Compare commits

...

12 Commits

Author SHA1 Message Date
7bf8b60716 📝 Add Developement Setup steps.
Some checks failed
CI / Lint (push) Failing after 1m34s
2025-12-13 17:29:36 +01:00
8a77b150a8 Fix discord badge.
Some checks failed
CI / Lint (push) Failing after 20s
2025-12-11 08:36:09 +00:00
5068bc162d 😴 Rename README to README.md
Some checks failed
CI / Lint (push) Failing after 20s
2025-12-10 23:13:46 +00:00
ee7ec290ba 🪄 Add readme
Some checks failed
CI / Lint (push) Failing after 21s
2025-12-10 23:12:45 +00:00
5f005609b8 🪛 fix prettier ignore.
Some checks failed
CI / Lint (push) Failing after 26s
2025-12-10 21:38:19 +00:00
a4a3fc0382 😭 fix lint.yml
Some checks failed
CI / Lint (push) Failing after 40s
2025-12-10 21:49:06 +01:00
909c9d99d5 🪛 Fix lint CI.
Some checks failed
CI / Lint (push) Failing after 15s
2025-12-10 21:42:20 +01:00
4c2b3141d7 🔨 Prepare Auto dev experience.
Some checks failed
CI / Lint (push) Failing after 5m24s
2025-12-10 21:25:56 +01:00
78423da39e 📝 Apply prettier and eslint on files. 2025-12-10 21:21:42 +01:00
1562e5394d Config prettier and eslint 2025-12-10 21:19:37 +01:00
cfa902a343 📊 Add scoreboard and played time. 2025-12-10 16:48:53 +01:00
549c504712 📦Remove t new-new + update depencies. 2025-12-10 16:47:06 +01:00
32 changed files with 557 additions and 452 deletions

View File

@@ -1,15 +1,15 @@
{ {
"generator": "dense", "generator": "dense",
"rules": [ "rules": [
"remove_comments", "remove_comments",
"remove_spaces", "remove_spaces",
"compute_expression", "compute_expression",
"convert_luau_number", "convert_luau_number",
"group_local_assignment", "group_local_assignment",
"remove_empty_do", "remove_empty_do",
"remove_function_call_parens", "remove_function_call_parens",
"remove_nil_declaration", "remove_nil_declaration",
"remove_unused_if_branch", "remove_unused_if_branch",
"remove_unused_variable" "remove_unused_variable"
] ]
} }

22
.gitea/workflows/lint.yml Normal file
View File

@@ -0,0 +1,22 @@
name: CI
on: [push]
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
with:
version: 10
cache: true
- name: Install node
uses: actions/setup-node@v6
with:
node-version: latest
cache: "pnpm"
- run: pnpm install
- run: pnpm prettier . --check
- run: pnpm eslint .

2
.prettierignore Normal file
View File

@@ -0,0 +1,2 @@
pnpm-lock.yaml
.pnpm-store/

View File

@@ -3,4 +3,4 @@
"tabWidth": 4, "tabWidth": 4,
"trailingComma": "all", "trailingComma": "all",
"useTabs": true "useTabs": true
} }

View File

@@ -1,6 +1,3 @@
{ {
"recommendations": [ "recommendations": ["roblox-ts.vscode-roblox-ts", "dbaeumer.vscode-eslint"]
"roblox-ts.vscode-roblox-ts", }
"dbaeumer.vscode-eslint"
]
}

View File

@@ -17,4 +17,4 @@
"files.associations": { "files.associations": {
"*.luau": "lua" "*.luau": "lua"
} }
} }

21
README.md Normal file
View File

@@ -0,0 +1,21 @@
# 🥀 Aconit
Aconit is an asymmetric horror game that is available on Roblox. The project is open source, so you can contribute to help develop it.
[![Gitea Last Commit](https://img.shields.io/gitea/last-commit/revocation/aconit?gitea_url=https%3A%2F%2Fazur84.servehttp.com)]() [![Discord](https://img.shields.io/discord/1352754862831439974?logo=discord)](https://discord.gg/QpAUUTJm3h) [![Favorites](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgames.roblox.com%2Fv1%2Fgames%2F8513843510%2Ffavorites%2Fcount&query=%24.favoritesCount&label=%E2%AD%90%20Roblox%20Favorites&color=yellow)](roblox.com/games/76850012177914/Aconit) [![roblox-ts](https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fazur84.servehttp.com%2FRevocation%2FAconit%2Fraw%2Fbranch%2Fmaster%2Fpnpm-lock.yaml&query=%24.importers%5B%22.%22%5D.devDependencies.roblox-ts.version&logo=roblox&label=roblox-ts&labelColor=ff0000&color=grey)](https://roblox-ts.com) [![flamework](https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fazur84.servehttp.com%2FRevocation%2FAconit%2Fraw%2Fbranch%2Fmaster%2Fpnpm-lock.yaml&query=%24.importers%5B%22.%22%5D.dependencies%5B%22%40flamework%2Fcore%22%5D.version&label=flamework&labelColor=FF7139&color=grey)](https://flamework.fireboltofdeath.dev/)
## 🪛 Developement Setup
I am describing this for people who have never used Node.js before. If you are already familiar with it, you may find it repetitive.
This project is based on roblox-ts and flamework.
### 🪢 Node.js and pnpm
First of all you need to install [node.js](https://pnpm.io/) and [pnpm](https://pnpm.io/).
Node.js is used for building the project, and pnpm is the package manager.
### 📦 Depencies installation
For install all depencies simply run ``pnpm install``.
### 📝 Developement help
Don't hesitate to check [roblox-ts](https://roblox-ts.com) and [flamework](https://flamework.fireboltofdeath.dev/) docs or send a message on our [discord server](https://discord.gg/QpAUUTJm3h).
### 🔨 Builds
Builds are automatic with gitea actions.

59
build.project.json Normal file
View File

@@ -0,0 +1,59 @@
{
"name": "roblox-ts-game",
"globIgnorePaths": ["**/package.json", "**/tsconfig.json"],
"tree": {
"$className": "DataModel",
"ServerScriptService": {
"$className": "ServerScriptService",
"TS": {
"$path": "out/server"
}
},
"ReplicatedStorage": {
"$className": "ReplicatedStorage",
"rbxts_include": {
"$path": "include",
"node_modules": {
"$className": "Folder",
"@rbxts": {
"$path": "node_modules/@rbxts"
},
"@flamework": {
"$path": "node_modules/@flamework"
}
}
},
"TS": {
"$path": "out/shared"
}
},
"StarterPlayer": {
"$className": "StarterPlayer",
"StarterPlayerScripts": {
"$className": "StarterPlayerScripts",
"TS": {
"$path": "out/client"
}
}
},
"Workspace": {
"$className": "Workspace",
"$properties": {
"FilteringEnabled": true
}
},
"HttpService": {
"$className": "HttpService",
"$properties": {
"HttpEnabled": true
}
},
"SoundService": {
"$className": "SoundService",
"$properties": {
"RespectFilteringEnabled": true
}
},
"$path": "map.rbxlx"
}
}

View File

@@ -1,9 +1,6 @@
{ {
"name": "roblox-ts-game", "name": "roblox-ts-game",
"globIgnorePaths": [ "globIgnorePaths": ["**/package.json", "**/tsconfig.json"],
"**/package.json",
"**/tsconfig.json"
],
"tree": { "tree": {
"$className": "DataModel", "$className": "DataModel",
"ServerScriptService": { "ServerScriptService": {
@@ -58,4 +55,4 @@
} }
} }
} }
} }

View File

@@ -1,54 +1,25 @@
import { defineConfig, globalIgnores } from "eslint/config"; // @ts-check
import typescriptEslint from "@typescript-eslint/eslint-plugin";
// import robloxTs from "eslint-plugin-roblox-ts";
import prettier from "eslint-plugin-prettier";
import tsParser from "@typescript-eslint/parser";
import path from "node:path";
import { fileURLToPath } from "node:url";
import js from "@eslint/js"; import js from "@eslint/js";
import { FlatCompat } from "@eslint/eslintrc"; import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended";
import roblox from "eslint-plugin-roblox-ts";
import { defineConfig } from "eslint/config";
import ts from "typescript-eslint";
const __filename = fileURLToPath(import.meta.url); export default defineConfig(
const __dirname = path.dirname(__filename); js.configs.recommended,
const compat = new FlatCompat({ ts.configs.recommended,
baseDirectory: __dirname, roblox.configs.recommended,
recommendedConfig: js.configs.recommended, eslintPluginPrettierRecommended,
allConfig: js.configs.all,
});
export default defineConfig([
globalIgnores(["out"]),
{ {
extends: compat.extends(
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:roblox-ts/recommended-legacy",
"plugin:prettier/recommended",
),
plugins: {
"@typescript-eslint": typescriptEslint,
// "roblox-ts": robloxTs,
prettier,
},
languageOptions: {
parser: tsParser,
ecmaVersion: 2018,
sourceType: "module",
parserOptions: {
jsx: true,
useJSXTextNode: true,
project: "./tsconfig.json",
},
},
rules: { rules: {
"prettier/prettier": "warn", "prettier/prettier": "warn",
"@typescript-eslint/no-unused-vars": ["error", { "@typescript-eslint/no-unused-vars": [
"varsIgnorePattern": "^[A-Z].*(Service|Controller|Component)$" "error",
}] {
varsIgnorePattern: "^[A-Z].*(Service|Controller|Component)$",
},
],
"@typescript-eslint/no-empty-object-type": "off",
}, },
}, },
]); );

BIN
map.rbxl Normal file

Binary file not shown.

View File

@@ -1,47 +1,45 @@
{ {
"name": "aconit", "name": "aconit",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"build": "rbxtsc", "build": "rbxtsc",
"watch": "rbxtsc -w", "watch": "rbxtsc -w",
"lint": "eslint", "lint": "eslint",
"production": "darklua minify out out" "prettier": "prettier",
}, "production": "darklua minify out out"
"keywords": [], },
"author": "Aconit team", "keywords": [],
"license": "ISC", "author": "Aconit team",
"type": "commonjs", "license": "ISC",
"devDependencies": { "type": "commonjs",
"@eslint/eslintrc": "^3.3.1", "devDependencies": {
"@eslint/js": "^9.37.0", "@eslint/js": "^9.39.1",
"@rbxts/compiler-types": "^3.0.0-types.0", "@rbxts/compiler-types": "3.0.0-types.0",
"@rbxts/services": "^1.5.5", "@rbxts/services": "^1.6.0",
"@rbxts/signal": "^1.1.1", "@rbxts/signal": "^1.1.1",
"@rbxts/t": "^3.2.1", "@rbxts/t": "^3.2.1",
"@rbxts/types": "^1.0.882", "@rbxts/types": "^1.0.896",
"@typescript-eslint/eslint-plugin": "^8.44.0", "eslint": "^9.39.1",
"@typescript-eslint/parser": "^8.44.0", "eslint-config-prettier": "^10.1.8",
"eslint": "^9.36.0", "eslint-plugin-prettier": "^5.5.4",
"eslint-config-prettier": "^10.1.8", "eslint-plugin-roblox-ts": "^1.3.0",
"eslint-plugin-prettier": "^5.5.4", "prettier": "^3.7.4",
"eslint-plugin-roblox-ts": "^1.2.1", "rbxts-transformer-flamework": "^1.3.2",
"prettier": "^3.6.2", "rbxts-transformer-instances": "^1.0.1",
"rbxts-transformer-flamework": "^1.3.2", "rbxts-transformer-services": "^1.1.1",
"rbxts-transformer-instances": "^1.0.1", "roblox-ts": "^3.0.0",
"rbxts-transformer-services": "^1.1.1", "typescript": "~5.5.4",
"rbxts-transformer-t-new-new": "^0.2.0", "typescript-eslint": "^8.49.0"
"roblox-ts": "^3.0.0", },
"typescript": "~5.5.3" "dependencies": {
}, "@flamework/components": "^1.3.2",
"dependencies": { "@flamework/core": "^1.3.2",
"@flamework/components": "^1.3.2", "@flamework/networking": "^1.3.2",
"@flamework/core": "^1.3.2", "@rbxts/object-utils": "^1.0.4",
"@flamework/networking": "^1.3.2", "@rbxts/pretty-react-hooks": "^0.6.4",
"@rbxts/object-utils": "^1.0.4", "@rbxts/react": "^17.2.3",
"@rbxts/pretty-react-hooks": "^0.6.4", "@rbxts/react-roblox": "^17.2.3"
"@rbxts/react": "^17.2.3", }
"@rbxts/react-roblox": "^17.2.3" }
}
}

501
pnpm-lock.yaml generated
View File

@@ -30,17 +30,14 @@ importers:
specifier: ^17.2.3 specifier: ^17.2.3
version: 17.2.3 version: 17.2.3
devDependencies: devDependencies:
'@eslint/eslintrc':
specifier: ^3.3.1
version: 3.3.1
'@eslint/js': '@eslint/js':
specifier: ^9.37.0 specifier: ^9.39.1
version: 9.38.0 version: 9.39.1
'@rbxts/compiler-types': '@rbxts/compiler-types':
specifier: ^3.0.0-types.0 specifier: 3.0.0-types.0
version: 3.0.0-types.0 version: 3.0.0-types.0
'@rbxts/services': '@rbxts/services':
specifier: ^1.5.5 specifier: ^1.6.0
version: 1.6.0 version: 1.6.0
'@rbxts/signal': '@rbxts/signal':
specifier: ^1.1.1 specifier: ^1.1.1
@@ -49,29 +46,23 @@ importers:
specifier: ^3.2.1 specifier: ^3.2.1
version: 3.2.1 version: 3.2.1
'@rbxts/types': '@rbxts/types':
specifier: ^1.0.882 specifier: ^1.0.896
version: 1.0.887 version: 1.0.896
'@typescript-eslint/eslint-plugin':
specifier: ^8.44.0
version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/parser':
specifier: ^8.44.0
version: 8.46.2(eslint@9.38.0)(typescript@5.5.4)
eslint: eslint:
specifier: ^9.36.0 specifier: ^9.39.1
version: 9.38.0 version: 9.39.1
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.1.8 specifier: ^10.1.8
version: 10.1.8(eslint@9.38.0) version: 10.1.8(eslint@9.39.1)
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.5.4 specifier: ^5.5.4
version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2) version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.4)
eslint-plugin-roblox-ts: eslint-plugin-roblox-ts:
specifier: ^1.2.1 specifier: ^1.3.0
version: 1.2.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4) version: 1.3.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4)
prettier: prettier:
specifier: ^3.6.2 specifier: ^3.7.4
version: 3.6.2 version: 3.7.4
rbxts-transformer-flamework: rbxts-transformer-flamework:
specifier: ^1.3.2 specifier: ^1.3.2
version: 1.3.2(typescript@5.5.4) version: 1.3.2(typescript@5.5.4)
@@ -81,15 +72,15 @@ importers:
rbxts-transformer-services: rbxts-transformer-services:
specifier: ^1.1.1 specifier: ^1.1.1
version: 1.1.1(typescript@5.5.4) version: 1.1.1(typescript@5.5.4)
rbxts-transformer-t-new-new:
specifier: ^0.2.0
version: 0.2.0
roblox-ts: roblox-ts:
specifier: ^3.0.0 specifier: ^3.0.0
version: 3.0.0 version: 3.0.0
typescript: typescript:
specifier: ~5.5.3 specifier: ~5.5.4
version: 5.5.4 version: 5.5.4
typescript-eslint:
specifier: ^8.49.0
version: 8.49.0(eslint@9.39.1)(typescript@5.5.4)
packages: packages:
@@ -107,28 +98,28 @@ packages:
resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/config-helpers@0.4.1': '@eslint/config-helpers@0.4.2':
resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.16.0': '@eslint/core@0.17.0':
resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.1': '@eslint/eslintrc@3.3.3':
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.38.0': '@eslint/js@9.39.1':
resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.7': '@eslint/object-schema@2.1.7':
resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/plugin-kit@0.4.0': '@eslint/plugin-kit@0.4.1':
resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@flamework/components@1.3.2': '@flamework/components@1.3.2':
@@ -218,12 +209,15 @@ packages:
'@rbxts/t@3.2.1': '@rbxts/t@3.2.1':
resolution: {integrity: sha512-/fnf2QSx+TI3HSJ6QW2ikvGQk0mlx/63UXo60pLAKGqbxXiAuTJh88bpKpHw6aCzfFLJAwrVIcgCUOokLMPcag==} resolution: {integrity: sha512-/fnf2QSx+TI3HSJ6QW2ikvGQk0mlx/63UXo60pLAKGqbxXiAuTJh88bpKpHw6aCzfFLJAwrVIcgCUOokLMPcag==}
'@rbxts/types@1.0.887': '@rbxts/types@1.0.896':
resolution: {integrity: sha512-vhp4vIKEfl1TaBcKxBxU5dTFsVNqLkvefoF9pw/Epb+Jk9T+0g4SFQQtBdCu3UdZcBGK/PWk/IJeEyoRNDMkSw==} resolution: {integrity: sha512-zuw1lpvW8hfnHxUmkoEjJ/NDrfpDjqzKWV1iU18DRoM0VsMleLfUv/t7giN70ST/KnGS6S6ubH8la+JTEl6aRw==}
'@roblox-ts/luau-ast@2.0.0': '@roblox-ts/luau-ast@2.0.0':
resolution: {integrity: sha512-cmMi093IdwBOLVxwuordhM8AmtbyTIyRpsTbB0D/JauidW4SXsQRQowSwWjHo4QP0DRJBXvOIlxtqEQi50uNzQ==} resolution: {integrity: sha512-cmMi093IdwBOLVxwuordhM8AmtbyTIyRpsTbB0D/JauidW4SXsQRQowSwWjHo4QP0DRJBXvOIlxtqEQi50uNzQ==}
'@roblox-ts/luau-ast@2.0.1':
resolution: {integrity: sha512-jej2mzRGwhR9wu4woAtgTwqsKADlegZYlQ+M5qVHRojvjoyJVFkLrSbhBKRr8HR+fVW5nCz0qX7kNa0tSpAY+A==}
'@roblox-ts/path-translator@1.1.0': '@roblox-ts/path-translator@1.1.0':
resolution: {integrity: sha512-D0akTmnNYqBw+ZIek5JxocT3BjmbgGOuOy0x1nIIxHBPNLGCpzseToY8jyYs/0mlvnN2xnSP/k8Tv+jvGOQSwQ==} resolution: {integrity: sha512-D0akTmnNYqBw+ZIek5JxocT3BjmbgGOuOy0x1nIIxHBPNLGCpzseToY8jyYs/0mlvnN2xnSP/k8Tv+jvGOQSwQ==}
@@ -236,107 +230,107 @@ packages:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@typescript-eslint/eslint-plugin@8.46.2': '@typescript-eslint/eslint-plugin@8.49.0':
resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.46.2 '@typescript-eslint/parser': ^8.49.0
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/parser@8.46.2': '@typescript-eslint/parser@8.49.0':
resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.44.0': '@typescript-eslint/project-service@8.46.4':
resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.46.2': '@typescript-eslint/project-service@8.49.0':
resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/scope-manager@8.44.0': '@typescript-eslint/scope-manager@8.46.4':
resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/scope-manager@8.46.2': '@typescript-eslint/scope-manager@8.49.0':
resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.44.0': '@typescript-eslint/tsconfig-utils@8.46.4':
resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/tsconfig-utils@8.46.2': '@typescript-eslint/tsconfig-utils@8.49.0':
resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.44.0': '@typescript-eslint/type-utils@8.46.4':
resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.46.2': '@typescript-eslint/type-utils@8.49.0':
resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/types@8.44.0': '@typescript-eslint/types@8.46.4':
resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.46.2': '@typescript-eslint/types@8.49.0':
resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.44.0': '@typescript-eslint/typescript-estree@8.46.4':
resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/typescript-estree@8.46.2': '@typescript-eslint/typescript-estree@8.49.0':
resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.44.0': '@typescript-eslint/utils@8.46.4':
resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.46.2': '@typescript-eslint/utils@8.49.0':
resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/visitor-keys@8.44.0': '@typescript-eslint/visitor-keys@8.46.4':
resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/visitor-keys@8.46.2': '@typescript-eslint/visitor-keys@8.49.0':
resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
acorn-jsx@5.3.2: acorn-jsx@5.3.2:
@@ -460,8 +454,8 @@ packages:
eslint-config-prettier: eslint-config-prettier:
optional: true optional: true
eslint-plugin-roblox-ts@1.2.1: eslint-plugin-roblox-ts@1.3.0:
resolution: {integrity: sha512-B6PyXsz2urPJIr2TxZBD3qQwCM0FN6lUOoddJTk1AcdRkWSTe1Vc6VuNP593u7Tbq9sStjW2k2iYjI1G5CFNiQ==} resolution: {integrity: sha512-J67YmWK1SVWWa5mtWCm+9LnK8uN5Snhe0hwDnCKc93LWDzX4YL37PyFQhhlP+oS5I6eM6ZdLMg3rvJURLQn5cQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=22.5.1} engines: {node: ^18.18.0 || ^20.9.0 || >=22.5.1}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': '>=6.0.0' '@typescript-eslint/parser': '>=6.0.0'
@@ -480,8 +474,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.38.0: eslint@9.39.1:
resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -510,10 +504,6 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
expand-tilde@2.0.2:
resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
engines: {node: '>=0.10.0'}
fast-deep-equal@3.1.3: fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -536,6 +526,15 @@ packages:
fastq@1.19.1: fastq@1.19.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
file-entry-cache@8.0.0: file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
@@ -578,10 +577,6 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*} engines: {node: 6.* || 8.* || >= 10.*}
get-installed-path@4.0.8:
resolution: {integrity: sha512-PmANK1xElIHlHH2tXfOoTnSDUjX1X3GvKK6ZyLbUnSCCn1pADwu67eVWttuPzJWrXDDT2MfO6uAaKILOFfitmA==}
engines: {node: '>=6', npm: '>=5', yarn: '>=1'}
glob-parent@5.1.2: glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@@ -594,14 +589,6 @@ packages:
resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==}
engines: {node: '>=16 || 14 >=14.17'} engines: {node: '>=16 || 14 >=14.17'}
global-modules@1.0.0:
resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==}
engines: {node: '>=0.10.0'}
global-prefix@1.0.2:
resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==}
engines: {node: '>=0.10.0'}
globals@14.0.0: globals@14.0.0:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -609,9 +596,6 @@ packages:
graceful-fs@4.2.11: graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
has-flag@4.0.0: has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -623,10 +607,6 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
homedir-polyfill@1.0.3:
resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==}
engines: {node: '>=0.10.0'}
hosted-git-info@4.1.0: hosted-git-info@4.1.0:
resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -647,9 +627,6 @@ packages:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'} engines: {node: '>=0.8.19'}
ini@1.3.8:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
is-binary-path@2.1.0: is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -674,15 +651,11 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'} engines: {node: '>=0.12.0'}
is-windows@1.0.2:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
isexe@2.0.0: isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
js-yaml@4.1.0: js-yaml@4.1.1:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true hasBin: true
json-buffer@3.0.1: json-buffer@3.0.1:
@@ -782,10 +755,6 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'} engines: {node: '>=6'}
parse-passwd@1.0.0:
resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==}
engines: {node: '>=0.10.0'}
path-exists@4.0.0: path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -805,6 +774,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
picomatch@4.0.3:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
prelude-ls@1.2.1: prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@@ -813,8 +786,8 @@ packages:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
prettier@3.6.2: prettier@3.7.4:
resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
@@ -838,9 +811,6 @@ packages:
peerDependencies: peerDependencies:
typescript: ^5.2.2 typescript: ^5.2.2
rbxts-transformer-t-new-new@0.2.0:
resolution: {integrity: sha512-IS3z/SBv78ft/eDMu46boB5eyl2hBAffVoJzUeIzuVBe6z38mz9L/c7OvCvgEX9QGRZI+LmEJA/mgPR6gH7Bsw==}
readdirp@3.6.0: readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'} engines: {node: '>=8.10.0'}
@@ -853,10 +823,6 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
resolve-dir@1.0.1:
resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==}
engines: {node: '>=0.10.0'}
resolve-from@4.0.0: resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -926,6 +892,10 @@ packages:
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
to-regex-range@5.0.1: to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'} engines: {node: '>=8.0'}
@@ -940,6 +910,13 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
typescript-eslint@8.49.0:
resolution: {integrity: sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
typescript@5.5.3: typescript@5.5.3:
resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
@@ -964,10 +941,6 @@ packages:
validate-npm-package-license@3.0.4: validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
which@1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
hasBin: true
which@2.0.2: which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@@ -1002,9 +975,9 @@ packages:
snapshots: snapshots:
'@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)': '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)':
dependencies: dependencies:
eslint: 9.38.0 eslint: 9.39.1
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {} '@eslint-community/regexpp@4.12.2': {}
@@ -1017,15 +990,15 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/config-helpers@0.4.1': '@eslint/config-helpers@0.4.2':
dependencies: dependencies:
'@eslint/core': 0.16.0 '@eslint/core': 0.17.0
'@eslint/core@0.16.0': '@eslint/core@0.17.0':
dependencies: dependencies:
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
'@eslint/eslintrc@3.3.1': '@eslint/eslintrc@3.3.3':
dependencies: dependencies:
ajv: 6.12.6 ajv: 6.12.6
debug: 4.4.3 debug: 4.4.3
@@ -1033,19 +1006,19 @@ snapshots:
globals: 14.0.0 globals: 14.0.0
ignore: 5.3.2 ignore: 5.3.2
import-fresh: 3.3.1 import-fresh: 3.3.1
js-yaml: 4.1.0 js-yaml: 4.1.1
minimatch: 3.1.2 minimatch: 3.1.2
strip-json-comments: 3.1.1 strip-json-comments: 3.1.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/js@9.38.0': {} '@eslint/js@9.39.1': {}
'@eslint/object-schema@2.1.7': {} '@eslint/object-schema@2.1.7': {}
'@eslint/plugin-kit@0.4.0': '@eslint/plugin-kit@0.4.1':
dependencies: dependencies:
'@eslint/core': 0.16.0 '@eslint/core': 0.17.0
levn: 0.4.1 levn: 0.4.1
'@flamework/components@1.3.2(@flamework/core@1.3.2)': '@flamework/components@1.3.2(@flamework/core@1.3.2)':
@@ -1136,10 +1109,12 @@ snapshots:
'@rbxts/t@3.2.1': {} '@rbxts/t@3.2.1': {}
'@rbxts/types@1.0.887': {} '@rbxts/types@1.0.896': {}
'@roblox-ts/luau-ast@2.0.0': {} '@roblox-ts/luau-ast@2.0.0': {}
'@roblox-ts/luau-ast@2.0.1': {}
'@roblox-ts/path-translator@1.1.0': '@roblox-ts/path-translator@1.1.0':
dependencies: dependencies:
ajv: 8.17.1 ajv: 8.17.1
@@ -1154,16 +1129,15 @@ snapshots:
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15': {}
'@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4)': '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.5.4) '@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.5.4) '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.5.4) '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.46.2 '@typescript-eslint/visitor-keys': 8.49.0
eslint: 9.38.0 eslint: 9.39.1
graphemer: 1.4.0
ignore: 7.0.5 ignore: 7.0.5
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 2.1.0(typescript@5.5.4) ts-api-utils: 2.1.0(typescript@5.5.4)
@@ -1171,88 +1145,88 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4)': '@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.46.2(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.46.2 '@typescript-eslint/visitor-keys': 8.49.0
debug: 4.4.3 debug: 4.4.3
eslint: 9.38.0 eslint: 9.39.1
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.44.0(typescript@5.5.4)': '@typescript-eslint/project-service@8.46.4(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4) '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.5.4)
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
debug: 4.4.3 debug: 4.4.3
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.46.2(typescript@5.5.4)': '@typescript-eslint/project-service@8.49.0(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4) '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.5.4)
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
debug: 4.4.3 debug: 4.4.3
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.44.0': '@typescript-eslint/scope-manager@8.46.4':
dependencies: dependencies:
'@typescript-eslint/types': 8.44.0 '@typescript-eslint/types': 8.46.4
'@typescript-eslint/visitor-keys': 8.44.0 '@typescript-eslint/visitor-keys': 8.46.4
'@typescript-eslint/scope-manager@8.46.2': '@typescript-eslint/scope-manager@8.49.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/visitor-keys': 8.46.2 '@typescript-eslint/visitor-keys': 8.49.0
'@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.5.4)': '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.5.4)':
dependencies: dependencies:
typescript: 5.5.4 typescript: 5.5.4
'@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.5.4)': '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.5.4)':
dependencies: dependencies:
typescript: 5.5.4 typescript: 5.5.4
'@typescript-eslint/type-utils@8.44.0(eslint@9.38.0)(typescript@5.5.4)': '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1)(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/types': 8.44.0 '@typescript-eslint/types': 8.46.4
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.5.4)
'@typescript-eslint/utils': 8.44.0(eslint@9.38.0)(typescript@5.5.4) '@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.5.4)
debug: 4.4.3 debug: 4.4.3
eslint: 9.38.0 eslint: 9.39.1
ts-api-utils: 2.1.0(typescript@5.5.4) ts-api-utils: 2.1.0(typescript@5.5.4)
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.5.4)': '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1)(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.46.2(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
'@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.5.4) '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
debug: 4.4.3 debug: 4.4.3
eslint: 9.38.0 eslint: 9.39.1
ts-api-utils: 2.1.0(typescript@5.5.4) ts-api-utils: 2.1.0(typescript@5.5.4)
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.44.0': {} '@typescript-eslint/types@8.46.4': {}
'@typescript-eslint/types@8.46.2': {} '@typescript-eslint/types@8.49.0': {}
'@typescript-eslint/typescript-estree@8.44.0(typescript@5.5.4)': '@typescript-eslint/typescript-estree@8.46.4(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.44.0(typescript@5.5.4) '@typescript-eslint/project-service': 8.46.4(typescript@5.5.4)
'@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.5.4) '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.5.4)
'@typescript-eslint/types': 8.44.0 '@typescript-eslint/types': 8.46.4
'@typescript-eslint/visitor-keys': 8.44.0 '@typescript-eslint/visitor-keys': 8.46.4
debug: 4.4.3 debug: 4.4.3
fast-glob: 3.3.3 fast-glob: 3.3.3
is-glob: 4.0.3 is-glob: 4.0.3
@@ -1263,52 +1237,51 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/typescript-estree@8.46.2(typescript@5.5.4)': '@typescript-eslint/typescript-estree@8.49.0(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.46.2(typescript@5.5.4) '@typescript-eslint/project-service': 8.49.0(typescript@5.5.4)
'@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4) '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.5.4)
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/visitor-keys': 8.46.2 '@typescript-eslint/visitor-keys': 8.49.0
debug: 4.4.3 debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.3 semver: 7.7.3
tinyglobby: 0.2.15
ts-api-utils: 2.1.0(typescript@5.5.4) ts-api-utils: 2.1.0(typescript@5.5.4)
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.44.0(eslint@9.38.0)(typescript@5.5.4)': '@typescript-eslint/utils@8.46.4(eslint@9.39.1)(typescript@5.5.4)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
'@typescript-eslint/scope-manager': 8.44.0 '@typescript-eslint/scope-manager': 8.46.4
'@typescript-eslint/types': 8.44.0 '@typescript-eslint/types': 8.46.4
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.5.4)
eslint: 9.38.0 eslint: 9.39.1
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.5.4)': '@typescript-eslint/utils@8.49.0(eslint@9.39.1)(typescript@5.5.4)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
'@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.46.2(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
eslint: 9.38.0 eslint: 9.39.1
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/visitor-keys@8.44.0': '@typescript-eslint/visitor-keys@8.46.4':
dependencies: dependencies:
'@typescript-eslint/types': 8.44.0 '@typescript-eslint/types': 8.46.4
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
'@typescript-eslint/visitor-keys@8.46.2': '@typescript-eslint/visitor-keys@8.49.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.46.2 '@typescript-eslint/types': 8.49.0
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
acorn-jsx@5.3.2(acorn@8.15.0): acorn-jsx@5.3.2(acorn@8.15.0):
@@ -1412,25 +1385,26 @@ snapshots:
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
eslint-config-prettier@10.1.8(eslint@9.38.0): eslint-config-prettier@10.1.8(eslint@9.39.1):
dependencies: dependencies:
eslint: 9.38.0 eslint: 9.39.1
eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2): eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.4):
dependencies: dependencies:
eslint: 9.38.0 eslint: 9.39.1
prettier: 3.6.2 prettier: 3.7.4
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.11.11 synckit: 0.11.11
optionalDependencies: optionalDependencies:
eslint-config-prettier: 10.1.8(eslint@9.38.0) eslint-config-prettier: 10.1.8(eslint@9.39.1)
eslint-plugin-roblox-ts@1.2.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4): eslint-plugin-roblox-ts@1.3.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4):
dependencies: dependencies:
'@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.5.4) '@roblox-ts/luau-ast': 2.0.1
'@typescript-eslint/type-utils': 8.44.0(eslint@9.38.0)(typescript@5.5.4) '@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/utils': 8.44.0(eslint@9.38.0)(typescript@5.5.4) '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1)(typescript@5.5.4)
eslint: 9.38.0 '@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.5.4)
eslint: 9.39.1
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -1444,16 +1418,16 @@ snapshots:
eslint-visitor-keys@4.2.1: {} eslint-visitor-keys@4.2.1: {}
eslint@9.38.0: eslint@9.39.1:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1 '@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.1 '@eslint/config-helpers': 0.4.2
'@eslint/core': 0.16.0 '@eslint/core': 0.17.0
'@eslint/eslintrc': 3.3.1 '@eslint/eslintrc': 3.3.3
'@eslint/js': 9.38.0 '@eslint/js': 9.39.1
'@eslint/plugin-kit': 0.4.0 '@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7 '@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3 '@humanwhocodes/retry': 0.4.3
@@ -1501,10 +1475,6 @@ snapshots:
esutils@2.0.3: {} esutils@2.0.3: {}
expand-tilde@2.0.2:
dependencies:
homedir-polyfill: 1.0.3
fast-deep-equal@3.1.3: {} fast-deep-equal@3.1.3: {}
fast-diff@1.3.0: {} fast-diff@1.3.0: {}
@@ -1527,6 +1497,10 @@ snapshots:
dependencies: dependencies:
reusify: 1.1.0 reusify: 1.1.0
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
file-entry-cache@8.0.0: file-entry-cache@8.0.0:
dependencies: dependencies:
flat-cache: 4.0.1 flat-cache: 4.0.1
@@ -1568,10 +1542,6 @@ snapshots:
get-caller-file@2.0.5: {} get-caller-file@2.0.5: {}
get-installed-path@4.0.8:
dependencies:
global-modules: 1.0.0
glob-parent@5.1.2: glob-parent@5.1.2:
dependencies: dependencies:
is-glob: 4.0.3 is-glob: 4.0.3
@@ -1587,26 +1557,10 @@ snapshots:
minipass: 4.2.8 minipass: 4.2.8
path-scurry: 1.11.1 path-scurry: 1.11.1
global-modules@1.0.0:
dependencies:
global-prefix: 1.0.2
is-windows: 1.0.2
resolve-dir: 1.0.1
global-prefix@1.0.2:
dependencies:
expand-tilde: 2.0.2
homedir-polyfill: 1.0.3
ini: 1.3.8
is-windows: 1.0.2
which: 1.3.1
globals@14.0.0: {} globals@14.0.0: {}
graceful-fs@4.2.11: {} graceful-fs@4.2.11: {}
graphemer@1.4.0: {}
has-flag@4.0.0: {} has-flag@4.0.0: {}
hashids@2.3.0: {} hashids@2.3.0: {}
@@ -1615,10 +1569,6 @@ snapshots:
dependencies: dependencies:
function-bind: 1.1.2 function-bind: 1.1.2
homedir-polyfill@1.0.3:
dependencies:
parse-passwd: 1.0.0
hosted-git-info@4.1.0: hosted-git-info@4.1.0:
dependencies: dependencies:
lru-cache: 6.0.0 lru-cache: 6.0.0
@@ -1634,8 +1584,6 @@ snapshots:
imurmurhash@0.1.4: {} imurmurhash@0.1.4: {}
ini@1.3.8: {}
is-binary-path@2.1.0: is-binary-path@2.1.0:
dependencies: dependencies:
binary-extensions: 2.3.0 binary-extensions: 2.3.0
@@ -1654,11 +1602,9 @@ snapshots:
is-number@7.0.0: {} is-number@7.0.0: {}
is-windows@1.0.2: {}
isexe@2.0.0: {} isexe@2.0.0: {}
js-yaml@4.1.0: js-yaml@4.1.1:
dependencies: dependencies:
argparse: 2.0.1 argparse: 2.0.1
@@ -1756,8 +1702,6 @@ snapshots:
dependencies: dependencies:
callsites: 3.1.0 callsites: 3.1.0
parse-passwd@1.0.0: {}
path-exists@4.0.0: {} path-exists@4.0.0: {}
path-key@3.1.1: {} path-key@3.1.1: {}
@@ -1771,13 +1715,15 @@ snapshots:
picomatch@2.3.1: {} picomatch@2.3.1: {}
picomatch@4.0.3: {}
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
prettier-linter-helpers@1.0.0: prettier-linter-helpers@1.0.0:
dependencies: dependencies:
fast-diff: 1.3.0 fast-diff: 1.3.0
prettier@3.6.2: {} prettier@3.7.4: {}
punycode@2.3.1: {} punycode@2.3.1: {}
@@ -1803,12 +1749,6 @@ snapshots:
dependencies: dependencies:
typescript: 5.5.4 typescript: 5.5.4
rbxts-transformer-t-new-new@0.2.0:
dependencies:
'@rbxts/t': 3.2.1
get-installed-path: 4.0.8
typescript: 5.5.4
readdirp@3.6.0: readdirp@3.6.0:
dependencies: dependencies:
picomatch: 2.3.1 picomatch: 2.3.1
@@ -1817,11 +1757,6 @@ snapshots:
require-from-string@2.0.2: {} require-from-string@2.0.2: {}
resolve-dir@1.0.1:
dependencies:
expand-tilde: 2.0.2
global-modules: 1.0.0
resolve-from@4.0.0: {} resolve-from@4.0.0: {}
resolve@1.22.11: resolve@1.22.11:
@@ -1892,6 +1827,11 @@ snapshots:
dependencies: dependencies:
'@pkgr/core': 0.2.9 '@pkgr/core': 0.2.9
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
to-regex-range@5.0.1: to-regex-range@5.0.1:
dependencies: dependencies:
is-number: 7.0.0 is-number: 7.0.0
@@ -1904,6 +1844,17 @@ snapshots:
dependencies: dependencies:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
typescript-eslint@8.49.0(eslint@9.39.1)(typescript@5.5.4):
dependencies:
'@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
'@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
eslint: 9.39.1
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
typescript@5.5.3: {} typescript@5.5.3: {}
typescript@5.5.4: {} typescript@5.5.4: {}
@@ -1921,10 +1872,6 @@ snapshots:
spdx-correct: 3.2.0 spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
which@1.3.1:
dependencies:
isexe: 2.0.0
which@2.0.2: which@2.0.2:
dependencies: dependencies:
isexe: 2.0.0 isexe: 2.0.0

View File

@@ -6,3 +6,4 @@
[tools] [tools]
darklua = "seaofvoices/darklua@0.17.2" darklua = "seaofvoices/darklua@0.17.2"
rojo = "rojo-rbx/rojo@7.6.1" rojo = "rojo-rbx/rojo@7.6.1"
rbxcloud = "Sleitnick/rbxcloud@0.17.0"

View File

@@ -3,7 +3,7 @@ import React from "@rbxts/react";
import { StrictMode } from "@rbxts/react"; import { StrictMode } from "@rbxts/react";
import { createPortal, createRoot } from "@rbxts/react-roblox"; import { createPortal, createRoot } from "@rbxts/react-roblox";
import { Players, StarterGui } from "@rbxts/services"; import { Players, StarterGui } from "@rbxts/services";
import PlayersBoard from "shared/gui/players_board"; import PlayersBoard from "client/gui/players_board";
@Controller() @Controller()
class GuiController implements OnStart { class GuiController implements OnStart {
@@ -12,7 +12,9 @@ class GuiController implements OnStart {
StarterGui.SetCoreGuiEnabled(Enum.CoreGuiType.Chat, true); StarterGui.SetCoreGuiEnabled(Enum.CoreGuiType.Chat, true);
try { try {
StarterGui.SetCore("ResetButtonCallback", true); StarterGui.SetCore("ResetButtonCallback", true);
} catch (error) {} } catch (err) {
error(err);
}
const root = createRoot(new Instance("Folder")); const root = createRoot(new Instance("Folder"));

View File

@@ -1,5 +1,5 @@
import { lerp, useMotion } from "@rbxts/pretty-react-hooks"; import { useKeyPress, useMotion } from "@rbxts/pretty-react-hooks";
import React, { Component, ReactNode, StrictMode, useEffect, useState } from "@rbxts/react"; import React, { useEffect, useState } from "@rbxts/react";
import { Players } from "@rbxts/services"; import { Players } from "@rbxts/services";
import Profile from "./profile"; import Profile from "./profile";
@@ -55,6 +55,9 @@ function PlayerEntry({
export default function PlayersBoard() { export default function PlayersBoard() {
const [players, setPlayers] = useState<Player[]>(Players.GetPlayers()); const [players, setPlayers] = useState<Player[]>(Players.GetPlayers());
const [selectedPlayer, setSelectedPlayer] = useState<Player>(); const [selectedPlayer, setSelectedPlayer] = useState<Player>();
const [activated, setActivated] = useState(true);
const tabPressed = useKeyPress(["Tab"]);
useEffect(() => { useEffect(() => {
const playerAdded = Players.PlayerAdded.Connect(() => { const playerAdded = Players.PlayerAdded.Connect(() => {
setPlayers(Players.GetPlayers()); setPlayers(Players.GetPlayers());
@@ -68,6 +71,10 @@ export default function PlayersBoard() {
}; };
}, []); }, []);
useEffect(() => {
if (tabPressed) setActivated(!activated);
}, [tabPressed]);
return ( return (
<> <>
<frame <frame
@@ -75,6 +82,7 @@ export default function PlayersBoard() {
Position={UDim2.fromScale(0.8, 0.1)} Position={UDim2.fromScale(0.8, 0.1)}
BackgroundColor3={new Color3(0, 0.72, 1)} BackgroundColor3={new Color3(0, 0.72, 1)}
BackgroundTransparency={0.7} BackgroundTransparency={0.7}
Visible={activated}
> >
<frame <frame
BorderColor3={new Color3(1, 1, 1)} BorderColor3={new Color3(1, 1, 1)}

View File

@@ -1,25 +1,47 @@
import React, { useEffect, useRef, useState } from "@rbxts/react"; import React, { useEffect, useRef, useState } from "@rbxts/react";
import { LocalizationService, Players } from "@rbxts/services"; import { LocalizationService, Players, RunService } from "@rbxts/services";
import { ProfileClientEvents } from "client/networking";
function TimePlayed({ targetTime }: { targetTime: number }) { function TimePlayed({
const [time, setTime] = useState(); targetTime,
const [id, setId] = useState<DateTime>(); reeloffset,
timeOrigin,
}: {
targetTime: number;
timeOrigin: number;
reeloffset: number;
}) {
const [time, setTime] = useState<number>(0);
useEffect(() => { useEffect(() => {
let killed = false; const connection = RunService.PreRender.Connect(() => {
setId(DateTime.fromUnixTimestamp(targetTime)); setTime(targetTime + os.time() - timeOrigin);
task.spawn(() => {
while (true) {
if (killed) return;
}
}); });
return () => { return () => connection.Disconnect();
killed = true;
};
}, [targetTime]); }, [targetTime]);
return (
<textlabel
Text={
targetTime === -1
? "XX:XX:XX"
: DateTime.fromUnixTimestamp(time).FormatUniversalTime(
"HH:mm:ss",
LocalizationService.RobloxLocaleId,
)
}
Size={new UDim2(1, -reeloffset, 0.3, 0)}
BackgroundTransparency={1}
TextScaled={true}
Position={new UDim2(0, reeloffset, 0.45, 0)}
TextColor3={new Color3(0, 0, 0)}
/>
);
} }
export default function Profile({ player }: { player: Player }) { export default function Profile({ player }: { player: Player }) {
const [userIcon, setUserIcon] = useState<string>(); const [userIcon, setUserIcon] = useState<string>();
const [timePlayed, setTimePlayed] = useState<number>(-1);
const [timeOrigin, setTimeOrigin] = useState<number>(-1);
const ref = useRef<ImageLabel>(); const ref = useRef<ImageLabel>();
useEffect(() => { useEffect(() => {
const [image] = Players.GetUserThumbnailAsync( const [image] = Players.GetUserThumbnailAsync(
@@ -28,6 +50,12 @@ export default function Profile({ player }: { player: Player }) {
Enum.ThumbnailSize.Size180x180, Enum.ThumbnailSize.Size180x180,
); );
setUserIcon(image); setUserIcon(image);
if (RunService.IsRunning()) {
ProfileClientEvents.getPlayerStartTime(player.UserId).then((value) => {
setTimePlayed(value[0]);
setTimeOrigin(value[1]);
});
}
}, [player]); }, [player]);
const reeloffset = ref.current?.AbsoluteSize.X ?? 0; const reeloffset = ref.current?.AbsoluteSize.X ?? 0;
return ( return (
@@ -72,14 +100,7 @@ export default function Profile({ player }: { player: Player }) {
Position={new UDim2(0, reeloffset, 0.25, 0)} Position={new UDim2(0, reeloffset, 0.25, 0)}
TextColor3={new Color3(0.13, 0.13, 0.13)} TextColor3={new Color3(0.13, 0.13, 0.13)}
/> />
<textlabel <TimePlayed reeloffset={reeloffset} targetTime={timePlayed} timeOrigin={timeOrigin} />
Text={DateTime.fromUnixTimestamp().FormatLocalTime("LTS", LocalizationService.RobloxLocaleId)}
Size={new UDim2(1, -reeloffset, 0.3, 0)}
BackgroundTransparency={1}
TextScaled={true}
Position={new UDim2(0, reeloffset, 0.45, 0)}
TextColor3={new Color3(0, 0, 0)}
/>
<textlabel <textlabel
Text={`Lev : ${0}`} Text={`Lev : ${0}`}
Size={new UDim2(1, -reeloffset, 0.3, 0)} Size={new UDim2(1, -reeloffset, 0.3, 0)}

View File

@@ -1,3 +1,4 @@
import { GameplayEvents } from "shared/networking"; import { GameplayEvents, ProfileEvents } from "shared/networking";
export const GameplayClientEvents = GameplayEvents.createClient({}); export const GameplayClientEvents = GameplayEvents.createClient({});
export const ProfileClientEvents = ProfileEvents.createClient({});

View File

@@ -20,7 +20,7 @@ export class Doors extends BaseComponent<{}, DoorInstance> implements OnStart {
} }
onStart(): void { onStart(): void {
const doororigin = this.instance.WorldPivot.Position; const doororigin = this.instance.WorldPivot.Position;
while (task.wait(0.5)) { while (task.wait(0.5) !== 0) {
let actived = false; let actived = false;
Players.GetPlayers().forEach((player) => { Players.GetPlayers().forEach((player) => {
const character = player.Character; const character = player.Character;

View File

@@ -9,7 +9,7 @@ interface Attribute {
@Component({ @Component({
tag: "Random_Decoration", tag: "Random_Decoration",
}) })
class RandomDecoration extends BaseComponent<Attribute, Part> implements OnStart { class RandomDecorationComponent extends BaseComponent<Attribute, Part> implements OnStart {
onStart(): void { onStart(): void {
const decoration = this.getRandomDecoration(this.attributes.Type); const decoration = this.getRandomDecoration(this.attributes.Type);
decoration.Parent = this.instance.Parent; decoration.Parent = this.instance.Parent;

View File

@@ -1,3 +1,4 @@
import { GameplayEvents } from "shared/networking"; import { GameplayEvents, ProfileEvents } from "shared/networking";
export const GameplayServerEvents = GameplayEvents.createServer({}); export const GameplayServerEvents = GameplayEvents.createServer({});
export const ProfileServerEvents = ProfileEvents.createServer({});

View File

@@ -15,7 +15,7 @@ class CommandsService implements OnStart {
ragdollCommand.PrimaryAlias = "/ragdoll"; ragdollCommand.PrimaryAlias = "/ragdoll";
ragdollCommand.Triggered.Connect((TextSource) => { ragdollCommand.Triggered.Connect((TextSource) => {
const player = Players.GetPlayerByUserId(TextSource.UserId); const player = Players.GetPlayerByUserId(TextSource.UserId);
this.ragdollService.ragdoll(player?.Character!); this.ragdollService.ragdoll(player!.Character!);
}); });
const unragdollCommand = new TextChatCommand(); const unragdollCommand = new TextChatCommand();
@@ -23,7 +23,7 @@ class CommandsService implements OnStart {
unragdollCommand.PrimaryAlias = "/unragdoll"; unragdollCommand.PrimaryAlias = "/unragdoll";
unragdollCommand.Triggered.Connect((TextSource) => { unragdollCommand.Triggered.Connect((TextSource) => {
const player = Players.GetPlayerByUserId(TextSource.UserId); const player = Players.GetPlayerByUserId(TextSource.UserId);
this.ragdollService.ragdoll(player?.Character!); this.ragdollService.ragdoll(player!.Character!);
}); });
const takeownerCommand = new TextChatCommand(); const takeownerCommand = new TextChatCommand();

View File

@@ -40,7 +40,7 @@ export class RagdollService implements OnPlayerJoined, OnStart {
//#endregion //#endregion
//#region Private functions. //#region Private functions.
private getRagdollPhysic(character: Model) { private getRagdollPhysic(character: Model): [Set<Motor6D>, Set<BallSocketConstraint>] {
const motors = new Set<Motor6D>(); const motors = new Set<Motor6D>();
const constraints = new Set<BallSocketConstraint>(); const constraints = new Set<BallSocketConstraint>();
character.GetDescendants().forEach((descendant) => { character.GetDescendants().forEach((descendant) => {
@@ -51,7 +51,7 @@ export class RagdollService implements OnPlayerJoined, OnStart {
constraints.add(descendant); constraints.add(descendant);
} }
}); });
return $tuple(motors, constraints); return [motors, constraints];
} }
private prepareRagdoll(character: Model) { private prepareRagdoll(character: Model) {

View File

@@ -63,7 +63,9 @@ export class SprintService implements OnStart, OnPlayerJoined {
GameplayServerEvents.sprint.connect((player, enabled) => { GameplayServerEvents.sprint.connect((player, enabled) => {
if (this.timeout.has(player.UserId) && !this.cant_run.has(player.UserId)) return; if (this.timeout.has(player.UserId) && !this.cant_run.has(player.UserId)) return;
const character = player.Character; const character = player.Character;
enabled ? this.is_running.add(player.UserId) : this.is_running.delete(player.UserId); if (enabled) {
this.is_running.add(player.UserId);
} else this.is_running.delete(player.UserId);
if (character) { if (character) {
const humanoid = character.FindFirstChildOfClass("Humanoid"); const humanoid = character.FindFirstChildOfClass("Humanoid");
if (humanoid) { if (humanoid) {
@@ -145,6 +147,8 @@ export class SprintService implements OnStart, OnPlayerJoined {
setRunningInterdiction(player: Player, enabled: boolean) { setRunningInterdiction(player: Player, enabled: boolean) {
this.setRunning(player, !enabled); this.setRunning(player, !enabled);
enabled ? this.cant_run.add(player.UserId) : this.cant_run.delete(player.UserId); if (enabled) {
this.cant_run.add(player.UserId);
} else this.cant_run.delete(player.UserId);
} }
} }

View File

@@ -1,23 +1,32 @@
import { Modding, OnStart, Service } from "@flamework/core"; import { Modding, OnStart, Service } from "@flamework/core";
import { Players } from "@rbxts/services"; import { Players } from "@rbxts/services";
import { OnPlayerJoined } from "shared/modding/player_events"; import { OnPlayerJoined, OnPlayerQuit } from "shared/modding/player_events";
@Service() @Service()
class PlayerJoinService implements OnStart { class PlayerJoinService implements OnStart {
onStart() { onStart() {
const listeners = new Set<OnPlayerJoined>(); const playerJoinListener = new Set<OnPlayerJoined>();
const playerQuitListener = new Set<OnPlayerQuit>();
Modding.onListenerAdded<OnPlayerJoined>((object) => listeners.add(object)); Modding.onListenerAdded<OnPlayerJoined>((object) => playerJoinListener.add(object));
Modding.onListenerRemoved<OnPlayerJoined>((object) => listeners.delete(object)); Modding.onListenerRemoved<OnPlayerJoined>((object) => playerJoinListener.delete(object));
Modding.onListenerAdded<OnPlayerQuit>((object) => playerQuitListener.add(object));
Modding.onListenerRemoved<OnPlayerQuit>((object) => playerQuitListener.delete(object));
Players.PlayerAdded.Connect((player) => { Players.PlayerAdded.Connect((player) => {
for (const listener of listeners) { for (const listener of playerJoinListener) {
task.spawn(() => listener.onPlayerJoined(player)); task.spawn(() => listener.onPlayerJoined(player));
} }
}); });
Players.PlayerRemoving.Connect((player) => {
for (const listener of playerQuitListener) {
task.spawn(() => listener.onPlayerQuit(player));
}
});
for (const player of Players.GetPlayers()) { for (const player of Players.GetPlayers()) {
for (const listener of listeners) { for (const listener of playerJoinListener) {
task.spawn(() => listener.onPlayerJoined(player)); task.spawn(() => listener.onPlayerJoined(player));
} }
} }

View File

@@ -0,0 +1,43 @@
import { OnStart, Service } from "@flamework/core";
import { DataStoreService } from "@rbxts/services";
import { t } from "@rbxts/t";
import { ProfileServerEvents } from "server/networking";
import { OnPlayerJoined, OnPlayerQuit } from "shared/modding/player_events";
@Service()
class StatsService implements OnPlayerJoined, OnStart, OnPlayerQuit {
firstJoinStoreCache = new Map<number, [number, number]>();
firstJoinStore!: DataStore;
onStart(): void {
this.firstJoinStore = DataStoreService.GetDataStore("Stats_Players_Played_Time");
ProfileServerEvents.getPlayerStartTime.setCallback((_, playerId) => {
const playedtime = this.getPlayerPlayedTime(playerId);
return playedtime!;
});
}
onPlayerJoined(player: Player): void {
const playerId = tostring(player.UserId);
const [value] = this.firstJoinStore.GetAsync(playerId);
if (!t.optional(t.number)(value)) throw `Bad Data in DataBase for ${player.UserId}`;
if (value === undefined) {
this.firstJoinStore.SetAsync(playerId, 0);
}
this.firstJoinStoreCache.set(player.UserId, [value ?? 0, os.time()]);
}
getPlayerPlayedTime(playerId: number) {
return this.firstJoinStoreCache.get(playerId);
}
onPlayerQuit(player: Player): void {
const [value, time] = this.firstJoinStoreCache.get(player.UserId)!;
const t = value + os.time() - time;
this.firstJoinStore.SetAsync(tostring(player.UserId), t, [player.UserId]);
}
}

View File

@@ -1,6 +1,5 @@
// TODO // TODO
import { TupleType } from "typescript";
import { AbilityType } from "./main"; import { AbilityType } from "./main";
/** /**

View File

@@ -1,3 +1,7 @@
export interface OnPlayerJoined { export interface OnPlayerJoined {
onPlayerJoined(player: Player): void; onPlayerJoined(player: Player): void;
}
export interface OnPlayerQuit {
onPlayerQuit(player: Player): void;
} }

View File

@@ -6,4 +6,11 @@ interface GameplayClient {
interface GameplayServer {} interface GameplayServer {}
interface ProfileClient {
getPlayerStartTime(playerId: number): [number, number];
}
interface ProfileServer {}
export const GameplayEvents = Networking.createEvent<GameplayClient, GameplayServer>(); export const GameplayEvents = Networking.createEvent<GameplayClient, GameplayServer>();
export const ProfileEvents = Networking.createFunction<ProfileClient, ProfileServer>();

View File

@@ -15,10 +15,7 @@
"moduleDetection": "force", "moduleDetection": "force",
"strict": true, "strict": true,
"target": "ESNext", "target": "ESNext",
"typeRoots": [ "typeRoots": ["node_modules/@rbxts", "node_modules/@flamework"],
"node_modules/@rbxts",
"node_modules/@flamework",
],
// configurable // configurable
"rootDir": "src", "rootDir": "src",
"outDir": "out", "outDir": "out",
@@ -27,22 +24,16 @@
"tsBuildInfoFile": "out/tsconfig.tsbuildinfo", "tsBuildInfoFile": "out/tsconfig.tsbuildinfo",
"plugins": [ "plugins": [
{ {
"transform": "rbxts-transformer-flamework", "transform": "rbxts-transformer-flamework"
}, },
{ {
"transform": "rbxts-transformer-instances" "transform": "rbxts-transformer-instances"
}, },
{ {
"transform": "rbxts-transformer-services" "transform": "rbxts-transformer-services"
},
{
"transform": "rbxts-transformer-t-new-new"
} }
], ],
"removeComments": true "removeComments": true
}, },
"include": [ "include": ["src/**/*", "node_modules/rbxts-transformer-instances"]
"src/**/*", }
"node_modules/rbxts-transformer-instances"
]
}