diff --git a/.gitignore b/.gitignore index f5d1f48..96fdb6e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .vscode/ # Database Files -tc.db +test.db # Logs *.log @@ -11,6 +11,11 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +discord-logs.json +game-logs.json +discord-logs-1.json +game-logs-1.json + # Runtime data pids *.pid diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..5d324b3 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,14 @@ +stages: + - deploy + +deploy_prod: + stage: deploy + script: + - echo "Deploy to production server" + - git remote add heroku https://heroku:$HEROKU_API_KEY@git.heroku.com/tc-automod.git + - git push -fq heroku HEAD:master || true + environment: + name: production + when: manual + only: + - master diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..57777b2 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +worker: node ./src/bot.js \ No newline at end of file diff --git a/README.md b/README.md index b05c5a8..09201b7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,34 @@ -# AutoMod -tc needed a bot smh +# True Colors Link Service +A service which offers a simple link between ROBLOX services and Discord so all data and user information is united and easy to access. A product of the True Colors Development Team. + +The initial goal of the LINK project was to create a more robust moderation system for TCA. The concepts and plans have changed since the initial unreleased project proposal from January 2018. +> LINK is the automation and simple interface of various tasks of the True Colors Administration. As the acronym describes, it links everything together into a single and easy to use interface through Discord bot commands and a website dedicated to the True Colors staff team. The network would branch into both the Discord and our ROBLOX game (Skylands) in order to unify our logging system into one place. The use of a bot connected to LINK would verify users and send potentially suspicious information to the staff team to investigate while also connecting Discord accounts to ROBLOX accounts making it easy for the administration to connect users and their actions from both Discord and the group games. + The website would include an improved appeal system which not only logs all appeals into a single place, but also helps keep the staff team focused on investigating the user using a Discord bot to message notifications, in #administration-chat and / or DMs, and website notifications. The entire goal of this project is to help create a more focused and structured administrative system. +-- *TCA LINK Project Proposal, September 1, 2018, Pascal Young* + +After such a long wait, a lot of disscussion, unimaginable amounts of time and energy, the project is afloat and will be released Q1 of 2020 in the main True Colors group games. It may have taken 2 years, but for the product's success, this time has given us plenty of quality assurance tests and logistical problem solving time. + +- atom#0001 + +## Setup +Setting up this project for production is fairly straight-forward, if you know about the system in place. There are "automatic" moderation systems in place, which are toggleable. However, if you are unsure about any random numbers in the config file, it may be best to leave it alone. + +**As of January 18, 2020**: a more elegant configuration system has been created allowing for dynamic config file changes. All configuration values have been moved to the database file under the settings table. *Changing values will require a database browser for SQLite files*. + + Requirements: +- Discord Bot Token +- Rules and startup dedicated channels. +- A dedicated VPS (Virtual Private Server) for the Game Interface. +- A game. + +The hardest part of all of this is the VPS. Make sure you port forward the port "5000". Any operating system could be used, Linux was the only testing candidate though. + +## How It Works +### Discord Interface +We use a discord bot to serve data to the admin upon request. Since Discord is our main method of communication, this is concidered a central line. Previously using Trello, manual logging Discord channels, and having a group game, everything is easily accessable via Discord commands, including logs created from the game. + +### Game Interface +The game interface is a bit more complex than the others. The game interacts with a web API with the included server. An in-game script holds both a ViewKey (for GET requests) and a PostKey (for POST requests.) Data is served to the gameserver to the admin client from the webserver. While the interface isn't as polished due to the existing game UI, the main features are satisfactory with logging and adding evidence and such. + +### Export Service +Automated scripts can only do so much, as it doesn't account for human error. While there are scripts included in the source code to help export previous logs from Trello and Discord, some logs will need to be manually entered. At the time of writing this, there are 2600 logs on Discord. Plans to save logs which aren't able to be automatically saved to the database to a file are in the works. This feature has began development January 25, 2020. Expect updates soon. diff --git a/package.json b/package.json index 86316b3..abe1560 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,19 @@ { - "name": "tc-auto-mod", - "version": "0.0.0", + "name": "tc-link", + "version": "1.0.0", "description": "", "engines": { - "node": "12.0.0" + "node": "12.6.0" }, "dependencies": { "anyid": "^1.0.1", "babel-eslint": "^8.1.2", "better-sqlite3": "^5.4.0", + "body-parser": "^1.19.0", "chalk": "^2.0.1", "cheerio": "^1.0.0-rc.2", - "discord.js": "^11.2.1", - "discord.js-commando": "^0.9.0", + "discord.js": "^11.6.3", + "discord.js-commando": "^0.10.0", "eslint": "^4.14.0", "express": "^4.17.1", "flatted": "^2.0.1", @@ -35,10 +36,15 @@ "scripts": { "start": "node ./src/bot.js", "fill": "node ./scripts/filldb.js", - "init": "node ./scripts/initdb.js" + "init": "node ./scripts/initdb.js", + "web": "node ./src/web/Server.js", + "gen-legacy-chat": "node ./scripts/legacy/discord.js", + "gen-legacy-game": "node ./scripts/legacy/game.js", + "convert-legacy-chat": "node ./scripts/legacy/discordConvert.js", + "convert-legacy-game": "node ./scripts/legacy/gameConvert.js" }, "author": "Pascal Young", "private": true, "main": "bot.js", - "repository": "https://gitlab.com/true-colors/automod.git" + "repository": "https://gitlab.com/true-colors/link.git" } diff --git a/scripts/filldb.js b/scripts/filldb.js index efee59b..8d10ac2 100644 --- a/scripts/filldb.js +++ b/scripts/filldb.js @@ -1,7 +1,18 @@ +/* + * v2.0 filldb.js. Adds more static data. + + * No breaking changes besides new tables. +*/ + var sqlite = require('sqlite3') var db = new sqlite.Database('tc.db') var reasons = [ + /* + ? Reason entries: + ? { reason: "", value: 0 }, + */ + // General { reason: "exploit", value: 999 }, { reason: "iplogger", value: 999 }, @@ -41,10 +52,76 @@ var reasons = [ { reason: "dmhatespeech", value: 5 }, ] +var staff = [ + /* + ? Staff entries: + ? { igid: "", name: "", ign: "", chat_id: "", username: "", role: "", + ? warn_credit: 0, kick_credit: 0, ban_credit: 0 } + */ + + + // Testing purposes, not all staff entries.. + { igid: "000", name: "Audrey", ign: "pascaling", chat_id: "276126275083436034", username: "atom#0001", role: "Head Discord Moderator", + warn_credit: 100, kick_credit: 100, ban_credit: 100 } +] + +// defaultSettings +var s = { + experiments: 0, + owner: '276126275083436034', + prefix: '!', + token: '', + log_channel: '', + startup_channel: '', + rules_channel: '', + default_tz: 'UTC', + timezone: 'UTC/GMT', + WEBKEY: '', + POSTKEY: '', + auto_moderate: 0, + lowKick1Points: 6, + lowBan1Points: 10, + lowKick2Points: 16, + lowBan2Points: 22, + lowKick3Points: 28, + lowPermPoints: 34, + version: '0.5.0', + rules: "**1.** Do not spam. Spam is considered repeatedly sending images, posting lengthy and irrelevant message, posting long strings of messages (i.e. song lyrics, emoji spam), spam pinging (@ing) people/ranks, etc.\n\n**2.** Do not advertise other servers or groups without permission. This includes direct messaging members of this server advertisements without their consent.\n\n**3.** Inappropriate language, topics, and actions are not allowed. this includes:\n→**A.** Slurs, deliberate attempts to revoke negative reactions, pornography/adult conent, gore, offensive/hateful content in regards to race, gender identity, sexuality, etc., and graphic topics such as major genocides and school shootings.\n→**B.** Please refrain from making insensitive jokes, i.e. trigger jokes, insulting people by calling them 'autistic', etc.\n\n**4.** Do not post harmful content such as viruses, the glorification of harmful acts (i.e. self-harm, suicide), threats of IP tracking/DDoSing/Doxing, and malicious/illegal material.\n\n**5.** Respect and common decency is expected at all times. Do not mock, harass, or bully other members; this includes intentionally making people uncomfortable.\n\n**6.** Please do not be intentionally obnoxious, particularly in the voice channels. This includes playing loud audio, screaming, mic spamming, etc.\n\n**7.** True Colors is not an online dating platform; do not utilize the server as a platform for dating and/or hookups.\n\n**8.** Do not publicly post about moderation history. If you have a problem regarding moderation, please contact a member of the staff team.\n\nFor ROBLOX-related rules and an in-depth version of the guidelines, click [here](https://docs.google.com/document/d/1g1uASD3n5IIXwgiFRta4mnz0XK0WvRb6bLPXK53AbBw/edit?usp=sharing).", + patch_notes: '\n**0.5.0**:\n - Upgraded auto-moderation system, introducing "points" given per log.\n - Introducing Legacy Log (BETA) support for importing.\n - Added an unban command.\n - Added a hotswap feature for debugging purposes.\n - General improvements preparing for future updates.\n- Added `deleteLog` command (also `remove`,`rm`,`delete`) for HR department members.\n- Various bug fixes and performance improvements.\n**0.4.1**:\n- Audit logs are now available for every command ran. This will be expanded on in the future.\n- Many bug fixes for quality of life improvements.', + help_message: "tbd", + toggles: JSON.stringify({ + startupMessage:true, + tzConvert: true, + staffCmds: false, + helpCmd: true, + rulesCmd: true, + versionCmd: true, + mAddEvidence: true, + mComment: true, + mViewThread: true, + mViewUserAttachments: true, + mViewGameLogs: true, + mViewLogAttachments: true, + mViewUserStatus: true, + mCreateLogs: true, + mDeleteLogs: true, + notify: false, + nChannel: "", + mDeleteLogs: true, + autoAct: false + }) +} + +db.run(`INSERT INTO settings VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, [s.experiments, s.owner, s.prefix, s.token, s.log_channel, s.startup_channel, s.rules_channel, s.default_tz, s.timezone, s.WEBKEY, s.POSTKEY, s.auto_moderate, s.lowKick1Points, s.lowBan1Points, s.lowKick2Points, s.lowBan2Points, s.lowKick3Points, s.lowPermPoints, s.version, s.rules, s.patch_notes, s.help_message, s.toggles]) + reasons.forEach(item => { db.run(`INSERT INTO reasons VALUES(?,?)`, [item.reason, item.value]) }) +staff.forEach(item => { + db.run(`INSERT INTO staff VALUES(?,?,?,?,?,?,?,?,?)`, [item.igid, item.name, item.ign, item.chat_id, item.username, item.role, item.warn_credit, item.kick_credit, item.ban_credit ]) +}) + db.close() -console.log('Database Filled!') \ No newline at end of file +console.log('DatabaseV2 Filled!') \ No newline at end of file diff --git a/scripts/initdb.js b/scripts/initdb.js index 36e1bd6..e9f8a24 100644 --- a/scripts/initdb.js +++ b/scripts/initdb.js @@ -1,17 +1,174 @@ +/* + * v2.0 of initdb.js. Revises data structures with the main migration to unified user information. + * Less focus on 'automatic' action, as it is smaller of a priority. + * ~ 12/22/2019 + + ? List of changes: + ! - logs: added location text field. either discord or game. + ! added legacy integer field. 0 or 1, a boolean. + ! added points integer field. (4/13/2020) + ! - evidence: added location text field. either discord or game. + + ! - users: added ign, igid and gban_status text fields. + ! renamed warnings, kicks, bans text fields to chat_warnings, chat_kicks, chat_bans. + ! added game_warnings, game_kicks, game_bans integer fields + ! added legacy integer field, 0 or 1, a boolean. + + ! - appeals: added status and location text field. + ? Incomplete feature at time of update. + + ! - warnings: added location text field. + ! - kicks: added location text field. + ! - bans: added location text field. + ! - perm_bans: added location text field. + + * Created staff table to connect game and chat staff identification. + ? This will be fully implemented later on along with appeals and updates to commenting and such. + ? Similar to registering chat and game identity connections for regular users, it is important to do the same for staff. + + * Created settings table for dynamic toggles and updates. + * Created dev_settings table for dynamic toggles and updates for dev previews. + +*/ + var sqlite = require('sqlite3') -var db = new sqlite.Database('tc.db') - -db.run("CREATE TABLE reasons (reason TEXT, point_value INTEGER)") -db.run("CREATE TABLE logs (id INTEGER, time TEXT, username TEXT, user_id TEXT, staff_username TEXT, staff_id TEXT, reason TEXT, log_message_id TEXT, action TEXT, user_log_num)") -db.run("CREATE TABLE evidence (id INTEGER, user_log_num INTEGER, reason TEXT, time TEXT, evidence_url TEXT, user TEXT)") -db.run("CREATE TABLE comments (log_id INTEGER, time TEXT, staff TEXT, staff_id TEXT, content TEXT)") -db.run("CREATE TABLE users (id TEXT PRIMARY KEY, username TEXT, logs INTEGER, points INTEGER, warnings INTEGER, kicks INTEGER, bans INTEGER)") -db.run("CREATE TABLE appeals (user_id TEXT, username TEXT, content TEXT)") -db.run("CREATE TABLE warnings (user_id TEXT, username TEXT, time TEXT)") -db.run("CREATE TABLE kicks (user_id TEXT, username TEXT, time TEXT)") -db.run("CREATE TABLE bans (user_id TEXT, username TEXT, time TEXT)") -db.run("CREATE TABLE perm_bans (user_id TEXT, username TEXT, time TEXT)") +var db = new sqlite.Database('tc.db') // tc.db + +db.run(`CREATE TABLE reasons ( + reason TEXT, + point_value INTEGER + )`) + +db.run(`CREATE TABLE logs ( + id INTEGER, + legacy INTEGER, + location TEXT, + time TEXT, + username TEXT, + user_id TEXT, + staff_username TEXT, + staff_id TEXT, + reason TEXT, + points INTEGER, + log_message_id TEXT, + action TEXT, + user_log_num INTEGER + )`) + +db.run(`CREATE TABLE evidence ( + id INTEGER, + location TEXT, + user_log_num INTEGER, + reason TEXT, + time TEXT, + evidence_url TEXT, + user TEXT + )`) + +db.run(`CREATE TABLE comments ( + log_id INTEGER, + time TEXT, + staff TEXT, + staff_id TEXT, + content TEXT + )`) + +db.run(`CREATE TABLE users ( + id TEXT, + legacy_imported INTEGER, + username TEXT, + ign TEXT, + igid TEXT, + logs INTEGER, + points INTEGER, + chat_warnings INTEGER, + chat_kicks INTEGER, + chat_bans INTEGER, + game_warnings INTEGER, + game_kicks INTEGER, + game_bans INTEGER, + gban_status TEXT + )`) + +db.run(`CREATE TABLE appeals ( + location TEXT, + user_id TEXT, + username TEXT, + content TEXT, + status TEXT + )`) + +db.run(`CREATE TABLE warnings (location TEXT, + user_id TEXT, + username TEXT, + time TEXT + )`) + +db.run(`CREATE TABLE kicks ( + location TEXT, + user_id TEXT, + username TEXT, + time TEXT + )`) + +db.run(`CREATE TABLE bans ( + location TEXT, + user_id TEXT, + username TEXT, + time TEXT, + active INTEGER + )`) + +db.run(`CREATE TABLE perm_bans ( + location TEXT, + user_id TEXT, + username TEXT, + time TEXT + )`) + +db.run(`CREATE TABLE staff ( + igid TEXT PRIMARY KEY, + name TEXT, + ign TEXT, + chat_id TEXT, + username TEXT, + role TEXT, + warn_credit INTEGER, + kick_credit INTEGER, + ban_credit INTEGER + )`) + +db.run(`CREATE TABLE settings ( + sv INTEGER PRIMARY KEY AUTOINCREMENT, + experiments INTEGER, + owner TEXT, + prefix TEXT, + token TEXT, + log_channel TEXT, + startup_channel TEXT, + rules_channel TEXT, + default_tz TEXT, + timezone TEXT, + WEBKEY TEXT, + POSTKEY TEXT, + auto_moderate INTEGER, + lowKick1Points INTEGER, + lowBan1Points INTEGER, + lowKick2Points INTEGER, + lowBan2Points INTEGER, + lowKick3Points INTEGER, + lowPermPoints INTEGER, + version TEXT, + rules TEXT, + patch_notes TEXT, + help_message TEXT, + toggles TEXT + )`) + +db.run(`CREATE TABLE sv_loader ( + sv INTEGER, + )`) db.close() -console.log('Database Initialized!') \ No newline at end of file +console.log('DatabaseV2 Initialized!') \ No newline at end of file diff --git a/scripts/legacy/discord.js b/scripts/legacy/discord.js new file mode 100644 index 0000000..70dad0d --- /dev/null +++ b/scripts/legacy/discord.js @@ -0,0 +1,43 @@ +const Discord = require('discord.js') +const client = new Discord.Client() +const config = require('../../src/config.json') +const Moderation = require('../../src/structures/Moderation') +const fs = require('fs') +var c = require('../../src/structures/Settings').load() +const Flatted = require('flatted') + +client.on('ready', () => { + console.log(`Logged in as ${client.user.tag} (${client.user.id})`) + + getData() +}) + +client.login(c.token) + +async function getData(limit = 1000000) { + const sum_messages = []; + let last_id; + + while (true) { + const options = { limit: 100 }; + if (last_id) { + options.before = last_id; + } + + const messages = await client.channels.get(config.old_log_channel).fetchMessages(options); + sum_messages.push(...messages.array()); + last_id = messages.last().id; + + if (messages.size != 100 || sum_messages >= limit) { + break; + } + } + + let data = Flatted.stringify(sum_messages); + + fs.writeFile('discord-logs.json', data, (err) => { + if (err) throw err; + console.log('Legacy chat data written to file'); + client.logout() + }); +} \ No newline at end of file diff --git a/scripts/legacy/discordConvert.js b/scripts/legacy/discordConvert.js new file mode 100644 index 0000000..e86ef3d --- /dev/null +++ b/scripts/legacy/discordConvert.js @@ -0,0 +1,117 @@ +const Discord = require('discord.js') +const client = new Discord.Client() +const Moderation = require('../../src/structures/Moderation') +const data = require('./discord-logs.json') +var c = require('../../src/structures/Settings').load() +const Flatted = require('flatted') + +client.on('ready', () => { + console.log(`Logged in as ${client.user.tag} (${client.user.id})`) + + start() +}) + +async function start() { + var config = require('../../src/structures/Settings').load() + for (messages in Flatted.parse(data)) { + console.log(`${messages.size} logs found.`) + let x = await Moderation.generateLogId() + + messages.map(msg => { + let log = msg['content'] + + // remove all markdown... + // must be ordered like such: + log = log.replace("***", "") + log = log.replace("**", "") + log = log.replace("*", "") + log = log.replace("```", "") + log = log.replace("`", "") + log = log.replace("||", "") + log = log.replace("_", "") + log = log.replace("~~", "") + // split + log = log.split("\n") + + // individual log fields.. + // username & id + let user = log[0].split("Username: ")[1].split("#")[0] + let discriminator = log[0].split("Username: ")[1].split("#")[1].substring(0, 4) + let username = `${user}#${discriminator}` + //console.log(`${username}`) + let id + if (log[0].split("Username: ")[1].split("#")[1].replace("(", "").replace(")", "").substring(5).length > 4) { + id = log[0].split("Username: ")[1].split("#")[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'').substring(4) + + } else if (log[1].length > 4 && log[1].includes("ID") || log[1].includes("Id") || log[1].includes("id") || log[1].includes("(")) { + id = log[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + + } else if (log[2].length > 4 && log[2].includes("ID") || log[2].includes("Id") || log[2].includes("id") || log[2].includes("(")) { + id = log[2].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + } + //console.log(id) + + // Log # + let logNum = log[2].toLowerCase().substring(17) + //console.log(logNum) + + // type of moderation + // we can be flexible with the formatting here since it's just information, + // and isn't required for any performance purposes. + let action = log[4].toLowerCase().substring(20) + //console.log(action) + + // evidence + let evidence = [] + for (i = 0; i < log.length; i++) { + if (log[i].includes("http")) evidence.push(log[i]) + } + //console.log(evidence) + + // explaination + let details = 'unknown' + for (i = 0; i < log.length; i++) { + if (log[i].includes('Explanation')) { + details = log[i] + } else if (log[i].includes('explanation')) { + details = log[i] + } else { + if (!log[i].includes('http') && log[i].includes('Username') && log[i].includes('Moderation Log') && log[i].includes('Evidence') && log[i].includes('ID')) { + details = log[i] + } + } + } + details = details.substring(13) + details = details.replace("***", "") + details = details.replace("**", "") + details = details.replace("*", "") + details = details.replace("```", "") + details = details.replace("`", "") + details = details.replace("||", "") + details = details.replace("_", "") + details = details.replace("~~", "") + //console.log(details) + + //console.log("") + + let date = new Date(msg['createdTimestamp']) + let day = date.toDateString() + let minutes = (date.getMinutes() < 10 ? "0" : "") + date.getMinutes() + let hours = (date.getHours() < 10 ? "0" : "") + date.getHours() + let time = `${hours}:${minutes}` + let datetime = `${day} @ ${time} (${config.timezone})` + + //console.log(datetime) + let staff = `${msg['author']['username']}#${msg['author']['discriminator']}` + let staffId = msg['author']['id'] + + x++ + + //console.log(x) + Moderation.addLogLegacy(x, 'DISCORD', datetime, username, id, staff, staffId, details, msg['id'], action) + console.log(`${messages.size - (x-100)} logs need manual review.`) + }) + } +} + +client.login(c.token) \ No newline at end of file diff --git a/scripts/legacy/game.js b/scripts/legacy/game.js new file mode 100644 index 0000000..a2c4400 --- /dev/null +++ b/scripts/legacy/game.js @@ -0,0 +1,42 @@ +const Discord = require('discord.js') +const client = new Discord.Client() +const config = require('../../src/config.json') +const Moderation = require('../../src/structures/Moderation') +const fs = require('fs') +const Flatted = require('flatted') + +client.on('ready', () => { + console.log(`Logged in as ${client.user.tag} (${client.user.id})`) + + getData() +}) + +client.login(config.token) + +async function getData(limit = 1000000) { + const sum_messages = []; + let last_id; + + while (true) { + const options = { limit: 100 }; + if (last_id) { + options.before = last_id; + } + + const messages = await client.channels.get(config.game_logs).fetchMessages(options); + sum_messages.push(...messages.array()); + last_id = messages.last().id; + + if (messages.size != 100 || sum_messages >= limit) { + break; + } + } + + let data = Flatted.stringify(sum_messages, null, 2); + + fs.writeFile('game-logs.json', data, (err) => { + if (err) throw err; + console.log('Legacy game data written to file'); + client.logout() + }); +} \ No newline at end of file diff --git a/scripts/legacy/gameConvert.js b/scripts/legacy/gameConvert.js new file mode 100644 index 0000000..4849bbf --- /dev/null +++ b/scripts/legacy/gameConvert.js @@ -0,0 +1,116 @@ +const Discord = require('discord.js') +const client = new Discord.Client() +const Moderation = require('../../src/structures/Game') +const data = require('./game-logs.json') +const Flatted = require('flatted') + +client.on('ready', () => { + console.log(`Logged in as ${client.user.tag} (${client.user.id})`) + + start() +}) + +async function start() { + var config = require('../../src/structures/Settings').load() + for (messages in data[0]) { + console.log(`${messages.size} logs found.`) + let x = await Moderation.getIncompleteLogId() + + messages.map(msg => { + let log = msg['content'] + + // remove all markdown... + // must be ordered like such: + log = log.replace("***", "") + log = log.replace("**", "") + log = log.replace("*", "") + log = log.replace("```", "") + log = log.replace("`", "") + log = log.replace("||", "") + log = log.replace("_", "") + log = log.replace("~~", "") + // split + log = log.split("\n") + + // individual log fields.. + // username & id + let user = log[0].split("Username: ")[1].split("#")[0] + let discriminator = log[0].split("Username: ")[1].split("#")[1].substring(0, 4) + let username = `${user}#${discriminator}` + //console.log(`${username}`) + let id + if (log[0].split("Username: ")[1].split("#")[1].replace("(", "").replace(")", "").substring(5).length > 4) { + id = log[0].split("Username: ")[1].split("#")[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'').substring(4) + + } else if (log[1].length > 4 && log[1].includes("ID") || log[1].includes("Id") || log[1].includes("id") || log[1].includes("(")) { + id = log[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + + } else if (log[2].length > 4 && log[2].includes("ID") || log[2].includes("Id") || log[2].includes("id") || log[2].includes("(")) { + id = log[2].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + } + //console.log(id) + + // Log # + let logNum = log[2].toLowerCase().substring(17) + //console.log(logNum) + + // type of moderation + // we can be flexible with the formatting here since it's just information, + // and isn't required for any performance purposes. + let action = log[4].toLowerCase().substring(20) + //console.log(action) + + // evidence + let evidence = [] + for (i = 0; i < log.length; i++) { + if (log[i].includes("http")) evidence.push(log[i]) + } + //console.log(evidence) + + // explaination + let details = 'unknown' + for (i = 0; i < log.length; i++) { + if (log[i].includes('Explanation')) { + details = log[i] + } else if (log[i].includes('explanation')) { + details = log[i] + } else { + if (!log[i].includes('http') && log[i].includes('Username') && log[i].includes('Moderation Log') && log[i].includes('Evidence') && log[i].includes('ID')) { + details = log[i] + } + } + } + details = details.substring(13) + details = details.replace("***", "") + details = details.replace("**", "") + details = details.replace("*", "") + details = details.replace("```", "") + details = details.replace("`", "") + details = details.replace("||", "") + details = details.replace("_", "") + details = details.replace("~~", "") + //console.log(details) + + //console.log("") + + let date = new Date(msg['createdTimestamp']) + let day = date.toDateString() + let minutes = (date.getMinutes() < 10 ? "0" : "") + date.getMinutes() + let hours = (date.getHours() < 10 ? "0" : "") + date.getHours() + let time = `${hours}:${minutes}` + let datetime = `${day} @ ${time} (${config.timezone})` + + //console.log(datetime) + let staff = `${msg['author']['username']}#${msg['author']['discriminator']}` + let staffId = msg['author']['id'] + + x++ + + //console.log(x) + Moderation.addLogLegacy(x, 'GAME', datetime, username, id, staff, staffId, details, msg['id'], action) + console.log(`${messages.size - (x-100)} logs need manual review.`) + }) + } +} + +client.login(config.token) \ No newline at end of file diff --git a/scripts/legacy/test.js b/scripts/legacy/test.js new file mode 100644 index 0000000..da10e94 --- /dev/null +++ b/scripts/legacy/test.js @@ -0,0 +1,166 @@ +const Discord = require('discord.js') +const client = new Discord.Client() +const config = require('../../src/config.json') +const Moderation = require('../../src/structures/Moderation') +const fs = require('fs') +var c = require('../../src/structures/Settings').load() +const Flatted = require('flatted') + +client.on('ready', () => { + console.log(`Logged in as ${client.user.tag} (${client.user.id})`) + + getData() +}) + +client.login(c.token) + +async function getData(limit = 1000000) { + const sum_messages = []; + let last_id; + + while (true) { + const options = { limit: 100 }; + if (last_id) { + options.before = last_id; + } + + const messages = await client.channels.get(config.old_log_channel).fetchMessages(options); + + let x = await Moderation.generateLogId() + + messages.map(msg => { + let log = msg['content'] + + // remove all markdown... + // must be ordered like such: + log = log.replace("***", "") + log = log.replace("**", "") + log = log.replace("*", "") + log = log.replace("```", "") + log = log.replace("`", "") + log = log.replace("||", "") + log = log.replace("_", "") + log = log.replace("~~", "") + // split + log = log.split("\n") + + // individual log fields.. + // username & id + let user + let discriminator + if (log[0].indexOf("Username: ") >= 0) { + user = log[0].split("Username: ")[1].split("#")[0] + if (err) user = "" + if (log[1].length == 5) { + discriminator = log[1].split("#")[1].substring(0, 4) + if (err) discriminator = "" + } + else { + discriminator = log[0].split("Username: ")[1].split("#")[1].substring(0, 4) + if (err) discriminator = "" + } + } + else if (log[0].indexOf("username: ") >= 0) { + user = log[0].split("username: ")[1].split("#")[0] + if (err) user = "" + discriminator = log[0].split("username: ")[1].split("#")[1].substring(0, 4) + if (err) discriminator = "" + } + let username = `${user}#${discriminator}` + //console.log(`${username}`) + let id + if (log[0].indexOf("Username: ") >= 0) { + if (log[0].split("Username: ")[1].split("#")[1].replace("(", "").replace(")", "").substring(5).length > 4) { + id = log[0].split("Username: ")[1].split("#")[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'').substring(4) + if (err) id = "" + + } else if (log[1].length > 4 && log[1].includes("ID") || log[1].includes("Id") || log[1].includes("id") || log[1].includes("(")) { + id = log[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + if (err) id = "" + } else if (log[2].length > 4 && log[2].includes("ID") || log[2].includes("Id") || log[2].includes("id") || log[2].includes("(")) { + id = log[2].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + if (err) id = "" + } + } + else if (log[0].indexOf("username: ") >= 0) { + if (log[0].split("username: ")[1].split("#")[1].replace("(", "").replace(")", "").substring(5).length > 4) { + id = log[0].split("username: ")[1].split("#")[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'').substring(4) + if (err) id = "" + } else if (log[1].length > 4 && log[1].includes("ID") || log[1].includes("Id") || log[1].includes("id") || log[1].includes("(")) { + id = log[1].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + if (err) id = "" + } else if (log[2].length > 4 && log[2].includes("ID") || log[2].includes("Id") || log[2].includes("id") || log[2].includes("(")) { + id = log[2].replace("(", "").replace(")", "").replace("ID:", "").replace("Id:", "").replace("id:", "").replace(/\s/g,'') + if (err) id = "" + } + } + + // Log # + let logNum = log[2].toLowerCase().substring(17) + //console.log(logNum) + + // type of moderation + // we can be flexible with the formatting here since it's just information, + // and isn't required for any performance purposes. + let action = log[4].toLowerCase().substring(20) + //console.log(action) + + // evidence + let evidence = [] + for (i = 0; i < log.length; i++) { + if (log[i].includes("http")) evidence.push(log[i]) + } + //console.log(evidence) + + // explaination + let details = 'unknown' + for (i = 0; i < log.length; i++) { + if (log[i].includes('Explanation')) { + details = log[i] + } else if (log[i].includes('explanation')) { + details = log[i] + } else { + if (!log[i].includes('http') && log[i].includes('Username') && log[i].includes('Moderation Log') && log[i].includes('Evidence') && log[i].includes('ID')) { + details = log[i] + } + } + } + details = details.substring(13) + details = details.replace("***", "") + details = details.replace("**", "") + details = details.replace("*", "") + details = details.replace("```", "") + details = details.replace("`", "") + details = details.replace("||", "") + details = details.replace("_", "") + details = details.replace("~~", "") + //console.log(details) + + //console.log("") + + let date = new Date(msg['createdTimestamp']) + let day = date.toDateString() + let minutes = (date.getMinutes() < 10 ? "0" : "") + date.getMinutes() + let hours = (date.getHours() < 10 ? "0" : "") + date.getHours() + let time = `${hours}:${minutes}` + let datetime = `${day} @ ${time} (${config.timezone})` + + //console.log(datetime) + let staff = `${msg['author']['username']}#${msg['author']['discriminator']}` + let staffId = msg['author']['id'] + + x++ + + //console.log(x) + Moderation.addLogLegacy(x, 'DISCORD', `${datetime}`, `${username}`, `${id}`, `${staff}`, `${staffId}`, `${details}`, `${msg['id']}`, `${action}`) + console.log(`${messages.size - (x-100)} logs need manual review.`) + }) + + sum_messages.push(...messages.array()); + last_id = messages.last().id; + + if (messages.size != 100 || sum_messages >= limit) { + break; + } + } +} \ No newline at end of file diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml deleted file mode 100644 index 4698e59..0000000 --- a/shrinkwrap.yaml +++ /dev/null @@ -1,2380 +0,0 @@ -dependencies: - anyid: 1.0.7 - babel-eslint: 8.2.6 - better-sqlite3: 5.4.1 - chalk: 2.4.2 - cheerio: 1.0.0-rc.3 - discord.js: 11.5.1 - discord.js-commando: 0.9.0 - eslint: 4.19.1 - express: 4.17.1 - flatted: 2.0.1 - moment: 2.24.0 - moment-duration-format: 1.3.0 - q: 1.5.1 - request: 2.88.0 - request-promise: 4.2.4 - serialijse: 0.1.3 - snekfetch: 3.6.4 - spacetime: 5.9.1 - sqlite3: 4.0.9 - touch: 3.1.0 - trello: 0.8.0 - tsubaki: 1.3.1 - underscore: 1.9.1 - winston: 2.4.4 -packages: - /@babel/code-frame/7.0.0-beta.44: - dependencies: - '@babel/highlight': 7.0.0-beta.44 - dev: false - resolution: - integrity: sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== - /@babel/generator/7.0.0-beta.44: - dependencies: - '@babel/types': 7.0.0-beta.44 - jsesc: 2.5.2 - lodash: 4.17.15 - source-map: 0.5.7 - trim-right: 1.0.1 - dev: false - resolution: - integrity: sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== - /@babel/helper-function-name/7.0.0-beta.44: - dependencies: - '@babel/helper-get-function-arity': 7.0.0-beta.44 - '@babel/template': 7.0.0-beta.44 - '@babel/types': 7.0.0-beta.44 - dev: false - resolution: - integrity: sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== - /@babel/helper-get-function-arity/7.0.0-beta.44: - dependencies: - '@babel/types': 7.0.0-beta.44 - dev: false - resolution: - integrity: sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== - /@babel/helper-split-export-declaration/7.0.0-beta.44: - dependencies: - '@babel/types': 7.0.0-beta.44 - dev: false - resolution: - integrity: sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== - /@babel/highlight/7.0.0-beta.44: - dependencies: - chalk: 2.4.2 - esutils: 2.0.3 - js-tokens: 3.0.2 - dev: false - resolution: - integrity: sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== - /@babel/template/7.0.0-beta.44: - dependencies: - '@babel/code-frame': 7.0.0-beta.44 - '@babel/types': 7.0.0-beta.44 - babylon: 7.0.0-beta.44 - lodash: 4.17.15 - dev: false - resolution: - integrity: sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== - /@babel/traverse/7.0.0-beta.44: - dependencies: - '@babel/code-frame': 7.0.0-beta.44 - '@babel/generator': 7.0.0-beta.44 - '@babel/helper-function-name': 7.0.0-beta.44 - '@babel/helper-split-export-declaration': 7.0.0-beta.44 - '@babel/types': 7.0.0-beta.44 - babylon: 7.0.0-beta.44 - debug: 3.2.6 - globals: 11.12.0 - invariant: 2.2.4 - lodash: 4.17.15 - dev: false - resolution: - integrity: sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== - /@babel/types/7.0.0-beta.44: - dependencies: - esutils: 2.0.3 - lodash: 4.17.15 - to-fast-properties: 2.0.0 - dev: false - resolution: - integrity: sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== - /@types/node/12.6.8: - dev: false - resolution: - integrity: sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg== - /abbrev/1.1.1: - dev: false - resolution: - integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - /accepts/1.3.7: - dependencies: - mime-types: 2.1.24 - negotiator: 0.6.2 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - /acorn-jsx/3.0.1: - dependencies: - acorn: 3.3.0 - dev: false - resolution: - integrity: sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - /acorn/3.3.0: - dev: false - engines: - node: '>=0.4.0' - hasBin: true - resolution: - integrity: sha1-ReN/s56No/JbruP/U2niu18iAXo= - /acorn/5.7.3: - dev: false - engines: - node: '>=0.4.0' - hasBin: true - resolution: - integrity: sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - /ajv-keywords/2.1.1/ajv@5.5.2: - dependencies: - ajv: 5.5.2 - dev: false - id: registry.npmjs.org/ajv-keywords/2.1.1 - peerDependencies: - ajv: ^5.0.0 - resolution: - integrity: sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= - /ajv/5.5.2: - dependencies: - co: 4.6.0 - fast-deep-equal: 1.1.0 - fast-json-stable-stringify: 2.0.0 - json-schema-traverse: 0.3.1 - dev: false - resolution: - integrity: sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - /ajv/6.10.2: - dependencies: - fast-deep-equal: 2.0.1 - fast-json-stable-stringify: 2.0.0 - json-schema-traverse: 0.4.1 - uri-js: 4.2.2 - dev: false - resolution: - integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - /ansi-escapes/3.2.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - /ansi-regex/2.1.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - /ansi-regex/3.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - /ansi-styles/2.2.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - /ansi-styles/3.2.1: - dependencies: - color-convert: 1.9.3 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - /anyid/1.0.7: - dependencies: - base-x: 3.0.6 - lodash: 4.17.15 - dev: false - engines: - node: '>=5.0.0' - resolution: - integrity: sha512-YWiRwXDulkatD6FQse2UHU3lEZwsBL5fXx+RDe7MO5he3LcHmuBVtd/ge98Fz5g5Gzk3P9L4ijx+DGAvW9gylQ== - /aproba/1.2.0: - dev: false - resolution: - integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - /are-we-there-yet/1.1.5: - dependencies: - delegates: 1.0.0 - readable-stream: 2.3.6 - dev: false - resolution: - integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - /argparse/1.0.10: - dependencies: - sprintf-js: 1.0.3 - dev: false - resolution: - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - /array-flatten/1.1.1: - dev: false - resolution: - integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - /asn1/0.2.4: - dependencies: - safer-buffer: 2.1.2 - dev: false - resolution: - integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - /assert-plus/1.0.0: - dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - /async-limiter/1.0.0: - dev: false - resolution: - integrity: sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== - /async/1.0.0: - dev: false - resolution: - integrity: sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= - /asynckit/0.4.0: - dev: false - resolution: - integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= - /aws-sign2/0.7.0: - dev: false - resolution: - integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - /aws4/1.8.0: - dev: false - resolution: - integrity: sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - /babel-code-frame/6.26.0: - dependencies: - chalk: 1.1.3 - esutils: 2.0.3 - js-tokens: 3.0.2 - dev: false - resolution: - integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - /babel-eslint/8.2.6: - dependencies: - '@babel/code-frame': 7.0.0-beta.44 - '@babel/traverse': 7.0.0-beta.44 - '@babel/types': 7.0.0-beta.44 - babylon: 7.0.0-beta.44 - eslint-scope: 3.7.1 - eslint-visitor-keys: 1.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== - /babylon/7.0.0-beta.44: - dev: false - engines: - node: '>=4.2.0' - hasBin: true - resolution: - integrity: sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== - /balanced-match/1.0.0: - dev: false - resolution: - integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - /base-x/3.0.6: - dependencies: - safe-buffer: 5.2.0 - dev: false - resolution: - integrity: sha512-4PaF8u2+AlViJxRVjurkLTxpp7CaFRD/jo5rPT9ONnKxyhQ8f59yzamEvq7EkriG56yn5On4ONyaG75HLqr46w== - /bcrypt-pbkdf/1.0.2: - dependencies: - tweetnacl: 0.14.5 - dev: false - resolution: - integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - /better-sqlite3/5.4.1: - dependencies: - integer: 2.1.0 - tar: 4.4.10 - dev: false - requiresBuild: true - resolution: - integrity: sha512-uFIjBdnSbzZT8NEqgH1IuARJaA4wtbJ2VmM/ibxlkY+9a0Z8dlyJZBBeKTg2l8L8fPvfpXearuZbjtr+5x8MiA== - /bluebird/3.5.5: - dev: false - resolution: - integrity: sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== - /body-parser/1.19.0: - dependencies: - bytes: 3.1.0 - content-type: 1.0.4 - debug: 2.6.9 - depd: 1.1.2 - http-errors: 1.7.2 - iconv-lite: 0.4.24 - on-finished: 2.3.0 - qs: 6.7.0 - raw-body: 2.4.0 - type-is: 1.6.18 - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - /boolbase/1.0.0: - dev: false - resolution: - integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24= - /brace-expansion/1.1.11: - dependencies: - balanced-match: 1.0.0 - concat-map: 0.0.1 - dev: false - resolution: - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - /buffer-from/1.1.1: - dev: false - resolution: - integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - /bytes/3.1.0: - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - /caller-path/0.1.0: - dependencies: - callsites: 0.2.0 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - /callsites/0.2.0: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= - /caseless/0.12.0: - dev: false - resolution: - integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - /chalk/1.1.3: - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - /chalk/2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - /chardet/0.4.2: - dev: false - resolution: - integrity: sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - /cheerio/1.0.0-rc.3: - dependencies: - css-select: 1.2.0 - dom-serializer: 0.1.1 - entities: 1.1.2 - htmlparser2: 3.10.1 - lodash: 4.17.15 - parse5: 3.0.3 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== - /chownr/1.1.2: - dev: false - resolution: - integrity: sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== - /circular-json/0.3.3: - deprecated: 'CircularJSON is in maintenance only, flatted is its successor.' - dev: false - resolution: - integrity: sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - /cli-cursor/2.1.0: - dependencies: - restore-cursor: 2.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - /cli-width/2.2.0: - dev: false - resolution: - integrity: sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - /co/4.6.0: - dev: false - engines: - iojs: '>= 1.0.0' - node: '>= 0.12.0' - resolution: - integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - /code-point-at/1.1.0: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - /color-convert/1.9.3: - dependencies: - color-name: 1.1.3 - dev: false - resolution: - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - /color-name/1.1.3: - dev: false - resolution: - integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - /colors/1.0.3: - dev: false - engines: - node: '>=0.1.90' - resolution: - integrity: sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= - /combined-stream/1.0.8: - dependencies: - delayed-stream: 1.0.0 - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - /common-tags/1.8.0: - dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== - /concat-map/0.0.1: - dev: false - resolution: - integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - /concat-stream/1.6.2: - dependencies: - buffer-from: 1.1.1 - inherits: 2.0.4 - readable-stream: 2.3.6 - typedarray: 0.0.6 - dev: false - engines: - '0': node >= 0.8 - resolution: - integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - /console-control-strings/1.1.0: - dev: false - resolution: - integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - /content-disposition/0.5.3: - dependencies: - safe-buffer: 5.1.2 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - /content-type/1.0.4: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - /cookie-signature/1.0.6: - dev: false - resolution: - integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - /cookie/0.4.0: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - /core-util-is/1.0.2: - dev: false - resolution: - integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - /cross-spawn/5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: false - resolution: - integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - /css-select/1.2.0: - dependencies: - boolbase: 1.0.0 - css-what: 2.1.3 - domutils: 1.5.1 - nth-check: 1.0.2 - dev: false - resolution: - integrity: sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - /css-what/2.1.3: - dev: false - resolution: - integrity: sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - /cycle/1.0.3: - dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-IegLK+hYD5i0aPN5QwZisEbDStI= - /dashdash/1.14.1: - dependencies: - assert-plus: 1.0.0 - dev: false - engines: - node: '>=0.10' - resolution: - integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - /debug/2.6.9: - dependencies: - ms: 2.0.0 - dev: false - resolution: - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - /debug/3.2.6: - dependencies: - ms: 2.1.2 - dev: false - resolution: - integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - /deep-extend/0.6.0: - dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - /deep-is/0.1.3: - dev: false - resolution: - integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - /delayed-stream/1.0.0: - dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - /delegates/1.0.0: - dev: false - resolution: - integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - /depd/1.1.2: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - /destroy/1.0.4: - dev: false - resolution: - integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - /detect-libc/1.0.3: - dev: false - engines: - node: '>=0.10' - hasBin: true - resolution: - integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - /discord.js-commando/0.9.0: - dependencies: - common-tags: 1.8.0 - escape-string-regexp: 1.0.5 - require-all: 2.2.0 - dev: false - engines: - node: '>=7.0.0' - peerDependencies: - discord.js: ^10.0.0 || ^11.0.0 - sqlite: ^2.2.0 - resolution: - integrity: sha1-+dz+trjKuMxYXNXMfKbBxKmaLpQ= - /discord.js/11.5.1: - dependencies: - long: 4.0.0 - prism-media: 0.0.3 - snekfetch: 3.6.4 - tweetnacl: 1.0.1 - ws: 6.2.1 - dev: false - engines: - node: '>=6.0.0' - peerDependencies: - '@discordjs/uws': ^10.149.0 - bufferutil: ^4.0.0 - erlpack: discordapp/erlpack - libsodium-wrappers: ^0.7.3 - node-opus: ^0.2.7 - opusscript: ^0.0.6 - sodium: ^2.0.3 - resolution: - integrity: sha512-tGhV5xaZXE3Z+4uXJb3hYM6gQ1NmnSxp9PClcsSAYFVRzH6AJH74040mO3afPDMWEAlj8XsoPXXTJHTxesqcGw== - /doctrine/2.1.0: - dependencies: - esutils: 2.0.3 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - /dom-serializer/0.1.1: - dependencies: - domelementtype: 1.3.1 - entities: 1.1.2 - dev: false - resolution: - integrity: sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - /domelementtype/1.3.1: - dev: false - resolution: - integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - /domhandler/2.4.2: - dependencies: - domelementtype: 1.3.1 - dev: false - resolution: - integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - /domutils/1.5.1: - dependencies: - dom-serializer: 0.1.1 - domelementtype: 1.3.1 - dev: false - resolution: - integrity: sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - /domutils/1.7.0: - dependencies: - dom-serializer: 0.1.1 - domelementtype: 1.3.1 - dev: false - resolution: - integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - /ecc-jsbn/0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: false - resolution: - integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - /ee-first/1.1.1: - dev: false - resolution: - integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - /encodeurl/1.0.2: - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - /entities/1.1.2: - dev: false - resolution: - integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - /es6-promise/3.0.2: - dev: false - resolution: - integrity: sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y= - /escape-html/1.0.3: - dev: false - resolution: - integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - /escape-string-regexp/1.0.5: - dev: false - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - /eslint-scope/3.7.1: - dependencies: - esrecurse: 4.2.1 - estraverse: 4.2.0 - dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= - /eslint-scope/3.7.3: - dependencies: - esrecurse: 4.2.1 - estraverse: 4.2.0 - dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== - /eslint-visitor-keys/1.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== - /eslint/4.19.1: - dependencies: - ajv: 5.5.2 - babel-code-frame: 6.26.0 - chalk: 2.4.2 - concat-stream: 1.6.2 - cross-spawn: 5.1.0 - debug: 3.2.6 - doctrine: 2.1.0 - eslint-scope: 3.7.3 - eslint-visitor-keys: 1.0.0 - espree: 3.5.4 - esquery: 1.0.1 - esutils: 2.0.3 - file-entry-cache: 2.0.0 - functional-red-black-tree: 1.0.1 - glob: 7.1.4 - globals: 11.12.0 - ignore: 3.3.10 - imurmurhash: 0.1.4 - inquirer: 3.3.0 - is-resolvable: 1.1.0 - js-yaml: 3.13.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.15 - minimatch: 3.0.4 - mkdirp: 0.5.1 - natural-compare: 1.4.0 - optionator: 0.8.2 - path-is-inside: 1.0.2 - pluralize: 7.0.0 - progress: 2.0.3 - regexpp: 1.1.0 - require-uncached: 1.0.3 - semver: 5.7.0 - strip-ansi: 4.0.0 - strip-json-comments: 2.0.1 - table: 4.0.2 - text-table: 0.2.0 - dev: false - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== - /espree/3.5.4: - dependencies: - acorn: 5.7.3 - acorn-jsx: 3.0.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== - /esprima/4.0.1: - dev: false - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - /esquery/1.0.1: - dependencies: - estraverse: 4.2.0 - dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - /esrecurse/4.2.1: - dependencies: - estraverse: 4.2.0 - dev: false - engines: - node: '>=4.0' - resolution: - integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - /estraverse/4.2.0: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= - /esutils/2.0.3: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - /etag/1.8.1: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - /express/4.17.1: - dependencies: - accepts: 1.3.7 - array-flatten: 1.1.1 - body-parser: 1.19.0 - content-disposition: 0.5.3 - content-type: 1.0.4 - cookie: 0.4.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 1.1.2 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.1.2 - fresh: 0.5.2 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.3.0 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.5 - qs: 6.7.0 - range-parser: 1.2.1 - safe-buffer: 5.1.2 - send: 0.17.1 - serve-static: 1.14.1 - setprototypeof: 1.1.1 - statuses: 1.5.0 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - dev: false - engines: - node: '>= 0.10.0' - resolution: - integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - /extend/3.0.2: - dev: false - resolution: - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - /external-editor/2.2.0: - dependencies: - chardet: 0.4.2 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: false - engines: - node: '>=0.12' - resolution: - integrity: sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - /extsprintf/1.3.0: - dev: false - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - /extsprintf/1.4.0: - dev: false - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - /eyes/0.1.8: - dev: false - engines: - node: '> 0.1.90' - resolution: - integrity: sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - /fast-deep-equal/1.1.0: - dev: false - resolution: - integrity: sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - /fast-deep-equal/2.0.1: - dev: false - resolution: - integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - /fast-json-stable-stringify/2.0.0: - dev: false - resolution: - integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - /fast-levenshtein/2.0.6: - dev: false - resolution: - integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - /figures/2.0.0: - dependencies: - escape-string-regexp: 1.0.5 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - /file-entry-cache/2.0.0: - dependencies: - flat-cache: 1.3.4 - object-assign: 4.1.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - /finalhandler/1.1.2: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - /flat-cache/1.3.4: - dependencies: - circular-json: 0.3.3 - graceful-fs: 4.2.0 - rimraf: 2.6.3 - write: 0.2.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== - /flatted/2.0.1: - dev: false - resolution: - integrity: sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== - /forever-agent/0.6.1: - dev: false - resolution: - integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - /form-data/2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.24 - dev: false - engines: - node: '>= 0.12' - resolution: - integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - /forwarded/0.1.2: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - /fresh/0.5.2: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - /fs-minipass/1.2.6: - dependencies: - minipass: 2.3.5 - dev: false - resolution: - integrity: sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== - /fs.realpath/1.0.0: - dev: false - resolution: - integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - /functional-red-black-tree/1.0.1: - dev: false - resolution: - integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - /gauge/2.7.4: - dependencies: - aproba: 1.2.0 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.2 - string-width: 1.0.2 - strip-ansi: 3.0.1 - wide-align: 1.1.3 - dev: false - resolution: - integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - /getpass/0.1.7: - dependencies: - assert-plus: 1.0.0 - dev: false - resolution: - integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - /glob/7.1.4: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.0.4 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - resolution: - integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - /globals/11.12.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - /graceful-fs/4.2.0: - dev: false - resolution: - integrity: sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== - /har-schema/2.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - /har-validator/5.1.3: - dependencies: - ajv: 6.10.2 - har-schema: 2.0.0 - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - /has-ansi/2.0.0: - dependencies: - ansi-regex: 2.1.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - /has-flag/3.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - /has-unicode/2.0.1: - dev: false - resolution: - integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - /htmlparser2/3.10.1: - dependencies: - domelementtype: 1.3.1 - domhandler: 2.4.2 - domutils: 1.7.0 - entities: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.4.0 - dev: false - resolution: - integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - /http-errors/1.7.2: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.1 - statuses: 1.5.0 - toidentifier: 1.0.0 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - /http-errors/1.7.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.1.1 - statuses: 1.5.0 - toidentifier: 1.0.0 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - /http-signature/1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.1 - sshpk: 1.16.1 - dev: false - engines: - node: '>=0.8' - npm: '>=1.3.7' - resolution: - integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - /iconv-lite/0.2.11: - dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha1-HOYKOleGSiktEyH/RgnKS7llrcg= - /iconv-lite/0.4.24: - dependencies: - safer-buffer: 2.1.2 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - /ignore-walk/3.0.1: - dependencies: - minimatch: 3.0.4 - dev: false - resolution: - integrity: sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - /ignore/3.3.10: - dev: false - resolution: - integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - /imurmurhash/0.1.4: - dev: false - engines: - node: '>=0.8.19' - resolution: - integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= - /inflight/1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: false - resolution: - integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - /inherits/2.0.3: - dev: false - resolution: - integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - /inherits/2.0.4: - dev: false - resolution: - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - /ini/1.3.5: - dev: false - resolution: - integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - /inquirer/3.3.0: - dependencies: - ansi-escapes: 3.2.0 - chalk: 2.4.2 - cli-cursor: 2.1.0 - cli-width: 2.2.0 - external-editor: 2.2.0 - figures: 2.0.0 - lodash: 4.17.15 - mute-stream: 0.0.7 - run-async: 2.3.0 - rx-lite: 4.0.8 - rx-lite-aggregates: 4.0.8 - string-width: 2.1.1 - strip-ansi: 4.0.0 - through: 2.3.8 - dev: false - resolution: - integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - /integer/2.1.0: - dev: false - requiresBuild: true - resolution: - integrity: sha512-vBtiSgrEiNocWvvZX1RVfeOKa2mCHLZQ2p9nkQkQZ/BvEiY+6CcUz0eyjvIiewjJoeNidzg2I+tpPJvpyspL1w== - /invariant/2.2.4: - dependencies: - loose-envify: 1.4.0 - dev: false - resolution: - integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - /ipaddr.js/1.9.0: - dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== - /is-fullwidth-code-point/1.0.0: - dependencies: - number-is-nan: 1.0.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - /is-fullwidth-code-point/2.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - /is-promise/2.1.0: - dev: false - resolution: - integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - /is-resolvable/1.1.0: - dev: false - resolution: - integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - /is-typedarray/1.0.0: - dev: false - resolution: - integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - /isarray/1.0.0: - dev: false - resolution: - integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - /isexe/2.0.0: - dev: false - resolution: - integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - /isstream/0.1.2: - dev: false - resolution: - integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - /js-tokens/3.0.2: - dev: false - resolution: - integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls= - /js-tokens/4.0.0: - dev: false - resolution: - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - /js-yaml/3.13.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false - hasBin: true - resolution: - integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - /jsbn/0.1.1: - dev: false - resolution: - integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - /jsesc/2.5.2: - dev: false - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - /json-schema-traverse/0.3.1: - dev: false - resolution: - integrity: sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - /json-schema-traverse/0.4.1: - dev: false - resolution: - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - /json-schema/0.2.3: - dev: false - resolution: - integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - /json-stable-stringify-without-jsonify/1.0.1: - dev: false - resolution: - integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - /json-stringify-safe/5.0.1: - dev: false - resolution: - integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - /jsprim/1.4.1: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.2.3 - verror: 1.10.0 - dev: false - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - /levn/0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - /lodash/4.17.15: - dev: false - resolution: - integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - /long/4.0.0: - dev: false - resolution: - integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - /loose-envify/1.4.0: - dependencies: - js-tokens: 4.0.0 - dev: false - hasBin: true - resolution: - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - /lru-cache/4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: false - resolution: - integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - /media-typer/0.3.0: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - /merge-descriptors/1.0.1: - dev: false - resolution: - integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - /methods/1.1.2: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - /mime-db/1.40.0: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== - /mime-types/2.1.24: - dependencies: - mime-db: 1.40.0 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== - /mime/1.6.0: - dev: false - engines: - node: '>=4' - hasBin: true - resolution: - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - /mimic-fn/1.2.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - /minimatch/3.0.4: - dependencies: - brace-expansion: 1.1.11 - dev: false - resolution: - integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - /minimist/0.0.8: - dev: false - resolution: - integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - /minimist/1.2.0: - dev: false - resolution: - integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - /minipass/2.3.5: - dependencies: - safe-buffer: 5.2.0 - yallist: 3.0.3 - dev: false - resolution: - integrity: sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== - /minizlib/1.2.1: - dependencies: - minipass: 2.3.5 - dev: false - resolution: - integrity: sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== - /mkdirp/0.5.1: - dependencies: - minimist: 0.0.8 - dev: false - hasBin: true - resolution: - integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - /moment-duration-format/1.3.0: - dev: false - resolution: - integrity: sha1-VBdxtfh6BJzGVUBHXTrZZnN9aQg= - /moment/2.24.0: - dev: false - resolution: - integrity: sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== - /ms/2.0.0: - dev: false - resolution: - integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - /ms/2.1.1: - dev: false - resolution: - integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - /ms/2.1.2: - dev: false - resolution: - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - /mute-stream/0.0.7: - dev: false - resolution: - integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - /nan/2.14.0: - dev: false - resolution: - integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - /natural-compare/1.4.0: - dev: false - resolution: - integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - /needle/2.4.0: - dependencies: - debug: 3.2.6 - iconv-lite: 0.4.24 - sax: 1.2.4 - dev: false - engines: - node: '>= 4.4.x' - hasBin: true - resolution: - integrity: sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - /negotiator/0.6.2: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - /node-pre-gyp/0.11.0: - dependencies: - detect-libc: 1.0.3 - mkdirp: 0.5.1 - needle: 2.4.0 - nopt: 4.0.1 - npm-packlist: 1.4.4 - npmlog: 4.1.2 - rc: 1.2.8 - rimraf: 2.6.3 - semver: 5.7.0 - tar: 4.4.10 - dev: false - hasBin: true - resolution: - integrity: sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== - /nopt/1.0.10: - dependencies: - abbrev: 1.1.1 - dev: false - hasBin: true - resolution: - integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - /nopt/4.0.1: - dependencies: - abbrev: 1.1.1 - osenv: 0.1.5 - dev: false - hasBin: true - resolution: - integrity: sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - /npm-bundled/1.0.6: - dev: false - resolution: - integrity: sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - /npm-packlist/1.4.4: - dependencies: - ignore-walk: 3.0.1 - npm-bundled: 1.0.6 - dev: false - resolution: - integrity: sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== - /npmlog/4.1.2: - dependencies: - are-we-there-yet: 1.1.5 - console-control-strings: 1.1.0 - gauge: 2.7.4 - set-blocking: 2.0.0 - dev: false - resolution: - integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - /nth-check/1.0.2: - dependencies: - boolbase: 1.0.0 - dev: false - resolution: - integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - /number-is-nan/1.0.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - /oauth-sign/0.9.0: - dev: false - resolution: - integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - /object-assign/4.1.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - /on-finished/2.3.0: - dependencies: - ee-first: 1.1.1 - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - /once/1.4.0: - dependencies: - wrappy: 1.0.2 - dev: false - resolution: - integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - /onetime/2.0.1: - dependencies: - mimic-fn: 1.2.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - /optionator/0.8.2: - dependencies: - deep-is: 0.1.3 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - wordwrap: 1.0.0 - dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - /os-homedir/1.0.2: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - /os-tmpdir/1.0.2: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - /osenv/0.1.5: - dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - dev: false - resolution: - integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - /parse5/3.0.3: - dependencies: - '@types/node': 12.6.8 - dev: false - resolution: - integrity: sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== - /parseurl/1.3.3: - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - /path-is-absolute/1.0.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - /path-is-inside/1.0.2: - dev: false - resolution: - integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - /path-to-regexp/0.1.7: - dev: false - resolution: - integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - /performance-now/2.1.0: - dev: false - resolution: - integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - /pluralize/7.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - /prelude-ls/1.1.2: - dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - /prism-media/0.0.3: - dev: false - resolution: - integrity: sha512-c9KkNifSMU/iXT8FFTaBwBMr+rdVcN+H/uNv1o+CuFeTThNZNTOrQ+RgXA1yL/DeLk098duAeRPP3QNPNbhxYQ== - /process-nextick-args/2.0.1: - dev: false - resolution: - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - /progress/2.0.3: - dev: false - engines: - node: '>=0.4.0' - resolution: - integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - /proxy-addr/2.0.5: - dependencies: - forwarded: 0.1.2 - ipaddr.js: 1.9.0 - dev: false - engines: - node: '>= 0.10' - resolution: - integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== - /pseudomap/1.0.2: - dev: false - resolution: - integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - /psl/1.2.0: - dev: false - resolution: - integrity: sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA== - /punycode/1.4.1: - dev: false - resolution: - integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4= - /punycode/2.1.1: - dev: false - engines: - node: '>=6' - resolution: - integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - /q/1.5.1: - dev: false - engines: - node: '>=0.6.0' - teleport: '>=0.2.0' - resolution: - integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - /qs/1.2.0: - dev: false - resolution: - integrity: sha1-7Qeb4oaCFH5v2aNMwrDB4OxkU+4= - /qs/6.5.2: - dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - /qs/6.7.0: - dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - /range-parser/1.2.1: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - /raw-body/2.4.0: - dependencies: - bytes: 3.1.0 - http-errors: 1.7.2 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - /rc/1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.5 - minimist: 1.2.0 - strip-json-comments: 2.0.1 - dev: false - hasBin: true - resolution: - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - /readable-stream/2.3.6: - dependencies: - core-util-is: 1.0.2 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false - resolution: - integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - /readable-stream/3.4.0: - dependencies: - inherits: 2.0.4 - string_decoder: 1.2.0 - util-deprecate: 1.0.2 - dev: false - engines: - node: '>= 6' - resolution: - integrity: sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== - /regexpp/1.1.0: - dev: false - engines: - node: '>=4.0.0' - resolution: - integrity: sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== - /request-promise-core/1.1.2: - dependencies: - lodash: 4.17.15 - dev: false - engines: - node: '>=0.10.0' - peerDependencies: - request: ^2.34 - resolution: - integrity: sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== - /request-promise/4.2.4: - dependencies: - bluebird: 3.5.5 - request-promise-core: 1.1.2 - stealthy-require: 1.1.1 - tough-cookie: 2.5.0 - dev: false - engines: - node: '>=0.10.0' - peerDependencies: - request: ^2.34 - resolution: - integrity: sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg== - /request/2.88.0: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.8.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.3 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.24 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.2 - safe-buffer: 5.2.0 - tough-cookie: 2.4.3 - tunnel-agent: 0.6.0 - uuid: 3.3.2 - dev: false - engines: - node: '>= 4' - resolution: - integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - /require-all/2.2.0: - dev: false - resolution: - integrity: sha1-tEIMIzrAKC0P9Jsnf7iAqLXeCJQ= - /require-uncached/1.0.3: - dependencies: - caller-path: 0.1.0 - resolve-from: 1.0.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - /resolve-from/1.0.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - /restler/3.3.0: - dependencies: - iconv-lite: 0.2.11 - qs: 1.2.0 - xml2js: 0.4.0 - yaml: 0.2.3 - dev: false - engines: - node: '>= 0.10.x' - resolution: - integrity: sha1-+TpZteG8LFrQwrlz94EpshgbYHY= - /restore-cursor/2.0.0: - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.2 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - /rimraf/2.6.3: - dependencies: - glob: 7.1.4 - dev: false - hasBin: true - resolution: - integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - /run-async/2.3.0: - dependencies: - is-promise: 2.1.0 - dev: false - engines: - node: '>=0.12.0' - resolution: - integrity: sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - /rx-lite-aggregates/4.0.8: - dependencies: - rx-lite: 4.0.8 - dev: false - resolution: - integrity: sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - /rx-lite/4.0.8: - dev: false - resolution: - integrity: sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - /safe-buffer/5.1.2: - dev: false - resolution: - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - /safe-buffer/5.2.0: - dev: false - resolution: - integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - /safer-buffer/2.1.2: - dev: false - resolution: - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - /sax/0.5.8: - dev: false - resolution: - integrity: sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= - /sax/1.2.4: - dev: false - resolution: - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - /semver/5.7.0: - dev: false - hasBin: true - resolution: - integrity: sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - /send/0.17.1: - dependencies: - debug: 2.6.9 - depd: 1.1.2 - destroy: 1.0.4 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 1.7.3 - mime: 1.6.0 - ms: 2.1.1 - on-finished: 2.3.0 - range-parser: 1.2.1 - statuses: 1.5.0 - dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - /serialijse/0.1.3: - dev: false - engines: - node: '>=4.0' - optionalDependencies: - object-assign: 4.1.1 - zlib: 1.0.5 - resolution: - integrity: sha512-Ra9NpfBmQqfefQjte6fjk3KXOvkK8oiCfRhui9wIehkAwAu+sVYymQzwJ1xkSpWjqey4a3pcCa/ugB3vMWoEmw== - /serve-static/1.14.1: - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.17.1 - dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - /set-blocking/2.0.0: - dev: false - resolution: - integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - /setprototypeof/1.1.1: - dev: false - resolution: - integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - /shebang-command/1.2.0: - dependencies: - shebang-regex: 1.0.0 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - /shebang-regex/1.0.0: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - /signal-exit/3.0.2: - dev: false - resolution: - integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - /slice-ansi/1.0.0: - dependencies: - is-fullwidth-code-point: 2.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - /snekfetch/3.6.4: - deprecated: use node-fetch instead - dev: false - resolution: - integrity: sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw== - /source-map/0.5.7: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - /spacetime/5.9.1: - dev: false - resolution: - integrity: sha512-wOO5jCQj2+RY2YkhnA0JFnd2aFuHGRuGp0k1EpdpU4aknfULy9yGh5ccDPsYHDRzBPLq926/655bSQgsKQRXYQ== - /sprintf-js/1.0.3: - dev: false - resolution: - integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - /sqlite3/4.0.9: - dependencies: - nan: 2.14.0 - node-pre-gyp: 0.11.0 - request: 2.88.0 - dev: false - requiresBuild: true - resolution: - integrity: sha512-IkvzjmsWQl9BuBiM4xKpl5X8WCR4w0AeJHRdobCdXZ8dT/lNc1XS6WqvY35N6+YzIIgzSBeY5prdFObID9F9tA== - /sshpk/1.16.1: - dependencies: - asn1: 0.2.4 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: false - engines: - node: '>=0.10.0' - hasBin: true - resolution: - integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - /stack-trace/0.0.10: - dev: false - resolution: - integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - /statuses/1.5.0: - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - /stealthy-require/1.1.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - /string-width/1.0.2: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - /string-width/2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - /string_decoder/1.1.1: - dependencies: - safe-buffer: 5.1.2 - dev: false - resolution: - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - /string_decoder/1.2.0: - dependencies: - safe-buffer: 5.1.2 - dev: false - resolution: - integrity: sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== - /strip-ansi/3.0.1: - dependencies: - ansi-regex: 2.1.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - /strip-ansi/4.0.0: - dependencies: - ansi-regex: 3.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= - /strip-json-comments/2.0.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= - /supports-color/2.0.0: - dev: false - engines: - node: '>=0.8.0' - resolution: - integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - /supports-color/5.5.0: - dependencies: - has-flag: 3.0.0 - dev: false - engines: - node: '>=4' - resolution: - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - /table/4.0.2: - dependencies: - ajv: 5.5.2 - ajv-keywords: /ajv-keywords/2.1.1/ajv@5.5.2 - chalk: 2.4.2 - lodash: 4.17.15 - slice-ansi: 1.0.0 - string-width: 2.1.1 - dev: false - resolution: - integrity: sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== - /tar/4.4.10: - dependencies: - chownr: 1.1.2 - fs-minipass: 1.2.6 - minipass: 2.3.5 - minizlib: 1.2.1 - mkdirp: 0.5.1 - safe-buffer: 5.2.0 - yallist: 3.0.3 - dev: false - engines: - node: '>=4.5' - resolution: - integrity: sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== - /text-table/0.2.0: - dev: false - resolution: - integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - /through/2.3.8: - dev: false - resolution: - integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - /tmp/0.0.33: - dependencies: - os-tmpdir: 1.0.2 - dev: false - engines: - node: '>=0.6.0' - resolution: - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - /to-fast-properties/2.0.0: - dev: false - engines: - node: '>=4' - resolution: - integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - /toidentifier/1.0.0: - dev: false - engines: - node: '>=0.6' - resolution: - integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - /touch/3.1.0: - dependencies: - nopt: 1.0.10 - dev: false - hasBin: true - resolution: - integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - /tough-cookie/2.4.3: - dependencies: - psl: 1.2.0 - punycode: 1.4.1 - dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - /tough-cookie/2.5.0: - dependencies: - psl: 1.2.0 - punycode: 2.1.1 - dev: false - engines: - node: '>=0.8' - resolution: - integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - /trello/0.8.0: - dependencies: - es6-promise: 3.0.2 - object-assign: 4.1.1 - restler: 3.3.0 - dev: false - engines: - node: '>= 0.10.x' - resolution: - integrity: sha1-AGFJWTDhxOFWX1TVd46rFghkJgI= - /trim-right/1.0.1: - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - /tsubaki/1.3.1: - dev: false - engines: - node: '>=6' - resolution: - integrity: sha1-b2kEZSjHqwYeZ4YuDyqxbNZ3POo= - /tunnel-agent/0.6.0: - dependencies: - safe-buffer: 5.2.0 - dev: false - resolution: - integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - /tweetnacl/0.14.5: - dev: false - resolution: - integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - /tweetnacl/1.0.1: - dev: false - resolution: - integrity: sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A== - /type-check/0.3.2: - dependencies: - prelude-ls: 1.1.2 - dev: false - engines: - node: '>= 0.8.0' - resolution: - integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - /type-is/1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.24 - dev: false - engines: - node: '>= 0.6' - resolution: - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - /typedarray/0.0.6: - dev: false - resolution: - integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - /underscore/1.9.1: - dev: false - resolution: - integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - /unpipe/1.0.0: - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - /uri-js/4.2.2: - dependencies: - punycode: 2.1.1 - dev: false - resolution: - integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - /util-deprecate/1.0.2: - dev: false - resolution: - integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - /utils-merge/1.0.1: - dev: false - engines: - node: '>= 0.4.0' - resolution: - integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - /uuid/3.3.2: - dev: false - hasBin: true - resolution: - integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - /vary/1.1.2: - dev: false - engines: - node: '>= 0.8' - resolution: - integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - /verror/1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.0 - dev: false - engines: - '0': node >=0.6.0 - resolution: - integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - /which/1.3.1: - dependencies: - isexe: 2.0.0 - dev: false - hasBin: true - resolution: - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - /wide-align/1.1.3: - dependencies: - string-width: 2.1.1 - dev: false - resolution: - integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - /winston/2.4.4: - dependencies: - async: 1.0.0 - colors: 1.0.3 - cycle: 1.0.3 - eyes: 0.1.8 - isstream: 0.1.2 - stack-trace: 0.0.10 - dev: false - engines: - node: '>= 0.10.0' - resolution: - integrity: sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q== - /wordwrap/1.0.0: - dev: false - resolution: - integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - /wrappy/1.0.2: - dev: false - resolution: - integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - /write/0.2.1: - dependencies: - mkdirp: 0.5.1 - dev: false - engines: - node: '>=0.10.0' - resolution: - integrity: sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - /ws/6.2.1: - dependencies: - async-limiter: 1.0.0 - dev: false - resolution: - integrity: sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - /xml2js/0.4.0: - dependencies: - sax: 0.5.8 - xmlbuilder: 13.0.2 - dev: false - resolution: - integrity: sha1-Ek/EEUtBKcgQgA7LKshs8lRiy5o= - /xmlbuilder/13.0.2: - dev: false - engines: - node: '>=6.0' - resolution: - integrity: sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== - /yallist/2.1.2: - dev: false - resolution: - integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - /yallist/3.0.3: - dev: false - resolution: - integrity: sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== - /yaml/0.2.3: - dev: false - resolution: - integrity: sha1-tUUOkudu82td0k42YAkeuu7z5cc= - /zlib/1.0.5: - dev: false - engines: - node: '>=0.2.0' - optional: true - resolution: - integrity: sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA= -registry: 'https://registry.npmjs.org/' -shrinkwrapMinorVersion: 9 -shrinkwrapVersion: 3 -specifiers: - anyid: ^1.0.1 - babel-eslint: ^8.1.2 - better-sqlite3: ^5.4.0 - chalk: ^2.0.1 - cheerio: ^1.0.0-rc.2 - discord.js: ^11.2.1 - discord.js-commando: ^0.9.0 - eslint: ^4.14.0 - express: ^4.17.1 - flatted: ^2.0.1 - moment: ^2.24.0 - moment-duration-format: ^1.3.0 - q: ^1.5.0 - request: ^2.88.0 - request-promise: ^4.2.4 - serialijse: ^0.1.3 - snekfetch: ^3.2.3 - spacetime: ^5.9.0 - sqlite3: ^4.0.9 - touch: ^3.1.0 - trello: ^0.8.0 - tsubaki: ^1.1.1 - underscore: ^1.8.3 - winston: ^2.3.1 diff --git a/src/assets/Adonis/.gitignore b/src/assets/Adonis/.gitignore new file mode 100644 index 0000000..f606ba6 --- /dev/null +++ b/src/assets/Adonis/.gitignore @@ -0,0 +1,3 @@ + +README.md +README.md diff --git a/src/assets/Adonis/Client/Client.lua b/src/assets/Adonis/Client/Client.lua new file mode 100644 index 0000000..082d70f --- /dev/null +++ b/src/assets/Adonis/Client/Client.lua @@ -0,0 +1,489 @@ +------------------- +-- Adonis Client -- +------------------- + +math.randomseed(os.time()) + +--// Loccalllsssss +local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay, spawn = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay, spawn; +local unique = {} +local origEnv = getfenv(); setfenv(1,setmetatable({}, {__metatable = unique})) +local origWarn = warn +local startTime = tick() +local clientLocked = false +local oldInstNew = Instance.new +local oldReq = require +local Folder = nil +local locals = {} +local client = {} +local Queues = {} +local service = {} +local RbxEvents = {} +local Debounces = {} +local LoopQueue = {} +local RealMethods = {} +local RunningLoops = {} +local HookedEvents = {} +local WaitingEvents = {} +local ServiceSpecific = {} +local ServiceVariables = {} +local function isModule(module) for ind,modu in next,client.Modules do if rawequal(module, modu) then return true end end end +local function logError(err) warn("ERROR:"..tostring(err)) if client and client.Remote then client.Remote.Send("LogError",err) end end +local message = function(...) game:GetService("TestService"):Message(...) end +local print = function(...) for i,v in next,{...}do print(':: Adonis :: '..tostring(v)) end end +local warn = function(...) for i,v in next,{...}do warn(tostring(v)) end end +local cPcall = function(func,...) local function cour(...) coroutine.resume(coroutine.create(func),...) end local ran,error=pcall(cour,...) if error then print(error) logError(error) warn('ERROR :: '..error) end end +local Pcall = function(func,...) local ran,error=pcall(func,...) if error then logError(error) end end +local Routine = function(func,...) coroutine.resume(coroutine.create(func),...) end +local sortedPairs = function(t, f) local a = {} for n in next,t do table.insert(a, n) end table.sort(a, f) local i = 0 local iter = function () i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end +local player = game:GetService("Players").LocalPlayer +local Fire, Detected +local wrap = coroutine.wrap +local Kill = function(info) + --if true then print(info or "SOMETHING TRIED TO CRASH CLIENT?") return end + wrap(function() pcall(function() + if Detected then + Detected("kick", info) + elseif Fire then + Fire("BadMemes", info) + end + end) end)() + + wrap(function() pcall(function() + wait(1) + service.Player:Kick(info) + end) end)() + + wrap(function() pcall(function() + wait(5) + while true do + pcall(spawn,function() + spawn(Kill) + -- memes + end) + end + end) end)() +end; + +local GetEnv; GetEnv = function(env, repl) + local scriptEnv = setmetatable({},{ + __index = function(tab,ind) + return (locals[ind] or (env or origEnv)[ind]) + end; + + __metatable = unique; + }) + + if repl and type(repl)=="table" then + for ind, val in next,repl do + scriptEnv[ind] = val + end + end + + return scriptEnv +end; + +local LoadModule = function(plugin, yield, envVars) + local plug = require(plugin) + if type(plug) == "function" then + if yield then + --Pcall(setfenv(plug,GetEnv(getfenv(plug), envVars))) + local ran,err = service.TrackTask("Plugin: ".. tostring(plugin), setfenv(plug, GetEnv(getfenv(plug), envVars))) + if not ran then + warn("Module encountered an error while loading: "..tostring(plugin)) + warn(tostring(err)) + end + else + --service.Threads.RunTask("PLUGIN: "..tostring(plugin),setfenv(plug,GetEnv(getfenv(plug), envVars))) + local ran,err = service.TrackTask("Thread: Plugin: ".. tostring(plugin), setfenv(plug, GetEnv(getfenv(plug), envVars))) + if not ran then + warn("Module encountered an error while loading: "..tostring(plugin)) + warn(tostring(err)) + end + end + else + client[plugin.Name] = plug + end +end; + +client = { + Handlers = {}; + Modules = {}; + Service = service; + Module = script; + Print = print; + Warn = warn; + Deps = {}; + Pcall = Pcall; + cPcall = cPcall; + Routine = Routine; + LogError = logError; + TestEvent = Instance.new("RemoteEvent"); + + Disconnect = function(info) + service.Player:Kick(info or "Disconnected from server") + wait(30) + client.Kill(info) + end; + + Kill = Kill; +}; + +locals = { + Pcall = Pcall; + Folder = Folder; + GetEnv = GetEnv; + cPcall = cPcall; + client = client; + Routine = Routine; + service = service; + logError = logError; + sortedPairs = sortedPairs; + origEnv = origEnv; +} + +service = setfenv(require(script.Parent.Core.Service), GetEnv(nil, {client = client}))(function(eType, msg, desc, ...) + local extra = {...} + if eType == "MethodError" and service.Detected then + Kill("Shananigans denied") + --player:Kick("Method error") + --service.Detected("kick", "Method change detected") + elseif eType == "ServerError" then + logError("Client", msg) + elseif eType == "ReadError" then + --message("===== READ ERROR:::::::") + --message(tostring(msg)) + --message(tostring(desc)) + --message(" ") + + Kill(tostring(msg)) + --if Detected then + -- Detected("log", tostring(msg)) + --end + end +end, function(c, parent, tab) + if not isModule(c) and c ~= script and c ~= Folder and parent == nil then + tab.UnHook() + end +end, ServiceSpecific) + +--// Localize +os = service.Localize(os) +math = service.Localize(math) +table = service.Localize(table) +string = service.Localize(string) +coroutine = service.Localize(coroutine) +Instance = service.Localize(Instance) +Vector2 = service.Localize(Vector2) +Vector3 = service.Localize(Vector3) +CFrame = service.Localize(CFrame) +UDim2 = service.Localize(UDim2) +UDim = service.Localize(UDim) +Ray = service.Localize(Ray) +Rect = service.Localize(Rect) +Faces = service.Localize(Faces) +Color3 = service.Localize(Color3) +NumberRange = service.Localize(NumberRange) +NumberSequence = service.Localize(NumberSequence) +NumberSequenceKeypoint = service.Localize(NumberSequenceKeypoint) +ColorSequenceKeypoint = service.Localize(ColorSequenceKeypoint) +PhysicalProperties = service.Localize(PhysicalProperties) +ColorSequence = service.Localize(ColorSequence) +Region3int16 = service.Localize(Region3int16) +Vector3int16 = service.Localize(Vector3int16) +BrickColor = service.Localize(BrickColor) +TweenInfo = service.Localize(TweenInfo) +Axes = service.Localize(Axes) + +--// Wrap +for i,val in next,service do if type(val) == "userdata" then service[i] = service.Wrap(val, true) end end +pcall(function() return service.Player.Kick end) +script = service.Wrap(script, true) +Enum = service.Wrap(Enum, true) +game = service.Wrap(game, true) +rawequal = service.RawEqual +workspace = service.Wrap(workspace, true) +Instance = {new = function(obj, parent) return service.Wrap(oldInstNew(obj, service.UnWrap(parent)), true) end} +require = function(obj) return service.Wrap(oldReq(service.UnWrap(obj)), true) end +client.Service = service +client.Module = service.Wrap(client.Module, true) + +--// Setting things up +for ind,loc in next,{ + _G = _G; + game = game; + spawn = spawn; + script = script; + getfenv = getfenv; + setfenv = setfenv; + workspace = workspace; + getmetatable = getmetatable; + setmetatable = setmetatable; + loadstring = loadstring; + coroutine = coroutine; + rawequal = rawequal; + typeof = typeof; + print = print; + math = math; + warn = warn; + error = error; + pcall = pcall; + xpcall = xpcall; + select = select; + rawset = rawset; + rawget = rawget; + ipairs = ipairs; + pairs = pairs; + next = next; + Rect = Rect; + Axes = Axes; + os = os; + tick = tick; + Faces = Faces; + delay = delay; + unpack = unpack; + string = string; + Color3 = Color3; + newproxy = newproxy; + tostring = tostring; + tonumber = tonumber; + Instance = Instance; + TweenInfo = TweenInfo; + BrickColor = BrickColor; + NumberRange = NumberRange; + ColorSequence = ColorSequence; + NumberSequence = NumberSequence; + ColorSequenceKeypoint = ColorSequenceKeypoint; + NumberSequenceKeypoint = NumberSequenceKeypoint; + PhysicalProperties = PhysicalProperties; + Region3int16 = Region3int16; + Vector3int16 = Vector3int16; + elapsedTime = elapsedTime; + require = require; + table = table; + type = type; + wait = wait; + Enum = Enum; + UDim = UDim; + UDim2 = UDim2; + Vector2 = Vector2; + Vector3 = Vector3; + Region3 = Region3; + CFrame = CFrame; + Ray = Ray; + service = service; +} do locals[ind] = loc end + +--// Init +return service.NewProxy({__metatable = "Adonis"; __tostring = function() return "Adonis" end; __call = function(tab,data) + local folder = script.Parent + local remoteName,depsName = string.match(data.Name, "(.*)\\(.*)") + Folder = folder:Clone() + + setfenv(1,setmetatable({}, {__metatable = unique})) + + client.Loader = data.Loader + client.Module = data.Module + client.DepsName = depsName + client.TrueStart = data.Start + client.LoadingTime = data.LoadingTime + client.RemoteName = remoteName + + folder:Destroy() + script:Destroy() + + --// Intial setup + for ind, serv in next,{ + "Workspace"; + "Players"; + "Lighting"; + "ReplicatedStorage"; + "ReplicatedFirst"; + "ScriptContext"; + "JointsService"; + "LogService"; + "Teams"; + "SoundService"; + "StarterGui"; + "StarterPack"; + "StarterPlayers"; + "TestService"; + "NetworkClient"; + }do local temp = service[serv] end + + --// Load Order List + local LoadOrder = { + "Variables"; + "UI"; + "Core"; + "Remote"; + "Functions"; + "Process"; + "Anti"; + } + + --// Load Core Modules + for ind,load in next,LoadOrder do + local modu = Folder.Core:FindFirstChild(load) + if modu then + LoadModule(modu,true,{script = script}) + end + end + + --// Initialize Cores + for i, name in next,LoadOrder do + local core = client[name] + if core and type(core) == "table" and core.Init then + core.Init() + core.Init = nil + elseif type(core) == "userdata" and getmetatable(core) == "ReadOnly_Table" and core.Init then + core.Init() + end + end + + for ind,obj in next,Folder.Dependencies:GetChildren() do client.Deps[obj.Name] = obj end + + --// Load Plugins + for index,plugin in next,Folder.Plugins:GetChildren() do + LoadModule(plugin, nil, {script = plugin}) + end + + ServiceSpecific.Player = service.Players.LocalPlayer; + ServiceSpecific.PlayerGui = service.Player:FindFirstChild("PlayerGui"); + ServiceSpecific.SafeTweenSize = function(obj,...) pcall(obj.TweenSize,obj,...) end; + ServiceSpecific.SafeTweenPos = function(obj,...) pcall(obj.TweenPosition,obj,...) end; + ServiceSpecific.Filter = function(str,from,to) + return client.Remote.Get("Filter",str,(to and from) or service.Player,to or from) + end; + + ServiceSpecific.LaxFilter = function(str,from) + return service.Filter(str,from or service.Player,from or service.Player) + end; + + ServiceSpecific.BroadcastFilter = function(str,from) + return client.Remote.Get("BroadcastFilter",str,from or service.Player) + end; + + ServiceSpecific.IsMobile = function() + if service.UserInputService.TouchEnabled and not service.UserInputService.MouseEnabled and not service.UserInputService.KeyboardEnabled then + return true + else + return false + end + end; + + ServiceSpecific.LocalContainer = function() + if not client.Variables.LocalContainer or not client.Variables.LocalContainer.Parent then + client.Variables.LocalContainer = service.New("Camera") + client.Variables.LocalContainer.Name = client.Functions.GetRandom() + client.Variables.LocalContainer.Parent = service.Workspace + end + return client.Variables.LocalContainer + end; + + --// Loading Finisher + client.Finish_Loading = function() + if client.Core.Key then + --// Events + service.NetworkClient.ChildRemoved:Connect(function() wait(30) client.Anti.Detected("crash", "Network client disconnected") end) + service.NetworkClient.ChildAdded:Connect(function() client.Anti.Detected("crash", "Network client reconnected?") end) + service.Player.Changed:Connect(function() if service.Player.Parent ~= service.Players then wait(5) client.Anti.Detected("kick","Parent not players") elseif client.Anti.RLocked(service.Player) then client.Anti.Detected("kick","Roblox Locked") end end) + service.Player.Chatted:Connect(service.EventTask("Event: ProcessChat", client.Process.Chat)) + service.Player.CharacterRemoving:Connect(service.EventTask("Event: CharacterRemoving", client.Process.CharacterRemoving)) + service.Player.CharacterAdded:Connect(service.Threads.NewEventTask("Event: CharacterAdded", client.Process.CharacterAdded)) + service.LogService.MessageOut:Connect(client.Process.LogService) --service.Threads.NewEventTask("EVENT:MessageOut",client.Process.LogService,60)) + service.ScriptContext.Error:Connect(client.Process.ErrorMessage) --service.Threads.NewEventTask("EVENT:ErrorMessage",client.Process.ErrorMessage,60)) + + --// Get RateLimits + client.Process.RateLimits = client.Remote.Get("RateLimits") or client.Process.RateLimits; + + --// Get CodeName + client.Variables.CodeName = client.Remote.Get("Variable", "CodeName") + + --// Ping loop + client.Remote.Send("ClientLoaded") + delay(5, function() service.StartLoop("ClientCheck",30,client.Core.CheckClient,true) end) + + --wait() + local settings = client.Remote.Get("Setting",{"G_API","G_Access","G_Access_Key","G_Access_Perms","Allowed_API_Calls"}) + if settings then + client.G_API = settings.G_API + client.G_Access = settings.G_Access + client.G_Access_Key = settings.G_Access_Key + client.G_Access_Perms = settings.G_Access_Perms + client.Allowed_API_Calls = settings.Allowed_API_Calls + else + warn("FAILED TO GET SETTINGS FROM SERVER"); + end + + --// API + if service.NetworkClient then + service.TrackTask("Thread: API Manager", client.Core.StartAPI) + --service.Threads.RunTask("_G API Manager",client.Core.StartAPI) + end + + --// Finished loading + clientLocked = true + client.Finish_Loading = function() end + client.LoadingTime() --origWarn(tostring(tick()-(client.TrueStart or startTime))) + else + client.Kill("Missing remote key") + end + end + + --// Core + Fire = client.Remote.Fire + Detected = client.Anti.Detected + client.Core.Name = "\0" + client.Core.Special = depsName + client = service.ReadOnly(client, { + [client.Variables] = true; + [client.Handlers] = true; + G_API = true; + G_Access = true; + G_Access_Key = true; + G_Access_Perms = true; + Allowed_API_Calls = true; + Finish_Loading = true; + RemoteEvent = true; + ScriptCache = true; + Returns = true; + PendingReturns = true; + EncodeCache = true; + DecodeCache = true; + Received = true; + Sent = true; + Service = true; + Holder = true; + GUIs = true; + LastUpdate = true; + RateLimits = true; + }, true) + --[[client.UI = service.ReadOnly(client.UI, true) + client.Core = service.ReadOnly(client.Core, true, {RemoteEvent = true, Key = true, LastUpdate = true}) + client.Anti = service.ReadOnly(client.Anti, true) + client.Remote = service.ReadOnly(client.Remote, true) + client.Functions = service.ReadOnly(client.Functions, true) + client.Processing = service.ReadOnly(client.Processing, true)--]] + client.Core.GetEvent() + return "SUCCESS" +end}) diff --git a/src/assets/Adonis/Client/Core/Anti.lua b/src/assets/Adonis/Client/Core/Anti.lua new file mode 100644 index 0000000..6262f46 --- /dev/null +++ b/src/assets/Adonis/Client/Core/Anti.lua @@ -0,0 +1,953 @@ +client = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Anti-Exploit +return function() + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + + local Anti, Process, UI, Variables + local function Init() + UI = client.UI; + Anti = client.Anti; + Variables = client.Variables; + Process = client.Process; + end + + local script = script + local service = service + local client = client + local Core = client.Core + local Remote = client.Remote + local Functions = client.Functions + local Disconnect = client.Disconnect + local Send = client.Remote.Send + local Get = client.Remote.Get + local NetworkClient = service.NetworkClient + local Kill = client.Kill + local Player = service.Players.LocalPlayer + local Kick = Player.Kick + local toget = tostring(getfenv) + + getfenv().client = nil + getfenv().service = nil + getfenv().script = nil + + local Detected = function(action,info) + if NetworkClient then + pcall(Send,"Detected",action,info) + wait(0.5) + if action == "kick" then + if not service.RunService:IsStudio() then + Disconnect(info) + end + elseif action == "crash" then + Kill(info) + end + end + end; + + local CheckEnv = function() + if tostring(getfenv) ~= toget or type(getfenv) ~= "function" then + + end + end + + local Detectors = service.ReadOnly({ + Speed = function(data) + service.StartLoop("AntiSpeed",1,function() + --if service.CheckMethod(workspace, "GetRealPhysicsFPS") then + if workspace:GetRealPhysicsFPS() > tonumber(data.Speed) then + Detected('kill','Speed exploiting') + end + --else + -- Detected('kick','Method change detected') + --end + end) + end; + + LockLighting = function(data) --// Replaced by LocalLighting + --[[ + local lightSets = Remote.Get("Variable","LightingSettings") + service.Lighting.Changed:connect(function(c) + if lightSets[c] ~= nil then + service.Lighting[c] = lightSets[c] + local data = {} + data.Property = c + Remote.Send("AddReplication","LChanged",data) + end + end)--]] + local settings = { + Ambient = service.Lighting.Ambient; + Brightness = service.Lighting.Brightness; + ColorShift_Bottom = service.Lighting.ColorShift_Bottom; + ColorShift_Top = service.Lighting.ColorShift_Top; + GlobalShadows = service.Lighting.GlobalShadows; + OutdoorAmbient = service.Lighting.OutdoorAmbient; + Outlines = service.Lighting.Outlines; + ShadowColor = service.Lighting.ShadowColor; + GeographicLatitude = service.Lighting.GeographicLatitude; + Name = service.Lighting.Name; + TimeOfDay = service.Lighting.TimeOfDay; + FogColor = service.Lighting.FogColor; + FogEnd = service.Lighting.FogEnd; + FogStart = service.Lighting.FogStart; + } + + local checking = false + + Routine(function() + while true do + if not checking then + for i,v in pairs(settings) do + if service.Lighting[i] ~= nil then + --print(i) + settings[i] = service.Lighting[i] + end + end + end + wait(1) + end + end) + + Variables.LightingChanged = false + local tempIgnore = false + local function check(c) + if Variables.LightingChanged then return true end + local temp = service.Lighting[c] + if service.Lighting[c] ~= nil and settings[c] ~= nil then + tempIgnore = true + service.Lighting[c] = settings[c] + tempIgnore = false + wait(0.01) + if c == Anti.LastChanges.Lighting then + tempIgnore = true + service.Lighting[c] = temp + tempIgnore = false + return true + else + return false + end + end + end + + service.Lighting.Changed:connect(function(c) + checking = true + if not tempIgnore then + if check(c) then + print("SERVER CHANGED IT") + else + print("CLIENT CHANGED IT") + end + end + checking = false + end) + end; + + ReplicationLogs = function() + local filtering = workspace.FilteringEnabled + + local function checkParent(obj,class) + local tester; pcall(function() tester = obj:GetFullName() end) + if tester then + local full = obj:GetFullName() + local prev = game + local blackParents = { + service.InsertService; + service.TweenService; + service.GamepadService; + service.Workspace.CurrentCamera; + service.LocalContainer(); + service.Player; + service.Player.Character; + } + + local blackClasses = { + "TouchTransmitter"; + } + + local players = service.Players:GetPlayers() + + for ind,b in pairs(blackParents) do + if b and (rawequal(obj, b) or obj:IsDescendantOf(b)) then + return true + end + end + + for ind,b in pairs(blackClasses) do + if obj:IsA(b) then + return true + end + end + + for ind,p in pairs(players) do + if p and (obj:IsDescendantOf(p) or (p.Character and obj:IsDescendantOf(p.Character)))then + return true + end + end + + local new = obj + for i=1,50 do + if new then + if (class and new:IsA(class)) and not (string.find(new.Name,"ADONIS") and new:IsA("LocalScript")) then + return true + else + prev = new + end + else + return false + end + new = obj.Parent + end + + return false + else + --warn(Anti.GetClassName(obj)) + return true + end + end + + game.DescendantAdded:Connect(function(c) + if not filtering and not checkParent(c) then + --print("LOG CREATE "..c:GetFullName()) + local data = {} + data.obj = c + data.name = c.Name + data.class = c.ClassName + data.parent = c.Parent + data.path = c:GetFullName() + Remote.Fire("AddReplication","Created",c,data) + end + end) + + game.DescendantRemoving:Connect(function(c) + if not filtering and not checkParent(c) then + --print("LOG DESTROY "..c:GetFullName()) + local data = {} + data.obj = c + data.name = c.Name + data.class = c.ClassName + data.parent = c.Parent + data.path = c:GetFullName() + if c and c.Parent then + local event; + event = c.Parent.ChildRemoved:connect(function(n) + if rawequal(c, n) then + Remote.Fire("AddReplication","Destroyed",c,data) + event:disconnect() + end + end) + wait(5) + if event then + event:disconnect() + end + else + Remote.Fire("AddReplication","Destroyed",c,data) + end + end + end) + end; + + NameId = function(data) + local realId = data.RealID + local realName = data.RealName + + service.StartLoop("NameIDCheck",10,function() + if service.Player.Name ~= realName then + Detected('log','Local username does not match server username') + end + + if service.Player.userId ~= realId then + Detected('log','Local userID does not match server userID') + end + end) + end; + + AntiGui = function(data) --// Future + service.Player.DescendantAdded:connect(function(c) + if c:IsA("GuiMain") or c:IsA("PlayerGui") and rawequal(c.Parent, service.PlayerGui) and not UI.Get(c) then + c:Destroy() + Detected("log","Unknown GUI detected and destroyed") + end + end) + end; + + AntiTools = function(data) + if service.Player:WaitForChild("Backpack", 120) then + local btools = data.BTools --Remote.Get("Setting","AntiBuildingTools") + local tools = data.AntiTools --Remote.Get("Setting","AntiTools") + local allowed = data.AllowedList --Remote.Get("Setting","AllowedToolsList") + local function check(t) + if (t:IsA("Tool") or t:IsA("HopperBin")) and not t:FindFirstChild(Variables.CodeName) then + if client.AntiBuildingTools and t:IsA("HopperBin") and (rawequal(t.BinType, Enum.BinType.Grab) or rawequal(t.BinType, Enum.BinType.Clone) or rawequal(t.BinType, Enum.BinType.Hammer) or rawequal(t.BinType, Enum.BinType.GameTool)) then + t.Active = false + t:Destroy() + Detected("log","Building tools detected") + end + if tools then + local good = false + for i,v in pairs(client.AllowedToolsList) do + if t.Name==v then + good = true + end + end + if not good then + t:Destroy() + Detected("log","Tool detected") + end + end + end + end + + for i,t in pairs(service.Player.Backpack:children()) do + check(t) + end + + service.Player.Backpack.ChildAdded:connect(check) + end + end; + + --[[ + CheatEngineFinder = function(data) + for i,v in pairs(service.LogService:GetLogHistory()) do + for k,m in pairs(v) do + if type(m)=='string' and m:lower():find('program files') and m:lower():find('cheat engine') and m:lower():find('failed to resolve texture format') then + Detected('kick','Cheat Engine installation detected.') + end + end + end + end; + --]] + + HumanoidState = function(data) + wait(1) + local humanoid = service.Player.Character:WaitForChild("Humanoid") + local event + local doing = true + event = humanoid.StateChanged:connect(function(old,new) + if not doing then event:disconnect() end + if rawequal(new, Enum.HumanoidStateType.StrafingNoPhysics) and doing then + doing = false + Detected("kill","Noclipping") + event:disconnect() + end + end) + + while humanoid and humanoid.Parent and humanoid.Parent.Parent and doing and wait(0.1) do + if rawequal(humanoid:GetState(), Enum.HumanoidStateType.StrafingNoPhysics) and doing then + doing = false + Detected("kill","Noclipping") + end + end + end; + + Paranoid = function(data) + wait(1) + local char = service.Player.Character + local torso = char:WaitForChild("Head") + local humPart = char:WaitForChild("HumanoidRootPart") + local hum = char:WaitForChild("Humanoid") + while torso and humPart and rawequal(torso.Parent, char) and rawequal(humPart.Parent, char) and char.Parent ~= nil and hum.Health>0 and hum and hum.Parent and wait(1) do + if (humPart.Position-torso.Position).magnitude>10 and hum and hum.Health>0 then + Detected("kill","HumanoidRootPart too far from Torso (Paranoid?)") + end + end + end; + + MainDetection = function(data) + local game = service.DataModel + local isStudio = select(2, pcall(service.RunService.IsStudio, service.RunService)) + local findService = service.DataModel.FindService + local lastUpdate = tick() + local doingCrash = false + local goodCores = {} + local gettingGood = false + local gettingMenu = false + local menuOpened = false + local gotGoodTime = tick() + local coreNums = {} + local coreClears = { + FriendStatus = true; + ImageButton = false; + ButtonHoverText = true; + HoverMid = true; + HoverLeft = true; + HoverRight = true; + ButtonHoverTextLabel = true; + Icon = true; + ImageLabel = true; + NameLabel = true; + Players = true; + ColumnValue = true; + ColumnName = true; + Frame = false; + StatText = false; + } + + local lookFor = { + --'stigma'; + --'sevenscript'; + --"a".."ssh".."ax"; + --"a".."ssh".."urt"; + --'elysian'; + 'current identity is 0'; + 'gui made by kujo'; + "tetanus reloaded hooked"; + --"brackhub"; + } + + local files = { + ["C:\\RC7\\rc7.dat"] = true; + } + + local function check(Message) + for i,v in pairs(lookFor) do + if string.find(string.lower(Message),string.lower(v)) and not string.find(string.lower(Message),"failed to load") then + return true + end + end + end + + local function findLog(msg) + for i,v in pairs(service.LogService:GetLogHistory()) do + if string.find(string.lower(v.message),string.lower(msg)) then + return true + end + end + end + + local function findFiles() + local image = service.New("Decal",service.Workspace) + for i,v in next,files do + image.Texture = i; + wait(0.5) + if findLog(i) then + else + --// Detected + warn("RC7 DETECTION WORKED?") + end + end + end + + local function isGood(item) + for i,v in next,goodCores do + if rawequal(item, v) then + return true + end + end + end + + local function checkServ(c) if not pcall(function() + if not isStudio and (findService("ServerStorage", game) or findService("ServerScriptService", game)) then + Detected("crash","Disallowed Services Detected") + end + end) then Detected("kick","Finding Error") end end + + local function chkObj(item) + local coreNav = service.GuiService.CoreGuiNavigationEnabled + service.GuiService.CoreGuiNavigationEnabled = false + if Anti.ObjRLocked(item) and not service.GuiService:IsTenFootInterface() then + local cont = true + local ran,err = pcall(function() + local checks = { + service.Chat; + service.Teams; + service.Lighting; + service.StarterGui; + service.TestService; + service.StarterPack; + service.StarterPlayer; + service.JointsService; + service.InsertService; + service.ReplicatedStorage; + service.ReplicatedFirst; + service.SoundService; + service.HttpService; + service.Workspace; + service.Players; + } + for i,v in next,checks do + if item:IsDescendantOf(v) then cont = false end + end + end) + + if cont then + local cont = false + local class = Anti.GetClassName(item) + local name = tostring(item) + local checks = { + "Script"; + "LocalScript"; + "CoreScript"; + "ScreenGui"; + "Frame"; + "TextLabel"; + "TextButton"; + "ImageLabel"; + "TextBox"; + "ImageButton"; + "GuiMain"; + } + + if class then + if class == "LocalScript" then + return true + end + + for i,v in next,checks do + if rawequal(class, v) then + cont = true + end + end + + --[[ + Menu: + FriendStatus - TextButton; + EVERY SINGLE MENU GUI ON CLICK FFS + + Reset: + ImageButton - ImageButton + ButtonHoverText - Frame + HoverMid - ImageLabel + HoverLeft - ImageLabel + HoverRight - ImageLabel + ButtonHoverTextLabel - TextLabel + + PlayerList: + Icon - ImageLabel; + ImageLabel - ImageLabel; + NameLabel - TextLabel; + Players - Frame; + ColumnValue - TextLabel; + ColumnName - TextLabel; + Frame - Frame; + StatText - TextLabel; + ]]-- + end + + if not true and cont and menuOpened == false then + local players = 0 + local leaderstats = {} + local totStats = 0 + local teams = 0 + local total = 0 + + for i,v in pairs(service.Players:GetChildren()) do + if v:IsA("Player") then + players = players+1 + local stats = v:FindFirstChild("leaderstats") + if stats then + for k,m in pairs(stats:GetChildren()) do + if not leaderstats[m.Name] then + leaderstats[m.Name] = 0 + end + leaderstats[m.Name] = leaderstats[m.Name]+1 + end + end + end + end + + for i,v in pairs(leaderstats) do + totStats = totStats+1 + end + + for i,v in pairs(service.Teams:GetChildren()) do + if v:IsA("Team") then + teams = teams+1 + end + end + + total = (teams+players+((teams+players)*totStats)+totStats)-1 + if not coreNums[name] then coreNums[name] = 0 end + coreNums[name] = coreNums[name]+1 + + print(name.." : "..class.." : "..coreNums[name]) + print(total) + --[[ + if name == "FriendStatus" and coreNums.FriendStatus > players then + print("FRIEND STATUS EXCEEDED PLAYER COUNT") + elseif name == "Icon" and coreNums.Icon > players then + print("ICON EXCEEDED PLAYER COUNT") + elseif name == "ColumnValue" and coreNums.ColoumnValue > totPlayerItems then + print("COLUMN VALUE EXCEEDS PLAYER ITEMS COUNT") + elseif name == "ColumnName" and coreNums.ColumnName > totPlayerItems then + print("COLUMN NAME EXCEEDS PLAYER ITEMS COUNT") + elseif name == "NameLabel" and coreNums.NameLabel > totPlayerItems then + print("NAME LABEL EXCEEDS PLAYER ITEMS COUNT") + end--]] + + if menuOpen or (gettingGood or (gettingMenu and (name == "FriendStatus" and class == "TextButton"))) then + table.insert(goodCores,item) + elseif not isGood(item) then + --print("-------------------------------") + --print("FOUND NAME: "..tostring(item)) + --print("FOUND CLASS: "..tostring(class)) + --print("FOUND TYPE: "..tostring(type(item))) + --print("FOUND TYPEOF: "..tostring(type(item))) + --print("-------------------------------") + + local testName = tostring(math.random()..math.random()) + local ye,err = pcall(function() + service.GuiService:AddSelectionParent(testName, item) -- Christbru figured out the detection method + service.GuiService:RemoveSelectionGroup(testName) + end) + + --print(ye,err) + + if err and string.find(err,testName) and string.find(err,"GuiService:") then return true end + wait(0.5) + for i,v in next,service.LogService:GetLogHistory() do + if string.find(v.message,testName) and string.find(v.message,"GuiService:") then + return true + end + end--]] + end + end + end + end + service.GuiService.CoreGuiNavigationEnabled = coreNav + end + + local function checkTool(t) + if (t:IsA("Tool") or t:IsA("HopperBin")) and not t:FindFirstChild(Variables.CodeName) and service.Player:FindFirstChild("Backpack") and t:IsDescendantOf(service.Player.Backpack) then + if t:IsA("HopperBin") and (rawequal(t.BinType, Enum.BinType.Grab) or rawequal(t.BinType, Enum.BinType.Clone) or rawequal(t.BinType, Enum.BinType.Hammer) or rawequal(t.BinType, Enum.BinType.GameTool)) then + Detected("log","Building tools detected; "..tostring(t.BinType)) + end + end + end + + checkServ() + + service.DataModel.ChildAdded:connect(checkServ) + --service.Player.DescendantAdded:connect(checkTool) + + service.Players.PlayerAdded:connect(function(p) + gotGoodTime = tick() + end) + + service.Events.CharacterRemoving:connect(function() + for i,v in next,coreNums do + if coreClears[i] then + coreNums[i] = 0 + end + end + --[[ + gettingGood = true + wait() + gettingGood = false--]] + end) + + service.GuiService.MenuClosed:connect(function() + menuOpen = false + end) + + service.GuiService.MenuOpened:connect(function() + menuOpen = true + end) + + service.ScriptContext.ChildAdded:connect(function(child) + if Anti.GetClassName(child) == "LocalScript" then + Detected("kick","Localscript Detected; "..tostring(child)) + end + end) + + service.ReplicatedFirst.ChildAdded:connect(function(child) + if Anti.GetClassName(child) == "LocalScript" then + Detected("kick","Localscript Detected; "..tostring(child)) + end + end) + + service.LogService.MessageOut:connect(function(Message, Type) + if check(Message) then + Detected('crash','Exploit detected; '..Message) + end + end) + + service.Selection.SelectionChanged:connect(function() + Detected('kick','Selection changed') + end) + + service.ScriptContext.Error:Connect(function(Message, Trace, Script) + if Script and tostring(Script)=='tpircsnaisyle'then + Detected("kick","Elysian") + elseif (not Script or ((not Trace or Trace == ""))) then + local tab = service.LogService:GetLogHistory() + local continue = false + if Script then + for i,v in next,tab do + if v.message == Message and tab[i+1] and tab[i+1].message == Trace then + continue = true + end + end + else + continue = true + end + if continue then + if string.find(tostring(Trace),"CoreGui") or string.find(tostring(Trace),"PlayerScripts") or string.find(tostring(Trace),"Animation_Scripts") or string.match(tostring(Trace),"^(%S*)%.(%S*)") then + return + else + Detected("log","Traceless/Scriptless error") + end + end + end + end) + + service.NetworkClient.ChildRemoved:connect(function(child) + wait(30) + client.Kill("Client disconnected from server") + end) + + service.RunService.Stepped:connect(function() + lastUpdate = tick() + end) + + --[[game.DescendantAdded:connect(function(c) + if chkObj(c) and type(c)=="userdata" and not doingCrash then + doingCrash = true + --print("OK WE DETECTED THINGS") + Detected("crash","New CoreGui Object; "..tostring(c)) + end + end)--]] + + if service.Player:WaitForChild("Backpack", 120) then + service.Player.Backpack.ChildAdded:connect(checkTool) + end + + --// Detection Loop + service.StartLoop("Detection",10,function() + --// Prevent event stopping + if tick()-lastUpdate > 60 then + Detected("crash","Events stopped") + end + + --// Check player parent + if service.Player.Parent ~= service.Players then + Detected("crash","Parent not players") + end + + --// Stuff + local ran,err = pcall(function() service.ScriptContext.Name = "ScriptContext" end) + if not ran then + Detected("log","ScriptContext error?") + end + + --// Check Log History + for i,v in next,service.LogService:GetLogHistory() do + if check(v.message) then + Detected('crash','Exploit detected') + end + end + + --// Check Loadstring + local ran,err = pcall(function() + local func,err = loadstring("print('LOADSTRING TEST')") + end) + if ran then + Detected('crash','Exploit detected; Loadstring usable') + end + + --// Check Context Level + local ran,err = pcall(function() + local test = Instance.new("StringValue") + test.RobloxLocked = true + end) + if ran then + Detected('crash','RobloxLocked usable') + end + end) + end; + + AntiDeleteTool = function(data) + local name = math.random(1000,999999).."b" + local part = client.Deps.AntiDelete:Clone() --service.New("Part") + part.Name = name + part.CanCollide = false + part.Anchored = true + part.Size = Vector3.new(3,3,3)--Vector3.new(1000,1000,0.1) + part.CFrame = workspace.CurrentCamera.CoordinateFrame + part.Parent = workspace.CurrentCamera + part.Transparency = 1 + + local cam + local event + + local function doEvent() + cam = workspace.CurrentCamera + cam.Changed:connect(function(p) + if cam.Parent~=service.Workspace then + doEvent() + end + end) + cam.ChildRemoved:connect(function(c) + if (c==part or not part or not part.Parent or part.Parent~=workspace.CurrentCamera) then + part = client.Deps.AntiDelete:Clone() --service.New("Part") + part.Name = name + part.CanCollide = false + part.Anchored = true + part.Size = Vector3.new(3,3,3)--Vector3.new(1000,1000,0.1) + part.CFrame = workspace.CurrentCamera.CoordinateFrame + part.Parent = workspace.CurrentCamera + part.Transparency = 1 + Detected("log","Attempting to Delete") + end + end) + end + + doEvent() + + service.StartLoop("AntiDeleteTool","RenderStepped",function() + local part = service.Workspace.CurrentCamera:FindFirstChild(name) + if part then + part.CFrame = service.Workspace.CurrentCamera.CoordinateFrame*CFrame.Angles(0,1.5,0)--*CFrame.new(0,0,-0.8) + end + end) + end; + + AntiGod = function(data) + local humanoid = service.Player.Character:WaitForChild('Humanoid') + local bob = true service.Player.Character.Humanoid.Died:connect(function() bob=false end) + local moos + moos = service.Player.Character.Humanoid.Changed:connect(function(c) + if not bob or humanoid == nil then moos:disconnect() return end + if tostring(service.Player.Character.Humanoid.Health)=="-1.#IND" then + Detected('kill','Infinite Health [Godded]') + end + end) + service.Player.Character.Humanoid.Health=service.Player.Character.Humanoid.Health-1 + end; + + }, false, true) + + local Launch = function(mode,data) + if Anti.Detectors[mode] and service.NetworkClient then + Anti.Detectors[mode](data) + end + end; + + Anti = service.ReadOnly({ + LastChanges = { + Lighting = {}; + }; + + Init = Init; + Launch = Launch; + Detected = Detected; + Detectors = Detectors; + + GetClassName = function(obj) + local testName = tostring(math.random()..math.random()) + local ran,err = pcall(function() + local test = obj[testName] + end) + if err then + local class = string.match(err,testName.." is not a valid member of (.*)") + if class then + return class + end + end + end; + + RLocked = function(obj) + return not pcall(function() return obj.GetFullName(obj) end) + --[[local ran,err = pcall(function() service.New("StringValue", obj):Destroy() end) + if ran then + return false + else + return true + end--]] + end; + + ObjRLocked = function(obj) + return not pcall(function() return obj.GetFullName(obj) end) + --[[local ran,err = pcall(function() obj.Parent = obj.Parent end) + if ran then + return false + else + return true + end--]] + end; + + CoreRLocked = function(obj) + local testName = tostring(math.random()..math.random()) + local ye,err = pcall(function() + game:GetService("GuiService"):AddSelectionParent(testName, obj) + game:GetService("GuiService"):RemoveSelectionGroup(testName) + end) + if err and string.find(err, testName) and string.find(err, "GuiService:") then + return true + else + wait(0.5) + for i,v in next,service.LogService:GetLogHistory() do + if string.find(v.message,testName) and string.find(v.message,"GuiService:") then + return true + end + end + end + end; + }, false, true) + + client.Anti = Anti + + do + local meta = service.MetaFunc + local track = meta(service.TrackTask) + local loop = meta(service.StartLoop) + local opcall = meta(pcall) + local oWait = meta(wait) + local resume = meta(coroutine.resume) + local create = meta(coroutine.create) + local tick = meta(tick) + local loopAlive = tick() + local otostring = meta(tostring) + + track("Thread: TableCheck", meta(function() + while oWait(1) do + loopAlive = tick() + local ran, core, remote, functions, anti, send, get, detected, disconnect, kill = coroutine.resume(coroutine.create(function() return client.Core, client.Remote, client.Functions, client.Anti, client.Remote.Send, client.Remote.Get, client.Anti.Detected, client.Disconnect, client.Kill end)) + if not ran or core ~= Core or remote ~= Remote or functions ~= Functions or anti ~= Anti or send ~= Send or get ~= Get or detected ~= Detected or disconnect ~= Disconnect or kill ~= Kill then + opcall(Detected, "crash", "Tamper Protection 10042") + oWait(1) + opcall(Disconnect, "Adonis_10042") + opcall(Kill, "Adonis_10042") + opcall(Kick, Player, "Adonis_10042") + --pcall(function() while true do end end) + end + end + end)) + --[[ + loop("Thread: CheckLoop", "Stepped", meta(function() + local ran,ret = resume(create(function() return tick()-loopAlive end)) + if not ran or not ret or ret > 5 then + opcall(Detected, "crash", "Tamper Protection 10043") + oWait(1) + opcall(Disconnect, "Adonis_10043") + opcall(Kill, "Adonis_10043") + opcall(Kick, Player, "Adonis_10043") + end + end), true)--]] + end +end diff --git a/src/assets/Adonis/Client/Core/Core.lua b/src/assets/Adonis/Client/Core/Core.lua new file mode 100644 index 0000000..a3e672e --- /dev/null +++ b/src/assets/Adonis/Client/Core/Core.lua @@ -0,0 +1,370 @@ +client = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Core +return function() + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + + local script = script + local service = service + local client = client + local Anti, Core, Functions, Process, Remote, UI, Variables + local function Init() + UI = client.UI; + Anti = client.Anti; + Core = client.Core; + Variables = client.Variables + Functions = client.Functions; + Process = client.Process; + Remote = client.Remote; + end + + getfenv().client = nil + getfenv().service = nil + getfenv().script = nil + + client.Core = { + Init = Init; + Name = script.Name; + Special = script.Name; + MakeGui = client.UI.Make; + GetGui = client.UI.Get; + RemoveGui = client.UI.Remove; + ScriptCache = {}; + + GetEvent = function() + if Core.RemoteEvent then + Core.RemoteEvent.Event:Disconnect() + Core.RemoteEvent.Security:Disconnect() + Core.RemoteEvent = nil + end + + Core.RemoteEvent = {} + + local rindex = 0 + local firstSearch + local timer = 1 + local prevTime = 0 + local start = os.time() + local events = {} + local found + + local function finishEvent(event) + if event then + local rFunc = event:FindFirstChildOfClass("RemoteFunction") + if rFunc then + Core.RemoteEvent.Object = event + + Core.RemoteEvent.Function = rFunc + rFunc.OnClientInvoke = Process.Remote; + + Core.RemoteEvent.FireServer = event.FireServer + Core.RemoteEvent.Event = event.OnClientEvent:Connect(Process.Remote)--]] + Core.RemoteEvent.Security = event.Changed:Connect(function(p) + if Core.RemoteEvent.Function then + Core.RemoteEvent.Function.OnClientInvoke = Process.Remote; + end + + if p == "RobloxLocked" and Anti.RLocked(event) then + client.Kill("RemoteEvent Locked") + elseif not event or not event.Parent then + Core.GetEvent() + end + end) + + rFunc.Changed:Connect(function() + rFunc.OnClientInvoke = Process.Remote; + end) + + --SetFireServer(service.MetaFunc(event.FireServer)) + + if not Core.Key then + Remote.Fire(client.DepsName.."GET_KEY") + end + else + client.Kill("RemoteFunction not found") + end + else + client.Kill("RemoteEvent not found") + end + end + + local function search() + local children = {} + for i,child in next,service.JointsService:GetChildren() do + if string.sub(child.Name,1,#client.RemoteName) == client.RemoteName then + table.insert(children, child) + end + end + + for ind,e in next,events do + e.Event:Disconnect() events[ind] = nil + end + + for i,child in next,children do + if not Anti.ObjRLocked(child) and child:IsA("RemoteEvent") and child:FindFirstChildOfClass("RemoteFunction") then + local index = rindex+1 + rindex = index + if not events[child] then + local eventTab; eventTab = { + Event = child.OnClientEvent:Connect(function(com, ...) + if com == "TrustCheck" and select(1,...) == Core.Special and not found then + found = child + Core.RemoteEvent.Event = eventTab.Event + finishEvent(child) + for ind,e in next,events do + if ind ~= child then + e.Event:Disconnect() events[ind] = nil + end + end + elseif found and found == child then + --Process.Remote(com, ...) + end + end); + Object = child; + } + events[child] = eventTab + end + + child:FireServer(client.Module, "TrustCheck") + end + end + end + + repeat + if os.time() > prevTime then + prevTime = os.time() + timer = timer+1 + if timer%10 == 0 or not firstSearch then + firstSearch = true + local event = service.JointsService:FindFirstChild(client.RemoteName) + if event then + found = event + finishEvent(event) + end + --search() + end + end + + until found or not wait(0.01) + end; + + LoadPlugin = function(plugin) + local plug = require(plugin) + local func = setfenv(plug,GetEnv(getfenv(plug))) + cPcall(func) + end; + + LoadBytecode = function(str, env) + return require(client.Deps.Rerubi)(str, env) + end; + + LoadCode = function(str, env) + return Core.LoadBytecode(str, env) + end; + + CheckClient = function() + if tick() - Core.LastUpdate >= 55 then + wait(math.random()) --// De-sync everyone's client checks + local returner = math.random() + local ret = Remote.Send("ClientCheck", {Sent = 0;--[[Remote.Sent]] Received = Remote.Received}, client.DepsName, returner) + --[[if ret and ret == returner then + Core.LastUpdate = tick() + else + client.Kill("Client check failed") + end--]] + end + end; + + StartAPI = function() + local ScriptCache = Core.ScriptCache + local Rerubi = client.Deps.Rerubi + local Get = Remote.Get + local G_API = client.G_API + local Allowed_API_Calls = client.Allowed_API_Calls + local NewProxy = service.NewProxy + local MetaFunc = service.MetaFunc + local ReadOnly = service.ReadOnly + local StartLoop = service.StartLoop + local ReadOnly = service.ReadOnly + local UnWrap = service.UnWrap + local service = nil + local client = nil + local _G = _G + local setmetatable = setmetatable + local type = type + local print = print + local error = error + local pairs = pairs + local warn = warn + local next = next + local table = table + local rawset = rawset + local rawget = rawget + local getfenv = getfenv + local setfenv = setfenv + local require = require + local tostring = tostring + local client = client + local Routine = Routine + local cPcall = cPcall + + --// Get Settings + local API_Special = { + + } + + setfenv(1,setmetatable({}, {__metatable = getmetatable(getfenv())})) + + local API_Specific = { + API_Specific = { + Test = function() + print("We ran the api specific stuff") + end + }; + Service = service; + } + + local API = { + Access = ReadOnly({}, nil, nil, true); + --[[ + Access = service.MetaFunc(function(...) + local args = {...} + local key = args[1] + local ind = args[2] + local targ + + setfenv(1,setmetatable({}, {__metatable = getmetatable(getfenv())})) + + if API_Specific[ind] then + targ = API_Specific[ind] + elseif client[ind] and client.Allowed_API_Calls[ind] then + targ = client[ind] + end + + if client.G_Access and key == client.G_Access_Key and targ and client.Allowed_API_Calls[ind] then + if type(targ) == "table" then + return service.NewProxy { + __index = function(tab,inde) + if targ[inde] ~= nil and API_Special[inde] == nil or API_Special[inde] == true then + if targ[inde]~=nil and type(targ[inde]) == "table" and client.G_Access_Perms == "Read" then + return service.ReadOnly(targ[inde]) + else + return targ[inde] + end + elseif API_Special[inde] == false then + error("Access Denied: "..tostring(inde)) + else + error("Could not find "..tostring(inde)) + end + end; + __newindex = function(tabl,inde,valu) + error("Read-only") + end; + __metatable = true; + } + end + else + error("Incorrect key or G_Access is disabled") + end + end); + --]] + + Scripts = ReadOnly({ + ExecutePermission = MetaFunc(function(code) + local exists; + + for i,v in next,ScriptCache do + if UnWrap(v.Script) == getfenv(2).script then + exists = v + end + end + + if exists and exists.noCache ~= true and (not exists.runLimit or (exists.runLimit and exists.Executions <= exists.runLimit)) then + exists.Executions = exists.Executions+1 + return exists.Source, exists.Loadstring + end + + local data = Get("ExecutePermission",UnWrap(getfenv(3).script), code, true) + if data and data.Source then + local module; + if not exists then + module = require(Rerubi:Clone()) + table.insert(ScriptCache,{ + Script = getfenv(2).script; + Source = data.Source; + Loadstring = module; + noCache = data.noCache; + runLimit = data.runLimit; + Executions = data.Executions; + }) + else + module = exists.Loadstring + exists.Source = data.Source + end + return data.Source, module + end + end); + + ReportLBI = MetaFunc(function(scr, origin) + if origin == "Local" then + return true + end + end); + }, nil, nil, true); + } + + AdonisGTable = NewProxy{ + __index = function(tab,ind) + if ind == "Scripts" then + return API.Scripts + elseif G_API and Allowed_API_Calls.Client == true then + if type(API[ind]) == "function" then + return MetaFunc(API[ind]) + else + return API[ind] + end + else + error("_G API is disabled") + end + end; + __newindex = function(tabl,ind,new) + error("Read-only") + end; + __metatable = "API"; + } + + if not _G.Adonis then + rawset(_G,"Adonis",AdonisGTable) + StartLoop("APICheck",1,function() + rawset(_G,"Adonis",AdonisGTable) + end, true) + end + end; + }; +end diff --git a/src/assets/Adonis/Client/Core/Functions.lua b/src/assets/Adonis/Client/Core/Functions.lua new file mode 100644 index 0000000..8d02cb7 --- /dev/null +++ b/src/assets/Adonis/Client/Core/Functions.lua @@ -0,0 +1,1397 @@ +client = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Special Variables +return function() + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + local script = script + local service = service + local client = client + local Anti, Core, Functions, Process, Remote, UI, Variables + local function Init() + UI = client.UI; + Anti = client.Anti; + Core = client.Core; + Variables = client.Variables + Functions = client.Functions; + Process = client.Process; + Remote = client.Remote; + end + + getfenv().client = nil + getfenv().service = nil + getfenv().script = nil + + client.Functions = { + Init = Init; + Kill = client.Kill; + + GetRandom = function(pLen) + local Len = (type(pLen) == "number" and pLen) or math.random(10,15) --// reru + local Res = {}; + for Idx = 1, Len do + Res[Idx] = string.format('%02x', math.random(255)); + end; + return table.concat(Res) + end; + + Round = function(num) + return math.floor(num + 0.5) + end; + + SetView = function(ob) + if ob=='reset' then + workspace.CurrentCamera.CameraType = 'Custom' + workspace.CurrentCamera.CameraSubject = service.Player.Character.Humanoid + workspace.CurrentCamera.FieldOfView = 70 + else + workspace.CurrentCamera.CameraSubject = ob + end + end; + + Dizzy = function(speed) + service.StopLoop("DizzyLoop") + print("dizzy") + if speed then + print("start") + local cam = workspace.CurrentCamera + local last = tick() + local rot = 0 + local flip = false + service.StartLoop("DizzyLoop","RenderStepped",function() + print("in loop") + local dt = tick() - last + if flip then + rot = rot+math.rad(speed*dt) + else + rot = rot-math.rad(speed*dt) + end + + if rot >= 2.5 or rot <= -2.5 then + --flip = not flip + end + cam.CoordinateFrame = cam.CoordinateFrame * CFrame.Angles(0, 0.00, rot) + last = tick() + end) + end + end; + + Base64Encode = function(data) + local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + return ((data:gsub('.', function(x) + local r,b='',string.byte(x) + for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end + return r; + end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) + if (#x < 6) then return '' end + local c=0 + for i=1,6 do c=c+(string.sub(x,i,i)=='1' and 2^(6-i) or 0) end + return string.sub(b,c+1,c+1) + end)..({ '', '==', '=' })[#data%3+1]) + end; + + Base64Decode = function(data) + local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + data = string.gsub(data, '[^'..b..'=]', '') + return (data:gsub('.', function(x) + if (x == '=') then return '' end + local r,f='',(string.find(b,x)-1) + for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end + return r; + end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) + if (#x ~= 8) then return '' end + local c=0 + for i=1,8 do c=c+(string.sub(x,i,i)=='1' and 2^(7-i) or 0) end + return string.char(c) + end)) + end; + + GetGuiData = function(args) + local props = { + "AbsolutePosition"; + "AbsoluteSize"; + "ClassName"; + "Name"; + "Parent"; + "Archivable"; + "SelectionImageObject"; + "Active"; + "BackgroundColor3"; + "BackgroundTransparency"; + "BorderColor3"; + "BorderSizePixel"; + "Position"; + "Rotation"; + "Selectable"; + "Size"; + "SizeConstraint"; + "Style"; + "Visible"; + "ZIndex"; + "ClipsDescendants"; + "Draggable"; + "NextSelectionDown"; + "NextSelectionLeft"; + "NextSelectionRight"; + "NextSelectionUp"; + "AutoButtonColor"; + "Modal"; + "Image"; + "ImageColor3"; + "ImageRectOffset"; + "ImageRectSize"; + "ImageTransparency"; + "ScaleType"; + "SliceCenter"; + "Text"; + "TextColor3"; + "Font"; + "TextScaled"; + "TextStrokeColor3"; + "TextStrokeTransparency"; + "TextTransparency"; + "TextWrapped"; + "TextXAlignment"; + "TextYAlignment"; + }; + + local classes = { + "ScreenGui"; + "GuiMain"; + "Frame"; + "TextButton"; + "TextLabel"; + "ImageButton"; + "ImageLabel"; + "ScrollingFrame"; + "TextBox"; + "BillboardGui"; + "SurfaceGui"; + } + + local guis = { + Properties = { + Name = "ViewGuis"; + ClassName = "Folder"; + }; + Children = {}; + } + + local rLockedFound = false + + local add; add = function(tab,child) + if not Anti.ObjRLocked(child) then + local good = false + + for i,v in next,classes do + if child:IsA(v) then + good = true + end + end + + if good then + local new = { + Properties = {}; + Children = {}; + } + + for i,v in next,props do + pcall(function() + new.Properties[v] = child[v] + end) + end + + for i,v in next,child:GetChildren()do + add(new,v) + end + table.insert(tab.Children, new) + end + else + rLockedFound = true + end + end + for i,v in next,service.PlayerGui:GetChildren()do + pcall(add,guis,v) + end + return guis + end; + + LoadGuiData = function(data) + local make; make = function(dat) + local props = dat.Properties + local children = dat.Children + local gui = service.New(props.ClassName) + + for i,v in next,props do + pcall(function() + gui[i] = v + end) + end + + for i,v in next,children do + pcall(function() + local g = make(v) + if g then + g.Parent = gui + end + end) + end + return gui + end + + local temp = Instance.new("Folder") + for i,v in next,service.PlayerGui:GetChildren()do + if not UI.Get(v) then + v.Parent = temp + end + end + Variables.GuiViewFolder = temp + local folder = service.New("Folder",{Parent = service.PlayerGui; Name = "LoadedGuis"}) + for i,v in next,data.Children do + pcall(function() + local g = make(v) + if g then + g.Parent = folder + end + end) + end + end; + + UnLoadGuiData = function() + for i,v in next,service.PlayerGui:GetChildren()do + if v.Name == "LoadedGuis" then + v:Destroy() + end + end + + if Variables.GuiViewFolder then + for i,v in next,Variables.GuiViewFolder:GetChildren()do + v.Parent = service.PlayerGui + end + Variables.GuiViewFolder:Destroy() + Variables.GuiViewFolder = nil + end + end; + + GetParticleContainer = function(target) + if target then + for i,v in next,service.LocalContainer():GetChildren()do + if v.Name == target:GetFullName().."PARTICLES" then + local obj = v:FindFirstChild("_OBJECT") + if obj.Value == target then + return v + end + end + end + end + end; + + NewParticle = function(target, class, properties) + local effect, index; + + properties.Parent = target; + properties.Enabled = Variables.ParticlesEnabled; + + effect = service.New(class, properties); + index = Functions.GetRandom(); + + Variables.Particles[index] = effect; + + table.insert(Variables.Particles, effect); + + effect.Changed:Connect(function() + if not effect or not effect.Parent or effect.Parent ~= target then + pcall(function() effect:Destroy() end) + Variables.Particles[index] = nil; + end + end) + end; + + RemoveParticle = function(target, name) + for i,effect in next,Variables.Particles do + if effect.Parent == target and effect.Name == name then + effect:Destroy(); + Variables.Particles[i] = nil; + end + end + end; + + EnableParticles = function(enabled) + for i,effect in next,Variables.Particles do + if enabled then + effect.Enabled = true + else + effect.Enabled = false + end + end + end; + + NewLocal = function(class, props, parent) + local obj = service.New(class) + for prop,value in next,props do + obj[prop] = value + end + + if not parent or parent == "LocalContainer" then + obj.Parent = service.LocalContainer() + elseif parent == "Camera" then + obj.Parent = service.Workspace.CurrentCamera + elseif parent == "PlayerGui" then + obj.Parent = service.PlayerGui + end + end; + + MakeLocal = function(object,parent,clone) + if object then + local object = object + if clone then object = object:Clone() end + if not parent or parent == "LocalContainer" then + object.Parent = service.LocalContainer() + elseif parent == "Camera" then + object.Parent = service.Workspace.CurrentCamera + elseif parent == "PlayerGui" then + object.Parent = service.PlayerGui + end + end + end; + + MoveLocal = function(object,parent,newParent) + local par + if not parent or parent == "LocalContainer" then + par = service.LocalContainer() + elseif parent == "Camera" then + par = service.Workspace.CurrentCamera + elseif parent == "PlayerGui" then + par = service.PlayerGui + end + for ind,obj in next,par:GetChildren()do + if obj.Name == object or obj == obj then + obj.Parent = newParent + end + end + end; + + RemoveLocal = function(object,parent,match) + local par + if not parent or parent == "LocalContainer" then + par = service.LocalContainer() + elseif parent == "Camera" then + par = service.Workspace.CurrentCamera + elseif parent == "PlayerGui" then + par = service.PlayerGui + end + + for ind,obj in next,par:GetChildren() do + if (match and string.match(obj.Name,object)) or (obj.Name == object or object == obj) then + obj:Destroy() + end + end + end; + + NewCape = function(data) + local char = data.Parent + local material = data.Material or "Neon" + local color = data.Color or "White" + local reflect = data.Reflectance or 0 + local decal = tonumber(data.Decal or "") + if char then + Functions.RemoveCape(char) + local torso = char:FindFirstChild("Torso") or char:FindFirstChild("UpperTorso") or char:FindFirstChild("HumanoidRootPart") + local isR15 = (torso.Name == "UpperTorso") + if torso then + local p = service.New("Part") + p.Name = "ADONIS_CAPE" + p.Anchored = false + p.Position = torso.Position + p.Transparency = 0 + p.Material = material + p.CanCollide = false + p.TopSurface = 0 + p.BottomSurface = 0 + p.Size = Vector3.new(2,4,0.1) + p.BrickColor = BrickColor.new(color) or BrickColor.new("White") + p.Parent = service.LocalContainer() + + if reflect then + p.Reflectance = reflect + end + + local motor1 = service.New("Motor", p) + motor1.Part0 = p + motor1.Part1 = torso + motor1.MaxVelocity = .01 + motor1.C0 = CFrame.new(0,1.75,0)*CFrame.Angles(0,math.rad(90),0) + motor1.C1 = CFrame.new(0,1-((isR15 and 0.2) or 0),(torso.Size.Z/2))*CFrame.Angles(0,math.rad(90),0) + + local msh = service.New("BlockMesh", p) + msh.Scale = Vector3.new(0.9,0.87,0.1) + + local dec + if decal and decal ~= 0 then + dec = service.New("Decal", p) + dec.Name = "Decal" + dec.Face = 2 + dec.Texture = "http://www.roblox.com/asset/?id="..decal + dec.Transparency = 0 + end + + local index = Functions.GetRandom() + Variables.Capes[index] = { + Part = p; + Motor = motor1; + Enabled = true; + Parent = data.Parent; + Torso = torso; + Decal = dec; + Data = data; + Wave = true; + isR15 = isR15; + } + + local p = service.Players:GetPlayerFromCharacter(data.Parent) + if p and p == service.Player then + Variables.Capes[index].isPlayer = true + end + + if not Variables.CapesEnabled then + p.Transparency = 1 + if dec then + dec.Transparency = 1 + end + Variables.Capes[index].Enabled = false + end + + Functions.MoveCapes() + end + end + end; + RemoveCape = function(parent) + for i,v in next,Variables.Capes do + if v.Parent == parent or not v.Parent or not v.Parent.Parent then + pcall(v.Part.Destroy,v.Part) + Variables.Capes[i] = nil + end + end + end; + HideCapes = function(hide) + for i,v in next,Variables.Capes do + local torso = v.Torso + local parent = v.Parent + local part = v.Part + local motor = v.Motor + local wave = v.Wave + local decal = v.Decal + + if parent and parent.Parent and torso and torso.Parent and part and part.Parent then + if not hide then + part.Transparency = 0 + + if decal then + decal.Transparency = 0 + end + + v.Enabled = true + else + part.Transparency = 1 + if decal then + decal.Transparency = 1 + end + v.Enabled = false + end + else + pcall(part.Destroy,part) + Variables.Capes[i] = nil + end + end + end; + + MoveCapes = function() + service.StopLoop("CapeMover") + service.StartLoop("CapeMover",0.1,function() + if Functions.CountTable(Variables.Capes) == 0 or not Variables.CapesEnabled then + service.StopLoop("CapeMover") + else + for i,v in next,Variables.Capes do + local torso = v.Torso + local parent = v.Parent + local isPlayer = v.isPlayer + local isR15 = v.isR15 + local part = v.Part + local motor = v.Motor + local wave = v.Wave + local decal = v.Decal + + if parent and parent.Parent and torso and torso.Parent and part and part.Parent then + if v.Enabled and Variables.CapesEnabled then + part.Transparency = 0 + + if decal then + decal.Transparency = 0 + end + + local ang = 0.1 + if wave then + if torso.Velocity.magnitude > 1 then + ang = ang + ((torso.Velocity.magnitude/10)*.05)+.05 + end + v.Wave = false + else + v.Wave = true + end + ang = ang + math.min(torso.Velocity.magnitude/11, .8) + motor.MaxVelocity = math.min((torso.Velocity.magnitude/111), .04) + 0.002 + if isPlayer then + motor.DesiredAngle = -ang + else + motor.CurrentAngle = -ang -- bugs + end + if motor.CurrentAngle < -.2 and motor.DesiredAngle > -.2 then + motor.MaxVelocity = .04 + end + else + part.Transparency = 1 + if decal then + decal.Transparency = 1 + end + end + else + pcall(part.Destroy,part) + Variables.Capes[i] = nil + end + end + end + end, true) + end; + + CountTable = function(tab) + local count = 0 + for i,v in next,tab do + count = count+1 + end + return count + end; + + ClearAllInstances = function() + local objects = service.GetAdonisObjects() + for i in next,objects do + i:Destroy() + objects[i] = nil + end + end; + + PlayAnimation = function(animId) + for i,v in next,service.Player.Character.Humanoid:GetPlayingAnimationTracks()do + v:Stop() + end + if animId == 0 then return end + local anim = service.New('Animation') + anim.AnimationId = 'http://www.roblox.com/Asset?ID='..animId + anim.Name = "ADONIS_Animation" + local track = service.Player.Character.Humanoid:LoadAnimation(anim) + track:Play() + end; + + SetLighting = function(prop,value) + if service.Lighting[prop]~=nil then + service.Lighting[prop] = value + Variables.LightingSettings[prop] = value + end + end; + + LocalLighting = function(on) + if on then + service.StartLoop("LocalLighting","RenderStepped",function() + for prop,value in next,Variables.LightingSettings do + if service.Lighting[prop]~=nil then + service.Lighting[prop] = value + end + end + end) + else + service.StopLoop("LocalLighting") + end + end; + + ChatMessage = function(msg,color,font,size) + local tab = {} + + tab.Text = msg + + if color then + tab.Color = color + end + + if font then + tab.Font = font + end + + if size then + tab.Size = size + end + + service.StarterGui:SetCore("ChatMakeSystemMessage",tab) + + if Functions.SendToChat then + Functions.SendToChat({Name = "::Adonis::"},msg,"Private") + end + end; + + SetCamProperty = function(prop,value) + local cam = workspace.CurrentCamera + if cam[prop] then + cam[prop] = value + end + end; + + SetFPS = function(fps) + service.StopLoop("SetFPS") + local fps = tonumber(fps) + if fps then + service.StartLoop("SetFPS",0.1,function() + local ender = tick()+1/fps + repeat until tick()>=ender + end) + end + end; + + RestoreFPS = function() + service.StopLoop("SetFPS") + end; + + Crash = function() + --[[ + local load = function(f) return f() end + local s = string.rep("\n", 2^24) + print(load(function() return s end))--]] + --print(string.find(string.rep("a", 2^20), string.rep(".?", 2^20))) + --[[while true do + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + print("Triangles.") + end) + end) + end) + end) + end) + end) + end) + end) + end) + end) + end) + end--]] + + local Run = service.RunService; + local Lol = 0; + + local Thread; function Thread() + Run:BindToRenderStep(tostring(Lol), 100, function() print"Stopping"; Thread(); end); + Lol = Lol + 1; + end; + + Thread(); + --local crash; crash = function() while true do repeat spawn(function() pcall(function() print(game[("%s|"):rep(100000)]) crash() end) end) until nil end end + --crash() + end; + + HardCrash = function() + local crash + local tab + local gui = service.New("ScreenGui",service.PlayerGui) + local rem = service.New("RemoteEvent",workspace.CurrentCamera) + crash = function() + for i=1,50 do + service.Debris:AddItem(service.New("Part",workspace.CurrentCamera),2^4000) + print("((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)((((**&&#@#$$$$$%%%%:)") + local f = service.New('Frame',gui) + f.Size = UDim2.new(1,0,1,0) + spawn(function() table.insert(tab,string.rep(tostring(math.random()),100)) end) + rem:FireServer("Hiiiiiiiiiiiiiiii") + spawn(function() + spawn(function() + spawn(function() + spawn(function() + spawn(function() + print("hi") + spawn(crash) + end) + end) + end) + end) + end) + --print(game[("%s|"):rep(0xFFFFFFF)]) + end + tab = {} + end + while wait(0.01) do + for i = 1,50000000 do + cPcall(function() client.GPUCrash() end) + cPcall(function() crash() end) + print(1) + end + end + end; + + GPUCrash = function() + local crash + local gui = service.New("ScreenGui",service.PlayerGui) + crash = function() + while wait(0.01) do + for i = 1,500000 do + local f = service.New('Frame',gui) + f.Size = UDim2.new(1,0,1,0) + end + end + end + crash() + end; + + RAMCrash = function() + while wait(0.1) do + for i = 1,10000 do + service.Debris:AddItem(service.New("Part",workspace.CurrentCamera),2^4000) + end + end + end; + + KillClient = function() + client.Kill("KillClient called") + end; + + KeyBindListener = function() + local timer = 0 + Variables.KeyBinds = Remote.Get("PlayerData").Keybinds or {} + + service.UserInputService.InputBegan:Connect(function(input) + local key = tostring(input.KeyCode.Value) + local textbox = service.UserInputService:GetFocusedTextBox() + + if Variables.KeybindsEnabled and not (textbox) and key and Variables.KeyBinds[key] and not Variables.WaitingForBind then + local isAdmin = Remote.Get("CheckAdmin") + if (tick() - timer > 5 or isAdmin) and pcall(string.char, key) then + Remote.Send('ProcessCommand',Variables.KeyBinds[key],false,true) + UI.Make("Hint",{ + Message = "[Ran] Key: "..string.char(key).." | Command: "..tostring(Variables.KeyBinds[key]) + }) + end + timer = tick() + end + end) + end; + + AddKeyBind = function(key, command) + Variables.KeyBinds[tostring(key)] = command + Remote.Get("UpdateKeybinds",Variables.KeyBinds) + UI.Make("Hint",{ + Message = 'Bound "'..string.char(key)..'" to '..command + }) + end; + + RemoveKeyBind = function(key) + if Variables.KeyBinds[tostring(key)] ~= nil then + Variables.KeyBinds[tostring(key)] = nil + Remote.Get("UpdateKeybinds",Variables.KeyBinds) + Routine(function() + UI.Make("Hint",{ + Message = 'Removed "'..string.char(key)..'" from key binds' + }) + end) + end + end; + + BrickBlur = function(on,trans,color) + local exists = service.LocalContainer():FindFirstChild("ADONIS_WINDOW_FUNC_BLUR") + if exists then exists:Destroy() end + if on then + local pa = Instance.new("Part",workspace.CurrentCamera) + pa.Name = "ADONIS_WINDOW_FUNC_BLUR" + pa.Material = "Neon" + pa.BrickColor = color or BrickColor.Black() + pa.Transparency = trans or 0.5 + pa.CanCollide = false + pa.Anchored = true + pa.FormFactor = "Custom" + pa.Size=Vector3.new(100,100,0) + while pa and pa.Parent and wait(1/40) do + pa.CFrame = workspace.CurrentCamera.CoordinateFrame*CFrame.new(0,0,-2.5)*CFrame.Angles(12.6,0,0) + end + else + for i,v in next,workspace.CurrentCamera:GetChildren()do + if v.Name == "ADONIS_WINDOW_FUNC_BLUR" then + v:Destroy() + end + end + end + end; + + PlayAudio = function(audioId, volume, pitch, looped) + if Variables.localSounds[tostring(audioId)] then Variables.localSounds[tostring(audioId)]:Stop() Variables.localSounds[tostring(audioId)]:Destroy() Variables.localSounds[tostring(audioId)]=nil end + local sound = service.New("Sound") + sound.SoundId = "rbxassetid://"..audioId + if looped then sound.Looped = true end + if volume then sound.Volume = volume end + if pitch then sound.Pitch = pitch end + sound.Name = "ADONI_LOCAL_SOUND "..audioId + sound.Parent = service.LocalContainer() + Variables.localSounds[tostring(audioId)] = sound + sound:Play() + wait(1) + repeat wait(0.1) until not sound.IsPlaying + sound:Destroy() + Variables.localSounds[tostring(audioId)] = nil + end; + + StopAudio = function(audioId) + if Variables.localSounds[tostring(audioId)] then + Variables.localSounds[tostring(audioId)]:Stop() + Variables.localSounds[tostring(audioId)]:Destroy() + Variables.localSounds[tostring(audioId)] = nil + end + end; + + FadeAudio = function(audioId,inVol,pitch,looped,incWait) + if not inVol then + local sound = Variables.localSounds[tostring(audioId)] + if sound then + for i = sound.Volume,0,-0.01 do + sound.Volume = i + wait(incWait or 0.1) + end + Functions.StopAudio(audioId) + end + else + Functions.StopAudio(audioId) + Functions.PlayAudio(audioId,0,pitch,looped) + local sound = Variables.localSounds[tostring(audioId)] + if sound then + for i = 0,inVol,0.01 do + sound.Volume = i + wait(incWait or 0.1) + end + end + end + end; + + KillAllLocalAudio = function() + for i,v in next,Variables.localSounds do + v:Stop() + v:Destroy() + table.remove(Variables.localSounds,i) + end + end; + + RemoveGuis = function() + for i,v in next,service.PlayerGui:GetChildren()do + if not UI.Get(v) then + v:Destroy() + end + end + end; + + SetCoreGuiEnabled = function(element,enabled) + service.StarterGui:SetCoreGuiEnabled(element,enabled) + end; + + UnCape = function() + local cape = service.LocalContainer():FindFirstChild("::Adonis::Cape") + if cape then cape:Destroy() end + end; + + Cape = function(material,color,decal,reflect) + local torso = service.Player.Character:FindFirstChild("HumanoidRootPart") + if torso then + local p = service.New("Part",service.LocalContainer()) + p.Name = "::Adonis::Cape" + p.Anchored = true + p.Transparency=0.1 + p.Material=material + p.CanCollide = false + p.TopSurface = 0 + p.BottomSurface = 0 + if type(color)=="table" then + color = Color3.new(color[1],color[2],color[3]) + end + p.BrickColor = BrickColor.new(color) or BrickColor.new("White") + if reflect then + p.Reflectance=reflect + end + if decal and decal~=0 then + local dec = service.New("Decal", p) + dec.Face = 2 + dec.Texture = "http://www.roblox.com/asset/?id="..decal + dec.Transparency=0 + end + p.formFactor = "Custom" + p.Size = Vector3.new(.2,.2,.2) + local msh = service.New("BlockMesh", p) + msh.Scale = Vector3.new(9,17.5,.5) + wait(0.1) + p.Anchored=false + local motor1 = service.New("Motor", p) + motor1.Part0 = p + motor1.Part1 = torso + motor1.MaxVelocity = .01 + motor1.C0 = CFrame.new(0,1.75,0)*CFrame.Angles(0,math.rad(90),0) + motor1.C1 = CFrame.new(0,1,torso.Size.Z/2)*CFrame.Angles(0,math.rad(90),0)--.45 + local wave = false + repeat wait(1/44) + local ang = 0.1 + local oldmag = torso.Velocity.magnitude + local mv = .002 + if wave then ang = ang + ((torso.Velocity.magnitude/10)*.05)+.05 + wave = false + else + wave = true + end + ang = ang + math.min(torso.Velocity.magnitude/11, .5) + motor1.MaxVelocity = math.min((torso.Velocity.magnitude/111), .04) + mv + motor1.DesiredAngle = -ang + if motor1.CurrentAngle < -.2 and motor1.DesiredAngle > -.2 then + motor1.MaxVelocity = .04 + end + + repeat wait() until motor1.CurrentAngle == motor1.DesiredAngle or math.abs(torso.Velocity.magnitude - oldmag) >=(torso.Velocity.magnitude/10) + 1 + + if torso.Velocity.magnitude < .1 then + wait(.1) + end + until not p or not p.Parent or p.Parent ~= service.LocalContainer() + end + end; + + TextToSpeech = function(str) + local audioId = 296333956 + + local audio = Instance.new("Sound",service.LocalContainer()) + audio.SoundId = "rbxassetid://"..audioId + audio.Volume = 1 + + local audio2 = Instance.new("Sound",service.LocalContainer()) + audio2.SoundId = "rbxassetid://"..audioId + audio2.Volume = 1 + + local phonemes = { + { + str='%so'; + func={17} + }; --(on) + { + str='ing'; + func={41} + }; --(singer) + { + str="oot"; + func={4, 26}; --oo,t + }; + { + str='or'; + func={10} + }; --(door) --oor + { + str='oo'; + func={3} + }; --(good) + { + str='hi'; + func={44, 19}; --h, y/ii + }; + { + str='ie'; + func={1}; --ee + }; + { + str="eye"; + func={19}; --y/ii + }; + { + str="$Suy%s"; --%Suy + real="uy"; + func={19}; --y/ii + }; + { + str="%Sey%s"; --%Sey + func={1}; --ee + }; + { + str="%sye"; --%sye + func={19}; --y/ii + }; + --[[{ + str='th'; + func={30.9, 31.3} + }; --(think)--]] + { + str='the'; + func={25, 15}; --th, u + }; + { + str='th'; + func={32, 0.2395} + }; --(this) + --[[ + { + str='ow'; + func={10, 0.335} + }; --(show) --ow + --]] + { + str='ow'; + func={20} + }; --(cow) --ow + { + str="qu"; + func={21,38};--c,w + }; + { + str='ee'; + func={1} + }; --(sheep) + { + str='i%s'; + delay=0.5; + func={19} + }; --(I) + { + str='ea'; + func={1} + }; --(read) + { + str='u(.*)e'; + real='u'; + capture=true; + func={9} + }; --(cure) (match ure) --u + { + str='ch'; + func={24} + }; --(cheese) + { + str='ere'; + func={5} + }; --(here) + { + str='ai'; + func={6} + }; --(wait) + { + str='la'; + func={39,6} + }; + { + str='oy'; + func={8} + }; --(boy) + { + str='gh'; + func={44}; + }; + { + str='sh'; + func={22} + }; --(shall) + { + str='air'; + func={18} + }; --(hair) + + { + str='ar'; + func={16} + }; --(far) + { + str='ir'; + func={11} + }; --(bird) + { + str='er'; + func={12} + }; --(teacher) + { + str='sio'; + func={35} + }; --(television) + { + str='ck'; + func={21} + }; --(book) + { + str="zy"; + func={34,1}; --z,ee + }; + { + str="ny"; + func={42, 1}; --n,ee + }; + { + str="ly"; + func={39, 1}; --l,ee + }; + { + str="ey"; + func={1} --ee + }; + { + str='ii'; + func={19} + }; --(ii?) + { + str='i'; + func={2} + };--(ship) + + { + str='y'; --y%S + func={37} + }; --(yes) + --[[ + { + str='%Sy'; + func={23.9, 24.4} + }; --(my) + --]] + { + str='y'; + func={37} + }; --(my) + + { + str='s'; + func={23} + }; --(see) + + { + str='e'; + func={13}; + }; --(bed) + --[[--]] + { + str='a'; + func={14} + }; --(cat) + --[[ + { + str='a'; + func={6} + }; --(lazy) --ai--]] + { + str="x"; + func={21, 23} --c, s + }; + { + str='u'; + func={15} + }; --(up) + { + str='o'; + func={17} + }; --(on) + { + str='c'; + func={21} + }; --(car) + { + str='k'; + func={21} + }; --(book) + { + str='t'; + func={26} + }; --(tea) + { + str='f'; + func={27} + }; --(fly) + { + str='i'; + func={2} + };--(ship) + { + str='p'; + func={28} + }; --(pea) + { + str='b'; + func={29} + }; --(boat) + { + str='v'; + func={30} + }; --(video) + { + str='d'; + func={31} + }; --(dog) + { + str='j'; + func={33} + }; --(june) + { + str='z'; + func={34} + }; --(zoo) + { + str='g'; + func={36} + }; --(go) + { + str='w'; + func={38} + }; --(wet) + { + str='l'; + func={39} + }; --(love) + { + str='r'; + func={40} + }; --(red) + { + str='n'; + func={42} + }; --(now) + { + str='m'; + func={43} + }; --(man) + { + str='h'; + func={44} + }; --(hat) + { + str=' '; + func="wait"; + }; + { + str='%.'; + func="wait"; + }; + { + str='!'; + func="wait"; + }; + { + str='?'; + func="wait"; + }; + { + str=';'; + func="wait"; + }; + { + str=':'; + func="wait"; + }; + + } + + game:service("ContentProvider"):Preload("rbxassetid://"..audioId) + + local function getText(str) + local tab = {} + local str = str + local function getNext() + for i,v in ipairs(phonemes) do + local occ,pos = string.find(string.lower(str),"^"..v.str) + if occ then + if v.capture then + local real = v.real + local realStart,realEnd = string.find(string.lower(str),real) + --local captStart,captEnd = str:lower():find(v.str) + local capt = string.match(string.lower(str),v.str) + if occ>realEnd then + table.insert(tab,v) + getText(capt) + else + getText(capt) + table.insert(tab,v) + end + else + table.insert(tab,v) + end + str = string.sub(str,pos+1) + getNext() + end + end + end + getNext() + return tab + end + + local phos=getText(str) + local swap = false + + local function say(pos) + local sound=audio + --[[--]] + if swap then + sound=audio2 + end--]] + sound.TimePosition=pos + --sound:Play() + --wait(0.2) --wait(pause) + --sound:Stop() + end + + audio:Play() + audio2:Play() + for i,v in ipairs(phos) do + --print(i,v.str) + if type(v.func)=="string" then--v.func=="wait" then + wait(0.5) + elseif type(v)=="table" then + for l,p in ipairs(v.func) do + --[[--]] + if swap then + swap=false + else + swap=true + end--]] + say(p) + if v.delay then + wait(v.delay) + else + wait(0.1) + end + end + end + end + wait(0.5) + audio:Stop() + audio2:Stop() + end; + }; +end diff --git a/src/assets/Adonis/Client/Core/Process.lua b/src/assets/Adonis/Client/Core/Process.lua new file mode 100644 index 0000000..5d74e77 --- /dev/null +++ b/src/assets/Adonis/Client/Core/Process.lua @@ -0,0 +1,150 @@ +client = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Processing +return function() + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + + local script = script + local service = service + local client = client + local Anti, Core, Functions, Process, Remote, UI, Variables + local function Init() + UI = client.UI; + Anti = client.Anti; + Core = client.Core; + Variables = client.Variables + Functions = client.Functions; + Process = client.Process; + Remote = client.Remote; + end + + getfenv().client = nil + getfenv().service = nil + getfenv().script = nil + + client.Process = { + Init = Init; + RateLimits = { --// Defaults; Will be updated with server data at client run + Remote = 0.02; + Command = 0.1; + Chat = 0.1; + RateLog = 10; + }; + + Remote = function(data,com,...) + local args = {...} + Remote.Received = Remote.Received+1 + if type(com) == "string" then + if com == client.DepsName.."GIVE_KEY" then + if not Core.Key then + Core.Key = args[1] + client.Finish_Loading() + end + elseif Remote.UnEncrypted[com] then + return {Remote.UnEncrypted[com](...)} + elseif Core.Key then + local comString = Remote.Decrypt(com,Core.Key) + local command = (data.Mode == "Get" and Remote.Returnables[comString]) or Remote.Commands[comString] + if command then + --local ran,err = pcall(command, args) --task service.Threads.RunTask("REMOTE:"..comString,command,args) + local rets = {service.TrackTask("Remote: ".. comString, command, args)} + if not rets[1] then + logError(rets[2]) + else + return {unpack(rets, 2)}; + end + end + end + end + end; + + LogService = function(Message, Type) + --service.FireEvent("Output", Message, Type) + end; + + ErrorMessage = function(Message, Trace, Script) + --service.FireEvent("ErrorMessage", Message, Trace, Script) + if Message and Message ~= "nil" and Message ~= "" and (string.find(Message,"::Adonis::") or string.find(Message,script.Name) or Script == script) then + logError(tostring(Message).." - "..tostring(Trace)) + end + + if (Script == nil or (not Trace or Trace == "")) and not (Trace and string.find(Trace,"CoreGui.RobloxGui")) then + --Anti.Detected("log","Scriptless/Traceless error found. Script: "..tostring(Script).." - Trace: "..tostring(Trace)) + end + end; + + Chat = function(msg) + --service.FireEvent("Chat",msg) + if not service.Player or service.Player.Parent ~= service.Players then + Remote.Fire("ProcessChat",msg) + end + end; + + CharacterAdded = function() + UI.GetHolder() + service.Events.CharacterAdded:fire() + end; + + CharacterRemoving = function() + if Variables.UIKeepAlive then + for ind,g in next,client.GUIs do + if g.Class == "ScreenGui" or g.Class == "GuiMain" or g.Class == "TextLabel" then + if g.CanKeepAlive and not (g.Object:IsA("ScreenGui") and not g.Object.ResetOnSpawn) then + g.KeepAlive = true + g.KeepParent = g.Object.Parent + g.Object.Parent = nil + elseif not g.CanKeepAlive then + pcall(g.Destroy, g) + end + end + end + end + + if Variables.GuiViewFolder then + Variables.GuiViewFolder:Destroy() + Variables.GuiViewFolder = nil + end + + if Variables.ChatEnabled then + service.StarterGui:SetCoreGuiEnabled("Chat",true) + end + + if Variables.PlayerListEnabled then + service.StarterGui:SetCoreGuiEnabled('PlayerList',true) + end + + local textbox = service.UserInputService:GetFocusedTextBox() + if textbox then + textbox:ReleaseFocus() + end + + service.Events.CharacterRemoving:fire() + end + } +end diff --git a/src/assets/Adonis/Client/Core/Remote.lua b/src/assets/Adonis/Client/Core/Remote.lua new file mode 100644 index 0000000..b1e3c78 --- /dev/null +++ b/src/assets/Adonis/Client/Core/Remote.lua @@ -0,0 +1,457 @@ +client = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Remote +return function() + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + + local script = script + local service = service + local client = client + local Anti, Core, Functions, Process, Remote, UI, Variables + local function Init() + UI = client.UI; + Anti = client.Anti; + Core = client.Core; + Variables = client.Variables + Functions = client.Functions; + Process = client.Process; + Remote = client.Remote; + end + + getfenv().client = nil + getfenv().service = nil + getfenv().script = nil + + client.Remote = { + Init = Init; + Returns = {}; + PendingReturns = {}; + EncodeCache = {}; + DecodeCache = {}; + Received = 0; + Sent = 0; + + Returnables = { + Test = function(args) + return "HELLO FROM THE CLIENT SIDE :)! ", unpack(args) + end; + + Ping = function(args) + return Remote.Ping() + end; + + ClientHooked = function(args) + return Core.Special + end; + + TaskManager = function(args) + local action = args[1] + if action == "GetTasks" then + local tab = {} + for i,v in next,service.GetTasks() do + local new = {} + new.Status = v.Status + new.Name = v.Name + new.Index = v.Index + new.Created = v.Created + new.CurrentTime = os.time() + new.Function = tostring(v.Function) + table.insert(tab,new) + end + return tab + end + end; + + LoadCode = function(args) + local code = args[1] + local func = Core.LoadCode(code, GetEnv()) + if func then + return func() + end + end; + + Function = function(args) + local func = client.Functions[args[1]] + if func and type(func) == "function" then + return func(unpack(args, 2)) + end + end; + + Handler = function(args) + local handler = client.Handlers[args[1]] + if handler and type(handler) == "function" then + return handler(unpack(args, 2)) + end + end; + + UIKeepAlive = function(args) + if Variables.UIKeepAlive then + for ind,g in next,client.GUIs do + if g.KeepAlive then + if g.Class == "ScreenGui" or g.Class == "GuiMain" then + g.Object.Parent = service.Player.PlayerGui + elseif g.Class == "TextLabel" then + g.Object.Parent = UI.GetHolder() + end + + g.KeepAlive = false + end + end + end + + return true; + end; + + UI = function(args) + local guiName = args[1] + local themeData = args[2] + local guiData = args[3] + + + --Core.Theme = themeData + return UI.Make(guiName,guiData,themeData) + end; + + InstanceList = function(args) + local objects = service.GetAdonisObjects() + local temp = {} + for i,v in next,objects do + table.insert(temp, { + Text = v:GetFullName(); + Desc = v.ClassName; + }) + end + return temp + end; + + ClientLog = function(args) + local temp={} + local function toTab(str, desc, color) + for i,v in next,service.ExtractLines(str) do + table.insert(temp,{Text = v,Desc = desc..v, Color = color}) + end + end + + for i,v in next,service.LogService:GetLogHistory()do + if v.messageType==Enum.MessageType.MessageOutput then + toTab(v.message, "Output: ") + --table.insert(temp,{Text=v.message,Desc='Output: '..v.message}) + elseif v.messageType==Enum.MessageType.MessageWarning then + toTab(v.message, "Warning: ", Color3.new(1,1,0)) + --table.insert(temp,{Text=v.message,Desc='Warning: '..v.message,Color=Color3.new(1,1,0)}) + elseif v.messageType==Enum.MessageType.MessageInfo then + toTab(v.message, "Info: ", Color3.new(0,0,1)) + --table.insert(temp,{Text=v.message,Desc='Info: '..v.message,Color=Color3.new(0,0,1)}) + elseif v.messageType==Enum.MessageType.MessageError then + toTab(v.message, "Error: ", Color3.new(1,0,0)) + --table.insert(temp,{Text=v.message,Desc='Error: '..v.message,Color=Color3.new(1,0,0)}) + end + end + + return temp + end + }; + + UnEncrypted = { + LightingChange = function(prop,val) + print(prop,"TICKLE ME!?") + Variables.LightingChanged = true + service.Lighting[prop] = val + Anti.LastChanges.Lighting = prop + wait(.1) + Variables.LightingChanged = false + print("TICKLED :)",Variables.LightingChanged) + if Anti.LastChanges.Lighting == prop then + Anti.LastChanges.Lighting = nil + end + end + }; + + Commands = { + GetReturn = function(args) + print("THE SERVER IS ASKING US FOR A RETURN"); + local com = args[1] + local key = args[2] + local parms = {unpack(args,3)} + local retfunc = Remote.Returnables[com] + local retable = (retfunc and {pcall(retfunc,parms)}) or {} + if retable[1] ~= true then + logError(retable[2]) + Remote.Send("GiveReturn", key, "__ADONIS_RETURN_ERROR", retable[2]) + else + print("SENT RETURN"); + Remote.Send("GiveReturn", key, unpack(retable,2)) + end + end; + + GiveReturn = function(args) + print("SERVER GAVE US A RETURN") + if Remote.PendingReturns[args[1]] then + print("VALID PENDING RETURN") + Remote.PendingReturns[args[1]] = nil + service.Events[args[1]]:fire(unpack(args,2)) + end + end; + + SetVariables = function(args) + local vars = args[1] + for var,val in next,vars do + Variables[var] = val + end + end; + + Print = function(args) + print(unpack(args)) + end; + + FireEvent = function(args) + service.FireEvent(unpack(args)) + end; + + Test = function(args) + print("OK WE GOT COMMUNICATION! ORGL: "..tostring(args[1])) + end; + + TestError = function(args) + error("THIS IS A TEST ERROR") + end; + + TestEvent = function(args) + Remote.PlayerEvent(args[1],unpack(args,2)) + end; + + LoadCode = function(args) + local code = args[1] + local func = Core.LoadCode(code, GetEnv()) + if func then + return func() + end + end; + + LaunchAnti = function(args) + Anti.Launch(args[1],args[2]) + end; + + UI = function(args) + local guiName = args[1] + local themeData = args[2] + local guiData = args[3] + + --Core.Theme = themeData + UI.Make(guiName,guiData,themeData) + end; + + RemoveUI = function(args) + UI.Remove(args[1],args[2]) + end; + + StartLoop = function(args) + local name = args[1] + local delay = args[2] + local code = args[3] + local func = Core.LoadCode(code, GetEnv()) + if name and delay and code and func then + service.StartLoop(name,delay,func) + end + end; + + StopLoop = function(args) + service.StopLoop(args[1]) + end; + + Function = function(args) + local func = client.Functions[args[1]] + if func and type(func) == "function" then + Pcall(func,unpack(args,2)) + end + end; + + Handler = function(args) + local handler = client.Handlers[args[1]] + if handler and type(handler) == "function" then + Pcall(handler, unpack(args, 2)) + end + end + }; + + Fire = function(...) + local limits = Process.RateLimits + local limit = (limits and limits.Remote) or 0.01; + local RemoteEvent = Core.RemoteEvent; + local extra = {...}; + + if RemoteEvent and RemoteEvent.Object then + service.Queue("REMOTE_SEND", function() + Remote.Sent = Remote.Sent+1; + RemoteEvent.Object:FireServer({Mode = "Fire", Module = client.Module, Loader = client.Loader, Sent = Remote.Sent, Received = Remote.Received}, unpack(extra)); + wait(limit); + end) + end + end; + + Send = function(com,...) + Core.LastUpdate = tick() + Remote.Fire(Remote.Encrypt(com,Core.Key),...) + end; + + GetFire = function(...) + local RemoteEvent = Core.RemoteEvent; + local limits = Process.RateLimits; + local limit = (limits and limits.Remote) or 0.02; + local extra = {...}; + local returns; + + if RemoteEvent and RemoteEvent.Function then + local event = service.New("BindableEvent"); + + service.Queue("REMOTE_SEND", function() + Remote.Sent = Remote.Sent+1; + spawn(function() -- Wait for return in new thread; We don't want to hold the entire fire queue up while waiting for one thing to return since we just want to limit fire speed; + returns = {RemoteEvent.Function:InvokeServer({Mode = "Get", Module = client.Module, Loader = client.Loader, Sent = Remote.Sent, Received = Remote.Received}, unpack(extra))} + event:Fire(); + end) + wait(limit) + end) + + if not returns then + event.Event:Wait(); + event:Destroy(); + end + + if returns then + return unpack(returns) + end + end + end; + + Get = function(com,...) + Core.LastUpdate = tick() + local ret = Remote.GetFire(Remote.Encrypt(com,Core.Key),...) + if type(ret) == "table" then + return unpack(ret); + else + return ret; + end + end; + + OldGet = function(com,...) + local returns + local key = Functions:GetRandom() + local waiter = service.New("BindableEvent"); + local event = service.Events[key]:Connect(function(...) print("WE ARE GETTING A RETURN!") returns = {...} waiter:Fire() wait() waiter:Fire() waiter:Destroy() end) + + Remote.PendingReturns[key] = true + Remote.Send("GetReturn",com,key,...) + print(string.format("GETTING RETURNS? %s", tostring(returns))) + --returns = returns or {event:Wait()} + waiter.Event:Wait(); + print(string.format("WE GOT IT! %s", tostring(returns))) + + event:Disconnect() + + if returns then + if returns[1] == "__ADONIS_RETURN_ERROR" then + error(returns[2]) + else + return unpack(returns) + end + else + return nil + end + end; + + Ping = function() + local t = tick() + local ping = Remote.Get("Ping") + if not ping then return false end + local t2 = tick() + local mult = 10^3 + local ms = ((math.floor((t2-t)*mult+0.5)/mult)*100) + return ms + end; + + PlayerEvent = function(event,...) + Remote.Send("PlayerEvent",event,...) + end; + + Encrypt = function(str, key, cache) + local cache = cache or Remote.EncodeCache or {} + if not key or not str then + return str + elseif cache[key] and cache[key][str] then + return cache[key][str] + else + local keyCache = cache[key] or {} + local byte = string.byte + local abs = math.abs + local sub = string.sub + local len = string.len + local char = string.char + local endStr = {} + + for i = 1,len(str) do + local keyPos = (i%len(key))+1 + endStr[i] = string.char(((byte(sub(str, i, i)) + byte(sub(key, keyPos, keyPos)))%126) + 1) + end + + endStr = table.concat(endStr) + cache[key] = keyCache + keyCache[str] = endStr + return endStr + end + end; + + Decrypt = function(str, key, cache) + local cache = cache or Remote.DecodeCache or {} + if not key or not str then + return str + elseif cache[key] and cache[key][str] then + return cache[key][str] + else + local keyCache = cache[key] or {} + local byte = string.byte + local abs = math.abs + local sub = string.sub + local len = string.len + local char = string.char + local endStr = {} + + for i = 1,len(str) do + local keyPos = (i%len(key))+1 + endStr[i] = string.char(((byte(sub(str, i, i)) - byte(sub(key, keyPos, keyPos)))%126) - 1) + end + + endStr = table.concat(endStr) + cache[key] = keyCache + keyCache[str] = endStr + return endStr + end + end; + } +end diff --git a/src/assets/Adonis/Client/Core/Service.lua b/src/assets/Adonis/Client/Core/Service.lua new file mode 100644 index 0000000..db55cc3 --- /dev/null +++ b/src/assets/Adonis/Client/Core/Service.lua @@ -0,0 +1,1109 @@ +server = nil +client = nil +Pcall = nil +cPcall = nil +Routine = nil + +local ErrorHandler +local RealMethods = {} +local methods = setmetatable({},{ + __index = function(tab,index) + return function(obj,...) + local r,class = pcall(function() return obj.ClassName end) + if r and class and obj[index] and type(obj[index]) == "function" then + if not RealMethods[class] then + RealMethods[class] = {} + end + + if not RealMethods[class][index] then + RealMethods[class][index] = obj[index] + end + + if RealMethods[class][index] ~= obj[index] or pcall(function() return coroutine.create(obj[index]) end) then + if ErrorHandler then + ErrorHandler("MethodError", "Cached method doesn't match found method: "..tostring(index), "Method: "..tostring(index), index) + end + end + + return RealMethods[class][index](obj,...) + end + + return obj[index](obj,...) + end + end; + __metatable = "Methods"; +}) + + +return function(errorHandler, eventChecker, fenceSpecific) + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + + main = server or client + ErrorHandler = errorHandler + local Kill = main.Kill + local service; + local WaitingEvents = {} + local HookedEvents = {} + local Debounces = {} + local Queues = {} + local RbxEvents = {} + local LoopQueue = {} + local FilterCache = {} + local TrackedTasks = {} + local RunningLoops = {} + local ServiceVariables = {} + local CreatedItems = setmetatable({},{__mode = "v"}); + local Wrappers = setmetatable({},{__mode = "kv"}); + local oldInstNew = Instance.new + local WrapService = Instance.new("Folder") + local ThreadService = Instance.new("Folder") + local HelperService = Instance.new("Folder") + local EventService = Instance.new("Folder") + local Instance = {new = function(obj, parent) return service and client and service.Wrap(oldInstNew(obj, service.UnWrap(parent)), true) or oldInstNew(obj, parent) end} + local Events, Threads, Wrapper, Helpers = { + TrackTask = function(name, func, ...) + local index = math.random() + local isThread = string.sub(name, 1, 7) == "Thread:" + local data = { + Name = name; + Status = "Waiting"; + Function = func; + isThread = isThread; + Created = os.time(); + Index = index; + } + + local function taskFunc(...) + TrackedTasks[index] = data + data.Status = "Running" + data.Returns = {pcall(func, ...)} + + if not data.Returns[1] then + data.Status = "Errored" + else + data.Status = "Finished" + end + + TrackedTasks[index] = nil + return unpack(data.Returns) + end + + if isThread then + data.Thread = coroutine.create(taskFunc) + return select(2, coroutine.resume(data.Thread, ...)) + else + return taskFunc(...) + end + end; + + EventTask = function(name, func) + local newTask = service.TrackTask + return function(...) + return newTask(name, func, ...) + end + end; + + GetTasks = function() + return TrackedTasks + end; + + Events = setmetatable({},{ + __index = function(tab,ind) + return service.GetEvent(ind) + end + }); + + CheckEvents = function(waiting) + if true then return "Disabled" end + if waiting then + for ind,waiter in next,WaitingEvents do + if waiter.Waiting and waiter.Timeout ~= 0 and tick() - waiter.Last > waiter.Timeout then + waiter:Remove() + end + end + else + for i,v in next,HookedEvents do + if #v == 0 then + HookedEvents[i] = nil + else + for ind,waiter in pairs(WaitingEvents) do + if waiter.Waiting and waiter.Timeout ~= 0 and tick() - waiter.Last > waiter.Timeout then + waiter:Remove() + end + end + end + end + end + end; + + ForEach = function(tab, func) + for i,v in next,tab do + func(tab, i, v) + end + end; + + WrapEventArgs = function(tab) + local Wrap = service.Wrap + local UnWrap = service.UnWrap + local Wrapped = service.Wrapped + for i,v in next,tab do + if type(v) == "table" and v.__ISWRAPPED and v.__OBJECT then + tab[i] = Wrap(v.__OBJECT) + end + end + return tab + end; + + UnWrapEventArgs = function(args) + local Wrap = service.Wrap + local UnWrap = service.UnWrap + local Wrapped = service.Wrapped + for i,v in next,args do + if Wrapped(v) then + args[i] = { + __ISWRAPPED = true; + __OBJECT = UnWrap(v); + } + end + end + return args + end; + + GetEvent = function(name) + if not HookedEvents[name] then + local Wrap = service.Wrap + local UnWrap = service.UnWrap + local Wrapped = service.Wrapped + local WrapArgs = service.WrapEventArgs + local UnWrapArgs = service.UnWrapEventArgs + local event = Wrap(service.New("BindableEvent"), client) + local hooks = {} + + event.Event:Connect(function(...) + for i,v in next,hooks do + return v.Function(...) + end + end) + + event:SetSpecial("Wait", function(i, timeout) + local special = math.random() + local done = false + local ret + + if timeout and type(timeout) == "number" and timeout > 0 then + Routine(function() + wait(timeout) + if not done then + UnWrap(event):Fire(special) + end + end) + end + + repeat + ret = {UnWrap(event.Event):Wait()} + until ret[1] == 2 or ret[1] == special + + done = true + + if ret[1] == special then + warn("Event waiter timed out [".. tostring(timeout) .."]") + return nil + else + return unpack(WrapArgs(ret), 2) + end + end) + + event:SetSpecial("Fire", function(i, ...) + UnWrap(event):Fire(2, unpack(UnWrapArgs({...}))) + end) + + event:SetSpecial("ConnectOnce", function(i, func) + local event2; event2 = event:Connect(function(...) + event2:Disconnect() + func(...) + end) + + return event2 + end) + + event:SetSpecial("Connect", function(i, func) + local special = math.random() + local event2 = Wrap(UnWrap(event.Event):Connect(function(con, ...) + if con == 2 or con == special then + func(unpack(WrapArgs({...}))) + end + end), client) + + event2:SetSpecial("Fire", function(i, ...) + UnWrap(event):Fire(special, unpack(UnWrapArgs({...}))) + end) + + event2:SetSpecial("Wait", function(i, timeout) + local ret + + repeat + ret = {UnWrap(event.Event):Wait(timeout)} + until ret[1] == 2 or ret[1] == special + + return unpack(WrapArgs(ret), 2) + end) + + event2:SetSpecial("wait", event.Wait) + event2:SetSpecial("disconnect", event2.Disconnect) + + return event2 + end) + + event:SetSpecial("fire", event.Fire) + event:SetSpecial("wait", event.Wait) + event:SetSpecial("connect", event.Connect) + event:SetSpecial("connectOnce", event.ConnectOnce) + event:SetSpecial("Event", service.Wrap(event.Event, client)) + event.Event:SetSpecial("Wait", event.Wait) + event.Event:SetSpecial("wait", event.Wait) + event.Event:SetSpecial("Connect", event.Connect) + event.Event:SetSpecial("connect", event.Connect) + + HookedEvents[name] = event + return event + else + return HookedEvents[name] + end + end; + + HookEvent = function(name,func,env) + if type(name) ~= "string" or type(func) ~= "function" then + warn("Invalid argument supplied; HookEvent(string, function)") + else + return service.GetEvent(name):Connect(func) + end + end; + + FireEvent = function(name,...) + local event = HookedEvents[name] + return event and event:Fire(...) + end; + + RemoveEvents = function(name) + local event = HookedEvents[name] + if event then + HookedEvents[name] = nil + event:Destroy() + end + end; + },{ + Tasks = {}; + Threads = {}; + CheckTasks = function() + for i,task in next,service.Threads.Tasks do + if not task.Thread or task:Status() == "dead" then + task:Remove() + end + end + end; + + NewTask = function(name,func,timeout) + local pid = math.random()*tick()/1000 + local index = pid..":"..tostring(func) + local newTask; newTask = { + PID = pid; + Name = name; + Index = index; + Created = os.time(); + Changed = {}; + Timeout = timeout or 0; + Running = false; + Function = func; + R_Status = "Idle"; + Finished = {}; + Function = function(...) newTask.R_Status = "Running" newTask.Running = true local ret = {func(...)} newTask.R_Status = "Finished" newTask.Running = false newTask.Remove() return unpack(ret) end; + Remove = function() newTask.R_Status = "Removed" newTask.Running = false for i,v in pairs(service.Threads.Tasks) do if v == newTask then table.remove(service.Threads.Tasks,i) end end newTask.Changed:fire("Removed") newTask.Finished:fire() service.RemoveEvents(index.."_TASKCHANGED") service.RemoveEvents(index.."_TASKFINISHED") newTask.Thread = nil end; + Thread = service.Threads.Create(function(...) return newTask.Function(...) end); + Resume = function(...) newTask.R_Status = "Resumed" newTask.Running = true newTask.Changed:fire("Resumed") local rets = {service.Threads.Resume(newTask.Thread,...)} if not rets[1] then ErrorHandler("TaskError", rets[2]) newTask.Changed:fire("Errored",rets[2]) newTask.Remove() end return unpack(rets) end; + Status = function() if newTask.Timeout ~= 0 and ((os.time() - newTask.Created) > newTask.Timeout) then newTask:Stop() return "timeout" else return service.Threads.Status(newTask.Thread) end end; + Pause = function() newTask.R_Status = "Paused" newTask.Running = false service.Threads.Pause(newTask.Thread) newTask.Changed:fire("Paused") end; + Stop = function() newTask.R_Status = "Stopping" service.Threads.Stop(newTask.Thread) newTask.Changed:fire("Stopped") newTask.Remove() end; + Kill = function() newTask.R_Status = "Killing" service.Threads.End(newTask.Thread) newTask.Changed:fire("Killed") newTask.Remove() end; + } + + function newTask.Changed:connect(func) + return service.Events[index.."_TASKCHANGED"]:connect(func) + end; + + function newTask.Changed:fire(...) + service.Events[index.."_TASKCHANGED"]:fire(...) + end + + function newTask.Finished:connect(func) + return service.Events[index.."_TASKFINISHED"]:connect(func) + end + + function newTask.Finished:wait() + service.Events[index.."_TASKFINISHED"]:wait(0) + end + + function newTask.Finished:fire(...) + service.Events[index.."_TASKFINISHED"]:fire(...) + end + + newTask.End = newTask.Stop + newTask.Kill = newTask.Stop + + table.insert(service.Threads.Tasks,newTask) + + service.Threads.CheckTasks() + + return newTask.Resume, newTask + end; + + RunTask = function(name,func,...) + local func,task = service.Threads.NewTask(name,func) + return task,func(...) + end; + + TimeoutRunTask = function(name,func,timeout,...) + local func,task = service.Threads.NewTask(name,func,timeout) + return task,func(...) + end; + + WaitTask = function(name,func,...) + local func,task = service.Threads.NewTask(name,func) + local returns = {func(...)} + task.Finished:wait() + return task, unpack(returns) + end; + + NewEventTask = function(name,func,timeout) + --if true then return func end --// disabling stuff for now; Spamming tasks for events just seems like a bad idea + return function(...) + if service.Running then + return service.Threads.NewTask(name,func,timeout)(...) + else + return function() end + end + end + end; + + Stop = coroutine.yield; + Wait = coroutine.yield; + Pause = coroutine.yield; + Yield = coroutine.yield; + Status = coroutine.status; + Running = coroutine.running; + Create = coroutine.create; + Start = coroutine.resume; + Wrap = coroutine.wrap; + Get = coroutine.running; + New = function(func) local new = coroutine.create(func) table.insert(service.Threads.Threads,new) return new end; + End = function(thread) repeat if thread and service.Threads.Status(thread) ~= "dead" then service.Threads.Stop(thread) service.Threads.Resume(thread) else thread = false break end until not thread or service.Threads.Status(thread) == "dead" end; + Wrap = function(func,...) local new = service.Threads.New(func) service.Threads.Resume(func,...) return new end; + Resume = function(thread,...) if thread and coroutine.status(thread) == "suspended" then return coroutine.resume(thread,...) end end; + Remove = function(thread) service.Threads.Stop(thread) for ind,th in pairs(service.Threads.Threads) do if th == thread then table.remove(service.Threads.Threads,ind) end end end; + StopAll = function() for ind,th in pairs(service.Threads.Threads) do service.Threads.Stop(th) table.remove(service.Threads.Threads,ind) end end; ResumeAll = function() for ind,th in pairs(service.Threads.Threads) do service.Threads.Resume(th) end end; GetAll = function() return service.Threads.Threads end; + },{ + WrapIgnore = function(tab) return setmetatable(tab,{__metatable = "Ignore"}) end; + CheckWrappers = function() + for obj,wrap in next,Wrappers do + if service.IsDestroyed(obj) then + Wrappers[obj] = nil + end + end + end; + Wrapped = function(object) + if getmetatable(object) == "Adonis_Proxy" then + return true + else + return false + end + end; + UnWrap = function(object) + if type(object) == "table" then + local tab = {} + for i,v in next,object do tab[i] = service.UnWrap(v) end + return tab + elseif service.Wrapped(object) then + return object:GetObject() + else + return object + end + end; + Wrap = function(object, fullWrap) + fullWrap = fullWrap or (fullWrap == nil and client ~= nil) --// Everything clientside should be getting wrapped anyway + if getmetatable(object) == "Ignore" or getmetatable(object) == "ReadOnly_Table" then + return object + elseif Wrappers[object] then + return Wrappers[object] + elseif type(object) == "table" then + local tab = setmetatable({},{__eq = function(tab,val) return object end}) + for i,v in next,object do tab[i] = service.Wrap(v, fullWrap) end + return tab + --[[elseif type(object) == "function" then + return function(...) + pcall(setfenv, object, getfenv()) + return unpack(service.Wrap({object(...)})) + end--]] + elseif (typeof(object) == "Instance" or typeof(object) == "RBXScriptSignal" or typeof(object) == "RBXScriptConnection") and not service.Wrapped(object) then + local Wrap = (not fullWrap and function(...) return ... end) or function(obj) return service.Wrap(obj, fullWrap) end + local UnWrap = service.UnWrap + local newObj = newproxy(true) + local newMeta = getmetatable(newObj) + local custom; custom = { + GetMetatable = function() + return newMeta + end; + + AddToCache = function() + Wrappers[object] = newObj; + end; + + IsRobloxLocked = function() + return main.Anti.RLocked(object) + end; + + RemoveFromCache = function() + Wrappers[object] = nil + end; + + GetObject = function() + return object + end; + + SetSpecial = function(ignore, name, val) + custom[name] = val + end; + + Clone = function(self, noAdd) + local new = object:Clone() + if not noAdd then + table.insert(CreatedItems, new) + end + return service.Wrap(new) + end; + + connect = function(ignore, func) + return Wrap(object:connect(function(...) + return func(unpack(service.Wrap{...})) + end)) + end; + + wait = function(ignore,...) + return Wrap(object.wait)(object, ...) + end; + } + + custom.Connect = custom.connect + custom.Wait = custom.wait + + newMeta.__tostring = function() return custom.ToString or tostring(object) end + newMeta.__metatable = "Adonis_Proxy" + newMeta.__index = function(tab, ind) + local target = custom[ind] or object[ind] + if custom[ind] then + return custom[ind] + elseif type(target) == "function" then + return function(ignore, ...) + return unpack(Wrap{methods[ind](object, unpack(UnWrap{...}))}) + end + else + return Wrap(target) + end + end + + newMeta.__newindex = function(tab, ind, val) + object[ind] = UnWrap(val) + end + + newMeta.__gc = function(tab) + custom:RemoveFromCache() + end + + newMeta.__eq = service.RawEqual + + custom:AddToCache() + return newObj + else + return object + end + end; + },{ + CloneTable = function(tab) + local new = (getmetatable(tab) ~= nil and setmetatable({},{ + __index = function(t, ind) + return tab[ind] + end + })) or {} + for i,v in next,tab do + new[i] = v + end + return new + end; + IsLocked = function(obj) return not pcall(function() obj.Name = obj.Name return obj.Name end) end; + Timer = function(t,func,check) + local start = tick() + local event; event = service.RunService.RenderStepped:connect(function() + if tick()-start>t or (check and check()) then + func() + event:disconnect() + end + end) + end; + Unpack = function(tab,ind,limit) + if (not limit and tab[ind or 1] ~= nil) or (limit and (ind or 1) <= limit) then + return tab[ind or 1], service.Unpack(tab,(ind or 1)+1,limit) + end + end; + AltUnpack = function(args,shift) + if shift then shift = shift-1 end + return args[1+(shift or 0)],args[2+(shift or 0)],args[3+(shift or 0)],args[4+(shift or 0)],args[5+(shift or 0)],args[6+(shift or 0)],args[7+(shift or 0)],args[8+(shift or 0)],args[9+(shift or 0)],args[10+(shift or 0)] + end; + ExtractLines = function(str) + local strs = {} + local new = "" + for i=1,#str+1 do + if string.byte(str:sub(i,i)) == 10 or i == #str+1 then + table.insert(strs,new) + new = "" + else + local char = str:sub(i,i) + if string.byte(char) < 32 then + char = "" + end + new = new..char + end + end + return strs + end; + Filter = function(str,from,to) + local new = "" + local lines = service.ExtractLines(str) + for i = 1,#lines do + local ran,newl = pcall(function() return service.Chat:FilterStringAsync(lines[i],from,to) end) + newl = (ran and newl) or lines[i] or "" + if i > 1 then + new = new.."\n"..newl + else + new = newl + end + end + return new or "Filter Error" + end; + LaxFilter = function(str,from,cmd) -- @Roblox; If this function violates the filtering rules please note that this is currently the only way + if tonumber(str) then -- to avoid major filter related problems (like commands becoming unusable due to numbers or names being filtered) + return str -- Please consider dropping the filter rules down a notch or improving on the existing filtering methods + elseif type(str) == "string" then -- Also always feel free to message me with any concerns you have :)! + if cmd and #service.GetPlayers(from, str, true) > 0 then + return str + else + return service.Filter(str, from, from) + end + else + return str + end + end; + BroadcastFilter = function(str,from) + local new = "" + local lines = service.ExtractLines(str) + for i = 1,#lines do + local ran,newl = pcall(function() return service.Chat:FilterStringForBroadcast(lines[i],from) end) + newl = (ran and newl) or lines[i] or "" + if i > 1 then + new = new.."\n"..newl + else + new = newl + end + end + return new or "Filter Error" + end; + MetaFunc = function(func) + return service.NewProxy { + __call = function(tab,...) + return func(...) + end + } + end; + NewProxy = function(meta) + local newProxy = newproxy(true) + local metatable = getmetatable(newProxy) + metatable.__metatable = false + for i,v in next,meta do metatable[i] = v end + return newProxy + end; + GetUserType = function(obj) + local ran,err = pcall(function() local temp = obj[math.random()] end) + if ran then + return "Unknown" + else + return err:match("%S+$") + end + end; + CountTable = function(tab) + local num = 0 + for i in next,tab do + num = num+1 + end + return num + end; + Debounce = function(key,func) + local env = getfenv(2) + local Debounces = (env and env._ADONIS_DEBOUNCES) or Debounces or {} + + if env then + env._ADONIS_DEBOUNCES = (env and env._ADONIS_DEBOUNCES) or {} + end + + if Debounces[key] then + return false + else + Debounces[key] = true + local ran,err = pcall(func) + Debounces[key] = false + if not ran then + error(err) + end + end + end; + + Queue = function(key,func) + if not Queues[key] then Queues[key] = {} end + local queue = Queues[key] + local tab = {} + + tab.Time = tick(); + tab.Running = false; + tab.Function = func; + + table.insert(queue, tab); + + service.ProcessQueue(queue); + end; + + ProcessQueue = function(queue) + if queue then + if queue.__PROCESSING then + return "Processing" + else + local stepped = service.RunService.RenderStepped; + + queue.__PROCESSING = true + + while wait() and #queue > 0 do + for i,v in next,queue do + if i ~= "__PROCESSING" then + if v.Running then + repeat stepped:wait() until not v.Running or not queue[i] + else + v.Running = true + pcall(v.Function) + v.Running = false + table.remove(queue,i) + end + end + end + end + + queue.__PROCESSING = false + end + else + for ind,data in next,LoopQueue do + if not data.LastRun or (data.LastRun and tick()-data.LastRun>data.Delay) then + if data.MaxRuns and data.NumRuns and data.MaxRuns<=data.NumRuns then + LoopQueue[ind] = nil + else + if data.MaxRuns and data.NumRuns then + data.NumRuns = data.NumRuns+1 + end + Pcall(data.Function) + data.LastRun = tick() + end + end + end + end + end; + + QueueItem = function(name,data) + local new = data + if data.MaxRuns then + data.NumRuns = 0 + end + LoopQueue[name] = new + end; + + RemoveQueue = function(name) + LoopQueue[name] = nil + end; + + New = function(class,data) + local new = Instance.new(class) + if data then + if type(data) == "table" then + local parent = data.Parent + if service.Wrapped(parent) then parent = parent:GetObject() end + data.Parent = nil + + for val,prop in pairs(data) do + new[val] = prop + end + + if parent then + new.Parent = parent + end + elseif type(data) == "userdata" then + if service.Wrapped(data) then + new.Parent = data:GetObject() + else + new.Parent = data + end + end + end + + if new then + table.insert(CreatedItems, new) + end + + return new + end; + Iterate = function(tab,func) + if tab and type(tab) == "table" then + for ind,val in next,tab do + local ret = func(ind,val) + if ret ~= nil then + return ret + end + end + elseif tab and type(tab) == "userdata" then + for ind,val in next,tab:GetChildren() do + local ret = func(val,ind) + if ret ~= nil then + return ret + end + end + else + error("Invalid table") + end + end; + GetTime = function(optTime) + local tim=optTime or os.time() + local hour = math.floor((tim%86400)/60/60) + local min = math.floor(((tim%86400)/60/60-hour)*60) + if min < 10 then min = "0"..min end + if hour < 10 then hour = "0"..hour end + return hour..":"..min + end; + OwnsAsset = function(p,id) + return service.MarketPlace:PlayerOwnsAsset(p,id) + end; + MaxLen = function(message,length) + if #message>length then + return message:sub(1,length).."..." + else + return message + end + end; + Round = function(num) + if num >= 0.5 then + return math.ceil(num) + elseif num < 0.5 then + return math.floor(num) + end + end; + StartLoop = function(name,delay,func,noYield) + local tab = { + Name = name; + Delay = delay; + Function = func; + Running = true; + } + + local index = tostring(name).." - "..main.Functions:GetRandom() + + local function kill() + tab.Running = true + if RunningLoops[index] == tab then + RunningLoops[index] = nil + end + end + + local function loop() + if tonumber(delay) then + repeat + func() + wait(tonumber(delay)) + until RunningLoops[index] ~= tab or not tab.Running + kill() + elseif delay == "Heartbeat" then + repeat + func() + service.RunService.Heartbeat:wait() + until RunningLoops[index] ~= tab or not tab.Running + kill() + elseif delay == "RenderStepped" then + repeat + func() + service.RunService.RenderStepped:wait() + until RunningLoops[index] ~= tab or not tab.Running + kill() + elseif delay == "Stepped" then + repeat + func() + service.RunService.Stepped:wait() + until RunningLoops[index] ~= tab or not tab.Running + kill() + else + tab.Running = false + end + end + + tab.Kill = kill + RunningLoops[index] = tab + + + if noYield then + service.TrackTask("Thread: Loop: ".. name, loop) + else + service.TrackTask("Loop: ".. name, loop) + end + + --[[local task = service.Threads.RunTask("LOOP:"..name, loop) + + if not noYield then + task.Finished:wait() + kill() + end--]] + + --[[if noYield then + Routine(loop) + else + loop() + end--]] + + return tab + end; + StopLoop = function(name) + for ind,loop in pairs(RunningLoops) do + if name == loop.Function or name == loop.Name then + loop.Running = false + end + end + end; + FindClass = function(parent, class) + for ind, child in next,parent:GetChildren() do + if child:IsA(class) then + return child + end + end + end; + Immutable = function(...) + local co = coroutine.create(function(...) while true do coroutine.yield(...) end end) + co(...) + return co + end; + ReadOnly = function(tabl, excluded, killOnError, noChecks) + local doChecks = (not noChecks) and service.RunService:IsClient() + local player = doChecks and service.Players.LocalPlayer + local kick = player and player.Kick + local settings, getMeta, get, pc, resume, create = getfenv().settings, getmetatable, getfenv, pcall, coroutine.resume, coroutine.create + local unique = doChecks and getMeta(get()) + local checkFor = doChecks and { + secret500 = true; + getrawmetatable = true; + setreadonly = true; + full_access = true; + elysianexecute = true; + decompile = true; + make_writable = true; + } + + return service.NewProxy { + __index = function(tab, ind) + local topEnv = doChecks and get and get(2) + local setRan = doChecks and pcall(settings) + if doChecks and (setRan or (get ~= getfenv or getMeta ~= getmetatable or pc ~= pcall) or (not topEnv or type(topEnv) ~= "table" or getMeta(topEnv) ~= unique)) then + ErrorHandler("ReadError", "Tampering with Client [read rt0001]", "["..tostring(ind).. " " .. tostring(topEnv) .. " " .. tostring(topEnv and getMeta(topEnv)).."]\n".. tostring(debug.traceback())) + --elseif doChecks and (function() local ran,err = pc(function() for i in next,checkFor do if topEnv[i] then return true end end return false end) if not ran or ran and err then return true end end)() then + -- ErrorHandler("ReadError", "Tampering with Client [read rt0002]", "["..tostring(ind).. " " .. tostring(topEnv) .. " " .. tostring(topEnv and getMeta(topEnv)).."]\n".. tostring(debug.traceback())) + elseif tabl[ind]~=nil and type(tabl[ind]) == "table" and not (excluded and (excluded[ind] or excluded[tabl[ind]])) then + return service.ReadOnly(tabl[ind], excluded, killOnError, noChecks) + else + return tabl[ind] + end + end; + + __newindex = function(tab,ind,new) + local topEnv = doChecks and get and get(2) + local setRan = doChecks and pcall(settings) + if doChecks and (setRan or (get ~= getfenv or getMeta ~= getmetatable or pc ~= pcall) or (not topEnv or type(topEnv) ~= "table" or getMeta(topEnv) ~= unique)) then + ErrorHandler("ReadError", "Tampering with Client [write wt0003]", "["..tostring(ind).. " " .. tostring(topEnv) .. " " .. tostring(topEnv and getMeta(topEnv)).."]\n".. tostring(debug.traceback())) + --elseif doChecks and (function() local ran,err = pc(function() for i in next,checkFor do if topEnv[i] then return true end end return false end) if not ran or ran and err then return true end end)() then + -- ErrorHandler("ReadError", "Tampering with Client [write wt0004]", "["..tostring(ind).. " " .. tostring(topEnv) .. " " .. tostring(topEnv and getMeta(topEnv)).."]\n".. tostring(debug.traceback())) + elseif not (excluded and (excluded[ind] or excluded[tabl[ind]])) then + if killOnError then + ErrorHandler("ReadError", "Tampering with Client [write wt0005]", "["..tostring(ind).. " " .. tostring(topEnv) .. " " .. tostring(topEnv and getMeta(topEnv)).."]\n".. tostring(debug.traceback())) + end + + error("Read-only") + else + rawset(tabl, ind, new) + end + end; + + __metatable = "ReadOnly_Table"; + __gc = function()end; + } + end; + Wait = function(mode) + if not mode or mode == "Stepped" then + service.RunService.Stepped:wait() + elseif mode == "Heartbeat" then + service.RunService.Heartbeat:wait() + elseif mode and tonumber(mode) then + wait(tonumber(mode)) + end + end; + ForEach = function(tab, func) for i,v in next,tab do func(tab,i,v) end return tab end; + OrigRawEqual = rawequal; + ForEach = function(tab, func) for i,v in next,tab do func(tab,i,v) end return tab end; + HasItem = function(obj, prop) return pcall(function() return obj[prop] end) end; + IsDestroyed = function(object) + if type(object) == "userdata" and service.HasItem(object, "Parent") then + if object.Parent == nil then + local ran,err = pcall(function() object.Parent = game object.Parent = nil end) + if not ran then + if err and string.match(err, "^The Parent property of (.*) is locked, current parent: NULL,") then + return true + else + return false + end + end + end + end + return false + end; + Insert = function(id) + local model = service.InsertService:LoadAsset(id) + return model:GetChildren()[1] + end; + GetPlayers = function() return service.Players:GetPlayers() end; + IsAdonisObject = function(obj) for i,v in next,CreatedItems do if v == obj then return true end end end; + GetAdonisObjects = function() return CreatedItems end; + } + + service = setmetatable({ + Variables = function() return ServiceVariables end; + Routine = Routine; + Running = true; + Pcall = Pcall; + cPcall = cPcall; + Threads = Threads; + DataModel = game; + WrapService = WrapService; + EventService = EventService; + ThreadService = ThreadService; + HelperService = HelperService; + MarketPlace = game:service("MarketplaceService"); + GamepassService = game:service("GamePassService"); + ChatService = game:service("Chat"); + Gamepasses = game:service("GamePassService"); + Delete = function(obj,num) game:service("Debris"):AddItem(obj,(num or 0)) pcall(obj.Delete, obj) end; + RbxEvent = function(signal, func) local event = signal:connect(func) table.insert(RbxEvents, event) return event end; + DelRbxEvent = function(signal) for i,v in next,RbxEvents do if v == signal then v:Disconnect() table.remove(RbxEvents, i) end end end; + SanitizeString = function(str) str = service.Trim(str) local new = "" for i = 1,#str do if str:sub(i,i) ~= "\n" and str:sub(i,i) ~= "\0" then new = new..str:sub(i,i) end end return new end; + Trim = function(str) return str:match("^%s*(.-)%s*$") end; + Round = function(num) return math.floor(num + 0.5) end; + Localize = function(obj, readOnly) if type(obj) == "table" then local newTab = {} for i in next,obj do newTab[i] = service.Localize(obj[i], readOnly) end return (readOnly and service.ReadOnly(newTab)) or newTab else return obj end end; + RawEqual = function(obj1, obj2) return service.UnWrap(obj1) == service.UnWrap(obj2) end; + CheckProperty = function(obj,prop) return pcall(function() return obj[prop] end) end; + NewWaiter = function() local event = service.New("BindableEvent") return {Wait = event.wait; Finish = event.Fire} end; + },{ + __index = function(tab,index) + local found = (fenceSpecific and fenceSpecific[index]) or Wrapper[index] or Events[index] or Helpers[index] + if found ~= nil then + return found + else + local ran,serv = pcall(function() return (client ~= nil and service.Wrap(game:GetService(index), true)) or game:GetService(index) end) + if ran and serv then + service[tostring(serv)] = serv + return serv + end + end + end; + __tostring = "Service"; + __metatable = "Service"; + }) + + WrapService = Wrapper.Wrap(WrapService) + HelperService = Wrapper.Wrap(HelperService) + ThreadService = Wrapper.Wrap(ThreadService) + EventService = Wrapper.Wrap(EventService) + + service.WrapService = WrapService + service.HelperService = HelperService + service.ThreadService = ThreadService + service.EventService = EventService + + if client ~= nil then + for i,val in next,service do + if type(val) == "userdata" then + service[i] = service.Wrap(val, true) + end + end + end + + for i,v in next,Wrapper do + if type(v) == "function" then + WrapService:SetSpecial(i, function(ignore, ...) return v(...) end) + else + WrapService:SetSpecial(i, v) + end + end + + for i,v in next,Helpers do + if type(v) == "function" then + HelperService:SetSpecial(i, function(ignore, ...) return v(...) end) + else + HelperService:SetSpecial(i, v) + end + end + + for i,v in next,Threads do + if type(v) == "function" then + ThreadService:SetSpecial(i, function(ignore, ...) return v(...) end) + else + ThreadService:SetSpecial(i, v) + end + end + + for i,v in next,Events do + if type(v) == "function" then + EventService:SetSpecial(i, function(ignore, ...) return v(...) end) + else + EventService:SetSpecial(i, v) + end + end + + for name, service in next,{WrapService = WrapService, EventService = EventService, ThreadService = ThreadService, HelperService = HelperService} do + service:SetSpecial("ClassName", name) + service:SetSpecial("ToString", name) + service:SetSpecial("IsA", function(i, check) return check == name end) + end + + return service +end diff --git a/src/assets/Adonis/Client/Core/UI.lua b/src/assets/Adonis/Client/Core/UI.lua new file mode 100644 index 0000000..f507bb9 --- /dev/null +++ b/src/assets/Adonis/Client/Core/UI.lua @@ -0,0 +1,437 @@ +client = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Processing +return function() + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + + local script = script + local service = service + local client = client + local Anti, Core, Functions, Process, Remote, UI, Variables, Deps + local function Init() + UI = client.UI; + Anti = client.Anti; + Core = client.Core; + Variables = client.Variables + Functions = client.Functions; + Process = client.Process; + Remote = client.Remote; + Deps = client.Deps; + end + + getfenv().client = nil + getfenv().service = nil + getfenv().script = nil + + client.UI = { + Init = Init; + GetHolder = function() + if UI.Holder and UI.Holder.Parent == service.PlayerGui then + return UI.Holder + else + pcall(function()if UI.Holder then UI.Holder:Destroy()end end) + local new = service.New("ScreenGui"); + new.Name = Functions.GetRandom() + new.Parent = service.PlayerGui + UI.Holder = new + return UI.Holder + end + end; + + Prepare = function(gui) + if true then return gui end --// Disabled + + local gTable = UI.Get(gui,false,true) + if gui:IsA("ScreenGui") or gui:IsA("GuiMain") then + local new = Instance.new("TextLabel") + new.BackgroundTransparency = 1 + new.Size = UDim2.new(1,0,1,0) + new.Name = gui.Name + new.Active = true + new.Text = "" + + for ind,child in next,gui:GetChildren()do + child.Parent = new + end + + if gTable then + gTable:Register(new) + end + + gui:Destroy() + + return new + else + return gui + end + end; + + LoadModule = function(module, data, env) + local ran,func = pcall(require, module) + local newEnv = GetEnv(env) + local data = data or{} + + newEnv.script = module + newEnv.client = service.CloneTable(client) + newEnv.service = service.CloneTable(service) + newEnv.service.Threads = service.CloneTable(service.Threads) + + for i,v in next,newEnv.client do + if type(v) == "table" and i ~= "Variables" and i ~= "Handlers" then + newEnv.client[i] = service.CloneTable(v) + end + end + + if ran then + local rets = {service.TrackTask("UI: ".. module:GetFullName(), setfenv(func,newEnv), data)} + local ran = rets[1] + if ran then + return unpack(rets,2) + else + warn("Error while running module "..module.Name,tostring(rets[2])) + client.LogError("Error loading "..tostring(module).." - "..tostring(rets[2])) + end + else + warn("Error while loading module "..module.Name,tostring(func)) + end + end; + + GetNew = function(theme, name) + local found = {} + local endConfig = {} + local endConfValues = {} + local confFolder = Instance.new("Folder") + local func + + function func(theme, name, depth) + local depth = (depth or 11) - 1 + local folder = Deps.UI:FindFirstChild(theme) or Deps.UI.Default + if folder then + local baseValue = folder:FindFirstChild("Base_Theme") + local baseTheme = baseValue and baseValue.Value + local foundGUI = (baseValue and folder:FindFirstChild(name)) or Deps.UI.Default:FindFirstChild(name) + + if foundGUI then + local config = foundGUI:FindFirstChild("Config") + table.insert(found, { + Theme = theme; + Folder = folder; + Name = name; + Found = foundGUI; + Config = config; + isModule = foundGUI:IsA("ModuleScript"); + }) + + if config then + baseValue = config:FindFirstChild("BaseTheme") or baseValue + baseTheme = baseValue and baseValue.Value + end + end + + if baseTheme and depth > 0 then + func(baseTheme, name, depth) + end + end + end + + --// Find GUI and all default versions under it + func(theme, name) + confFolder.Name = "Config" + + if #found > 0 then + + --// Combine all configs found in order to build full config (in order of closest from target gui to furthest) + for i,v in next,found do + if v.Config then + for k,m in next,v.Config:GetChildren() do + if not endConfig[m.Name] then + endConfig[m.Name] = m + end + end + end + end + + --// Load all config values into the new Config folder + for i,v in next,endConfig do + v:Clone().Parent = confFolder + end + + --// Find next module based theme GUI if code not found or first in sequence is module (in theme) + if found[1].isModule then + return found[1].Found, found[1].Folder, confFolder + elseif not endConfig.Code then + for i,v in next,found do + if v.isModule then + return v.Found, v.Folder, confFolder + end + end + end + + --// Get rid of an old Config folder and throw the new combination Config folder in + local new = found[1].Found:Clone() + local oldFolder = new:FindFirstChild'Config' + + if oldFolder then oldFolder:Destroy() end + + confFolder.Parent = new + + return new, found[1].Folder, confFolder + end + end; + + Make = function(name, data, themeData) + local data = data or {} + local defaults = {Desktop = "Default"; Mobile = "Mobilius"} + local themeData = themeData or Core.Theme or defaults + local theme = Variables.CustomTheme or (service.IsMobile() and themeData.Mobile) or themeData.Desktop + local folder = Deps.UI:FindFirstChild(theme) or Deps.UI.Default + local newGui, folder2, foundConf = UI.GetNew(theme, name) + + if newGui then + local isModule = newGui:IsA("ModuleScript") + local conf = newGui:FindFirstChild("Config") + + if isModule then + return UI.LoadModule(newGui, data, { + script = newGui; + }) + elseif conf and foundConf and foundConf ~= true then + local code = foundConf.Code + local mult = foundConf.AllowMultiple + local keep = foundConf.CanKeepAlive + + local allowMult = mult and mult.Value or true + local found, num = UI.Get(name) + + if not found or ((num and num>0) and allowMult) then + local gTable,gIndex = UI.Register(newGui) + local newEnv = {} + + if folder:IsA("ModuleScript") then + newEnv.script = folder + newEnv.gTable = gTable + local ran,func = pcall(require, folder) + local newEnv = GetEnv(newEnv) + local rets = {pcall(setfenv(func,newEnv),newGui, gTable, data)} + local ran = rets[1] + local ret = rets[2] + + if ret ~= nil then + if type(ret) == "userdata" and Anti.GetClassName(ret) == "ScreenGui" then + code = (ret:FindFirstChild("Config") and ret.Config:FindFirstChild("Code")) or code + else + return ret + end + end + end + + newGui.Parent = Variables.GUIHolder + newGui.Name = Functions.GetRandom() + + data.gIndex = gIndex + data.gTable = gTable + + code.Parent = conf + code.Name = name + + return UI.LoadModule(code, data, { + script = code; + gTable = gTable; + Data = data; + GUI = newGui; + }) + end + end + else + print("GUI "..tostring(name).." not found") + end + end; + + Get = function(obj,ignore,returnOne) + local found = {} + local num = 0 + if obj then + for ind,g in next,client.GUIs do + if g.Name ~= ignore and g.Object ~= ignore and g ~= ignore then + if type(obj) == "string" then + if g.Name == obj then + found[ind] = g + num = num+1 + if returnOne then return g end + end + elseif type(obj) == "userdata" then + if service.RawEqual(g.Object, obj) then + found[ind] = g + num = num+1 + if returnOne then return g end + end + elseif type(obj) == "boolean" and obj == true then + found[ind] = g + num = num+1 + if returnOne then return g end + end + end + end + end + if num<1 then + return false + else + return found,num + end + end; + + Remove = function(name, ignore) + local gui = UI.Get(name, ignore) + if gui then + for i,v in next,gui do + v.Destroy() + end + end + end; + + Register = function(gui, data) + local gIndex = Functions.GetRandom() + local gTable;gTable = { + Object = gui, + Config = gui:FindFirstChild'Config'; + Name = gui.Name, + Events = {}, + Class = gui.ClassName, + Index = gIndex, + Active = true, + Ready = function() + if gTable.Config then gTable.Config.Parent = nil end + if pcall(function() + if gTable.Class == "ScreenGui" or gTable.Class == "GuiMain" then + gTable.Object.Parent = service.PlayerGui + else + gTable.Object.Parent = UI.GetHolder() + end + end) then + gTable.Active = true + else + warn("Something happened while trying to set the parent of "..tostring(gTable.Name)) + warn'Maybe it was locked (Destroyed)?' + gTable:Destroy() + end + end, + BindEvent = function(event, func) + local signal = event:connect(func) + local origDisc = signal.Disconnect + local Events = gTable.Events + local disc = function() + origDisc(signal) + for i,v in next, Events do + if v.Signal == signal then + table.remove(Events, i) + end + end + end + + table.insert(Events, { + Signal = signal; + Remove = disc + }) + + return { + Disconnect = disc; + disconnect = disc; + wait = service.CheckProperty(signal, "wait") and signal.wait + }, signal + end, + ClearEvents = function() + for i,v in next,gTable.Events do + v:Remove() + end + end, + Destroy = function() + pcall(function() + if gTable.CustomDestroy then + gTable.CustomDestroy() + else + service.UnWrap(gTable.Object):Destroy() + end + end) + gTable.Destroyed = true + gTable.Active = false + client.GUIs[gIndex] = nil + gTable.ClearEvents() + end, + UnRegister = function() + client.GUIs[gIndex] = nil + if gTable.AncestryEvent then + gTable.AncestryEvent:Disconnect() + end + end, + Register = function(tab,new) + if not new then new=tab end + + new:SetSpecial("Destroy", gTable.Destroy) + gTable.Object = service.Wrap(new) + gTable.Class = new.ClassName + + if gTable.AncestryEvent then + gTable.AncestryEvent:Disconnect() + end + + gTable.AncestryEvent = new.AncestryChanged:Connect(function(c, parent) + if client.GUIs[gIndex] then + if rawequal(c, gTable.Object) and gTable.Class == "TextLabel" and parent == service.PlayerGui then + wait() + gTable.Object.Parent = UI.GetHolder() + elseif rawequal(c, gTable.Object) and parent == nil and not gTable.KeepAlive then + gTable:Destroy() + elseif rawequal(c, gTable.Object) and parent ~= nil then + gTable.Active = true + client.GUIs[gIndex] = gTable + end + end + end) + client.GUIs[gIndex] = gTable + end + } + + if data then + for i,v in next,data do + gTable[i] = v + end + end + + gui.Name = Functions.GetRandom() + gTable:Register(gui) + + return gTable,gIndex + end + } + + client.UI.RegisterGui = client.UI.Register + client.UI.GetGui = client.UI.Get + client.UI.PrepareGui = client.UI.Prepare + client.UI.MakeGui = client.UI.Make +end diff --git a/src/assets/Adonis/Client/Core/Variables.lua b/src/assets/Adonis/Client/Core/Variables.lua new file mode 100644 index 0000000..34944e1 --- /dev/null +++ b/src/assets/Adonis/Client/Core/Variables.lua @@ -0,0 +1,82 @@ +client = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Special Variables +return function() + local _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay = + _G, game, script, getfenv, setfenv, workspace, + getmetatable, setmetatable, loadstring, coroutine, + rawequal, typeof, print, math, warn, error, pcall, + xpcall, select, rawset, rawget, ipairs, pairs, + next, Rect, Axes, os, tick, Faces, unpack, string, Color3, + newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor, + NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint, + NumberSequenceKeypoint, PhysicalProperties, Region3int16, + Vector3int16, elapsedTime, require, table, type, wait, + Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay + + local script = script + local service = service + local client = client + local Anti, Core, Functions, Process, Remote, UI, Variables + local function Init() + UI = client.UI; + Anti = client.Anti; + Core = client.Core; + Variables = client.Variables + Functions = client.Functions; + Process = client.Process; + Remote = client.Remote; + end + + getfenv().client = nil + getfenv().service = nil + getfenv().script = nil + + client.GUIs = {} + client.GUIHolder = service.New("Folder") + client.Variables = { + Init = Init; + CodeName = ""; + UIKeepAlive = true; + KeybindsEnabled = true; + ParticlesEnabled = true; + CapesEnabled = true; + Particles = {}; + KeyBinds = {}; + Capes = {}; + savedUI = {}; + localSounds = {}; + LightingSettings = { + Ambient = service.Lighting.Ambient; + Brightness = service.Lighting.Brightness; + ColorShift_Bottom = service.Lighting.ColorShift_Bottom; + ColorShift_Top = service.Lighting.ColorShift_Top; + GlobalShadows = service.Lighting.GlobalShadows; + OutdoorAmbient = service.Lighting.OutdoorAmbient; + Outlines = service.Lighting.Outlines; + ShadowColor = service.Lighting.ShadowColor; + GeographicLatitude = service.Lighting.GeographicLatitude; + Name = service.Lighting.Name; + TimeOfDay = service.Lighting.TimeOfDay; + FogColor = service.Lighting.FogColor; + FogEnd = service.Lighting.FogEnd; + FogStart = service.Lighting.FogStart; + } + }; +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/AntiDelete.rbxm b/src/assets/Adonis/Client/Dependencies/AntiDelete.rbxm new file mode 100644 index 0000000..0d9d2d8 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/AntiDelete.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/Changelog.lua b/src/assets/Adonis/Client/Dependencies/Changelog.lua new file mode 100644 index 0000000..f23b40d --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/Changelog.lua @@ -0,0 +1,1125 @@ +return { + "Version: 168 (a1)"; + "*Click and drag edges to expand*"; + ""; + "[05.20.2020 16:51 PST]"; + "*LINK integration."; + "*Removed commands deemed inappropriate for modified usage."; + "audrey (atom#0001; pascaling) says hello!"; + ""; + "[05.12.2020 19:55 EST]"; + "*Revived a popular command with new wording to adhere to ROBLOX's terms"; + "(The :CLOWNs, they are watching)"; + ""; + "[04.27.2020 15:36 EST]"; + "*Client will now queue Remote.Send and Remote.Get requests based on Process.RateLimits.Remote so the server doesn't drop them"; + "*Minor performance changes to client loading process"; + "*Added missing GitHub contributers to credits"; + "*Fixed warnings and admin notes not saving"; + "@GitHub Merged changes from NNickey:"; + "-Merge: PlayerGui preferred for loading over Backpack due to replication (15 second timeout)"; + "@GitHub Merged changes from ItsGJK:"; + "-Merge: Added :notifypm and :countdownpm"; + "-Merge: Fixed a typo"; + ""; + "[4.19.2020 06:02 EST]"; + "*Git merge"; + "*GetLevel will now return 0.5 for custom ranks"; + ""; + "[04.10.2020 12:50 EST]"; + "*Merged GitHub changes"; + "*Fully removed ypcall (fixes stuff like :jail)"; + "*Fixed UIKeepAlive"; + ""; + "[04.07.2020 13:29 EST]"; + "*Moved remote ratelimit check"; + "*ACLI will only run once per player in case one already exists"; + "*Minor changes & bug fixes"; + ""; + "[03.25.2020 13:03 EST]"; + "*Disabled Console GUI AutoLocalize property"; + ""; + "[03.25.2020 12:02 EST]"; + "*Fixed an issue that allowed server crashing via the chat system"; + "*Messages larger than those allowed by ROBLOX's chat (200 characters) will result in a kick"; + "*Any chat (Admins too) or command (Non-Admins only; via the command bar) message over 500 characters will now be trimmed"; + "*Limits defined by Process.MsgStringLimit & Process.MaxChatCharacterLimit"; + ""; + "[03.22.2020 18:10 EST]"; + "*Fixed a RateLimit issue with commands"; + "*Fixed punish"; + "*Fixed a tools issue with :refresh"; + ""; + "[03.22.2020 12:06 EST]"; + "*Changelog will now just use the date and time instead of a senseless number"; + "*Rate limiting for the remote event and chatted event"; + "*Merged a git pull request (updates btools command)"; + "*Updated F3X deps to the current(?) model"; + "*Fixed an issue where particles stayed after someone respawned"; + "*The command bar will now hide itself if focus is lost"; + "*To fix an issue Remote.Get now uses an actual RemoteFunction"; + "*Fixed a ZIndex issue in UserPanel game settings when adding to tables"; + "*Adonis should no longer kick you for selecting stuff while in studio"; + "*Minor other bug fixes/changes"; + "*Previous issues confirmed to be resolved"; + ""; + "1.2.43b [1/16/20; 12:39PM/12:39]"; + "UPDATE: 1:56PM"; + "I *think* both issues might be resolved; I'll still be waiting for any reports though."; + "I don't want to confirm anything as being resolved until a day or two (minimum) has passed without incident."; + "Short lasting third party code (about a day) may have been the culprit of Issue #1 (Limited impact)"; + "As to Issue #2 (Extremely limited impact) I believe it's an issue with a detection being triggered via an exploit so hopefully changing a few detections from Kick to Log resolved it, though I don't believe it was something widely known (Maybe 2 or 3 people at the most)"; + "Keep an eye out for logs talking about RobloxLocked or client issues in :exploitlogs and report any you see (if any)"; + "I probably won't reply to every single message; Send anyway"; + "If anyone knows any vulnerability reproduction steps now or in the future report it to me and I'll pay a bounty or something if I can confirm and patch it (in RB via group payout)"; + ""; + "ORIGINAL MESSAGE:"; + "POTENTIAL ISSUE (UNCONFIRMED):"; + "!Currently investigating reports of a potential vulnerability"; + "!Also currently hardening some things and reverting any changes made recently to be safe"; + "!As of right now I don't know what the conditions are for it or if it's actually Adonis"; + "!Report anything observed going forward to Davey_Bones and ideally shutdown any existing servers following this update"; + ""; + "ISSUE (CONFIRMED?):"; + "!Aside from the unconfirmed issue, there is a confirmed issue that involves exploiting the anti-exploit to trigger a kick."; + "!Currently I am not sure how this is being performed but it does not appear to be new and does not seem to allow anything other than kicking"; + "!As a precaution, I have disabled a number of anti-exploit features I believe could be responsible"; + "!(Some things have been changed from Kick to Log, so keep an eye on exploitlogs if you notice something wrong)"; + "!Also, report it immediately if something breaks as a result of this (I can only do minor in-studio testing)"; + "(Please only report issues, not a lack of issues, as my inbox will likely get overwhelmed once I push this update)"; + "..."; + "You can also message me with questions or concerns, but know that I likely won't be able to reply to most of you. I'll be disabling trade requests to stop those from spamming my inbox as well, so should be slightly more manageable... I hope"; + "..."; + "Sorry for the lack of updates... I've been busy with non-roblox stuff and haven't had as much time to fix bugs. Bit overdue."; + ""; + "1.2.42b [9/29/19; 1:43PM/13:43]"; + "*Merged GitHub changes"; + "*Out of Sync will now log instead of kick"; + "*Partially disabled Out of Sync check"; + ""; + "1.2.41b [7/14/2019; 12:36PM/12:36]"; + "*Shutdown reason should be filtered now"; + ""; + "1.2.40b [1/27/2019; 9:06AM/9:06]"; + "*Disabled \"Out of Sync\" kick"; + ""; + "1.2.39b [1/20/2019; 12:49PM/12:49]"; + "*Fixed shutdown reason"; + "*Added :ws as an alias for :walkspeed"; + ""; + "1.2.38b [1/19/2019; 5:26PM/17:26]"; + "*Changed encryption/decryption (fixed an issue with it as well)"; + "*Minor changes and bug fixes"; + "*Special thanks to WrathOfTheElvhen for bringing an encryption bug to my attention"; + "!!NOTE: ALL ADONIS DATASTORE DATA WILL BE LOST DUE TO CIPHER CHANGES!!"; + ""; + "1.2.37b [1/13/2019; 3:46PM/15:46]"; + "*First update of the new year (!!!)"; + "*Updated gamepass checking method (Merged from Brandon-Beck on GitHub)"; + "*Donor perks purchase will take effect immediately upon purchase"; + "*Fixed :mutelist (Merged from TheCakeChicken on GitHub)"; + ""; + "1.2.36b [12/29/2018; 4:09PM/16:09]"; + "*settings.Permissions now supports multiple custom ranks per command (eg \":view:Staff,Guards,Helpers\")"; + ""; + "1.2.35b [12/28/2018; 4:56PM/16:56]"; + "*Fixed gamepass-based admin support (cuz roblox did a roblox 'n borkied it)"; + "*Specify gamepasses using GamePass:IDHERE"; + ""; + "1.2.34b [12/19/2018; 10:44AM/10:44]"; + "**Reminder: Adonis has always been fully open-source and will NOT be affected by the upcoming private module changes**"; + "**You can find the current module in Davey_Bone's inventory**"; + "*Been busy with school/work; Sorry for the lack of updates"; + ""; + "1.2.33b [10/22/2018; 9:03AM/9:03]"; + "*Possibly fixed a bug (sortof)"; + "*Fixed client settings having a gross thick margin on the right side"; + ""; + "1.2.32b [10/3/2018]"; + "*Fixed custom chat"; + "*Window GUI now uses custom drag handler (replaces frame.Draggable)"; + "*Window GUI now uses DisplayOrder"; + "*Window GUI will now change DisplayOrder to focus windows when you click in them or drag them"; + "*Updated UserPanel GUI (only took me forever to finally get around to it (literally almost a year now qq))"; + ""; + "1.2.31b [10/3/2018]"; + "*Fixed a bug that caused an error in the local log about Backpack missing"; + ""; + "1.2.30b [9/30/2018]"; + "*Commands now support multiple admin levels (as a table)"; + "*This change is intended to allow one command to be assigned to multiple custom ranks"; + "*Also first update from new account :)! Hopefully my little redirection thinger works for the old version qq"; + ""; + "==========================="; + "*DEVELOPEMENT MOVED!"; + "*Moved development to account \"Skeletarius/Davey_Bones\""; + "*This will be the new primary developer of Adonis (This is still me (Sceleratis))"; + "*Please update your loader to the new one located in Davey_Bones' models"; + "==========================="; + ""; + "1.2.29b [8/17/2018]"; + "*Added :thanos so you can bring perfect balance to the server"; + ""; + "1.2.28b [8/16/2018]"; + "*Fixed the window close button missing its 'x'"; + ""; + "1.2.27b [7/24/2018]"; + "*They come from a world unlike our own."; + ""; + "1.2.26b [7/22/2018]"; + "*Added a debounce to :zawarudo"; + "*LogAdded event will now have a string for the type of log as first arg (eg \"Chat\" when a chat log is added)"; + ""; + "1.2.25b [6/27/2018]"; + "*Merged GitHub pull requests"; + "*Changed a bunch of stuff (localized some tables in server in each core module; server.TableHere.Whatever is now just TableHere.Whatever"; + "*Stopped enforcing server-side instancce wrapping; May improve server performance"; + ""; + "1.2.24b [6/13/2018]"; + "*Updated team commands"; + "*Updated Rerubi"; + "*Merged some changes from GitHub"; + ""; + "1.2.23b [6/10/2018]"; + "*Fixed an issue where messages wouldn't go away if spammed"; + "*FlyNoclip now uses GetService(\"Players\")"; + "*Invisible now makes faces and forcefields invisible"; + "*Set 1-120 limit on FOV cmd"; + "*Also Adonis is now on Github https://github.com/Sceleratis/Adonis"; + ""; + "1.2.22b [6/7/2018]"; + "*Killed some datastore error spam"; + "*Fixed a method call issue"; + "*Possibly fixed a locallog refresh issue"; + "*Possibly fixed an infinite wait for a torso"; + ""; + "1.2.21b [6/7/2018]"; + "*Fixed an issue where the script wasn't accepting blank command prefixes"; + ""; + "1.2.20b [6/6/2018]"; + "*Fixed an issue where the script would spam the console with GetData timeouts"; + "*Server to client GetData requests will now end if the player leaves, instead of waiting for the timeout"; + "*Fixed an out of memory errors/crash related to messages"; + ""; + "1.2.19b [6/3/2018]"; + "*Removed HopperBin building tools from :btools; Roblox killed/removed them"; + ""; + "1.2.18b [5/12/2018]"; + "*Updated the Base64 encoded encrypted message"; + ""; + "1.2.17.1b [5/5/2018]"; + "*Found the cause of the kicking issue and it should now be resolved in all new servers"; + ""; + "1.2.17b [5/4/2018]"; + "*Added :serverinstances & :clientinstances"; + "*Adonis will now auto kick guest accounts (they aren't supposed to be usable anymore)"; + "*Minor client security update"; + ""; + "1.2.16b [4/26/2018]"; + "*Fixed timed messages"; + "*Made a few random minor updates over the last few days (didn't update changelog)"; + ""; + "1.2.15b [4/22/2018]"; + "*Random small changes"; + "*You can now spawn tools directly from the tool list"; + ""; + "1.2.14b [4/20/2018]"; + "*Changed some client stuff"; + ""; + "1.2.13b"; + "*Fixed :wilfire crashing maybe"; + "*Fixed some effect gui audios not looping"; + "*Added sound to countdowns and a mute sound button"; + "*Added the ability to add title buttons to windows ez pz"; + "*Changed how group ranks are checked, shouldn't cache now"; + "*The script will now tell you if your admin level changes (like if you get deranked in a group)"; + "*Admin level cache updates are now logged in the script logs"; + "*Minor optimizations"; + "#Note: Group rank checking is still affected by the built in timed level caching"; + "#Group ranks will only update every 60 seconds, so it will take around 60 seconds from"; + "#the last level update (per player) for the script to recognise any group rank changes made on the site"; + ""; + "1.2.123b"; + "*Nuke command should be less painful/crashy"; + "*Hopefully fixed an issue causing some donor commands not to work"; + "*Fixed a typo related to server players info"; + "*Window resizing should work with touch devices now, however might move the camera"; + "*Converted the old explorer to the new style and fixed server-side deleting"; + ""; + "1.2.12b"; + "*Fixed command arg filtering"; + ""; + "1.2.11b"; + "*Updated flight to *maybe* work on devices without keyboards"; + "*:fly command now has an optional speed argument"; + "*Updated/changed task tracking"; + "*Random minor changes"; + ""; + "1.2.10b"; + "*Fixed some bugs and disabled some stuff that might have been causing problems (kicking?)"; + ""; + "1.2.9b"; + "*Added :sudo (Creators Only); Allows you to force a player to run a command"; + "#Note: The above can run all commands regardless of the target's level (as System)"; + "#It's highly recommended that its permission level should never be decreased"; + ""; + "1.2.8b"; + "*Minor performance changes"; + "*Events service now fully uses BindableEvents and less gross stuff"; + ""; + "1.2.7b"; + "*Squished a big ol bug"; + "*Might have fixed the random kicking thing, DM me if not"; + "*Also *might* have squished a window bug tied to client lag (and PMs) :)"; + "*Fixed track/particles (again qq)"; + "*Possibly fixed a bug that caused lag when a player joined"; + "#By *might* I mean I'm pretty sure, and testing shows good stuff, but I'm not 100%"; + "#So make sure you report stuff thx"; + ""; + "1.2.6b"; + "*Diddled a bunch of bugs away (pesky shutdown)"; + ""; + "1.2.6b"; + "*Fixed :makecard (forgot to port the GUI, sorry about that)"; + "*Fixed :n sticking around forever"; + ""; + "1.2.5b"; + "*Did some stuff and investigating some other stuff"; + "*Performance might be better, dunno"; + "*If you are having issues, message me with the problem and a link to your place"; + "*Random bug fixes"; + "*Fixed :hatpets"; + ""; + "1.2.4b"; + "*Bug fixes"; + "*Removed some (basically) duplicate items from Hydris theme"; + ""; + "1.2.3b"; + "*Fixed a problem with old-theme GUIs not working after the update"; + "*Updated how Base_Themes work"; + "*Updated client.UI.Make"; + "*Minor changes"; + ""; + "1.2.2b"; + "*Squished some bugs; Gross."; + "*Fixed PM reply and bchat issue"; + "*Fixed effect guis not being removable"; + "*Fixed anything that required LocalContainer not working (particles, track)"; + "*Fixed local text filtering"; + "*Fixed :ls and :cs"; + ""; + "1.2.1b"; + "*Looking into (and fixing?) bugs"; + "*Renamed Hybrid to Hydris to fix some potential theme compatability issues happening"; + "#(This forces it to use \"Default\" instead as Hybrid is no longer valid)#"; + "*Apparently the new group rank cache killing stuff broke everything so I disabled it for now"; + ""; + "1.2.0b"; + "#First (second now qq) major update of 2018 :)!#"; + "*Window GUI revamped (mOre rEsize mOre bEtter)(You'll need to manually switch to the new \"Default\" theme)"; + "*Old Window GUIs removed from themes to avoid compatability issues"; + "*New UI improvements (only applicible to new default theme)"; + "*Music command now has a fourth argument for volume"; + "*Only commands requiring arg filtering are filtered now (like message related ones)"; + "*Random Optimizations"; + "*Fixed unloopkill"; + "*Client changes"; + "*If a user is demoted/exiled they should no longer have admin after around 30 seconds"; + "###Above does not apply in reverse to promoted users###"; + "*Updated to newest version of Rerubi"; + "#All themes, especially ones that pull attributes (like code) from existing themes"; + "must now include a Base_Theme StringValue in their folder that"; + "indicates the original theme to pull from if the theme is missing UI elements or code#"; + "#If a theme does not have the Base_Theme StringValue, the default theme will be used instead"; + "This is to fix some potential compatability issues with themes created before this update#"; + "#Note: New UserPanel & Explorer are both not implemented yet because I haven't had time to work on them, sorry :("; + "It's been causing the entire update to take forever because of a lack of energy"; + "So instead of just procrastinating more, I've decided to ship without them"; + "They will be finished/added at some point in the future but I don't know when that will be"; + "I'm just too tired lately to finish it, so it might be a while#"; + "#If this majorly bugs out I'm just reverting it, so report them as always#"; + ""; + "1.1.5b"; + "*Changed client.UI.MakeGui to client.UI.Make"; + "*Changed client.UI.RegisterGui to client.UI.Register"; + "*Changed client.UI.RemoveGui to client.UI.Remove"; + "*Changed client.UI.PrepareGui to client.UI.Prepare"; + "*Changed client.UI.GetGui to client.UI.Get"; + ""; + "1.1.4b"; + "*As per ROBLOX's Request the following commands have been removed:"; + "*Removed :salem, :crucify, :kidnap, :trippy, :flash, :drug, :strobe, and :bleach"; + ""; + "*Anyway..."; + "*I dunno how often I'm going to update"; + "*Life stuff has consumed all of my time"; + "*And Roblox isn't as attractive as it used to be..."; + "*BUT! There is a *big* update I've been working on"; + "*I started it before December 2017 and was hoping to have it done by 2018"; + "*Buuuuuttt then I kinda got distracted and haven't had enough time to work on it"; + "*So I figured I'd just let you know that's why there haven't been any updates"; + "*Have a nice day :)! <3 - Me (That guy who gives you text and script stuffs)"; + "*<.< (Sceleratis wuz here shhh) >.> <.< ^_^ >_> o_O"; + ""; + "1.1.3b"; + "*Disabled settings.NetworkOwners by default to prevent lag"; + "+Added warnings (like lag) to certain settings' descriptions in the settings module"; + "+Added a console key setting that can be changed locally per user via client settings panel"; + "*If you experience lag when players load in make sure the NetworkOwners, ReplicationLogs, and AntiDelete settings are disabled"; + ""; + "1.1.2b"; + "*Fixed a bug with kicking players"; + ""; + "1.1.1b"; + "*Fixed plugin commands not loading correctly if the plugin yields"; + "*Minor changes"; + ""; + "1.1.0b"; + "*The player finder 'id-USERIDHERE' now works on players not in the game"; + "*If you give the name of a player not in-game, the script will create a pseudo-player for use in commands"; + "*These two player getting changes should be useful for banning players not in-game easilly"; + "+Replaced :databan and :undataban with :gameban and :ungameban; These will save to the normal banlist now"; + "*Changed how timebans work"; + "+Added :timebans to view current timebans"; + "+Updated :untimeban"; + "*Removed the original :databan and :undataban commands"; + "*Minor changes"; + ""; + "1.0.150b"; + "+Added SongHint setting"; + "+Added CodeExecution setting"; + "*Minor changes"; + ""; + "1.0.149b"; + "*Changes to how the script handles cleanup at game shutdown"; + "*Server-side instances are now wrapped; May cause plugin issues; Message me if so"; + ""; + "1.0.148b"; + "*Updated :deadlands"; + "+Added :undeadlands"; + ""; + "1.0.147b"; + "*Minor security update"; + "*Fixed :cs"; + ""; + "1.0.146b"; + "*Bug fixes"; + ""; + "1.0.145b"; + "*Fixed script creation"; + "*Fixed some bugs related to things like CFrame"; + "*Minor changes to wrappers"; + "*Only Instances get wrapped now"; + ""; + "1.0.144b"; + "*Remade userdata wrapping stuff"; + "*Wrapped everything the client touches"; + "*Localized some things"; + "*Added some checks"; + "*Changed some minor things"; + "*Expect bugs just sayin, report em if you find em"; + "*Seriously. Expect bugs. This update has been a painful one..."; + "*I'm like, 90% sure something will break with this update"; + "*But I haven't seen it yet, I expect it to have no error"; + "*So if you see something stupid happening, tell me"; + "*Thanks, ~Sceleratis (me <3)"; + ""; + "1.0.143b"; + "+Added list duplicate stacking for certain logs; replication logs included"; + ""; + "1.0.142b"; + "*Possibly fixed a loading error"; + "Still not entirely sure why it happened"; + "So this might not actually be fixed"; + "Just seems to be fixed in my tests"; + "yolo"; + "Also thx Straphos for helping me initially test for like, 2 hours straight"; + ""; + "1.0.141b"; + "Minor changes"; + ""; + "1.0.140b"; + "+Added settings.DataStoreKey"; + "!Note: ALL DATASTORE SAVED DATA LOST! This update slightly changes how things are retreived from the DataStore"; + "As such, all data in the datastore from before this update will be lost"; + "Be sure to change the DataStoreKey setting to something random"; + "It will be used when accessing anything in the datastore"; + ""; + "1.0.139b"; + "*Updated Rerubi to current version (Credit: Rerumu (Shining_Diamando))"; + "*Disabled some stuff and probably delagged things a little for some people"; + ""; + "1.0.136b"; + "*Adonis UI behaviour changes"; + "*Bug fixes"; + ""; + "1.0.135b"; + "+Added Steampunk theme made by Rerumu (Shining_Diamando)"; + ""; + "1.0.134b"; + "*Replaced LBI with Rerubi (Credit: Rerumu (Shining_Diamando))"; + ""; + "1.0.133b"; + "*Script bases now loads bytecode instead of using the loadstring module"; + "*Client no longer has access to full loadstring module; only LBI"; + "*All string based code sent to the client from the server must be precompiled first using server.Core.Bytecode(str)"; + ""; + "1.0.132b"; + "*Re-enabled server-side script execution"; + "*Disabled the ability to save/edit/add startup commands from in-game"; + ""; + "1.0.131b"; + "+Added some extra script logging for datastore updates"; + "*Fixed and compatability issue affecting F3X"; + "!I recommend clearing the data AND changing trello token if you are having an exploiting problem"; + "YOU MUST REVOKE PERMISSION IN YOUR TRELLO ACCOUNT SETTINGS TO CHANGE THE TOKEN"; + "IF YOU DO NOT THEN THE OLD TOKEN WILL STILL BE VALID!"; + "Something happened a while ago, might be the cause but who knows"; + "Script execution still disabled till confirmed anyway"; + ""; + "1.0.130b"; + "*Disabled server-side use of the loadstring module while I look into stuff"; + "*Anything requiring serverside script execution will not work, including the tornado command, sb, and :s"; + "*Minor security updates"; + ""; + "1.0.129b"; + "*Loading error kick messages are more descriptive"; + ""; + "1.0.128b"; + "*Fixed :char"; + "*Changed some things"; + ""; + "1.0.127b"; + "*Squished a bug (gross)"; + ""; + "1.0.126b"; + "*Patched a potential security issue with service.Events and remote.Get"; + ""; + "1.0.125b"; + "+Added :remotelogs; Shows player remote event activity"; + ""; + "1.0.124b"; + "*Patched a vuln (thx go to Parrallax for the message that ended up leading to finding & patching the issue)"; + "-I recommend checking/clearing any saved settings/script datastore stuff"; + ""; + "1.0.123b"; + "*Face AssetTypeId checking"; + "..."; + "Been super busy lately"; + "Sorry for the lack of updates"; + "Just haven't had the time"; + ""; + "1.0.122b"; + "Someone's always watching me..."; + "Someone's always there..."; + "..."; + "*Minor updates"; + ""; + "1.0.121b"; + "+Added :zawarudo (toggle)"; + ""; + "1.0.120b"; + "*Fixed a bug related to the recent GetPlayers update"; + ""; + "1.0.119b"; + "*Moved GetPlayers to server.Functions; Left reference in service table"; + "*Can now add/remove things like all, others, nonadmins, etc using server.Functions.PlayerFinders"; + ""; + "1.0.118b"; + "*Fixed some script execution stuff; :fly n all that should work now"; + ""; + "1.0.117b"; + "*Updated F3X"; + "*Fixed animated gif commands like :sh1a"; + ""; + "1.0.116b"; + "*Users can no longer warn or kickwarn same/higher level admins [my bad]"; + ""; + "1.0.115b"; + "+Added :clearwarnings"; + "*Fixed a bug related to :kickwarn, :warn, and :showwarnings where it applied to everyone"; + ""; + "1.0.114b"; + "+Added :warn, :kickwarn, and :warnings"; + "*Moderators can now use :kick, :mute, :unmute, and :kickwarn"; + "You can change the permission level for kick n all that in the settings"; + "Though if you don't trust your moderators, maybe they shouldn't be moderators?"; + "Still busy with school n stuff; Sorry bout the lack of updates/fixes"; + ""; + "1.0.113b"; + "LoadLibrary(\"RbxUtility\") for some reason caused an error which resulted in Loading Error 2; Removed it and it appears to be working now"; + "Sorry about that, I guess ROBLOX updated or something and LoadLibrary/RbxUtility decided to break(?)"; + ""; + "1.0.112b"; + "-Removed a duplicate module in the client"; + "-Removed the :funbox command following moderation action on the place it sends you to"; + "*Adonis will continue to be updated to adhere to community guidelines as needed"; + ""; + "1.0.111b"; + "*Minor stuff"; + "*Filter should ignore player names when running commands; checks GetPlayers() before filtering if arg is \"player\""; + "I can't do much about filter related command lag; It's going to happen; I'm sorry"; + ""; + "1.0.110b"; + "*Been busy lately, sorry for the delay in updates"; + "+Added :jumppower player num"; + "*Increased map restore speed"; + "*Fixed :unfly"; + ""; + "1.0.109b"; + "*Logic fix related to :slock (thx m27frogy for bringing to my attention)"; + ""; + "1.0.108b"; + "+Added server.Admin.IsPlaceOwner()"; + "+Added server.Core.GetDataStore()"; + ""; + "1.0.107b"; + "*Fixed bots & added a friendly flag to bots; if true they won't attack the player they were cloned from"; + "*:sword should be able to do team damage now"; + "*Fixed :tm"; + ""; + "1.0.106b"; + "*Due to filter issues, commands like :s, :ls, and :cs are no longer arg filtered (borked code input)"; + "If you find other commands that cannot be filtered message me"; + ""; + "1.0.105b"; + "Sorry for delays and lack of bug fixes"; + "Been busy with game development and IRL stuffs"; + "Trying to balance everything isn't easy lol"; + "Anyway...."; + "*Hopefully fixed the effect GUIs like :blind"; + "+Batch commands now yield; So \":hcountdown 10 | :m hi\" would make the hi message after hcountdown finishes"; + ""; + "1.0.104b"; + "+Added service.LaxFilter(str,plr); It's like the relaxed version of BroadcastFilter (also ignores numbers)"; + "*All non-numerical command arguments are now filtered using service.LaxFilter()"; + "NOTE: ROBLOX knows about the problems with text filter & game auto moderation"; + "They are working to make the system better as they know it's hitting pretty much everyone"; + "IF YOUR GAME GETS MODERATED; SEND AN EMAIL TO APPEALS@ROBLOX.COM"; + "Also if your game is moderated because of unfiltered text somewhere in Adonis be sure to message me aswell"; + "Thank you :)"; + ""; + "1.0.103b"; + "*Fixed chatlog mouse over thing not being filtered"; + "*Fixed jump button not being useable on mobile due to the notification holder"; + "*Notification holder will now be visible false if there are no notifications"; + "*Hint holder will now be visible false if there are no hints"; + "This should fix some issues with buttons under them not working"; + ""; + "1.0.102b"; + "*Capes now work correctly with R15"; + ""; + "1.0.101b"; + "*Command args in the logs are now filtered"; + ""; + "1.0.100b"; + "+Added :dex (A better, third party game explorer)"; + "*Fixed :explore"; + ""; + "1.0.99b"; + "*Apparently games got taken down due to :chatlogs"; + "So logged chats are now filtered"; + "Have a nice day"; + "Love you"; + "<3"; + ""; + "1.0.98b"; + "*Fixed !hat (for real this time (?))"; + ""; + "1.0.97b"; + "+Added :randomizeteams"; + ":rteams or :rteams all or :rteams nonadmins team1,team2,etc"; + ""; + "1.0.96b"; + "+Added server.Logs.TabToType()"; + "*service.Events.LogAdded now has a third arg describing log type (Command, Join, Chat, etc)"; + "*Fixed plugin events getting disconnected soon after being connected at server start"; + ""; + "1.0.95b"; + "*Client now uses server to filter"; + "*Remote.Get now logs errors and returns nil if it hits one instead of hanging"; + "*Messages & Hints now use FilterStringAsync instead of BroadcastFilter (less annoying maybe?)"; + "Once again, filtering is a requirement of ROBLOX"; + "You can disable it with a plugin if you want"; + "Though I really don't recommend it"; + "If you disable it, you risk moderation"; + "Personally, I rather not have Adonis deleted because of something small like message filtering :P"; + ""; + "1.0.94b"; + "*Fixed :bchat not being filtered"; + "I know many ask me 'why u filter'"; + "Well the simple answer is:"; + "You guys apparently can't be trusted"; + "to not spam random profainity"; + "so now ROBLOX is basically enforcing filtering"; + "If you decide not to filter, you will risk moderation"; + "Personally I rather not get my stuff or your game deleted"; + "Also yes EISS will be getting this update aswell"; + ""; + "1.0.93b"; + "+Added :lowres player"; + "*Changes to tasks/threads"; + "*Possibly fixed a server crashing problem (only time can tell?)"; + ""; + "1.0.92b"; + "*Called upon the great GUI gods to fix bugs"; + "+Added client.UI.GetHolder()"; + "+Added client.UI.PrepareGui(gui)"; + "+Added Theming_Info module to UI folder for some info stuffs"; + "*Certain GUIs will go into a holder instead of PlayerGui"; + "*This fixes that :m problem with the ROBLOX chat"; + ""; + "1.0.91b"; + "*Fixed mobile hint"; + "*Check for dead tasks when making new ones"; + ""; + "1.0.90b"; + "*service.Filter now supports multiline; Should fix multilined messages"; + ""; + "1.0.89b"; + "*Checks to ensure loading is past the key phase before trying to send remote commands to the player"; + ""; + "1.0.88b"; + "*Fixed a bug that crashed players"; + "*Changed how :wait() for script events works"; + "*Fixed a client loading bug"; + "*Change stuff with how client loads"; + "*Certain lists can now autoupdate (:chatlogs true, :logs true, :tasks, etc)"; + ""; + "1.0.87b"; + "*server.Remote.Get no longer yeilds using a loop; Expect better performance"; + "+Added service.Threads (Includes threading related utility functions)"; + "+Added service.Threads.NewTask & service.Threads.RunTask"; + "+Added :tasks (Currently only displays tasks, no management gui yet)"; + "+New task management system"; + "*Goal is for all events, commands, and other script processes to be registered as 'tasks'"; + ""; + "1.0.86b"; + "+Added settings.OnStartup, settings.OnJoin, and settings.OnSpawn"; + "+Added !notepad as an excuse to use the Window gui"; + "*Fixed a console bug"; + "*Fixed a tracking bug"; + "*Some other random bug fixes"; + ""; + "1.0.85b"; + "*Should work better with solo mode now"; + ""; + "1.0.84b"; + "*Client loading process now starts before player loads"; + ""; + "1.0.83b"; + "*Theme Modules can now select a GUI from a theme by returning the ScreenGui"; + "*More info on this included in the Colorize theme module"; + "+Added :re to :respawn (so now you can just do :re bob or whatever)"; + ""; + "1.0.82b"; + "*Hint, Message, Notify, and PM are now filtered"; + "+Added service.Filter() and service.BroadcastFilter"; + "*Hints now appear below the :notif message instead of overlapping"; + "*Increased PM reply box size"; + ""; + "1.0.81b"; + "*Fixed the problem with hat commands (again)"; + "*Raised the donor hat limit to 15"; + ""; + "1.0.80b"; + "+Added :sb command for script building"; + "*Fixed a bug related to server/client.Remote.Get()"; + "*Fixed something else I can't remember (sorry it's late at night)"; + "-Removed some true/false prints related to !help"; + ""; + "1.0.79b"; + "*:slock and :whitelist are two separate commands now"; + "*Fixed :databan (hopefully?)"; + "*Fixed perks list not showing to non-donors"; + "*Fixed the buy button not working in the donor panel for non-donors (ironic right?)"; + "*Players can now choose the theme they want to use in the client panel"; + "~Themes only affect the individual player so it shouldn't impact other users at all"; + "*service.New can now identify and apply parent correctly to wrapped objects like NewScript() scripts"; + "*Random bug fixes"; + ""; + "1.0.78b"; + "*Fixed !help being spammable"; + "*Maybe possibly probably hopefully fixed :makecard"; + ""; + "1.0.78b"; + "*Hat related stuff *should* be fixed now"; + ""; + "1.0.77b"; + "+Added service.MetaFunc & service.NewProxy"; + "*Externally visible metatables and read-only tables are now proxies"; + "+Added :nnumplayers"; + ""; + "1.0.76b"; + "*Fixed settings.FunCommands not working"; + "*Made it so guis do not need to supply their code"; + "*If no GUI code is given, will use default gui's code"; + "*GUI themes can now be a module that alters/generates guis"; + "+Added new theme: Colorize; Guis will change colors over time"; + "*Fixed TransBlack theme"; + "+Added :n ; Smaller version of :m"; + ""; + "1.0.75b"; + "*Squished some bugs (rip)"; + "*Hunted down some errors that escaped"; + "*Enabled some more antiexploit logging related things"; + "*Fixed UIKeepAlive"; + "*Fixed some other stuff"; + "*Pretty descriptive I know"; + "+Re-Added AntiParanoid (Default disabled)"; + "+Re-Added AntiNoclip (Default enabled)"; + "+Added settings.DataStoreEnabled; Sets if settings & admins can be loaded from the datastore"; + ""; + "1.0.74b"; + "+Added :tempadmin; Makes the player a mod for only that server"; + "+Added :tempunadmin; Removes player's admin powers only for that server"; + "*:admin is now used by :tempadmin instead of :mod"; + "*People modded in-game using :mod will now save"; + "*Fixed :unadmin not properly removing saved admins"; + "*Fixed :admin adding multiple entries instead of removing old ones"; + "*Trying to unadmin players not in the game will prompt you first"; + "*Any setting changes/people admined will update across all servers"; + "*Fixed a bug related to checking if a player is an admin"; + ""; + "1.0.73b"; + "*Fixed player data not saving"; + "*Changed datastore namespace"; + "*If datastore key is over 50 character it will be cut at 50 characters"; + "!NOTICE: ALL DATA RESET DUE TO NAMESPACE CHANGE"; + ""; + "1.0.72b"; + "*Fixed a major bug that caused moderators to not get admin"; + "*This should also fix the group admin related issue for mods"; + "*Fixed some other minor things and changed some stuff"; + "*Disabled something I accidentally left enabled that spammed local output"; + ""; + "1.0.71b"; + "*Bug fixes"; + "*Might have also made some bugs, not sure yet"; + "*Fixed :cs"; + "*Made changes to LBI and loadstring"; + "*Adonis created scripts can now be cloned (only the script calling server.Core.NewScript can clone)"; + "*Adonis created scripts no longer have things parented to them, like the loadstring module"; + "*Adonis created scripts can now be disabled & re-enabled"; + "*Adonis created scripts are now registered and checked on run"; + "*Adonis created scripts now use the default script/localscript name instead of assigning one"; + ""; + "1.0.70b"; + "+Added :networkowners & settings.NetworkOwners"; + "+Added :setbanmessage & settings.BanMessage"; + "+Added :setlockmessage & settings.LockMessage"; + "*Fixed people who are in more than one admin table showing up as the lowest level"; + "*Bug fixes"; + "*Craaaab People Craaaab People looks like Crab talks like People"; + ""; + "1.0.69b"; + "*RemoteEvent security update"; + ""; + "1.0.68b"; + "*Restoremap is now faster"; + "*Fixed a bug breaking the userpanel GUI"; + "*Improved the function to get player data"; + ""; + "1.0.66b"; + "*Fixed service.Debounce"; + "*Fixed a few things related to service.Events"; + "*Improved UIKeepAlive"; + "+Added a UI blacklist for UIKeepAlive (should fix some issues)"; + "*Fixed the terminal"; + ""; + "1.0.65b"; + "*Fixed particle commands like !fire not working after respawn"; + "*The clowns now steal screenguis"; + ""; + "1.0.64b"; + "*New :m and :sm messages will clear previous ones to prevent overlapping"; + "+Added service.Debounce and service.Queue"; + "*Lowered notification sound volume"; + "*Script will now nag you if you don't change the datastore key"; + "!Warning! People have been using server scripts to edit DataStores"; + "!Change the DataStore key to something random ASAP!"; + "!If you don't it's possible for people to make themselves admins or worse"; + "..."; + "+Someone's always watching me"; + "+Someone's always there"; + "+When I'm sleeping he just waits"; + "+And he stares"; + "+Someone's always standing in the"; + "+Darkest corner of my room"; + "+He's tall and wears a suit of black,"; + "+Dressed like the perfect groom"; + ""; + "1.0.63b"; + "*Events can now be fired using service.Events.EventName:fire(args)"; + ""; + "1.0.62b"; + "+Added :clearguis to clear message/hint/related script GUIs from everyone or specific people"; + ""; + "1.0.61b"; + "*Playerlist related bug fixes/changes"; + ""; + "1.0.60b"; + "*Fixed :setcoreguienabled"; + "*Fixed batch commands (eg :ff me | !wait 5 | :kill me)"; + ""; + "1.0.59b"; + "*Fixed :noclip causing the player to climb"; + "*Fixed :clip not working with :flynoclip"; + "*Fixed :players not working"; + "*Fixed :track not working"; + "*Fixed :bot (works however not finished, updates planned)"; + ""; + "1.0.58b"; + "*Disabled AntiBillboardImage"; + "*Disabled all objectAdded/deleted related anti exploits if FilteringEnabled"; + ""; + "1.0.57b"; + "+Added AntiBillboardImage"; + "[Removes those inappropriate billboards people insert]"; + ""; + "1.0.56b"; + "+Added :rope player1 player2"; + "*Fixed a script event bug causing service.HookEvent not to function properly in plugins"; + "*This fix also fixes the Log commands to Trello plugin"; + "*Changed how command errors look"; + ""; + "1.0.55b"; + "*Fixed a bug where admins could not use CustomRank commands; Mods > CustomRanks"; + ""; + "1.0.54b"; + "*Doing certain commands without arguments will run them on you"; + "An example would be chatting ':ff' instead of ':ff me' to ff yourself"; + ""; + "1.0.53b"; + "*Changed how the client loads"; + "Client will now load regardless of Backpack/PlayerGui/CharacterLoaded"; + "This fixes a problem related to CharacterAutoLoads"; + "*Client script is now a module like the server script"; + "+Added a special localscript to handle client loading from PlayerScripts"; + ""; + "1.0.52b"; + "*Fixed UIKeepAlive"; + ""; + "1.0.51b"; + "+Added the _G Access & API stuff to the client"; + "+Added UI & Client to the Allowed_API_Calls setting"; + ""; + "1.0.50b"; + "*Changed & Fixed :flatten and :size/:resize"; + "+Added a setting for the updated/admin notifications"; + ""; + "1.0.49b"; + "*Adonis will now tell the place owner when it updates"; + "+Added OnClick to the client GUI api stuff"; + "*Source is now free to take"; + ""; + "1.0.48b"; + "*Changed things to better support R15 by using HumanoidRootPart more instead of Torso"; + "!I expect bugs with this update; Report any you find"; + ""; + "1.0.47b"; + "+Added new gui 'Window' to be used by plugins for on the fly window creation w/ api"; + "*Bug fixes"; + ""; + "1.0.46b"; + "*Fixed a bug causing local errors & a security problem"; + "*Fixed client/gui errors not having a trace"; + "*GetRandom() now only returns only readable characters"; + "*Removed client loaded message"; + ""; + "1.0.45b"; + "*It has come"; + "*The ultimate command"; + "*The only command you will ever need"; + "*A command so powerful it makes all who witness it tremble"; + "*What is this command you ask?"; + "+Added :headlian player"; + "*The hotness has been unleashed"; + "*No going back now"; + "+Also added some stuff to prevent fake players; tell me if something goes wrong"; + ""; + "1.0.44b"; + "*Bug fixes to give & startergive"; + ""; + "1.0.43b"; + "*Fixed an issue with :give"; + ""; + "1.0.42b"; + "*Temp fixed an issue with :give"; + ""; + "1.0.41b"; + "*Terminal now supports live logs and output"; + "+Added event LogAdded"; + ""; + "1.0.40b"; + "*Donor capes now disabled by default per game (you can enable them still if they are enabled in settings via !donate)"; + ""; + "1.0.39b"; + "*Updated 'Building Tools by F3X' to the newest version"; + ""; + "1.0.38b"; + "*LocalLighting loops disabled in FE games (not needed)"; + "*Fixed effect related guis like :spook"; + "*Fixed :setfps"; + "+Added :deadlands player; do NOT use capes in the 'deadlands'"; + "*Bug fixes"; + ""; + "1.0.37b"; + "*Multiple bug fixes"; + "*Fixed :notif (yes I know finally)"; + ""; + "1.0.36b"; + "+Added CommandRan event; returns msg, command, args, table, index, ran, error"; + ""; + "1.0.35b"; + "*Changed something causing disconnect on loading"; + "+Added /e support"; + ""; + "1.0.34b"; + "+Added settings.AutoClean & settings.AutoCleanDelay"; + "+Added settings.CheckClients"; + ""; + "1.0.33b"; + "*ScriptBase security updates"; + ""; + "1.0.32b"; + "*Fixed a performance issue caused by having a large number of bans, such in the case of Trello boards containing 1k+ bans"; + ""; + "1.0.31b"; + "*Visual bug fixes"; + ""; + "1.0.30b"; + "*Chat handled server side, less command/chat/admin related lag"; + ""; + "1.0.29b"; + "*Made it so you can't steal the module till it's done ;)"; + ""; + "1.0.28b"; + "+Added settings.HideScript; Disable if your game saves so the script doesn't get deleted"; + "+Added settings.AntiUnAnchore"; + "+Added settings.AntiLeak"; + "*Changed how AntiDelete works; Removed stress from the Server module"; + ""; + "1.0.27b"; + "+Added settings.CustomRanks"; + "+Added :customrank player rankName (:customrank scel Baristas)"; + "*Made it so :admin is the same as :mod to avoid accidentally perm admining people you didn't intend to via :admin player"; + "*The :admin command is now :permadmin or :padmin"; + "*Fixed settings.SaveAdmins not doing anything"; + "*Minor bug fixes"; + ""; + "1.0.26b"; + "*Faster command matching"; + ""; + "1.0.25b"; + "*Performance fixes"; + ""; + "1.0.24b"; + "*Bug fixes & more caching"; + ""; + "1.0.23b"; + "*Console bug fixes"; + ""; + "1.0.22b"; + "*Fixed :cmds"; + "*Admin level now caches for 30 seconds per player to lower server stress related to checking levels constantly"; + ""; + "1.0.22b"; + "*Fixed !hat not removing scripts"; + ""; + "1.0.21b"; + "*Minor changes"; + "+Added :guiview player & :unguiview - Shows you someone's playerguis"; + "+Added the bot command back"; + "+Added !quote back"; + "-Removed Herobrine"; + ""; + "1.0.20b"; + "*Bug fixes"; + "*Minor changes"; + ""; + "1.0.19b"; + "*Bug fixes"; + "*Changed some stuff"; + "*Fixed some commands"; + "*Changed some cape stuff"; + "*UI changes"; + ""; + "1.0.18b"; + "*Bug fixes"; + ""; + "1.0.17b"; + "*Improved replication logs"; + ""; + "1.0.16b"; + "*Custom chat now has a cross server tab for admins"; + "*Bug fixes"; + "*UI Changes"; + ""; + "1.0.15b"; + "*Capes are now 100% local"; + "*Capes can be disabled via the Client tab of the user control panel"; + "*Settings changed in the Client tab now save"; + ""; + "1.0.14b"; + "!FIXED A SETTING MODULE ERROR; UPDATE YOUR LOADER ASAP!"; + ""; + "1.0.13b"; + "*New message GUI"; + "*Bug fixes"; + "*Minor UI changes"; + ""; + "1.0.12b"; + "*Changed some things"; + "+Added settings.AntiInsert; Lets you blacklist/alter certain classnames"; + "+Added settings.AntiDeleteTool"; + "+Added settings.AntiNil"; + "+Added settings.AntiDelete"; + ""; + "1.0.11b"; + "*Fixed :btools (?)"; + ""; + "1.0.10b"; + "*Whitelist fixes"; + ""; + "1.0.9b"; + "*Bug fixes"; + "*Changed how some logs are displayed"; + "+Added :scriptlog"; + ""; + "1.0.8b"; + "*Fixed/Hooked up all of the Trello features"; + "*Fixed :hat and :unflight"; + "+Added the Permissions setting"; + "*Minor bug fixes"; + ""; + "1.0.7b"; + "+Added back the ability to do Group:11234567:-100 to do rank 100+ (r u happy now katie)"; + ""; + "1.0.6b"; + "*Fixed how player data is saved to avoid over using the datastore"; + ""; + "1.0.5b"; + "*Fixed bans"; + ""; + "1.0.4b"; + "*Fixed random kicking bug"; + "*Minor bug fixes"; + "*:kick and now include a reason (:kick player reason)"; + "*You can now use Group:ID without a rank to specify an entire group"; + ""; + "1.0.3b"; + "*Console now shows a playerlist to aid in running commands on specific players"; + ""; + "1.0.2b"; + "*Module now works fine in solo mode and can be loaded via the dev console using require(359948692)()"; + ""; + "1.0.1b"; + "*Player particles made by commands like :sparkles can now be disabled locally via client userpanel tab"; + ""; + "1.0.1b"; + "First public beta release ;)"; + ""; + "0.0.1a"; + "Initial alpha & testing phase"; +} \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/Credits.lua b/src/assets/Adonis/Client/Dependencies/Credits.lua new file mode 100644 index 0000000..f8353ac --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/Credits.lua @@ -0,0 +1,29 @@ +return { + {Text = "Sceleratis/Davey_Bones", Desc = "Made Adonis & EISS"}; + {Text = "Kohltastrophe (Scripth)", Desc = "For his help with various things and some code"}; + {Text = "einsteinK", Desc = "Helped me with some scripting problems early in development and put together the LoadstringParser; Best scripter I know"}; + {Text = "atom#0001/pascaling", Desc = "Modified Adonis for True Colors specific usage (LINK.)"}; + {Text = "Rerumu (Shining_Diamando)",Desc = "Made the endless stairs place\nRerubi (Bytecode Interpreter)\nParser\nSteampunk theme"}; + {Text = "@GitHub MudockYatho", Desc = "GitHub Contributor"}; + {Text = "@GitHub TheCakeChicken", Desc = "GitHub Contributor"}; + {Text = "@GitHub NNickey", Desc = "GitHub Contributor"}; + {Text = "@GitHub ItsGJK", Desc = "GitHub Contributor"}; + {Text = "@GitHub Kan18", Desc = "GitHub Contributor"}; + {Text = "@GitHub Brandon-Beck", Desc = "GitHub Contributor"}; + {Text = "Stravant/JustAPerson/Jason Priest (?)", Desc = "Wrote LBI (No longer used)"}; + {Text = "darkelementallord", Desc = "Updated some guis"}; + {Text = "TheFurryFish", Desc = "Gave me some dank ideas like local particles and some loading related things; and helped debug"}; + {Text = "Moistality", Desc = "Helped with finding and patching vulns"}; + {Text = "GigsD4X/F3X", Desc = "F3X Building Tool"}; + {Text = "Drezmor", Desc = "Resize was originally ripped from his ohgals and modified"}; + {Text = "KingKeith55", Desc = "Provided the Stickify command"}; + {Text = "NickPatella", Desc = "Made the piano used in the !piano command"}; + {Text = "Raspberry Pi/Raspy_Pi", Desc = "Made Dex"}; + {Text = "j1my3p1x", Desc = "His replication checking idea is what lead to the replication logs"}; + {Text = "Bubby4j", Desc = "Used their \"Refresh Icon\" image"}; + {Text = "meafers", Desc = "Suggested some stuff"}; + {Text = "Donors", Desc = "Donors keep the wheels turning ;)"}; + {Text = "The Users [You :)]", Desc = "For using the script and keeping it alive :)"}; + {Text = "Special thanks", Desc = "Special thanks to everyone who helped along the way and suggested new ideas!"}; + {Text = "Not listed?", Desc = "Message me and tell me what you need to be credited for and I'll add you in!"}; +} diff --git a/src/assets/Adonis/Client/Dependencies/Parser.lua b/src/assets/Adonis/Client/Dependencies/Parser.lua new file mode 100644 index 0000000..d3d0f77 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/Parser.lua @@ -0,0 +1,287 @@ +--[[// + + https://github.com/Rerumu/Rerumu-Parser + +\\]]-- + + +local Encode, Decode, Extract; + +local SetMeta = setmetatable; +local Tostring = tostring; +local Tonumber = tonumber; +local Concat = table.concat; +local Gsub, Sub = string.gsub, string.sub; +local Match = string.match; +local Type = typeof; + +local Beat = game:GetService("RunService").Heartbeat +local C3, V3, CF, Ray, Bri = Color3.new, Vector3.new, CFrame.new, Ray.new, BrickColor.new; -- Yell at me for this lengthy definition later. +local U2, U, V2, Inew = UDim2.new, UDim.new, Vector2.new, Instance.new; +local Pcall = pcall; -- Because I don't think listing everything individually would work, a bit of performance with memoization would help right? +local Index = function(Ins, Prop) return Ins[Prop]; end; +local Properties = setmetatable({}, { + __index = function(self, ClassName) -- It's not neat to have to do many checks so I decided on this. + local Got = {}; + + self[ClassName] = Got; + + return Got; + end; + __call = function(self, Instance, Property) -- Much neater to have both things here. + local Found = self[Instance.ClassName][Property]; + local R + + if (Found == nil) then + Found, R = Pcall(Index, Instance, Property); + + self[Instance.ClassName][Property] = Found; + + return (Found and R) or nil; + end; + + if Found then + return Instance[Property]; + end; + end; +}); -- Handles memoization of instance properties for performance boosts past 1st use. + +local PropertiesStored = { -- Was too lazy to list so you have fun. + 'ClassName', 'Name'; -- Name of properties, for obvious reasons you will always need a ClassName property (creating instance). +}; + +local EFormat, DFormat = {}, {}; +local Backs = { + {'\b', '\\b'}; + {'\t', '\\t'}; + {'\n', '\\n'}; + {'\f', '\\f'}; + {'\r', '\\r'}; + {'"', '\\"'}; + {'\\', '\\\\'}; +}; + +for Idx = 1, #Backs do + local Pair = Backs[Idx]; + + EFormat[Pair[1]] = Pair[2]; + DFormat[Pair[2]] = Pair[1]; +end; + +Backs = nil; + +local __tMemoize = { + __index = function(self, String) + local Res = Match(self[1], String); + + self[2] = Res; + + return Res; + end; +}; + +local function SafeString(String, EncStr) + if EncStr then + return (Gsub(String, '[\b\t\n\f\r\\"]', EFormat)); + else + return (Gsub(String, '\\.', DFormat)); + end; +end; + +function Extract(Data) + local Mem = SetMeta({Data}, __tMemoize); + + if Mem['^%[.-%]$'] then -- Things are decoded here, feel free to add. + return Decode(Mem[2]); + elseif Mem['^"(.-)"$'] then + return SafeString(Mem[2]); + elseif Mem['^true$'] then + return true; + elseif Mem['^false$'] then + return false; + elseif (Mem['^I(%[.-%])$']) then + local InstData = Decode(Mem[2]); + local Inst = Inew(InstData.ClassName); + local Children = InstData.Children; + + InstData.ClassName = nil; + InstData.Children = nil; + + for Name, Value in next, InstData do + Inst[Name] = Value; + end; + + if Children then + for _, Child in next, Children do + Child.Parent = Inst; + end; + end; + + return Inst; + elseif (Mem['^B%[(%d+)%]$']) then + return Bri(Mem[2]); + elseif (Mem['^R%[(.+)%]$']) then + local A, B, C, X, Y, Z = Match(Mem[2], '(.+),(.+),(.+),(.+),(.+),(.+)'); + + return Ray(V3(A, B, C), V3(X, Y, Z)); + elseif (Mem['^CF%[(.+)%]$']) then + return CF(Match(Mem[2], '(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+)')); + elseif (Mem['^V3%[(.+)%]$']) then + return V3(Match(Mem[2], '(.+),(.+),(.+)')); + elseif (Mem['^V2%[(.+)%]$']) then + return V2(Match(Mem[2], '(.+),(.+)')); + elseif (Mem['^C3%[(.+)%]$']) then + return C3(Match(Mem[2], '(.+),(.+),(.+)')); + elseif (Mem['^U2%[(.+)%]$']) then + return U2(Match(Mem[2], '(.+),(.+),(.+),(.+)')); + elseif (Mem['^U%[(.+)%]$']) then + return U(Match(Mem[2], '(.+),(.+)')); + else + return Tonumber(Data); + end; +end; + +function Encode(Table, Buff) + local Result = {}; + local Buff = Buff or {}; + + for Index, Value in next, Table do + local Idx, Val = '', 'null'; + local ValT = Type(Value); + + if (Type(Index) == 'string') then + Idx = Concat{'"', SafeString(Index, true), '":'}; + end; + + if (ValT == 'number') or (ValT == 'boolean') then -- Things are encoded here; feel free to add. + Val = Tostring(Value); + elseif (ValT == 'string') then + Val = Concat{'"', SafeString(Value, true), '"'}; + elseif (ValT == 'table') and (not Buff[Value]) then + Buff[Value] = true; + + Val = Encode(Value, Buff); + elseif (ValT == 'Instance') then + local Child = Value'GetChildren'; + local Props = {}; + + for _, Name in next, PropertiesStored do + Props[Name] = Properties(Value, Name); + end; + + if (#Child ~= 0) then + Props.Children = Child; + end; + + Val = Concat{'I', Encode(Props)}; + elseif (ValT == 'BrickColor') then + Val = Concat{'B[', Value.Number, ']'}; + elseif (ValT == 'Ray') then + local Ori, Dir = Value.Origin, Value.Direction; + + Val = Concat{'R[', Concat({Ori.X, Ori.Y, Ori.Z, Dir.X, Dir.Y, Dir.Z}, ','), ']'}; + elseif (ValT == 'CFrame') then + Val = Concat{'CF[', Concat({Value:components()}, ','), ']'}; + elseif (ValT == 'Vector3') then + Val = Concat{'V3[', Concat({Value.X, Value.Y, Value.Z}, ','), ']'}; + elseif (ValT == 'Vector2') then + Val = Concat{'V2[', Value.X, ',', Value.Y, ']'}; + elseif (ValT == 'Color3') then + Val = Concat{'C3[', Concat({Value.r, Value.g, Value.b}, ','), ']'}; + elseif (ValT == 'UDim2') then + Val = Concat{'U2[', Concat({Value.X.Scale, Value.X.Offset, Value.Y.Scale, Value.Y.Offset}, ','), ']'}; + elseif (ValT == 'UDim') then + Val = Concat{'U[', Value.Scale, ',', Value.Offset, ']'}; + end; + + Result[#Result + 1] = (Idx .. Val); + end; + + return Concat{'[', Concat(Result, ';'), ']'}; +end; + +function Decode(String) + local Result = {}; + local Tables = 0; + local Len = #String; + local Esc, Quo; + local Layer; + + for Idx = 1, Len do + local Char = Sub(String, Idx, Idx); + + if Layer then + Layer[#Layer + 1] = Char; + elseif (not Layer) and (Idx ~= 1) then + Layer = {Char}; + end; + + if (not Esc) then + if (Char == '\\') then + Esc = true; + elseif (Char == '"') then + Quo = (not Quo); + elseif ((not Quo) and (Char == ';') and (Tables == 1)) or (Idx == Len) then + local Lay = Concat(Layer); + local Index = Match(Gsub(Lay, '\\"', ''), '^".-":.+$'); + + if Index then + Index = false; + + for Idz = 2, #Layer do + local Char = Layer[Idz]; + + if (not Index) then + if (Char == '"') then + Index = Idz - 1; + + break; + else + Index = (Char == '\\'); + end; + else + Index = false; + end; + end; + + Result[SafeString(Sub(Lay, 2, Index))] = Extract(Sub(Lay, Index + 3, -2)); + else + Result[#Result + 1] = Extract(Sub(Lay, 1, -2)); + end; + + Layer = nil; + elseif (not Quo) then + if (Char == '[') then + Tables = Tables + 1; + elseif (Char == ']') then + Tables = Tables - 1; + end; + end; + else + Esc = false; + end + + if Idx%300 == 0 then + Beat:wait() + end + end; + + return Result; +end; + +function noTabEncode(obj, buff) + if not obj then return obj end + return Encode({_PSEUDO_TAB = true, Stuff = obj}, buff) +end + +function noTabDecode(str) + if not str then return str end + local ret = Decode(str) + if ret and ret._PSEUDO_TAB then + return ret.Stuff + else + return ret + end +end + +return {Encode = noTabEncode, Decode = noTabDecode, RealEncode = Encode, RealDecode = Decode}; \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/Rerubi.lua b/src/assets/Adonis/Client/Dependencies/Rerubi.lua new file mode 100644 index 0000000..fa53356 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/Rerubi.lua @@ -0,0 +1,832 @@ +local Select = select; +local Byte = string.byte; +local Sub = string.sub; +local Opcode = { -- Opcode types. + 'ABC', 'ABx', 'ABC', 'ABC'; + 'ABC', 'ABx', 'ABC', 'ABx'; + 'ABC', 'ABC', 'ABC', 'ABC'; + 'ABC', 'ABC', 'ABC', 'ABC'; + 'ABC', 'ABC', 'ABC', 'ABC'; + 'ABC', 'ABC', 'AsBx', 'ABC'; + 'ABC', 'ABC', 'ABC', 'ABC'; + 'ABC', 'ABC', 'ABC', 'AsBx'; + 'AsBx', 'ABC', 'ABC', 'ABC'; + 'ABx', 'ABC'; +}; + +-- rlbi author -> Rerumu +-- special thanks; +-- @cntkillme for providing faster bit extraction +-- @Eternal for being #1 bug finder and providing better float decoder +-- @stravant for contributing to the original project this is derived from + +-- rerubi is an upgrade to the original Lua VM in Lua +-- the prime goal of rerubi is to be the fastest:tm: alternative +-- to a Lua in Lua bytecode execution + +local function gBit(Bit, Start, End) -- No tail-calls, yay. + if End then -- Thanks to cntkillme for giving input on this shorter, better approach. + local Res = (Bit / 2 ^ (Start - 1)) % 2 ^ ((End - 1) - (Start - 1) + 1); + + return Res - Res % 1; + else + local Plc = 2 ^ (Start - 1); + + if (Bit % (Plc + Plc) >= Plc) then + return 1; + else + return 0; + end; + end; +end; + +local function GetMeaning(ByteString) + local Pos = 1; + local gSizet; + local gInt; + + local function gBits8() -- Get the next byte in the stream. + local F = Byte(ByteString, Pos, Pos); + + Pos = Pos + 1; + + return F; + end; + + local function gBits32() + local W, X, Y, Z = Byte(ByteString, Pos, Pos + 3); + + Pos = Pos + 4; + + return (Z * 16777216) + (Y * 65536) + (X * 256) + W; + end; + + local function gBits64() + return gBits32() * 4294967296 + gBits32(); + end; + + local function gFloat() + -- thanks @Eternal for giving me this so I could mangle it in here and have it work + local Left = gBits32(); + local Right = gBits32(); + local IsNormal = 1 + local Mantissa = (gBit(Right, 1, 20) * (2 ^ 32)) + + Left; + + local Exponent = gBit(Right, 21, 31); + local Sign = ((-1) ^ gBit(Right, 32)); + + if (Exponent == 0) then + if (Mantissa == 0) then + return Sign * 0 -- +-0 + else + Exponent = 1 + IsNormal = 0 + end + elseif (Exponent == 2047) then + if (Mantissa == 0) then + return Sign * (1 / 0) -- +-Inf + else + return Sign * (0 / 0) -- +-Q/Nan + end + end + + -- sign * 2**e-1023 * isNormal.mantissa + return math.ldexp(Sign, Exponent - 1023) * (IsNormal + (Mantissa / (2 ^ 52))) + end; + + local function gString(Len) + local Str; + + if Len then + Str = Sub(ByteString, Pos, Pos + Len - 1); + + Pos = Pos + Len; + else + Len = gSizet(); + + if (Len == 0) then return; end; + + Str = Sub(ByteString, Pos, Pos + Len - 1); + + Pos = Pos + Len; + end; + + return Str; + end; + + local function ChunkDecode() + local Instr = {}; + local Const = {}; + local Proto = {}; + local Chunk = { + Instr = Instr; -- Instructions + Const = Const; -- Constants + Proto = Proto; -- Prototypes + Lines = {}; -- Lines + Name = gString(); -- Grab name string. + FirstL = gInt(); -- First line. + LastL = gInt(); -- Last line. + Upvals = gBits8(); -- Upvalue count. + Args = gBits8(); -- Arg count. + Vargs = gBits8(); -- Vararg type. + Stack = gBits8(); -- Stack. + }; + + if Chunk.Name then + Chunk.Name = Sub(Chunk.Name, 1, -2); + end; + + for Idx = 1, gInt() do -- Loading instructions to the chunk. + local Data = gBits32(); + local Opco = gBit(Data, 1, 6); + local Type = Opcode[Opco + 1]; + local Inst; + + if Type then + Inst = { + Enum = Opco; + gBit(Data, 7, 14); -- Register A. + }; + + if (Type == 'ABC') then -- Most common, basic instruction type. + Inst[2] = gBit(Data, 24, 32); + Inst[3] = gBit(Data, 15, 23); + elseif (Type == 'ABx') then + Inst[2] = gBit(Data, 15, 32); + elseif (Type == 'AsBx') then + Inst[2] = gBit(Data, 15, 32) - 131071; + end; + else + Inst = Data; -- Extended SETLIST + end; + + Instr[Idx] = Inst; + end; + + for Idx = 1, gInt() do -- Load constants. + local Type = gBits8(); + local Cons; + + if (Type == 1) then -- Boolean + Cons = (gBits8() ~= 0); + elseif (Type == 3) then -- Float/Double + Cons = gFloat(); + elseif (Type == 4) then + Cons = Sub(gString(), 1, -2); + end; + + Const[Idx - 1] = Cons; + end; + + for Idx = 1, gInt() do -- Nested function prototypes. + Proto[Idx - 1] = ChunkDecode(); + end; + + do -- Debugging + local Lines = Chunk.Lines; + + for Idx = 1, gInt() do + Lines[Idx] = gBits32(); + end; + + for _ = 1, gInt() do -- Locals in stack. + gString(); -- Name of local. + gBits32(); -- Starting point. + gBits32(); -- End point. + end; + + for _ = 1, gInt() do -- Upvalues. + gString(); -- Name of upvalue. + end; + end; + + return Chunk; -- Finished chunk. + end; + + do -- Most of this chunk I was too lazy to reformat or change + assert(gString(4) == "\27Lua", "Lua bytecode expected."); + assert(gBits8() == 0x51, "Only Lua 5.1 is supported."); + + gBits8(); -- Probably version control. + gBits8(); -- Is small endians. + + local IntSize = gBits8(); -- Int size + local Sizet = gBits8(); -- size_t + + if (IntSize == 4) then + gInt = gBits32; + elseif (IntSize == 8) then + gInt = gBits64; + else + error('Integer size not supported', 2); + end; + + if (Sizet == 4) then + gSizet = gBits32; + elseif (Sizet == 8) then + gSizet = gBits64; + else + error('Sizet size not supported', 2); + end; + + assert(gString(3) == "\4\8\0", "Unsupported bytecode target platform"); + end; + + return ChunkDecode(); +end; + +local function _Returns(...) + return Select('#', ...), {...}; +end; + +local function Wrap(Chunk, Env, Upvalues) + local Instr = Chunk.Instr; + local Const = Chunk.Const; + local Proto = Chunk.Proto; + + local function OnError(Err, Position) -- Handle your errors in whatever way. + local Name = Chunk.Name or 'Code'; + local Line = Chunk.Lines[Position] or '?'; + + Err = tostring(Err):match'^.+:%s*(.+)' or Err; + + error(string.format('%s (%s): %s', Name, Line, Err), 0); + end; + + return function(...) + -- Returned function to run bytecode chunk (Don't be stupid, you can't setfenv this to work your way). + local InstrPoint, Top = 1, -1; + local Vararg, Varargsz = {}, Select('#', ...) - 1; + + local GStack = {}; + local Lupvals = {}; + local Stack = setmetatable({}, { + __index = GStack; + __newindex = function(_, Key, Value) + if (Key > Top) then + Top = Key; + end; + + GStack[Key] = Value; + end; + }); + + local function Loop() + local Inst, Enum; + + while true do + Inst = Instr[InstrPoint]; + Enum = Inst.Enum; + InstrPoint = InstrPoint + 1; + + if (Enum == 0) then -- MOVE + Stack[Inst[1]] = Stack[Inst[2]]; + elseif (Enum == 1) then -- LOADK + Stack[Inst[1]] = Const[Inst[2]]; + elseif (Enum == 2) then -- LOADBOOL + Stack[Inst[1]] = (Inst[2] ~= 0); + + if (Inst[3] ~= 0) then + InstrPoint = InstrPoint + 1; + end; + elseif (Enum == 3) then -- LOADNIL + local Stk = Stack; + + for Idx = Inst[1], Inst[2] do + Stk[Idx] = nil; + end; + elseif (Enum == 4) then -- GETUPVAL + Stack[Inst[1]] = Upvalues[Inst[2]]; + elseif (Enum == 5) then -- GETGLOBAL + Stack[Inst[1]] = Env[Const[Inst[2]]]; + elseif (Enum == 6) then -- GETTABLE + local C = Inst[3]; + local Stk = Stack; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]] = Stk[Inst[2]][C]; + elseif (Enum == 7) then -- SETGLOBAL + Env[Const[Inst[2]]] = Stack[Inst[1]]; + elseif (Enum == 8) then -- SETUPVAL + Upvalues[Inst[2]] = Stack[Inst[1]]; + elseif (Enum == 9) then -- SETTABLE + local B, C = Inst[2], Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]][B] = C; + elseif (Enum == 10) then -- NEWTABLE + Stack[Inst[1]] = {}; + elseif (Enum == 11) then -- SELF + local A = Inst[1]; + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + B = Stk[B]; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[A + 1] = B; + Stk[A] = B[C]; + elseif (Enum == 12) then -- ADD + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]] = B + C; + elseif (Enum == 13) then -- SUB + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]] = B - C; + elseif (Enum == 14) then -- MUL + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]] = B * C; + elseif (Enum == 15) then -- DIV + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]] = B / C; + elseif (Enum == 16) then -- MOD + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]] = B % C; + elseif (Enum == 17) then -- POW + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + Stk[Inst[1]] = B ^ C; + elseif (Enum == 18) then -- UNM + Stack[Inst[1]] = -Stack[Inst[2]]; + elseif (Enum == 19) then -- NOT + Stack[Inst[1]] = (not Stack[Inst[2]]); + elseif (Enum == 20) then -- LEN + Stack[Inst[1]] = #Stack[Inst[2]]; + elseif (Enum == 21) then -- CONCAT + local Stk = Stack; + local B = Inst[2]; + local K = Stk[B]; + + for Idx = B + 1, Inst[3] do + K = K .. Stk[Idx]; + end; + + Stack[Inst[1]] = K; + elseif (Enum == 22) then -- JMP + InstrPoint = InstrPoint + Inst[2]; + elseif (Enum == 23) then -- EQ + local A = Inst[1] ~= 0; + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + if (B == C) ~= A then + InstrPoint = InstrPoint + 1; + end; + elseif (Enum == 24) then -- LT + local A = Inst[1] ~= 0; + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + if (B < C) ~= A then + InstrPoint = InstrPoint + 1; + end; + elseif (Enum == 25) then -- LE + local A = Inst[1] ~= 0; + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (B > 255) then + B = Const[B - 256]; + else + B = Stk[B]; + end; + + if (C > 255) then + C = Const[C - 256]; + else + C = Stk[C]; + end; + + if (B <= C) ~= A then + InstrPoint = InstrPoint + 1; + end; + elseif (Enum == 26) then -- TEST + if (not not Stack[Inst[1]]) == (Inst[3] == 0) then + InstrPoint = InstrPoint + 1; + end; + elseif (Enum == 27) then -- TESTSET + local B = Stack[Inst[2]]; + + if (not not B) == (Inst[3] == 0) then + InstrPoint = InstrPoint + 1; + else + Stack[Inst[1]] = B; + end; + elseif (Enum == 28) then -- CALL + local A = Inst[1]; + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + local Args, Results; + local Limit, Loop; + + Args = {}; + + if (B ~= 1) then + if (B ~= 0) then + Limit = A + B - 1; + else + Limit = Top; + end; + + Loop = 0; + + for Idx = A + 1, Limit do + Loop = Loop + 1; + + Args[Loop] = Stk[Idx]; + end; + + Limit, Results = _Returns(Stk[A](unpack(Args, 1, Limit - A))); + else + Limit, Results = _Returns(Stk[A]()); + end; + + Top = A - 1; + + if (C ~= 1) then + if (C ~= 0) then + Limit = A + C - 2; + else + Limit = Limit + A - 1; + end; + + Loop = 0; + + for Idx = A, Limit do + Loop = Loop + 1; + + Stk[Idx] = Results[Loop]; + end; + end; + elseif (Enum == 29) then -- TAILCALL + local A = Inst[1]; + local B = Inst[2]; + local Stk = Stack; + local Args, Results; + local Limit, Loop; + local Rets = 0; + + Args = {}; + + if (B ~= 1) then + if (B ~= 0) then + Limit = A + B - 1; + else + Limit = Top; + end + + Loop = 0; + + for Idx = A + 1, Limit do + Loop = Loop + 1; + + Args[#Args + 1] = Stk[Idx]; + end + + Results = {Stk[A](unpack(Args, 1, Limit - A))}; + else + Results = {Stk[A]()}; + end; + + for Index in next, Results do -- get return count + if (Index > Rets) then + Rets = Index; + end; + end; + + return Results, Rets; + elseif (Enum == 30) then -- RETURN + local A = Inst[1]; + local B = Inst[2]; + local Stk = Stack; + local Loop, Output; + local Limit; + + if (B == 1) then + return; + elseif (B == 0) then + Limit = Top; + else + Limit = A + B - 2; + end; + + Output = {}; + Loop = 0; + + for Idx = A, Limit do + Loop = Loop + 1; + + Output[Loop] = Stk[Idx]; + end; + + return Output, Loop; + elseif (Enum == 31) then -- FORLOOP + local A = Inst[1]; + local Stk = Stack; + + local Step = Stk[A + 2]; + local Index = Stk[A] + Step; + + Stk[A] = Index; + + if (Step > 0) then + if Index <= Stk[A + 1] then + InstrPoint = InstrPoint + Inst[2]; + + Stk[A + 3] = Index; + end; + else + if Index >= Stk[A + 1] then + InstrPoint = InstrPoint + Inst[2]; + + Stk[A + 3] = Index; + end + end + elseif (Enum == 32) then -- FORPREP + local A = Inst[1]; + local Stk = Stack; + + -- As per mirroring the real vm + Stk[A] = assert(tonumber(Stk[A]), '`for` initial value must be a number'); + Stk[A + 1] = assert(tonumber(Stk[A + 1]), '`for` limit must be a number'); + Stk[A + 2] = assert(tonumber(Stk[A + 2]), '`for` step must be a number'); + + Stk[A] = Stk[A] - Stk[A + 2]; + + InstrPoint = InstrPoint + Inst[2]; + elseif (Enum == 33) then -- TFORLOOP + local A = Inst[1]; + local C = Inst[3]; + local Stk = Stack; + + local Offset = A + 2; + local Result = {Stk[A](Stk[A + 1], Stk[A + 2])}; + + for Idx = 1, C do + Stack[Offset + Idx] = Result[Idx]; + end; + + if (Stk[A + 3] ~= nil) then + Stk[A + 2] = Stk[A + 3]; + else + InstrPoint = InstrPoint + 1; + end; + elseif (Enum == 34) then -- SETLIST + local A = Inst[1]; + local B = Inst[2]; + local C = Inst[3]; + local Stk = Stack; + + if (C == 0) then + InstrPoint = InstrPoint + 1; + C = Instr[InstrPoint]; -- This implementation was ambiguous! Will eventually re-test. + end; + + local Offset = (C - 1) * 50; + local T = Stk[A]; -- Assuming T is the newly created table. + + if (B == 0) then + B = Top; + end; + + for Idx = 1, B do + T[Offset + Idx] = Stk[A + Idx]; + end; + elseif (Enum == 35) then -- CLOSE + local A = Inst[1]; + local Cls = {}; -- Slight doubts on any issues this may cause + + for Idx = 1, #Lupvals do + local List = Lupvals[Idx]; + + for Idz = 0, #List do + local Upv = List[Idz]; + local Stk = Upv[1]; + local Pos = Upv[2]; + + if (Stk == Stack) and (Pos >= A) then + Cls[Pos] = Stk[Pos]; + Upv[1] = Cls; -- @memcorrupt credit me for the spoonfeed + end; + end; + end; + elseif (Enum == 36) then -- CLOSURE + local NewProto = Proto[Inst[2]]; + local Stk = Stack; + + local Indexes; + local NewUvals; + + if (NewProto.Upvals ~= 0) then + Indexes = {}; + NewUvals = setmetatable({}, { + __index = function(_, Key) + local Val = Indexes[Key]; + + return Val[1][Val[2]]; + end, + __newindex = function(_, Key, Value) + local Val = Indexes[Key]; + + Val[1][Val[2]] = Value; + end; + } + ); + + for Idx = 1, NewProto.Upvals do + local Mvm = Instr[InstrPoint]; + + if (Mvm.Enum == 0) then -- MOVE + Indexes[Idx - 1] = {Stk, Mvm[2]}; + elseif (Mvm.Enum == 4) then -- GETUPVAL + Indexes[Idx - 1] = {Upvalues, Mvm[2]}; + end; + + InstrPoint = InstrPoint + 1; + end; + + Lupvals[#Lupvals + 1] = Indexes; + end; + + Stk[Inst[1]] = Wrap(NewProto, Env, NewUvals); + elseif (Enum == 37) then -- VARARG + local A = Inst[1]; + local B = Inst[2]; + local Stk, Vars = Stack, Vararg; + + Top = A - 1; + + for Idx = A, A + (B > 0 and B - 1 or Varargsz) do + Stk[Idx] = Vars[Idx - A]; + end; + end; + end; + end; + + local Args = {...}; + + for Idx = 0, Varargsz do + if (Idx >= Chunk.Args) then + Vararg[Idx - Chunk.Args] = Args[Idx + 1]; + else + Stack[Idx] = Args[Idx + 1]; + end; + end; + + local A, B, C = pcall(Loop); -- Pcalling to allow yielding + + if A then -- We're always expecting this to come out true (because errorless code) + if B and (C > 0) then -- So I flipped the conditions. + return unpack(B, 1, C); + end; + + return; + else + OnError(B, InstrPoint - 1); -- Didn't get time to test the `-1` honestly, but I assume it works properly + end; + end; +end; +return function(BCode, Env) -- lua_function LoadBytecode (string BCode, table Env) + local Buffer = GetMeaning(BCode); + return Wrap(Buffer, Env or getfenv(0)), Buffer; +end; diff --git a/src/assets/Adonis/Client/Dependencies/Theming_Info [Read].lua b/src/assets/Adonis/Client/Dependencies/Theming_Info [Read].lua new file mode 100644 index 0000000..b1ce336 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/Theming_Info [Read].lua @@ -0,0 +1,121 @@ +--[[ + + Notice: + All themes MUST include a StringValue named "Base_Theme" that tells the script where to pull GUIs and Configs from + if they aren't found in the selected theme. Generally this should have it's value set to "Default" unless + the theme is derived from another existing theme (such as if you made a new theme using the "Hydris" theme, + the Base_Theme value would be set to "Hydris" so you don't need to copy all the code modules and all that) + + Alternatively, each individual GUI can include a StringValue in their Config folder named "BaseTheme" which + acts identical to Base_Theme, however is instead on a per-GUI basis instead of theme-wide. This allows you + to mix GUIs based on GUIs in different themes together into one theme. + + It should be noted that this functionality has a capped depth of 10 themes deep. + Here's somewhat of a visual to help you better understand what I mean by depth: + + ThemeToFind <- First GUI/Theme Checked (the one selected) + > BaseTheme1 <- Next theme checked (first theme's Base_Theme) + >> BaseTheme2 <- BaseTheme1's Base_Theme + >>> BaseTheme3 <- BaseTheme2's Base_Theme + >>>> BaseTheme4 <- BaseTheme3's Base_Theme + + The above will go on until it either reaches a depth of 10 (BaseTheme10) or reaches + a theme with no Base_Theme set. Usually the last theme in the sequence will be + the "Default" theme as it's Base_Theme is empty because it should never need to pull + from any other themes. + + Basic theming related information; + + All Adonis GUIs have a code module that makes them run. If you are only changing minor things on an + existing GUI (such as colors) then you do not need to include a code module, instead it will use the + default's. If you need to change the code for the GUI then you MUST include a code module inside a Config + folder. + + GUIs can avoid clearing the chat every time they appear by using client.UI.Prepare(gui) + To see an example of this refer to the Message GUI; In it the only line that needed to be + changed was local gui = script.Parent.Parent to local gui = client.UI.Prepare(script.Parent.Parent) + When PrepareGui is called on an already registered GUI the script will handle updating everything + accordingly. + + The function for every GUI has a global named gTable. gTable contains all GUI related functions and information + used by the script. When a GUI is ready to appear use gTable:Ready() instead of gui.Parent = playergui. + For removing the GUI it is prefered that you use gTable:Destroy() as it will unregister the GUI when it + destroys it. It is not required and just ensures that the GUI is properly cleaned up, however it should + also clean itself up when it's destroyed normally. + + GUI themes do NOT need to be folders containing GUIs! You can made a new module that alters or creates + GUIs (refer to Colorize theme.) These modules can also contain GUIs like a normal theme folder aswell. + If the theme module creates its own GUI on the fly, it must return something when it's done and handle all + of the GUI related code itself. Including registering the new GUi it created via + local gTable,gIndex = client.UI.Register(GUIObjectHere). The module must handle every aspect of the GUI's + creation process that normally client.UI.Make would. If it returns a ScreenGui, the default code for the + GUI will be used from the Hybrid theme, and it will be registered by the script like normal. If something + other than nil that isn't a ScreenGui is returned, the script will ignore the rest of the normal loading + process and return whatever the module returned. + + + Refer to the code and GUIs in the hybrid theme folder for examples. + + NOTE: + The config folder will be parented to nil once gTable:Ready() is called, before the GUI is parented. + You should preference all GUI elements instead of using script.Parent.X, as otherwise there will be + an error about indexing a nil value (the parent). It will only become nil AFTER gTable:Ready() is called + so anything after the call cannot reference script.Parent directly. You must use gTable:Ready() when the + GUI is ready to be displayed, otherwise unintended behaviour may occur. + + + + Client UI Functions; + + client.UI.GetHolder() + - This will return the primary ScreenGui object that all GUIs will go into after becoming a TextLabel (not currently used) + + client.UI.Prepare(gui) + - If gui is a ScreenGui; Transfers content to a new TextLabel and returns the new TextLabel; Else returns gui + + client.UI.Make(guiName,guiData,themeData) + - Responsible for handling the creation and registering of new UI elements + - guiName is the name of the GUI to find/create + - guiData is the data table passed to the GUI's code module function + - themeData is a table containing information about what theme to use + - Returns whatever GUI's code module returns + + client.UI.Get(Name,Ignore,returnOne) + - Finds and returns registered GUI gTables matching name + - Name is the name of the GUI to find + - Ignore is a GUI to ignore when trying to find the target + - if returnOne is true, return a single found gTable instead of a table containing all found ones + + client.UI.Remove(Name,Ignore) + - Finds registered GUIs matching Name and removes them + - If Ignore is set to a GUI; don't remove it when/if found + + client.UI.Register(gui) + - Handles the registration of new GUIs + - Returns gTable,gIndex + + + + + + + + + + + + + + + + + + + + + + + + +--]] +return function() end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Colorize.lua b/src/assets/Adonis/Client/Dependencies/UI/Colorize.lua new file mode 100644 index 0000000..ff5998c --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Colorize.lua @@ -0,0 +1,147 @@ +--// You can use modules like this to alter guis without making a new theme +--// This makes it so you don't need to make an entire gui folder n all that +--// If the theme is set to this module, it will use the default guis +--// The default requested gui will be passed to and modified by this module +--// before it runs. This lets you change things in anyway you want without +--// needing to change the guis by hand or their code. +--// This is also generally safer and update proof. +--// Alternatively if this returns anything, it will be assumed +--// that this module created and registered it's own screenguis +--// It will assume that any return is from those guis +--// For instance the YesNoPrompt returns Yes or No depending on +--// what button the player presses. +--// Any non-nil return will be returned by the script +--// IF YOU MAKE YOUR OWN SCREENGUIS IT IS UP TO YOU TO REGISTER THEM! +--// If you plan to make your own guis you must return something from this module +--// and you must register them using client.UI.Register(ScreenGuiObjectHere) +--// Register will return gTable and gIndex, when destroying your gui +--// use gTable:Destroy(); If your gui needs to be removed in a special way +--// you can define a custom destroy function by doing +--// gTable.CustomDestroy = function() doStuffHere end + +--// If this module returns a ScreenGui object, the script will use that as the gui and +--// take care of registering and running the code module n all that. +--// RETURNED SCREENGUI MUST CONTAIN A "Config" FOLDER; +--// If no Code module is given the default code module will be used. + +--[[ + ~= EXAMPLE CODE =~ + return function(gui,gTable,guiData) + local name = gTable.Name + if name == "YesNoPrompt" then + local new = Instance.new("ScreenGui") + local frame = Instance.new("Frame",new) + frame.Size = UDim2.new(0,400,0,400) + local yes = Instance.new("TextButton",frame) + yes.Size = UDim2.new(0.5,0,1,0) + yes.Text = "Yes" + local no = yes:Clone() + no.Text = "No" + no.Position = UDim2.new(0.5,0,0,0) + + local gTable,gIndex = client.UI.Register(new) + + local ans + local waiting = true + + gTable.CustomDestroy = function() + waiting = false + end + + yes.MouseButton1Click:connect(function() + ans = "Yes" + gTable:Destroy() + end) + + no.MouseButton1Click:connect(function() + ans = "No" + gTable:Destroy() + end) + + repeat wait() until ans or not waiting --// Wait until answer + return ans or false + end + end + +--]] + +service = nil +Routine = nil +client = nil + +return function(gui, guiData, gTable) + local contents = {} + local lerper = 0.5 + local switch = false + local targetColor = Color3.new(math.random(),math.random(),math.random()) + local classes = { + Frame = true; + TextBox = true; + TextLabel = true; + TextButton = true; + ImageLabel = true; + ImageButton = true; + ScrollingFrame = true; + } + + local function getCont(obj) + for i,v in pairs(obj:GetChildren()) do + if classes[v.ClassName] then + table.insert(contents,v) + getCont(v) + end + end + end + + if classes[gui.ClassName] then + table.insert(contents,gui) + end + + getCont(gui) + + if gTable.Name == "List" then + gui.Drag.Main.BackgroundTransparency = 0 + end + + local increment = 0.001 + local max = 0.7 + local min = 0.1 + local r,g,b = 0.1,0.5,0.8 + local rt,gt,bt = true,true,true + local sequence = { + Color3.fromRGB(255, 85, 88), + Color3.fromRGB(78, 140, 255), + Color3.fromRGB(78, 255, 149) + } + + local function lerpToColor(color1, color2, inc, time) + local inc = inc or 0.1 + for i = 0, 1, inc do + for i2,v in next,contents do + if v.Name ~= "CapeColor" and v.Name ~= "Color" then + v.BackgroundColor3 = color1:lerp(color2, i) + if v:IsA("ImageLabel") or v:IsA("ImageButton") then + v.ImageColor3 = color1:lerp(color2, i) + end + end + end + wait(time/(1/inc)) + end + end + + service.TrackTask("Thread: Colorize_"..tostring(gTable.Name),function() + while ((gTable.Active and wait()) or wait(1)) and not gTable.Destroyed do + for i,v in next,sequence do + local one, two = sequence[i], sequence[1] + + if i == #sequence then + two = sequence[1] + else + two = sequence[i+1] + end + + lerpToColor(one, two, 0.01, 2) + end + end + end) +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Alert.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Alert.lua new file mode 100644 index 0000000..310e189 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Alert.lua @@ -0,0 +1,64 @@ + +client = nil +service = nil + +return function(data) + local gTable + + local isMuted = false + + local alarm = service.New('Sound') + alarm.Volume = 1 + alarm.Looped = true + alarm.SoundId = 'http://www.roblox.com/asset/?id=138081509' + + local window = client.UI.Make("Window",{ + Name = "Alert"; + Title = "Alert"; + Size = {300,150}; + Icon = "rbxassetid://53252104"; + AllowMultiple = false; + OnClose = function() + alarm:Stop() + wait() + alarm:Destroy() + end + }) + + if window then + local label = window:Add("TextLabel",{ + Text = data.Message; + BackgroundTransparency = 1; + TextScaled = true; + TextWrapped = true; + }) + + local muteButton = window:AddTitleButton({ + Text = ""; + }) + + local sImg = muteButton:Add("ImageLabel", { + Size = UDim2.new(0, 20, 0, 20); + Position = UDim2.new(0, 5, 0, 0); + Image = "rbxassetid://1638551696"; + BackgroundTransparency = 1; + }) + + muteButton.MouseButton1Down:connect(function() + if isMuted then + alarm.Volume = 1 + sImg.Image = "rbxassetid://1638551696" + isMuted = false + else + alarm.Volume = 0 + sImg.Image = "rbxassetid://1638584675"; + isMuted = true + end + end) + + alarm.Parent = label + alarm:Play() + gTable = window.gTable + window:Ready() + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/BubbleChat.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/BubbleChat.lua new file mode 100644 index 0000000..6089ac6 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/BubbleChat.lua @@ -0,0 +1,48 @@ + +client = nil +service = nil + +return function(data) + local gTable + local color = data.Color + + if color == "off" then + client.UI.Remove("BubbleChat") + else + local window = client.UI.Make("Window",{ + Name = "BubbleChat"; + Title = "Bubble Chat"; + Size = {260,57}; + Position = UDim2.new(0, 10, 1, -80); + AllowMultiple = false; + }) + + if window then + local box = window:Add("TextBox",{ + Text = "Click here or press \";\" to chat"; + PlaceholderText = "Click here or press \";\" to chat"; + BackgroundTransparency = 1; + TextScaled = true; + TextSize = 20; + }) + + box.FocusLost:connect(function(enterPressed) + if enterPressed and service.Player.Character:FindFirstChild('Head') and color and box.Text~='Click here or press ";" to chat' then + if #box.Text > 0 then + service.ChatService:Chat(service.Player.Character.Head, service.LaxFilter(box.Text), color) + end + box.Text = 'Click here or press ";" to chat' + end + end) + + window:BindEvent(service.UserInputService.InputBegan, function(inputObject, gameProcessed) + if not gameProcessed and inputObject.UserInputType == Enum.UserInputType.Keyboard and inputObject.KeyCode == Enum.KeyCode.Semicolon then + box:CaptureFocus() + end + end) + + gTable = window.gTable + window:Ready() + end + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Chat.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Chat.rbxm new file mode 100644 index 0000000..404f713 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Chat.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/ColorPicker.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/ColorPicker.lua new file mode 100644 index 0000000..450dda8 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/ColorPicker.lua @@ -0,0 +1,188 @@ + +client = nil +service = nil + +return function(data) + local color = data.Color or Color3.new(1, 1, 1) + local red,green,blue = color.r,color.g,color.b + local redSlider,greenSlider,blueSlider + local redBox,greenBox,blueBox + local ySize = 25 + local returnColor + local gTable + + local window = client.UI.Make("Window",{ + Name = "ColorPicker"; + Title = data.Title or "Color Picker"; + Size = {250,230}; + MinSize = {150, 230}; + MaxSize = {math.huge, 230}; + --Position = UDim2.new(0, 10, 1, -80); + SizeLocked = true; + OnClose = function() + if not returnColor then + returnColor = color + end + end + }) + + local colorBox = window:Add("Frame",{ + Size = UDim2.new(1, -10, 0, ySize-5); + Position = UDim2.new(0, 5, 0, ySize*6); + BackgroundColor3 = color; + }) + + local okButton = window:Add("TextButton",{ + Text = "Accept"; + Size = UDim2.new(1, -10, 0, ySize-5); + Position = UDim2.new(0, 5, 0, ySize*7); + Events = { + MouseButton1Down = function() + returnColor = color + window:Close() + end + } + }) + + local function updateColors() + color = Color3.new(red, green, blue) + colorBox.BackgroundColor3 = color + + redBox:SetValue(math.floor(red*255)) + redSlider.SliderBar.ImageColor3 = Color3.new(0,0,0):lerp(Color3.new(1,0,0), red) + redSlider:SetValue(red) + + greenBox:SetValue(math.floor(green*255)) + greenSlider.SliderBar.ImageColor3 = Color3.new(0,0,0):lerp(Color3.new(0,1,0), green) + greenSlider:SetValue(green) + + blueBox:SetValue(math.floor(blue*255)) + blueSlider.SliderBar.ImageColor3 = Color3.new(0,0,0):lerp(Color3.new(0,0,1), blue) + blueSlider:SetValue(blue) + end + + redBox = window:Add("StringEntry",{ + Text = "Red: "; + BoxText = red*255; + BackgroundTransparency = 1; + TextSize = 20; + Size = UDim2.new(1, -20, 0, ySize-5); + Position = UDim2.new(0, 10, 0, ySize*0); + TextChanged = function(newText, focusLost, enterPressed) + if tonumber(newText) then + local doRet + newText = math.floor(tonumber(newText)) + if newText < 0 then + doRet = true + newText = 0 + elseif newText > 255 then + doRet = true + newText = 255 + end + + red = newText/255 + updateColors() + if doRet then return newText end + elseif focusLost then + return red*255 + end + end; + }) + + greenBox = window:Add("StringEntry",{ + Text = "Green: "; + BoxText = green*255; + BackgroundTransparency = 1; + TextSize = 20; + Size = UDim2.new(1, -20, 0, ySize-5); + Position = UDim2.new(0, 10, 0, ySize*2); + TextChanged = function(newText, focusLost, enterPressed) + if tonumber(newText) then + local doRet = false + newText = math.floor(tonumber(newText)) + if newText < 0 then + doRet = true + newText = 0 + elseif newText > 255 then + doRet = true + newText = 255 + end + + green = newText/255 + updateColors() + if doRet then return newText end + elseif focusLost then + return green*255 + end + end; + }) + + blueBox = window:Add("StringEntry",{ + Text = "Blue: "; + BoxText = blue*255; + BackgroundTransparency = 1; + TextSize = 20; + Size = UDim2.new(1, -20, 0, ySize-5); + Position = UDim2.new(0, 10, 0, ySize*4); + TextChanged = function(newText, focusLost, enterPressed) + if tonumber(newText) then + local doRet = false + newText = math.floor(tonumber(newText)) + if newText < 0 then + doRet = true + newText = 0 + elseif newText > 255 then + doRet = true + newText = 255 + end + + blue = newText/255 + updateColors() + if doRet then return newText end + elseif focusLost then + return blue*255 + end + end; + }) + + redSlider = window:Add("Slider",{ + Percent = color.r; + Size = UDim2.new(1, -20, 0, ySize-5); + Position = UDim2.new(0, 10, 0, ySize*1); + OnSlide = function(value) + red = value + updateColors() + end + }) + + greenSlider = window:Add("Slider",{ + Percent = color.r; + Size = UDim2.new(1, -20, 0, ySize-5); + Position = UDim2.new(0, 10, 0, ySize*3); + OnSlide = function(value) + green = value + updateColors() + end + }) + + blueSlider = window:Add("Slider",{ + Percent = color.r; + Size = UDim2.new(1, -20, 0, ySize-5); + Position = UDim2.new(0, 10, 0, ySize*5); + OnSlide = function(value) + blue = value + updateColors() + end + }) + + updateColors() + gTable = window.gTable + window:ResizeCanvas() + window:Ready() + + repeat + wait() + until returnColor or not gTable.Active + + return returnColor +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Console.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Console.rbxm new file mode 100644 index 0000000..b5bf03a Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Console.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Countdown.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Countdown.lua new file mode 100644 index 0000000..9f75dc0 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Countdown.lua @@ -0,0 +1,96 @@ + +client = nil +service = nil + +return function(data) + local gTable + local tLimit = data.Time + local sImg + + local isMuted = false + + local tock = service.New('Sound') + tock.Volume = 0.25 + tock.Looped = false + tock.SoundId = 'http://www.roblox.com/asset/?id=151715959' + + local buzzer = service.New('Sound') + buzzer.Volume = 0.25 + buzzer.Looped = false + buzzer.SoundId = 'http://www.roblox.com/asset/?id=267883066' + + local window = client.UI.Make("Window", { + Name = "Countdown"; + Title = "Countdown"; + Size = {300, 150}; + Position = UDim2.new(0, 10, 1, -160); + OnClose = function() + tock:Stop() + buzzer:Stop() + tock:Destroy() + buzzer:Destroy() + end + }) + + local label = window:Add("TextLabel", { + Text = tLimit; + BackgroundTransparency = 1; + TextScaled = true; + }) + + local muteButton = window:AddTitleButton({ + Text = ""; + OnClick = function() + if isMuted then + tock.Volume = 0.25 + buzzer.Volume = 0.25 + sImg.Image = "rbxassetid://1638551696" + isMuted = false + else + tock.Volume = 0 + buzzer.Volume = 0 + sImg.Image = "rbxassetid://1638584675"; + isMuted = true + end + end + }) + + sImg = muteButton:Add("ImageLabel", { + Size = UDim2.new(0, 20, 0, 20); + Position = UDim2.new(0, 5, 0, 0); + Image = "rbxassetid://1638551696"; + BackgroundTransparency = 1; + }) + + tock.Parent = label + buzzer.Parent = label + gTable = window.gTable + gTable:Ready() + + for i = tLimit, 0, -1 do + if gTable.Active then + tock:Play() + label.Text = i + else + break + end + wait(1) + end + + buzzer:Play() + + for k = 0,3 do + buzzer:Play() + for i = 1, 0, -0.1 do + label.TextTransparency = i + wait(0.05) + end + + for i = 0, 1, 0.1 do + label.TextTransparency = i + wait(0.05) + end + end + + window:Close() +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/CreateCard.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/CreateCard.lua new file mode 100644 index 0000000..6fccf0c --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/CreateCard.lua @@ -0,0 +1,71 @@ +client = nil +service = nil +return function(data) + local gTable + local window = client.UI.Make("Window",{ + Name = "CreateCard"; + Title = "Create Card"; + Size = {400, 330}; + AllowMultiple = false; + OnClose = function() + + end + }) + + if window then + window:Add("TextLabel",{ + Text = "List Name: "; + BackgroundTransparency = 1; + Size = UDim2.new(0, 80, 0, 30); + Position = UDim2.new(0, 10, 0, 10); + TextXAlignment = "Right"; + }):Copy("TextLabel", { + Text = "Card Name: "; + Position = UDim2.new(0, 10, 0, 50); + }):Copy("TextLabel", { + Text = "Card Desc: "; + Position = UDim2.new(0, 10, 0, 90); + }) + + local list = window:Add("TextBox", { + Text = ""; + BackgroundTransparency = 0.5; + Position = UDim2.new(0, 90, 0, 10); + Size = UDim2.new(1, -100, 0, 30); + BackgroundColor3 = window.BackgroundColor3:lerp(Color3.new(1, 1, 1), 0.2); + TextWrapped = true; + }) + + local name = list:Copy("TextBox", { + Position = UDim2.new(0, 90, 0, 50); + }) + + local desc = list:Copy("TextBox", { + Position = UDim2.new(0, 90, 0, 90); + Size = UDim2.new(1, -100, 1, -100); + }) + + local done = false + local create = window:Add("TextButton", { + Text = "Create"; + Size = UDim2.new(0, 70, 0, 30); + Position = UDim2.new(0, 10, 1, -40); + OnClick = function() + if not done then + done = true + window:Destroy() + client.Remote.Send("TrelloOperation",{ + Action = "MakeCard", + List = list.Text, + Name = name.Text, + Desc = desc.Text + }) + end + end + }) + + + gTable = window.gTable + window:Ready() + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Effect.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Effect.lua new file mode 100644 index 0000000..68588bd --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Effect.lua @@ -0,0 +1,226 @@ +client = nil +cPcall = nil +Pcall = nil +Routine = nil +service = nil +gTable = nil + +--// All global vars will be wiped/replaced except script +--// All guis are autonamed using client.Functions.GetRandom() + +return function(data) + local gui = service.New("ScreenGui") + local mode = data.Mode + local gTable = client.UI.Register(gui, {Name = "Effect"}) + local BindEvent = gTable.BindEvent + + client.UI.Remove("Effect", gui) + gTable:Ready() + + if mode == "Off" or not mode then + gTable:Destroy() + elseif mode == "Pixelize" then + local frame = Instance.new("Frame",gui) + local camera = workspace.CurrentCamera + local pixels = {} + + local resY = data.Resolution or 20 + local resX = data.Resolution or 20 + local depth = 0 + local distance = data.Distance or 80 + + local function renderScreen() + for i,pixel in pairs(pixels) do + local ray = camera:ScreenPointToRay(pixel.X,pixel.Y,depth) + local part, endPoint = workspace:FindPartOnRay(Ray.new(ray.Origin,ray.Direction*distance)) + if part and part.Transparency < 1 then + pixel.Pixel.BackgroundColor3 = part.BrickColor.Color + else + pixel.Pixel.BackgroundColor3 = Color3.fromRGB(105, 170, 255) + end + end + end + + frame.Size = UDim2.new(1,0,1,40) + frame.Position = UDim2.new(0,0,0,-35) + for y = 0,gui.AbsoluteSize.Y+50,resY do + for x = 0,gui.AbsoluteSize.X+30,resX do + local pixel = Instance.new("TextLabel") + pixel.Text = "" + pixel.BorderSizePixel = 0 + pixel.Size = UDim2.new(0,resX,0,resY) + pixel.Position = UDim2.new(0,x-(resX/2),0,y-(resY/2)) + pixel.BackgroundColor3 = Color3.fromRGB(105, 170, 255) + pixel.Parent = frame + table.insert(pixels,{Pixel = pixel,X = x, Y = y}) + end + end + + while wait() and not gTable.Destroyed and gui.Parent do + if not gTable.Destroyed and not gTable.Active then + wait(5) + else + renderScreen() + end + end + + gTable:Destroy() + elseif mode == "FadeOut" then + service.StarterGui:SetCore("TopbarEnabled",false) + service.UserInputService.MouseIconEnabled = false + for i,v in pairs(service.PlayerGui:GetChildren()) do + pcall(function() if v~=gui then v:Destroy() end end) + end + local bg = Instance.new("Frame", gui) + bg.BackgroundTransparency = 1 + bg.BackgroundColor3 = Color3.new(0,0,0) + bg.Size = UDim2.new(2,0,2,0) + bg.Position = UDim2.new(-0.5,0,-0.5,0) + for i = 1,0,-0.01 do + bg.BackgroundTransparency = i + wait(0.1) + end + bg.BackgroundTransparency = 0 + client.Functions.BrickBlur(true,0,BrickColor.new("Really black")) + elseif mode == "Trippy" then + local v = service.Player + local bg = Instance.new("Frame", gui) + + bg.BackgroundColor3 = Color3.new(0,0,0) + bg.BackgroundTransparency = 0 + bg.Size = UDim2.new(10,0,10,0) + bg.Position = UDim2.new(-5,0,-5,0) + bg.ZIndex = 10 + + while gui and gui.Parent do + wait(1/44) + bg.BackgroundColor3 = Color3.new(math.random(255)/255,math.random(255)/255,math.random(255)/255) + end + + if gui then gui:Destroy() end + elseif mode == "Spooky" then + local frame = Instance.new("Frame",gui) + frame.BackgroundColor3=Color3.new(0,0,0) + frame.Size=UDim2.new(1,0,1,50) + frame.Position=UDim2.new(0,0,0,-50) + local img = Instance.new("ImageLabel",frame) + img.Position = UDim2.new(0,0,0,0) + img.Size = UDim2.new(1,0,1,0) + img.BorderSizePixel = 0 + img.BackgroundColor3 = Color3.new(0,0,0) + local textures = { + 299735022; + 299735054; + 299735082; + 299735103; + 299735133; + 299735156; + 299735177; + 299735198; + 299735219; + 299735245; + 299735269; + 299735289; + 299735304; + 299735320; + 299735332; + 299735361; + 299735379; + } + + local sound = Instance.new("Sound",gui) + sound.SoundId = "rbxassetid://174270407" + sound.Looped = true + sound:Play() + + while gui and gui.Parent do + for i=1,#textures do + img.Image = "rbxassetid://"..textures[i] + wait(0.1) + end + end + sound:Stop() + elseif mode == "lifeoftheparty" then + local frame = Instance.new("Frame",gui) + frame.BackgroundColor3 = Color3.new(0,0,0) + frame.Size = UDim2.new(1,0,1,50) + frame.Position = UDim2.new(0,0,0,-50) + local img = Instance.new("ImageLabel",frame) + img.Position = UDim2.new(0,0,0,0) + img.Size = UDim2.new(1,0,1,0) + img.BorderSizePixel = 0 + img.BackgroundColor3 = Color3.new(0,0,0) + local textures = { + 299733203; + 299733248; + 299733284; + 299733309; + 299733355; + 299733386; + 299733404; + 299733425; + 299733472; + 299733489; + 299733501; + 299733523; + 299733544; + 299733551; + 299733564; + 299733570; + 299733581; + 299733597; + 299733609; + 299733621; + 299733632; + 299733640; + 299733648; + 299733663; + 299733674; + 299733694; + + } + local sound = Instance.new("Sound",gui) + sound.SoundId = "rbxassetid://172906410" + sound.Looped = true + sound:Play() + + while gui and gui.Parent do + for i=1,#textures do + img.Image = "rbxassetid://"..textures[i] + wait(0.1) + end + end + + sound:Stop() + elseif mode == "Strobe" then + local bg = Instance.new("Frame", gui) + bg.BackgroundColor3 = Color3.new(0,0,0) + bg.BackgroundTransparency = 0 + bg.Size = UDim2.new(10,0,10,0) + bg.Position = UDim2.new(-5,0,-5,0) + bg.ZIndex = 10 + + while gui and gui.Parent do + wait(1/44) + bg.BackgroundColor3 = Color3.new(1,1,1) + wait(1/44) + bg.BackgroundColor3 = Color3.new(0,0,0) + end + if gui then gui:Destroy() end + elseif mode == "Blind" then + local bg = Instance.new("Frame", gui) + bg.BackgroundColor3 = Color3.new(0,0,0) + bg.BackgroundTransparency = 0 + bg.Size = UDim2.new(10,0,10,0) + bg.Position = UDim2.new(-5,0,-5,0) + bg.ZIndex = 10 + elseif mode == "ScreenImage" then + local bg = Instance.new("ImageLabel", gui) + bg.Image="rbxassetid://"..data.Image + bg.BackgroundColor3 = Color3.new(0,0,0) + bg.BackgroundTransparency = 0 + bg.Size = UDim2.new(1,0,1,0) + bg.Position = UDim2.new(0,0,0,0) + bg.ZIndex = 10 + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Explorer.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Explorer.lua new file mode 100644 index 0000000..cd06b26 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Explorer.lua @@ -0,0 +1,101 @@ +client = nil +service = nil + +return function(data) + local gTable + local getList + local newEntry + local lastObject = game + local curObject = game + local scroller, search + + local window = client.UI.Make("Window",{ + Name = "Explorer"; + Title = "Game Explorer"; + Size = {400, 300}; + MinSize = {150, 100}; + AllowMultiple = false; + OnRefresh = function() + getList(curObject) + end + }) + + function newEntry(obj, name, numPos, isBack) + local new = scroller:Add("TextLabel", { + Text = " "..tostring(name); + ToolTip = obj.ClassName; + TextXAlignment = "Left"; + Size = UDim2.new(1, 0, 0, 30); + Position = UDim2.new(0, 0, 0, 30*numPos); + }) + + local del = new:Add("TextButton",{ + Text = "Delete"; + Size = UDim2.new(0, 80, 0, 30); + Position = UDim2.new(1, -160, 0, 0); + Visible = not isBack; + OnClick = function() + curObject = curObject.Parent or game + client.Remote.Send("HandleExplore", obj, "Delete") + obj:Destroy() + getList(curObject) + end; + }) + + local open = new:Add("TextButton", { + Text = "Open"; + Size = UDim2.new(0, 80, 0, 30); + Position = UDim2.new(1, -80, 0, 0); + OnClick = function() + lastObject = curObject + curObject = obj + getList(obj) + end; + }) + end + + function getList(obj) + local filter = search.Text + local num = 1 + scroller:ClearAllChildren() + newEntry(obj.Parent or lastObject or game, "Previous Parent (Go Up..)", 0, true) + for i,v in next,obj:GetChildren() do + pcall(function() + if (v.Name:sub(1, #filter):lower() == filter:lower() or (v.ClassName:sub(1, #filter):lower() == filter:lower())) then + newEntry(v, v.Name, num) + num = num+1 + end + end) + end + scroller:ResizeCanvas(false, true, false, false, 5, 5) + end + + if window then + scroller = window:Add("ScrollingFrame",{ + List = {}; + ScrollBarThickness = 2; + BackgroundTransparency = 1; + Position = UDim2.new(0, 5, 0, 30); + Size = UDim2.new(1,-10,1,-30); + }) + + search = window:Add("TextBox", { + Size = UDim2.new(1, -10, 0, 20); + Position = UDim2.new(0, 5, 0, 5); + BackgroundTransparency = 0.5; + BorderSizePixel = 0; + TextColor3 = Color3.new(1, 1, 1); + Text = ""; + PlaceholderText = "Search"; + TextStrokeTransparency = 0.8; + }) + + search.FocusLost:connect(function(enter) + getList(curObject, search.Text) + end) + + getList(game) + gTable = window.gTable + window:Ready() + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/HelpButton.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/HelpButton.lua new file mode 100644 index 0000000..546d1f1 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/HelpButton.lua @@ -0,0 +1,47 @@ +client = nil +cPcall = nil +Pcall = nil +Routine = nil +service = nil +gTable = nil + +--// All global vars will be wiped/replaced except script + +return function(data) + local playergui = service.PlayerGui + local localplayer = service.Players.LocalPlayer + local gui = service.New("ScreenGui") + local toggle = service.New("ImageButton", gui) + local gTable = client.UI.Register(gui) + + if client.UI.Get("HelpButton", gui, true) then + gui:Destroy() + gTable:Destroy() + return nil + end + + gTable.Name = "HelpButton" + gTable.CanKeepAlive = false + + toggle.Name = "Toggle" + toggle.BackgroundTransparency = 1 + toggle.Position = UDim2.new(1, -45, 1, -45) + toggle.Size = UDim2.new(0, 40, 0, 40) + toggle.Image = "rbxassetid://357249130" + toggle.ImageTransparency = 0.5 + + --if client.UI.Get("Chat") then + -- toggle.Position = UDim2.new(1, -(45+40),1, -45) + --end + + toggle.MouseButton1Down:connect(function() + local found = client.UI.Get("UserPanel",nil,true) + if found then + found.Object:Destroy() + else + client.UI.Make("UserPanel",{}) + end + end) + + gTable:Ready() +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Hint.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Hint.rbxm new file mode 100644 index 0000000..efb6be0 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Hint.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/List.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/List.lua new file mode 100644 index 0000000..4ce728e --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/List.lua @@ -0,0 +1,149 @@ + +client = nil +service = nil + +return function(data) + local Title = data.Title + local Tab = data.Table or data.Tab + local Update = data.Update + local UpdateArg = data.UpdateArg + local UpdateArgs = data.UpdateArgs + local AutoUpdate = data.AutoUpdate + local LoadTime = data.LoadTime + local gIndex = data.gIndex + local gTable = data.gTable + local Dots = data.Dots + local Size = data.Size + local Sanitize = data.Sanitize + local Stacking = data.Stacking + local getListTab + local doSearch, genList + local window, scroller, search + + function getListTab(Tab) + local newTab = {} + + for i,v in next,Tab do + if type(v) == "table" then + newTab[i] = { + Text = v.Text; + Desc = v.Desc; + Time = v.Time; + Filter = v.Filter; + Duplicates = v.Duplicates; + } + elseif type(v) == "string" then + newTab[i] = { + Text = v; + Desc = v; + } + end + end + + if Stacking then + local oldNewTab = newTab; + newTab = {} + local lastTab + for ind,ent in next,oldNewTab do + ent.Text = service.Trim(ent.Text) + ent.Desc = service.Trim(ent.Desc) + if not lastTab then + lastTab = ent + table.insert(newTab, ent) + else + if lastTab.Text == ent.Text and lastTab.Desc == ent.Desc then + lastTab.Duplicates = (lastTab.Duplicates and lastTab.Duplicates+1) or 2 + else + lastTab = ent + table.insert(newTab, ent) + end + end + end + end + + for i,v in next,newTab do + v.Text = (data.Sanitize and service.SanitizeString(v.Text)) or v.Text + + if v.Duplicates then + v.Text = "(x"..v.Duplicates..") "..v.Text + end + + if v.Time then + v.Text = "["..v.Time.."] "..v.Text + end + end + + return newTab + end + + function doSearch(tab, text) + local found = {} + text = text:lower() + for i,v in next,tab do + if text == "" or (type(v) == "string" and v:lower():find(text)) or (type(v) == "table" and ((v.Text and v.Text:lower():find(text)) or (v.Filter and v.Filter:lower():find(text)))) then + table.insert(found, v) + end + end + + return found + end + + function genList(Tab) + if search.Text ~= "Search" and search.Text ~= "" then + scroller:GenerateList(getListTab(doSearch(Tab, search.Text))) + else + search.Text = "Search" + scroller:GenerateList(getListTab(Tab)) + end + end + + window = client.UI.Make("Window",{ + Name = "List"; + Title = Title; + Size = Size or {225, 200}; + MinSize = {150, 100}; + OnRefresh = Update and function() + Tab = client.Remote.Get("UpdateList", Update, unpack(UpdateArgs or {UpdateArg})) + if Tab then + genList(Tab) + end + end + }) + + scroller = window:Add("ScrollingFrame",{ + List = {}; + ScrollBarThickness = 2; + BackgroundTransparency = 1; + Position = UDim2.new(0, 5, 0, 30); + Size = UDim2.new(1,-10,1,-30); + --LabelProps = { + -- TextXAlignment = "Left"; + --} + }) + + search = window:Add("TextBox", { + Size = UDim2.new(1, -10, 0, 20); + Position = UDim2.new(0, 5, 0, 5); + BackgroundTransparency = 0.5; + BorderSizePixel = 0; + TextColor3 = Color3.new(1, 1, 1); + Text = "Search"; + PlaceholderText = "Search"; + TextStrokeTransparency = 0.8; + }) + + search.FocusLost:connect(function(enter) + genList(Tab) + end) + + --window:SetPosition(UDim2.new(0.25, 0, 0.5, -window.AbsoluteSize.Y/2)) + gTable = window.gTable + window:Ready() + genList(Tab) + + if Update and AutoUpdate then + while gTable.Active and wait(AutoUpdate) do + window:Refresh() + end + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Message.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Message.rbxm new file mode 100644 index 0000000..7074df6 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Message.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Notif.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Notif.rbxm new file mode 100644 index 0000000..a391a39 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Notif.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Notification.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Notification.rbxm new file mode 100644 index 0000000..886ce75 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Notification.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Notify.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Notify.rbxm new file mode 100644 index 0000000..d67d095 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Notify.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/OldUserPanel.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/OldUserPanel.rbxm new file mode 100644 index 0000000..2971257 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/OldUserPanel.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Output.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Output.rbxm new file mode 100644 index 0000000..a4cf1a5 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Output.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Ping.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Ping.lua new file mode 100644 index 0000000..da548a6 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Ping.lua @@ -0,0 +1,39 @@ + +client = nil +service = nil + +return function(data) + local pinging = true + local gTable + + local window = client.UI.Make("Window",{ + Name = "Ping"; + Title = "Ping"; + Size = {150,70}; + Position = UDim2.new(0, 10, 1, -80); + AllowMultiple = false; + OnClose = function() + pinging = false + end + }) + + if window then + local label = window:Add("TextLabel",{ + Text = "..."; + BackgroundTransparency = 1; + TextSize = 20; + Size = UDim2.new(1, 0, 1, 0); + Position = UDim2.new(0, 0, 0, 0); + --TextScaled = true; + --TextWrapped = true; + }) + + gTable = window.gTable + window:Ready() + + repeat + label.Text = client.Remote.Ping().."ms" + wait(2) + until not pinging or not gTable.Active + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/PlayerList.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/PlayerList.rbxm new file mode 100644 index 0000000..c0f5a59 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/PlayerList.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/PrivateMessage.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/PrivateMessage.lua new file mode 100644 index 0000000..3588674 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/PrivateMessage.lua @@ -0,0 +1,69 @@ + +client = nil +service = nil + +return function(data) + local localplayer = service.Player + local player = data.Player + local message = data.Message + local title = data.Title + local debounce = false + local gTable + + local window = client.UI.Make("Window",{ + Name = "PrivateMessage"; + Title = tostring(player); + Size = {300,150}; + }) + + local label = window:Add("TextLabel",{ + Text = data.Message; + Size = UDim2.new(1, -10, 1, -40); + BackgroundTransparency = 1; + TextScaled = true; + TextWrapped = true; + }) + + local reply = window:Add("TextBox", { + Text = ""; --"Enter reply"; + PlaceholderText = "Enter reply"; + Size = UDim2.new(1, -65, 0, 30); + Position = UDim2.new(0, 5, 1, -35); + ClearTextOnFocus = false; + TextScaled = true; + }) + + local function sendIt(enter) + if not debounce then + debounce = true + if enter then + window:Close() + client.Remote.Send('PrivateMessage','Reply from '..localplayer.Name, player, localplayer, reply.Text) + client.UI.Make("Hint", {Message = "Reply sent"}) + end + debounce = false + end + end + + local send = window:Add("TextButton", { + Text = "Send"; + Size = UDim2.new(0, 60, 0, 30); + Position = UDim2.new(1, -65, 1, -35); + OnClick = function() + sendIt(true) + end + }) + + send.BackgroundColor3 = send.BackgroundColor3:lerp(Color3.new(0,0,0), 0.1) + reply.FocusLost:connect(sendIt) + + gTable = window.gTable + client.UI.Make("Notification",{ + Title = "New Message"; + Message = "Message from "..player.Name; + Time = false; + OnClick = function() window:Ready() end; + OnClose = function() window:Destroy() end; + OnIgnore = function() window:Destroy() end; + }) +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Settings.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Settings.lua new file mode 100644 index 0000000..fb0cd9c --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Settings.lua @@ -0,0 +1,205 @@ + +client = nil +service = nil + +return function(data) + local gTable + + local window = client.UI.Make("Window",{ + Name = "Settings"; + Title = "Settings"; + Size = {225, 200}; + AllowMultiple = false; + }) + + local cliSettings = { + { + Text = "Keybinds: "; + Desc = "- Enabled/Disables Keybinds"; + Entry = "Boolean"; + Value = client.Variables.KeybindsEnabled; + Function = function(enabled, toggle) + client.Variables.KeybindsEnabled = enabled + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","KeybindsEnabled",enabled) + toggle.Text = text + end + }; + { + Text = "UI Keep Alive: "; + Desc = "- Prevents Adonis UI deletion on death"; + Entry = "Boolean"; + Value = client.Variables.UIKeepAlive; + Function = function(enabled, toggle) + client.Variables.UIKeepAlive = enabled + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","UIKeepAlive",enabled) + toggle.Text = text + end + }; + { + Text = "Particle Effects: "; + Desc = "- Enables/Disables certain Adonis made effects like sparkles"; + Entry = "Boolean"; + Value = client.Variables.ParticlesEnabled; + Function = function(enabled, toggle) + client.Variables.ParticlesEnabled = enabled + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","ParticlesEnabled",enabled) + toggle.Text = text + end + }; + { + Text = "Capes: "; + Desc = "- Allows you to disable all player capes locally"; + Entry = "Boolean"; + Value = client.Variables.CapesEnabled; + Function = function(enabled, toggle) + client.Variables.CapesEnabled = enabled + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","CapesEnabled",enabled) + toggle.Text = text + end + }; + { + Text = "Console Key: "; + Desc = "Key used to open the console"; + Entry = "Button"; + Value = client.Variables.CustomConsoleKey or client.Remote.Get("Setting","ConsoleKeyCode"); + Function = function(toggle) + local gotKey + toggle.Text = "Waiting..." + local event = service.UserInputService.InputBegan:connect(function(InputObject) + local textbox = service.UserInputService:GetFocusedTextBox() + if not (textbox) and rawequal(InputObject.UserInputType, Enum.UserInputType.Keyboard) then + gotKey = InputObject.KeyCode.Name + end + end) + + repeat wait() until gotKey + + client.Variables.CustomConsoleKey = gotKey + event:Disconnect() + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","CustomConsoleKey",client.Variables.CustomConsoleKey) + toggle.Text = gotKey + end + }; + { + Text = "Theme: "; + Desc = "- Allows you to set the Adonis UI theme"; + Entry = "DropDown"; + Setting = "CustomTheme"; + Function = function(clone) + local toggle = clone.TextButton + local themePicker = gui.ThemePicker + local themeFrame = themePicker.Frame + local themeEnt = themePicker.Entry + local function showThemes() + themeFrame:ClearAllChildren() + + local themes = {"Default"} + local num = 0 + + for i,v in pairs(client.Deps.UI:GetChildren()) do + table.insert(themes,v.Name) + end + + for i,v in pairs(themes) do + local new = themeEnt:Clone() + new.Text = v + new.Position = UDim2.new(0,0,0,20*num) + new.Parent = themeFrame + new.Visible = true + new.MouseButton1Click:connect(function() + service.Debounce("ClientSelectingTheme",function() + themePicker.Visible = false + toggle.Text = v + client.Variables.CustomTheme = v + if v == "Default" then + client.Remote.Get("UpdateClient","CustomTheme",nil) + else + client.Remote.Get("UpdateClient","CustomTheme",v) + end + end) + end) + num = num+1 + end + + themePicker.Position = UDim2.new(0,toggle.AbsolutePosition.X, 0, toggle.AbsolutePosition.Y) + themePicker.Visible = true + end + + toggle.MouseButton1Click:connect(function() + service.Debounce("ClientDisplayThemes",function() + if themePicker.Visible then + themePicker.Visible = false + else + showThemes() + end + end) + end) + + if client.Variables.CustomTheme then + toggle.Text = client.Variables.CustomTheme + else + toggle.Text = "Default" + end + end + } + } + + if window then + local tabFrame = window:Add("TabFrame",{ + Size = UDim2.new(1, -10, 1, -10); + Position = UDim2.new(0, 5, 0, 5); + }) + + local clientTab = tabFrame:NewTab("Client",{ + Text = "Client"; + }) + + local gameTab = tabFrame:NewTab("Game",{ + Text = "Game"; + }) + + --[[local clientList = clientTab:Add + })("ScrollingFrame",{ + + + local gameList = gameTab:Add("ScrollingFrame",{ + + })--]] + + for i,v in next,cliSettings do + if v.Entry == "Boolean" then + local new = clientTab:Add("TextLabel", { + Size = UDim2.new(1, -10, 0, 25); + Position = UDim2.new(0, 5, 0, 25*(i-1)); + TextXAlignment = "Left"; + Enabled = v.Value; + Text = v.Text; + ToolTip = v.Desc; + }) + + new:Add("Boolean", { + Size = UDim2.new(0, 100, 0, 20); + Position = UDim2.new(1, -100, 0, 0); + Enabled = v.Value; + OnToggle = function(enabled, button) + print("Toggled thinger") + end + }) + end + end + + clientTab:ResizeCanvas(false, true) + + gTable = window.gTable + window:Ready() + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/TaskManager.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/TaskManager.rbxm new file mode 100644 index 0000000..e1009d8 Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/TaskManager.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Terminal.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Terminal.lua new file mode 100644 index 0000000..31d1bab --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Terminal.lua @@ -0,0 +1,84 @@ + +client = nil +service = nil + +return function(data) + local termLines = {} + local gTable + + local window = client.UI.Make("Window",{ + Name = "Terminal"; + Title = "Terminal"; + Size = {500,300}; + AllowMultiple = false; + OnClose = function() + + end + }) + + local scroller = window:Add("ScrollingFrame",{ + Size = UDim2.new(1, -10, 1, -40); + BackgroundTransparency = 1; + List = {}; + }) + + local textbox = window:Add("TextBox",{ + Text = ""; + Size = UDim2.new(1, 0, 0, 30); + Position = UDim2.new(0, 0, 1, -30); + --Text = ""; + PlaceholderText = "Enter command"; + TextXAlignment = "Left" + }) + + local function out(put, lines) + table.insert(lines,put) + if #lines>500 then + table.remove(lines,1) + end + end + + window:BindEvent(service.Events.TerminalLive, function(rData) + local data = rData.Data + local rType = rData.Type + + out(data,termLines) + end) + + textbox.FocusLost:connect(function(enterPressed) + service.Debounce("_TERMINAL_BOX_FOCUSLOST",function() + if enterPressed and textbox.Text ~= "" and textbox.Text ~= "Enter command" then + local com = textbox.Text + local ret + textbox.Text = "" + out(">"..com,termLines) + ret = client.Remote.Get("Terminal",com,{ + Time = tick(); + }) + + if ret and type(ret) == "table" then + for i,ent in ipairs(ret) do + out(ent,termLines) + end + end + + --scroller:GenerateList(termLines, nil, true) + textbox:CaptureFocus() + --textbox.Text = "Enter command" + end + + wait(0.1) + end) + end) + + gTable = window.gTable + window:Ready() + + local last = 0 + while gTable.Active and wait(0.5) do + if #termLines > last then + last = #termLines + scroller:GenerateList(termLines, nil, true) + end + end +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/TopBar.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/TopBar.rbxm new file mode 100644 index 0000000..f3c28fb Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/TopBar.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/UserPanel.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/UserPanel.lua new file mode 100644 index 0000000..8ae8395 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/UserPanel.lua @@ -0,0 +1,1173 @@ + +client = nil +service = nil + +local canEditTables = { + Admins = true; + Owners = true; + Moderators = true; + Banned = true; + Muted = true; + Blacklist = true; + Whitelist = true; + Permissions = true; + MusicList = false; + CapeList = false; + CustomRanks = false; + + OnStartup = true; + OnJoin = true; + OnSpawn = true; + + Allowed_API_Calls = false; + AntiInsert = false; +} + +local function tabToString(tab) + if type(tab) == "table" then + local str = "" + for i,v in next,tab do + if #str > 0 then + str = str.. "; " + end + + str = str.. tostring(i) ..": ".. tostring(v) + end + return str + else + return tostring(tab) + end +end + +return function(data) + local gTable + local window = client.UI.Make("Window",{ + Name = "UserPanel"; + Title = "Adonis"; + Size = {465, 325}; + AllowMultiple = false; + OnClose = function() + client.Variables.WaitingForBind = false + end + }) + + local function showTable(tab, setting) + local tabWindow = client.UI.Make("Window",{ + Name = setting .. "EditSettingsTable"; + Title = setting .. " Table Editor"; + Size = {320, 300}; + AllowMultiple = false; + }) + + if tabWindow then + --// Display tab & allow changes + local items = tabWindow:Add("ScrollingFrame", { + Size = UDim2.new(1, -10, 1, -35); + Position = UDim2.new(0, 5, 0, 5); + BackgroundTransparency = 1; + }) + + if canEditTables[setting] then + local selected + local inputBlock + + local function showItems() + local num = 0 + selected = nil + items:ClearAllChildren(); + + for i,v in next,tab do + items:Add("TextButton", { + Text = tabToString(v); + Size = UDim2.new(1, 0, 0, 25); + Position = UDim2.new(0, 0, 0, num*25); + Visible = true; + ZIndex = 100; + OnClicked = function(button) + if selected then + selected.Button.BackgroundTransparency = 0 + end + + button.BackgroundTransparency = 0.5 + selected = { + Index = i; + Value = v; + Button = button; + } + end + }) + + num = num + 1 + end + + items:ResizeCanvas(false, true) + end + + local entryText + local entryBox; entryBox = tabWindow:Add("Frame", { + Visible = false; + Size = UDim2.new(0, 200, 0, 75); + Position = UDim2.new(0.5, -100, 0.5, -100); + ZIndex = 100; + Children = { + { + Class = "TextLabel"; + Text = "Entry:"; + Position = UDim2.new(0, 15, 0, 10); + Size = UDim2.new(0, 40, 0, 25); + BackgroundTransparency = 1; + ZIndex = 100; + }; + { + Class = "TextButton"; + Text = "Add"; + Position = UDim2.new(0.5, 0, 1, -30); + Size = UDim2.new(0.5, -20, 0, 20); + BackgroundTransparency = 1; + ZIndex = 100; + OnClicked = function() + if not inputBlock then + inputBlock = true + if #entryText.Text > 0 then + client.Remote.Send("SaveTableAdd", setting, entryText.Text) + table.insert(tab, entryText.Text) + end + wait(0.5) + entryBox.Visible = false + inputBlock = false + showItems() + end + end + }; + { + Class = "TextButton"; + Text = "Cancel"; + Position = UDim2.new(0, 10, 1, -30); + Size = UDim2.new(0.5, -20, 0, 20); + BackgroundTransparency = 1; + ZIndex = 100; + OnClicked = function() + if not inputBlock then + inputBlock = false + entryBox.Visible = false + end + end + }; + } + }) + + entryText = entryBox:Add("TextBox", { + Position = UDim2.new(0, 55, 0, 10); + Size = UDim2.new(1, -60, 0, 25); + Text = ""; + PlaceholderText = "Type entry here"; + TextScaled = true; + BackgroundColor3 = Color3.new(1,1,1); + BackgroundTransparency = 0.8; + ZIndex = 100; + }) + + tabWindow:Add("TextButton", { + Text = "Remove"; + Position = UDim2.new(0, 5, 1, -25); + Size = UDim2.new(0.5, -10, 0, 20); + OnClicked = function(button) + if selected and not inputBlock then + inputBlock = true + client.Remote.Send("SaveTableRemove", setting, selected.Value) + table.remove(tab, selected.Index) + showItems() + wait(0.5) + inputBlock = false + end + end + }) + + tabWindow:Add("TextButton", { + Text = "Add", + Position = UDim2.new(0.5, 0, 1, -25); + Size = UDim2.new(0.5, -5, 0, 20); + OnClicked = function() + if not inputBlock then + entryText.Text = "" + entryBox.Visible = true + end + end + }) + + entryBox.BackgroundColor3 = entryBox.BackgroundColor3:lerp(Color3.new(1,1,1), 0.25) + showItems() + else + items:Add("TextLabel", { + Text = "Cannot edit this table in-game"; + Size = UDim2.new(1, 0, 0, 25); + Position = UDim2.new(0, 0, 0, 0); + }) + end + + tabWindow:Ready() + end + end + + if window then + local playerData = client.Remote.Get("PlayerData") + local chatMod = client.Remote.Get("Setting",{"Prefix","SpecialPrefix","BatchKey","AnyPrefix","DonorCommands","DonorCapes"}) + local settingsData = client.Remote.Get("AllSettings") + + local tabFrame = window:Add("TabFrame",{ + Size = UDim2.new(1, -10, 1, -10); + Position = UDim2.new(0, 5, 0, 5); + }) + + local infoTab = tabFrame:NewTab("Info",{ + Text = "Info"; + }) + + local donorTab = tabFrame:NewTab("Donate",{ + Text = "Donate"; + }) + + local keyTab = tabFrame:NewTab("Keybinds", { + Text = "Keybinds"; + }) + + local clientTab = tabFrame:NewTab("Client",{ + Text = "Client"; + }) + + local gameTab = tabFrame:NewTab("Game",{ + Text = "Game"; + }) + + if data.Tab then + if string.lower(data.Tab) == "info" then + infoTab:FocusTab(); + elseif string.lower(data.Tab) == "donate" then + donorTab:FocusTab(); + elseif string.lower(data.Tab) == "keybinds" then + keyTab:FocusTab(); + elseif string.lower(data.Tab) == "client" then + clientTab:FocusTab(); + elseif string.lower(data.Tab) == "settings" then + gameTab:FocusTab(); + end + end + + + --// Help/Info + do + infoTab:Add("TextLabel", { + Text = "Adonis is a script created by Sceleratis (Davey_Bones)\n\nIts purpose is to assist in the\nadministration and moderation\nof ROBLOX game servers.\n\nFeel free to take and edit it on\nthe condition that existing credits remain."; + TextWrapped = true; + Size = UDim2.new(1, -145, 1, -10); + Position = UDim2.new(0, 5, 0, 5); + }) + + infoTab:Add("TextButton", { + Text = "Commands"; + Size = UDim2.new(0, 130, 0, 40); + Position = UDim2.new(1, -135, 0, 5); + BackgroundTransparency = 0.5; + Events = { + MouseButton1Down = function() + client.Remote.Send("ProcessCommand",chatMod.Prefix.."cmds") + end + } + }) + + infoTab:Add("TextButton", { + Text = "Changelog"; + Size = UDim2.new(0, 130, 0, 40); + Position = UDim2.new(1, -135, 0, 50); + BackgroundTransparency = 0.5; + Events = { + MouseButton1Down = function() + client.UI.Make("List", { + Title = "Changelog"; + Table = require(client.Deps.Changelog); + }) + end + } + }) + + infoTab:Add("TextButton", { + Text = "Credits"; + Size = UDim2.new(0, 130, 0, 40); + Position = UDim2.new(1, -135, 0, 95); + BackgroundTransparency = 0.5; + Events = { + MouseButton1Down = function() + client.UI.Make("List", { + Title = "Credits"; + Table = require(client.Deps.Credits); + }) + end + } + }) + + infoTab:Add("TextButton", { + Text = "Get Loader"; + Size = UDim2.new(0, 130, 0, 40); + Position = UDim2.new(1, -135, 0, 140); + BackgroundTransparency = 0.5; + Events = { + MouseButton1Down = function() + service.MarketPlace:PromptPurchase(service.Players.LocalPlayer, 2373505175) + end + } + }) + + infoTab:Add("TextButton", { + Text = "Get Source"; + Size = UDim2.new(0, 130, 0, 40); + Position = UDim2.new(1, -135, 0, 185); + BackgroundTransparency = 0.5; + Events = { + MouseButton1Down = function() + service.MarketPlace:PromptPurchase(service.Players.LocalPlayer, 2373501710) + end + } + }) + end + + + --// Donor Tab + do + local donorData = playerData.Donor + local currentMaterial = donorData and donorData.Cape.Material + local currentTexture = donorData and donorData.Cape.Image + local currentColor = donorData and donorData.Cape.Color + + if type(currentColor) == "table" then + currentColor = Color3.new(currentColor[1],currentColor[2],currentColor[3]) + else + currentColor = BrickColor.new(currentColor).Color + end + + local dStatus = donorTab:Add("TextLabel", { + Text = " Donor Status: "; + Size = UDim2.new(1, -10, 0, 20); + Position = UDim2.new(0, 5, 0, 5); + BackgroundTransparency = 0.25; + TextXAlignment = "Left"; + }):Add("TextLabel", { + Text = (playerData.isDonor and "Donated") or "Not a Donor"; + Size = UDim2.new(0, 150, 1, 0); + Position = UDim2.new(1, -155, 0, 0); + BackgroundTransparency = 1; + TextXAlignment = "Right"; + }) + + local function updateStatus() + dStatus.Text = "Updating..." + dStatus.Text = client.Remote.Get("UpdateDonor", playerData.Donor) + wait(0.5) + dStatus.Text = "Donated" + end + + donorTab:Add("TextLabel", { + Text = " Donor Cape: "; + Size = UDim2.new(1, -10, 0, 20); + Position = UDim2.new(0, 5, 0, 25); + BackgroundTransparency = 0.8; + TextXAlignment = "Left"; + Children = { + { + Class = "Boolean"; + TextXAlignment = "Right"; + Size = UDim2.new(0, 150, 1, 0); + Position = UDim2.new(1, -155, 0, 0); + TextTransparency = (playerData.isDonor and 0) or 0.5; + BackgroundTransparency = 1; + Enabled = playerData.isDonor and playerData.Donor.Enabled; + OnToggle = playerData.isDonor and function(enabled) + service.Debounce("DonorStatusUpdate", function() + playerData.Donor.Enabled = enabled + updateStatus() + end) + end + } + } + }) + + donorTab:Add("TextLabel", { + Text = " Cape Color: "; + Size = UDim2.new(1, -10, 0, 20); + Position = UDim2.new(0, 5, 0, 45); + BackgroundTransparency = 0.25; + TextXAlignment = "Left"; + Children = { + { + Class = "TextButton"; + Text = ""; + Size = UDim2.new(0, 40, 1, -6); + Position = UDim2.new(1, -45, 0, 3); + BackgroundColor3 = currentColor; + TextTransparency = (playerData.isDonor and 0) or 0.5; + BackgroundTransparency = 0; + BorderPixelSize = 1; + BorderColor3 = Color3.fromRGB(100, 100, 100); + OnClick = playerData.isDonor and function(new) + service.Debounce("DonorStatusUpdate", function() + local newColor = client.UI.Make("ColorPicker", { + Color = currentColor; + }) + + currentColor = newColor or currentColor + new.BackgroundColor3 = currentColor + donorData.Cape.Color = currentColor + updateStatus() + end) + end + } + } + }) + + donorTab:Add("TextLabel", { + Text = " Cape Material: "; + Size = UDim2.new(1, -10, 0, 20); + Position = UDim2.new(0, 5, 0, 65); + BackgroundTransparency = 0.8; + TextXAlignment = "Left"; + Children = { + { + Class = "Dropdown"; + Size = UDim2.new(0, 100, 1, 0); + Position = UDim2.new(1, -105, 0, 0); + BackgroundTransparency = 1; + Selected = currentMaterial; + TextAlignment = "Right"; + NoArrow = true; + TextProperties = { + TextTransparency = (playerData.isDonor and 0) or 0.5; + }; + + Options = playerData.isDonor and { + "Brick"; + "Cobblestone"; + "Concrete"; + "CorrodedMetal"; + "DiamondPlate"; + "Fabric"; + "Foil"; + "Granite"; + "Grass"; + "Ice"; + "Marble"; + "Metal"; + "Neon"; + "Pebble"; + "Plastic"; + "Sand"; + "Slate"; + "SmoothPlastic"; + "Wood"; + "WoodPlanks"; + "Glass"; + }; + + OnSelect = function(selection) + service.Debounce("DonorStatusUpdate", function() + donorData.Cape.Material = selection + updateStatus() + end) + end; + } + } + }) + + donorTab:Add("TextLabel", { + Text = " Cape Texture: "; + Size = UDim2.new(1, -10, 0, 20); + Position = UDim2.new(0, 5, 0, 85); + BackgroundTransparency = 0.25; + TextXAlignment = "Left"; + Children = { + { + Class = "TextButton"; + TextXAlignment = "Right"; + Text = currentTexture or 0; + Size = UDim2.new(0, 100, 1, 0); + Position = UDim2.new(1, -105, 0, 0); + TextTransparency = (playerData.isDonor and 0) or 0.5; + BackgroundTransparency = 1; + OnClick = playerData.isDonor and function(textureButton) + service.Debounce("DonorStatusUpdate", function() + local lastValid = currentTexture + local donePreview = false + local pWindow = client.UI.Make("Window", { + Name = "CapeTexture"; + Title = "Texture Preview"; + Size = {200, 250}; + Ready = true; + OnClose = function() + donePreview = true; + end + }) + + local img = pWindow:Add("ImageLabel", { + BackgroundTransparency = 1; + Image = "rbxassetid://"..currentTexture; + Size = UDim2.new(1, -10, 1, -80); + Position = UDim2.new(0, 5, 0, 35); + }) + + pWindow:Add("TextBox", { + Text = currentTexture; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, 5); + TextChanged = function(text, enter, new) + local num = tonumber(text) + if num then + lastValid = num + img.Image = "rbxassetid://"..num; + else + new.Text = lastValid + end + end + }) + + pWindow:Add("TextButton", { + Text = "Select"; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 1, -35); + OnClick = function(new) + currentTexture = lastValid; + donorData.Cape.Image = lastValid; + textureButton.Text = lastValid; + donePreview = true; + + pWindow:Close() + updateStatus() + end + }) + end) + end + } + } + }) + + local donorPerks = { + "Perks you get here: " + } + + local capePerks,cmdPerks = { + "Customizable Cape"; + "Access to !cape"; + "Access to !uncape"; + },{ + "Access to !sparkles "; + "Access to !unsparkles"; + "Access to !particle"; + "Access to !unparticle"; + "Access to !fire "; + "Access to !unfire"; + "Access to !light "; + "Access to !unlight"; + "Access to !hat "; + "Access to !removehats"; + "Access to !face"; + "Access to !shirt"; + "Access to !pants"; + } + + if chatMod.DonorCapes then + for i,v in ipairs(capePerks) do + table.insert(donorPerks, v) + end + else + table.insert(donorPerks, "Donor capes are disabled here") + end + + if chatMod.DonorCommands then + for i,v in ipairs(cmdPerks) do + table.insert(donorPerks, v) + end + else + table.insert(donorPerks, "Donor commands are disabled here") + end + + donorTab:Add("ScrollingFrame", { + Size = UDim2.new(1, -145, 1, -115); + Position = UDim2.new(0, 5, 0, 110); + }):GenerateList(donorPerks, { + TextXAlignment = "Left"; + }) + + local dFrame = donorTab:Add("Frame", { + Size = UDim2.new(0, 140, 1, -110); + Position = UDim2.new(1, -140, 0, 105); + BackgroundTransparency = 1; + }) + + dFrame:Add("TextButton", { + Text = "Donate (Perks)"; + Size = UDim2.new(1, -10, 0, 40); + Position = UDim2.new(0, 5, 0, 5); + BackgroundTransparency = 0.5; + BackgroundColor3 = Color3.fromRGB(231, 6, 141); + OnClick = function() + service.MarketPlace:PromptGamePassPurchase(service.Players.LocalPlayer, 1348327) --497917601) + end + }) + + dFrame:Add("TextLabel", { + Text = "Extra (No Perks): "; + TextXAlignment = "Left"; + Size = UDim2.new(1, 0, 0, 30); + Position = UDim2.new(0, 5, 1, -80); + BackgroundTransparency = 1; + }) + + dFrame:Add("TextButton", { + Text = "50"; + Size = UDim2.new(0, 60, 0, 20); + Position = UDim2.new(0, 5, 1, -50); + BackgroundTransparency = 0.7; + BackgroundColor3 = Color3.new(0,1,0):lerp(Color3.new(1,0,0), 0.1); + OnClick = function() + service.MarketPlace:PromptGamePassPurchase(service.Players.LocalPlayer, 5212076) + end + }) + + dFrame:Add("TextButton", { + Text = "100"; + Size = UDim2.new(0, 60, 0, 20); + Position = UDim2.new(0.5, 5, 1, -50); + BackgroundTransparency = 0.5; + BackgroundColor3 = Color3.new(0,1,0):lerp(Color3.new(1,0,0), 0.3); + OnClick = function() + service.MarketPlace:PromptGamePassPurchase(service.Players.LocalPlayer, 5212077) + end + }) + + dFrame:Add("TextButton", { + Text = "500"; + Size = UDim2.new(0, 60, 0, 20); + Position = UDim2.new(0, 5, 1, -25); + BackgroundTransparency = 0.5; + BackgroundColor3 = Color3.new(0,1,0):lerp(Color3.new(1,0,0), 0.6); + OnClick = function() + service.MarketPlace:PromptGamePassPurchase(service.Players.LocalPlayer, 5212081) + end + }) + + dFrame:Add("TextButton", { + Text = "1000"; + Size = UDim2.new(0, 60, 0, 20); + Position = UDim2.new(0.5, 5, 1, -25); + BackgroundTransparency = 0.5; + BackgroundColor3 = Color3.new(0,1,0):lerp(Color3.new(1,0,0), 0.9); + OnClick = function() + service.MarketPlace:PromptGamePassPurchase(service.Players.LocalPlayer, 5212082) + end + }) + end + + + --// Keybinds + do + local doneKey + local selected + local currentKey + local editOldKeybind + local keyInputHandler + local curCommandText = "" + local waitingForBind = false + local keyDebounce = false + local inputBlock = false + local commandBox + local keyBox + local binds = keyTab:Add("ScrollingFrame", { + Size = UDim2.new(1, -10, 1, -35); + Position = UDim2.new(0, 5, 0, 5); + BackgroundTransparency = 0.5; + }) + + local function getBinds() + local num = 0 + selected = nil + binds:ClearAllChildren(); + + for i,v in next,client.Variables.KeyBinds do + if pcall(string.char, i) then + binds:Add("TextButton", { + Text = "Key: ".. string.upper(string.char(i)) .." | Command: "..v; + Size = UDim2.new(1, 0, 0, 25); + Position = UDim2.new(0, 0, 0, num*25); + OnClicked = function(button) + if selected then + selected.Button.BackgroundTransparency = 0 + end + + button.BackgroundTransparency = 0.5 + selected = { + Key = i; + Command = v; + Button = button; + } + end + }) + + num = num + 1 + end + end + + binds:ResizeCanvas(false, true) + end + + local binderBox; binderBox = keyTab:Add("Frame", { + Visible = false; + Size = UDim2.new(0, 200, 0, 150); + Position = UDim2.new(0.5, -100, 0.5, -100); + Children = { + { + Class = "TextLabel"; + Text = "Command:"; + Position = UDim2.new(0, 0, 0, 10); + Size = UDim2.new(1, 0, 0, 20); + BackgroundTransparency = 1; + }; + { + Class = "TextLabel"; + Text = "Key:"; + Position = UDim2.new(0, 0, 0, 65); + Size = UDim2.new(1, 0, 0, 20); + BackgroundTransparency = 1; + }; + { + Class = "TextButton"; + Text = "Add"; + Position = UDim2.new(0.5, 0, 1, -30); + Size = UDim2.new(0.5, -20, 0, 20); + BackgroundTransparency = 1; + OnClicked = function() + inputBlock = true + + if currentKey then + keyBox.Text = "Saving..." + if editOldKeybind then + client.Functions.RemoveKeyBind(editOldKeybind) + editOldKeybind = nil + end + client.Functions.AddKeyBind(currentKey.Value, commandBox.Text) + currentKey = nil + end + + binderBox.Visible = false + inputBlock = false + getBinds() + end + }; + { + Class = "TextButton"; + Text = "Cancel"; + Position = UDim2.new(0, 10, 1, -30); + Size = UDim2.new(0.5, -20, 0, 20); + BackgroundTransparency = 1; + OnClicked = function() + if not inputBlock then + doneKey = true + currentKey = nil + inputBlock = false + binderBox.Visible = false + client.Variables.WaitingForBind = false + if keyInputHandler then + keyInputHandler:Disconnect() + end + end + end + }; + } + }) + + commandBox = binderBox:Add("TextBox", { + Position = UDim2.new(0, 10, 0, 35); + Size = UDim2.new(1, -20, 0, 20); + TextChanged = function(newText, enter, box) + curCommandText = newText + end + }) + + keyBox = binderBox:Add("TextButton", { + Text = "Click To Bind"; + Position = UDim2.new(0, 10, 0, 90); + Size = UDim2.new(1, -20, 0, 20); + OnClicked = function(button) + doneKey = false + button.Text = "Waiting..." + client.Variables.WaitingForBind = true + keyInputHandler = window:BindEvent(service.UserInputService.InputBegan, function(InputObject) + local textbox = service.UserInputService:GetFocusedTextBox() + if not (textbox) and not doneKey and rawequal(InputObject.UserInputType, Enum.UserInputType.Keyboard) then + currentKey = InputObject.KeyCode + button.Text = string.upper(string.char(currentKey.Value)) + client.Variables.WaitingForBind = false + if keyInputHandler then + keyInputHandler:Disconnect() + keyInputHandler = nil + end + end + end) + end + }) + + commandBox.BackgroundColor3 = commandBox.BackgroundColor3:lerp(Color3.new(1, 1, 1), 0.1) + keyBox.BackgroundColor3 = commandBox.BackgroundColor3 + binderBox.BackgroundColor3 = binderBox.BackgroundColor3:lerp(Color3.new(1, 1, 1), 0.05) + + keyTab:Add("TextButton", { + Text = "Remove"; + Position = UDim2.new(0, 5, 1, -25); + Size = UDim2.new(1/3, -(15/3)-1, 0, 20); + OnClicked = function(button) + if selected and not inputBlock then + inputBlock = true + client.Functions.RemoveKeyBind(selected.Key) + getBinds() + inputBlock = false + end + end + }) + + keyTab:Add("TextButton", { + Text = "Edit"; + Position = UDim2.new((1/3), 0, 1, -25); + Size = UDim2.new(1/3, -(15/3)+5, 0, 20); + OnClicked = function(button) + if selected and not inputBlock then + currentKey = nil + editOldKeybind = selected.Key + keyBox.Text = string.upper(string.char(selected.Key)) + commandBox.Text = selected.Command + binderBox.Visible = true + end + end + }) + + keyTab:Add("TextButton", { + Text = "Add", + Position = UDim2.new((1/3)*2, 0, 1, -25); + Size = UDim2.new(1/3, -(15/3), 0, 20); + OnClicked = function() + if not inputBlock then + editOldKeybind = nil + currentKey = nil + keyBox.Text = "Click To Bind" + commandBox.Text = "" + binderBox.Visible = true + end + end + }) + + getBinds() + end + + + --// Client Settings + do + local cliSettings = { + { + Text = "Keybinds: "; + Desc = "- Enabled/Disables Keybinds"; + Entry = "Boolean"; + Value = client.Variables.KeybindsEnabled; + Function = function(enabled, toggle) + client.Variables.KeybindsEnabled = enabled + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","KeybindsEnabled",enabled) + toggle.Text = text + end + }; + { + Text = "UI Keep Alive: "; + Desc = "- Prevents Adonis UI deletion on death"; + Entry = "Boolean"; + Value = client.Variables.UIKeepAlive; + Function = function(enabled, toggle) + client.Variables.UIKeepAlive = enabled + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","UIKeepAlive",enabled) + toggle.Text = text + end + }; + { + Text = "Particle Effects: "; + Desc = "- Enables/Disables Adonis made particles"; + Entry = "Boolean"; + Value = client.Variables.ParticlesEnabled; + Function = function(enabled, toggle) + client.Variables.ParticlesEnabled = enabled + + if enabled then + client.Functions.EnableParticles(true) + else + client.Functions.EnableParticles(false) + end + + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","ParticlesEnabled",enabled) + toggle.Text = text + end + }; + { + Text = "Capes: "; + Desc = "- Allows you to disable all player capes locally"; + Entry = "Boolean"; + Value = client.Variables.CapesEnabled; + Function = function(enabled, toggle) + client.Variables.CapesEnabled = enabled + + if enabled then + client.Functions.HideCapes(false) + else + client.Functions.HideCapes(true) + end + + if enabled then + client.Functions.MoveCapes() + else + service.StopLoop("CapeMover") + end + + local text = toggle.Text + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","CapesEnabled",enabled) + toggle.Text = text + end + }; + { + Text = "Console Key: "; + Desc = "Key used to open the console"; + Entry = "Keybind"; + Value = client.Variables.CustomConsoleKey or client.Remote.Get("Setting","ConsoleKeyCode"); + Function = function(toggle) + service.Debounce("CliSettingKeybinder", function() + local gotKey + toggle.Text = "Waiting..." + local event = service.UserInputService.InputBegan:connect(function(InputObject) + local textbox = service.UserInputService:GetFocusedTextBox() + if not (textbox) and rawequal(InputObject.UserInputType, Enum.UserInputType.Keyboard) then + gotKey = InputObject.KeyCode.Name + end + end) + + repeat wait() until gotKey + + client.Variables.CustomConsoleKey = gotKey + event:Disconnect() + toggle.Text = "Saving.." + client.Remote.Get("UpdateClient","CustomConsoleKey",client.Variables.CustomConsoleKey) + toggle.Text = gotKey + end) + end + }; + { + Text = "Theme: "; + Desc = "- Allows you to set the Adonis UI theme"; + Entry = "DropDown"; + Setting = "CustomTheme"; + Value = "Game Theme"; + Options = (function() local themes = {"Game Theme"} for i,v in next,client.Deps.UI:GetChildren() do table.insert(themes, v.Name) end return themes end)(); + Function = function(selection) + client.Variables.CustomTheme = selection + if selection == "Game Theme" then + client.Remote.Get("UpdateClient","CustomTheme",nil) + else + client.Remote.Get("UpdateClient","CustomTheme",selection) + end + end + } + } + + local num = 0; + local cliScroll = clientTab:Add("ScrollingFrame", { + BackgroundTransparency = 1; + }); + + for i, setData in next,cliSettings do + local label = cliScroll:Add("TextLabel", { + Text = " ".. setData.Text; + ToolTip = setData.Desc; + TextXAlignment = "Left"; + Size = UDim2.new(1, 0, 0, 30); + Position = UDim2.new(0, 0, 0, num*30); + BackgroundTransparency = (i%2 == 0 and 0) or 0.2; + }) + + if setData.Entry == "Boolean" then + label:Add("Boolean", { + Size = UDim2.new(0, 120, 1, 0); + Position = UDim2.new(1, -120, 0, 0); + Enabled = setData.Value; + OnToggle = setData.Function; + BackgroundTransparency = 1; + }) + elseif setData.Entry == "Keybind" then + label:Add("TextButton", { + Text = tostring(setData.Value); + Size = UDim2.new(0, 120, 1, 0); + Position = UDim2.new(1, -120, 0, 0); + OnClick = setData.Function; + BackgroundTransparency = 1; + }) + elseif setData.Entry == "DropDown" then + label:Add("Dropdown", { + Size = UDim2.new(0, 120, 1, 0); + Position = UDim2.new(1, -120, 0, 0); + Selected = setData.Value; + OnSelect = setData.Function; + Options = setData.Options; + --BackgroundColor3 = label.BackgroundColor3:lerp(Color3.new(1, 1, 1), 0.25); + BackgroundTransparency = 1; + }) + end + + --[[cliScroll:Add("TextLabel", { + Text = setData.Desc; + ToolTip = setData.Desc; + TextXAlignment = "Left"; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, (num+1)*30); + })--]] + + num = num+1 + end + + cliScroll:ResizeCanvas(false, true) + end + + + --// Game Settings + do + if settingsData then + local settings = settingsData.Settings + local descs = settingsData.Descs + local order = settingsData.Order + + for i, setting in next,order do + local value = settings[setting] + local desc = descs[setting] + if setting == "" or setting == " " and value == nil then + + elseif value == nil then + gameTab:Add("TextLabel", { + Text = " "..setting..": "; + ToolTip = desc; + BackgroundTransparency = (i%2 == 0 and 0) or 0.2; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, (30*(i-1))+5); + TextXAlignment = "Left"; + Children = { + TextLabel = { + Text = "Cannot Change"; + Size = UDim2.new(0, 100, 1, 0); + Position = UDim2.new(1, -100, 0, 0); + TextTransparency = 0.5; + BackgroundTransparency = 1; + } + } + }) + elseif type(value) == "table" then + gameTab:Add("TextLabel", { + Text = " "..setting..": "; + ToolTip = desc; + BackgroundTransparency = (i%2 == 0 and 0) or 0.2; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, (30*(i-1))+5); + TextXAlignment = "Left"; + Children = { + TextButton = { + Text = "Open"; + Size = UDim2.new(0, 100, 1, 0); + Position = UDim2.new(1, -100, 0, 0); + BackgroundTransparency = 1; + OnClick = function() + showTable(value, setting) + end + } + } + }) + elseif type(value) == "boolean" then + gameTab:Add("TextLabel", { + Text = " ".. tostring(setting)..": "; + ToolTip = desc; + BackgroundTransparency = (i%2 == 0 and 0) or 0.2; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, (30*(i-1))+5); + TextXAlignment = "Left"; + Children = { + Boolean = { + Enabled = value; + Size = UDim2.new(0, 100, 1, 0); + Position = UDim2.new(1, -100, 0, 0); + BackgroundTransparency = 1; + OnToggle = function(enabled, button) + --warn("Setting ".. tostring(setting)..": ".. tostring(enabled)) + client.Remote.Send("SaveSetSetting", setting, enabled) + end + } + } + }) + elseif type(value) == "string" then + gameTab:Add("TextLabel", { + Text = " "..setting..": "; + ToolTip = desc; + BackgroundTransparency = (i%2 == 0 and 0) or 0.2; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, (30*(i-1))+5); + TextXAlignment = "Left"; + Children = { + TextBox = { + Text = value; + Size = UDim2.new(0, 100, 1, 0); + Position = UDim2.new(1, -100, 0, 0); + BackgroundTransparency = 1; + TextChanged = function(text, enter, new) + if enter then + --warn("Setting "..tostring(setting)..": "..tostring(text)) + client.Remote.Send("SaveSetSetting", setting, text) + end + end + } + } + }) + elseif type(value) == "number" then + gameTab:Add("TextLabel", { + Text = " "..setting..": "; + ToolTip = desc; + BackgroundTransparency = (i%2 == 0 and 0) or 0.2; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, (30*(i-1))+5); + TextXAlignment = "Left"; + Children = { + TextBox = { + Text = value; + Size = UDim2.new(0, 100, 1, 0); + Position = UDim2.new(1, -100, 0, 0); + BackgroundTransparency = 1; + TextChanged = function(text, enter, new) + if enter then + --warn("Setting "..tostring(setting)..": "..tonumber(text)) + client.Remote.Send("SaveSetSetting", setting, text) + end + end + } + } + }) + end + end + + gameTab:ResizeCanvas(false, true, false, false, 5, 5) + else + gameTab:Disable() + end + end + + gTable = window.gTable + window:Ready() + end +end diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Vote.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/Vote.lua new file mode 100644 index 0000000..7019e96 --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/Vote.lua @@ -0,0 +1,58 @@ + +client = nil +service = nil + +return function(data) + local gTable + local selected + + local question = data.Question + local answers = data.Answers + + local window = client.UI.Make("Window",{ + Name = "Vote"; + Title = "Vote"; + Size = {300,200}; + AllowMultiple = false; + OnClose = function() + if not selected then + selected = false + end + end + }) + + local quesText = window:Add("TextLabel",{ + Text = question; + TextScaled = true; + TextWrapped = true; + Size = UDim2.new(1, -10, 0, 50); + BackgroundTransparency = 1; + }) + + local ansList = window:Add("ScrollingFrame",{ + Size = UDim2.new(1, -10, 1, -60); + Position = UDim2.new(0, 5, 0, 55); + }) + + for i,ans in next,answers do + ansList:Add("TextButton",{ + Text = i..". "..ans; + Size = UDim2.new(1, -10, 0, 25); + Position = UDim2.new(0, 5, 0, 25*(i-1)); + TextXAlignment = "Left"; + Events = { + MouseButton1Click = function() + window:Close() + selected = ans + end + } + }) + end + + ansList:ResizeCanvas() + gTable = window.gTable + window:Ready() + + repeat wait() until selected or not gTable.Active + return selected +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/Window.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Default/Window.rbxm new file mode 100644 index 0000000..35cd04d Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Default/Window.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Default/YesNoPrompt.lua b/src/assets/Adonis/Client/Dependencies/UI/Default/YesNoPrompt.lua new file mode 100644 index 0000000..41882ba --- /dev/null +++ b/src/assets/Adonis/Client/Dependencies/UI/Default/YesNoPrompt.lua @@ -0,0 +1,66 @@ + +client = nil +service = nil + +return function(data) + local gTable + local answer + + local window = client.UI.Make("Window",{ + Name = "Prompt"; + Title = "Prompt"; + Size = {225,150}; + SizeLocked = true; + --Icon = "rbxassetid://136615916"; + OnClose = function() + if not answer then + answer = "No" + end + end + }) + + local label = window:Add("TextLabel",{ + Text = data.Question; + Font = "SourceSans"; + TextScaled = true; + BackgroundTransparency = 1; + TextScaled = true; + TextWrapped = true; + Size = UDim2.new(1, -10, 0.7, -5); + }) + + local yes = window:Add("TextButton",{ + Text = "Yes"; + Font = "Arial"; + TextSize = 18; + Size = UDim2.new(0.5, -5, 0.3, -5); + Position = UDim2.new(0,5,0.7,0); + BackgroundColor3 = Color3.fromRGB(74, 195, 56); + BackgroundTransparency = 0.5; + }) + + local no = window:Add("TextButton",{ + Text = "No"; + Font = "Arial"; + TextSize = 18; + Size = UDim2.new(0.5, -5, 0.3, -5); + Position = UDim2.new(0.5,0,0.7,0); + BackgroundColor3 = Color3.fromRGB(206, 72, 45); + BackgroundTransparency = 0.5; + }) + + yes.MouseButton1Down:connect(function() + answer = "Yes" + window:Close() + end) + + no.MouseButton1Down:connect(function() + answer = "No" + window:Close() + end) + + gTable = window.gTable + window:Ready() + repeat wait() until answer + return answer +end \ No newline at end of file diff --git a/src/assets/Adonis/Client/Dependencies/UI/Hydris.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Hydris.rbxm new file mode 100644 index 0000000..65d37fe Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Hydris.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Mobilius.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Mobilius.rbxm new file mode 100644 index 0000000..ae0be3e Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Mobilius.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/Steampunk.rbxm b/src/assets/Adonis/Client/Dependencies/UI/Steampunk.rbxm new file mode 100644 index 0000000..12a20ac Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/Steampunk.rbxm differ diff --git a/src/assets/Adonis/Client/Dependencies/UI/TransBlack.rbxm b/src/assets/Adonis/Client/Dependencies/UI/TransBlack.rbxm new file mode 100644 index 0000000..dddd0ee Binary files /dev/null and b/src/assets/Adonis/Client/Dependencies/UI/TransBlack.rbxm differ diff --git a/src/assets/Adonis/LICENSE b/src/assets/Adonis/LICENSE new file mode 100644 index 0000000..eae13e4 --- /dev/null +++ b/src/assets/Adonis/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Sceleratis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/assets/Adonis/Loader/Config/API.lua b/src/assets/Adonis/Loader/Config/API.lua new file mode 100644 index 0000000..8adc704 --- /dev/null +++ b/src/assets/Adonis/Loader/Config/API.lua @@ -0,0 +1,191 @@ +--[[ --// WARNING: MAY BE SEVERELY OUTDATED; REQUIRES UPDATING + --// INCOMPLETE; WILL FINISH LATER + + Adonis API Documentation for developers + + Require: + Adonis' MainModule can be loaded by using require(359948692)() + - This allows you to require the module via the console and test things per server + without having to add the loader and save the game; + - If you want to edit things like settings, themes, or plugins you can do the following: + local data = { + Settings = { + Admins = {"SomeGuy"} + }; + Themes = { + game.Workspace.ThemeFolder1; + game.Workspace.ThemeFolder2; + }; + Plugins = { + game.Workspace.Plugin1; + game.Workspace.Plugin2; + } + require(359948692)(data) + + - The MainModule will use a set of default settings for any setting not provided + + + _G.Adonis: + Read-only table in _G that can be used to access certain things in Adonis from other server scripts + + Functions: + _G.Adonis.Access(accessKey, serverSubTable) + - Returns a read-only version of a server subtable; allowing you to use all of it's functions + - Settings can be changed in the Settings module for what to allow access to and to change if scripts can read/write + + _G.Adonis.CheckAdmin(player) + - Returns true if the player is an Adonis admin + + _G.Adonis.GetLevel(player) + - Returns a player's admin level + - Levels: + 0 - Player + 1 - Moderator + 2 - Admin + 3 - Owner + 4 - Creators (basically place owners) + 5 - Place owner (the person who actually owns the place) + + _G.Adonis.CheckDonor(player) + - Returns true if the player is an Adonis donor + + _G.Adonis.CheckAgent(player) + - Returns true if the player is a Trello agent + + _G.Adonis.SetLighting(property, value) + - Sets the lighting property for the server and all clients + - Mainly used for local lighting to update all clients + + _G.Adonis.SetPlayerLighting(player, property, value) + - Sets the lighting property for a specific player + - Requires LocalLighting be enabled in settings in order to workspace + + _G.Adonis.NewParticle(part, type, properties) + - Lets you create local particles on the target part with properties defined in the properties table + - Type can be any classname that is place into a brick and has the .Enabled property + - Part must be a weldable part + _G.Adonis.RemoveParticle(part, name) + - Removes local particles named for all players from + + _G.Adonis.NewLocal(player, type, properties, newParent) + - Creates Instance.new(type) with properties + in local parent newParent for player + - newParents: "Camera", "LocalContainer", "PlayerGui" + - Defaults to LocalContainer if no parent is given + + _G.Adonis.MakeLocal(player, object, newParent) + - Localizes object for player by moving it to newParent (a local container) + - newParents: "Camera", "LocalContainer", "PlayerGui" + - Defaults to LocalContainer if no parent is given + + _G.Adonis.MoveLocal(player, object, oldParent, newParent) + - Same as MakeLocal except moves an existing local based on name/object provided + + _G.Adonis.RemoveLocal(player, object, oldParent) + - Finds and removes object from oldParent (a local container) + for player + + + Service: + Metatable used to access ROBLOX services and some utility functions + For example: service.Players + + Extra functions: + service.Delete(object) + - Uses service.Debris to delete an object; Works on some RobloxLocked objects + + service.Events.EventName:Connect(function) + - Attaches a function to an Adonis event + - Returns a table conaining the :Disconnect() and :Wait() methods + + service.Events.EventName:Wait() + - Will wait for EventName to fire once + - Will return all arguments passed + + service.Events.EventName:Fire(...) + - Fires all functions for the specified event (EventName) + + service.TrackTask(TaskName, TaskFunction, arg1, arg2, ...) + - Creates a new task named TaskName using TaskFunction and passes supplied arguments + + service.StartLoop(loopName, delay, function) + - Starts an infinite loop that can be stopped using service.StopLoop(loopName) + - Delay accepts a number, "Heartbeat", or "Stepped" + + service.StopLoop(loopName) + - Stops a loop started by service.StartLoop + + service.ReadOnly(table) + - Returns a read-only version of the table supplied to it + + service.GetPlayers(commandPlayer, nameString, dontError, isServer) + - Finds players via their name/modifiers provided in nameString + - If no args are given it will return a list of all players connected to the server, not just in game.Players + + Events: + service.Events.eventName + - Returns a table containing :connect and :disconnect + - Basically the same as service.HookEvent but more like a ROBLOX event + + Event List: + PlayerAdded + - Runs after Adonis client finishes loading + - Returns player + + PlayerRemoving + - Fired when a player leaves + - Returns player + + NetworkAdded + - Fired when a new NetworkClient appears + - Returns NetworkClient + + NetworkRemoved + - Fired when a NetworkClient is removed + - Returns NetworkClient + + PlayerChatted + - Fired when player chats; Works with anything that fires server.Process.Chat; Including Adonis' custom chat + - Returns player, msg + + CharacterAdded + - Fired when character loads; Does not use player.CharacterAdded + - Returns player + + ErrorMessage + - Fired when an error is found + - Returns message, trace, script + + Output + - Fired when anything prints + - Returns message, type + + CommandRan + - Fired when a command is ran + - Returns msg, command, args, table, index, ran, error + + - msg is the message the player chatted + - command is the command pulled from msg + - args is a table containing supplied command arguments + - table is the command table + - index is it's position in server.Commands + - ran returns true is the command ran successfully + - error returns any errors from the command function + + Server: + Main script table containing most of the functions and variables used by the admin + + Subtables: + Logs + Variables + Core + Remote + Functions + Process + Admin + HTTP + Anti + Commands + Settings + +--]] diff --git a/src/assets/Adonis/Loader/Config/Plugins/Client-Example Plugin.lua b/src/assets/Adonis/Loader/Config/Plugins/Client-Example Plugin.lua new file mode 100644 index 0000000..5dd516c --- /dev/null +++ b/src/assets/Adonis/Loader/Config/Plugins/Client-Example Plugin.lua @@ -0,0 +1,17 @@ +client = nil +service = nil +return function() + --Acts the same as a server plugin but with client functions instead of server. + --[[ + local window = client.UI.Make("Window",{ + Title = "Changing DataStore"; + Size = {700,300}; + Icon = "rbxassetid://357249130"; + }) + + window.Add("ImageLabel",{ + Image = "rbxassetid://531490964"; + }) + + --]] +end \ No newline at end of file diff --git a/src/assets/Adonis/Loader/Config/Plugins/Server-Example Plugin.lua b/src/assets/Adonis/Loader/Config/Plugins/Server-Example Plugin.lua new file mode 100644 index 0000000..817a6ae --- /dev/null +++ b/src/assets/Adonis/Loader/Config/Plugins/Server-Example Plugin.lua @@ -0,0 +1,42 @@ +--[[ + SERVER PLUGINS' NAMES MUST START WITH "Server: " + CLIENT PLUGINS' NAMES MUST START WITH "Client: " + + Plugins have full access to the server/client tables and most variables. + + You can use the MakePluginEvent to use the script instead of setting up an event. + PlayerChatted will get chats from the custom chat and nil players. + PlayerJoined will fire after the player finishes initial loading + CharacterAdded will also fire after the player is loaded, it does not use the CharacterAdded event. + + service.HookEvent('PlayerChatted',function(msg,plr) + print(msg..' from '..plr.Name..' Example Plugin') + end) + + service.HookEvent('PlayerJoined',function(p) + print(p.Name..' Joined! Example Plugin') + end) + + service.HookEvent('CharacterAdded',function(plr) + server.RunCommand('name',plr.Name,'BobTest Example Plugin') + end) + +--]] + +server = nil -- Mutes warnings about unknown globals +service = nil +return function() + server.Commands.ExampleCommand = { + Prefix = server.Settings.Prefix; -- Prefix to use for command + Commands = {"example"}; -- Commands + Args = {"arg1"}; -- Command arguments + Description = "Example command"; -- Command Description + Hidden = true; -- Is it hidden from the command list? + Fun = false; -- Is it fun? + AdminLevel = "Players"; -- Admin level; If using settings.CustomRanks set this to the custom rank name (eg. "Baristas") + Function = function(plr,args) -- Function to run for command + print("HELLO WORLD FROM AN EXAMPLE COMMAND :)") + print("Player supplied args[1] "..tostring(args[1])) + end + } +end \ No newline at end of file diff --git a/src/assets/Adonis/Loader/Config/Settings.lua b/src/assets/Adonis/Loader/Config/Settings.lua new file mode 100644 index 0000000..df224af --- /dev/null +++ b/src/assets/Adonis/Loader/Config/Settings.lua @@ -0,0 +1,461 @@ +local settings = {} +local descs = {} + + + -------------- + -- SETTINGS -- + -------------- + --[[ + + --// Basic Lua Info + + This is only here to help you when editing settings so you understand how they work + and don't break something. + + Anything that looks like setting = {} is known as a table. + Tables contain things; like the Lua version of a box. + An example of a table would be setting = {"John","Mary","Bill"} + You can have tables inside of tables, such in the case of setting = {{Group=1234,Rank=123,Type="Admin"}} + Just like real boxes, tables can contain pretty much anything including other tables. + + Anything that looks like "Bob" is what's known as a string. Strings + are basically plain text; setting = "Bob" would be correct however + setting = Bob would not; because if it's not surrounded by quotes Lua will think + that Bob is a variable; Quotes indicate something is a string and therefor not a variable/number/code + + Numbers do not use quotes. setting = 56 + + This green block of text you are reading is called a comment. It's like a message + from the programmer to anyone who reads their stuff. Anything in a comment will + not be seen by Lua. + + Incase you don't know what Lua is; Lua is the scripting language ROBLOX uses... + so every script you see (such as this one) and pretty much any code on ROBLOX is + written in Lua. + + + + + --// Settings [READ IF CONFUSED] + + If you see something like "Format: 'Username:UserId'" it means that anything you put + in that table must follow one of the formats next to Format: + + For instance if I wanted to give admin to a player using their username, userid, a group they are in + or an item they own I would do the following with the settings.Admins table: + + The format for the Admins' table's entries is "Username"; or "Username:UserId"; or UserId; or "Group:GroupId:GroupRank" or "Item:ItemID" + This means that if I want to admin Bobjenkins123 who has a userId of 1234567, is in + group "BobFans" (group ID 7463213) under the rank number 234, or owns the item belonging to ID 1237465 + I can do any of the following: + + settings.Admins = {"Bobjenkins123","Bobjenkins123:1234567",1234567,"Group:BobFans:7463213:234","Item:1237465"} + + + If I wanted to make it so rank 134 in group 1029934 and BobJenkins123 had mod admin I would do + settings.Moderators = {"Group:1029943:134","BobJenkins123"} + + + I was going to change the admin rank stuff but I figured it would confuse people too much, so I left it as mods/admins/owners ;p + + + --// Admins + + settings.Moderators = {"Sceleratis";"BobJenkins:1237123";1237666;"Group:181:255";"Item:1234567"} + This will make the person with the username Sceleratis, or the name BobJenkins, or the ID 1237123 OR 123766, + or is in group 181 in the rank 255, or owns the item belonging to the ID 1234567 a moderator + + If I wanted to give the rank 121 in group 181 Owner admin I would do: + settings.Owners = {"Group:181:121"} + See? Not so hard is it? + + If I wanted to add group 181 and all ranks in it to the :slock whitelist I would do; + settings.Whitelist = {"Group:181";} + + I can do the above if I wanted to give everyone in a group admin for any of the other admin tables + + + + --// Command Permissions + + You can set the permission level for specific commands using setting.Permissions + If I wanted to make it so only owners+ can use :ff player then I would do: + + settings.Permissions = {":ff:Owners"} + + :ff is the Command ":ff scel" and 3 is the NewLevel + + Permissions Levels: + Players + Moderators + Admins + Owners + Creators + + Note that when changing command permissions you MUST include the prefix; + So if you change the prefix to $ you would need to do $ff instead of :ff + + + --// Trello + + The Trello abilities of the script allow you to manage lists and permissions via + a Trello board; The following will guide you through the process of setting up a board; + + 1. Sign up for an account at http://trello.com + 2. Create a new board + http://prntscr.com/b9xljn + http://prntscr.com/b9xm53 + 3. Get the board ID; + http://prntscr.com/b9xngo + 4. Set settings.Trello_Primary to your board ID + 5. Set settings.Trello.Enabled to true + 6. Congrats! The board is ready to be used; + 7. Create a list and add cards to it; + http://prntscr.com/b9xswk + + - You can view lists in-game using :viewlist ListNameHere + + Lists: + Moderators - Card Format: Same as settings.Moderators + Admins - Card Format: Same as settings.Admins + Owners - Card Format: Same as settings.Owners + Creators - Card Format: Same as settings.Creators + Agents - Card Format: Same as settings.Admins + Banlist - Card Format: Same as settings.Banned + Mutelist - Card Format: Same as settings.Muted + Blacklist - Card Format: Same as settings.Blacklist + Whitelist - Card Format: Same as settings.Whitelist + Permissions - Card Format: Same as settings.Permissions + Music - Card Format: SongName:AudioID + Commands - Card Format: Command (eg. :ff bob) + + Card format refers to how card names should look + + + MAKE SURE YOU SET settings.DataStoreKey TO SOMETHING ABSOLUTELY RANDOM; + --]] + + + settings.HideScript = true -- Disable if your game saves; When the game starts the Adonis_Loader model will be hidden so other scripts cannot access the settings module + settings.DataStore = "Adonis_1" -- DataStore the script will use for saving data; Changing this will lose any saved data + settings.DataStoreKey = "CHANGE_THIS" -- CHANGE THIS TO SOMETHING RANDOM! Key used to encrypt all datastore entries; Changing this will lose any saved data + settings.DataStoreEnabled = true -- Disable if you don't want to load settings and admins from the datastore; PlayerData will still save + settings.Storage = game:service("ServerStorage") -- Where things like tools are stored + + settings.Theme = "Default" -- UI theme; + settings.MobileTheme = "Mobilius" -- Theme to use on mobile devices; Some UI elements are disabled + + settings.Moderators = {} -- Mods; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Admins = {} -- Admins; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Owners = {} -- Head Admins; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Creators = {} -- Place Owner; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Banned = {} -- List of people banned from the game Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Muted = {} -- List of people muted Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Blacklist = {} -- List of people banned from using admin Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Whitelist = {} -- People who can join if whitelist enabled Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";} + settings.Permissions = {} -- Command permissions; Format: {"Command:NewLevel";} + settings.MusicList = {}; -- List of songs to appear in the script Format: {{Name = "somesong",ID = 1234567},{Name = "anotherone",ID = 1243562}} + settings.CapeList = {}; -- List of capes Format: {{Name = "somecape",Material = "Fabric",Color = "Bright yellow",ID = 12345567,Reflectance = 1},{etc more stuff here}} + settings.CustomRanks = {}; -- List of custom AdminLevel ranks Format: {RankName = {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID"; "GamePass:GamePassID";};} + + settings.OnStartup = {}; -- List of commands ran at server start Format: {":notif TestNotif"} + settings.OnJoin = {}; -- List of commands ran as player on join (ignores adminlevel) Format: {":cmds"} + settings.OnSpawn = {}; -- List off commands ran as player on spawn (ignores adminlevel) Format: {"!fire Really red",":ff me"} + + settings.SaveAdmins = true -- If true anyone you :admin or :owner in-game will save + settings.WhitelistEnabled = false -- If true enables the whitelist/server lock; Only lets admins & whitelisted users join + + settings.Prefix = ":" -- The : in :kill me + settings.PlayerPrefix = "!" -- The ! in !donate; Mainly used for commands that any player can run; Do not make it the same as settings.Prefix + settings.SpecialPrefix = "" -- Used for things like "all", "me" and "others" (If changed to ! you would do :kill !me) + settings.SplitKey = " " -- The space in :kill me (eg if you change it to / :kill me would be :kill/me) + settings.BatchKey = "|" -- :kill me | :ff bob | :explode scel + settings.ConsoleKeyCode = "Quote" -- Keybind to open the console; Rebindable per player in userpanel; KeyCodes: http://wiki.roblox.com/index.php?title=API:Enum/KeyCode + + settings.HttpWait = 60; -- How long things that use the HttpService will wait before updating again + settings.Trello_Enabled = false; -- Are the Trello features enabled? + settings.Trello_Primary = ""; -- Primary Trello board + settings.Trello_Secondary = {"9HH6BEX2"}; -- Secondary Trello boards Format: {"BoardID";"BoardID2","etc"} + settings.Trello_AppKey = ""; -- Your Trello AppKey Link: https://trello.com/app-key + settings.Trello_Token = ""; -- Trello token (DON'T SHARE WITH ANYONE!) Link: https://trello.com/1/connect?name=Trello_API_Module&response_type=token&expires=never&scope=read,write&key=YOUR_APP_KEY_HERE + + settings.G_API = true -- If true allows other server scripts to access certain functions described in the API module through _G.Adonis + settings.G_Access = false -- If enabled allows other scripts to access Adonis using _G.Adonis.Access; Scripts will still be able to do things like _G.Adonis.CheckAdmin(player) + settings.G_Access_Key = "Example_Key" -- Key required to use the _G access API; Example_Key will not work for obvious reasons + settings.G_Access_Perms = "Read" -- Access perms + settings.Allowed_API_Calls = { + Client = false; -- Allow access to the Client (not recommended) + Settings = false; -- Allow access to settings (not recommended) + DataStore = false; -- Allow access to the DataStore (not recommended) + Core = false; -- Allow access to the script's core table (REALLY not recommended) + Service = false; -- Allow access to the script's service metatable + Remote = false; -- Communication table + HTTP = false; -- HTTP related things like Trello functions + Anti = false; -- Anti-Exploit table + Logs = false; + UI = false; -- Client UI table + Admin = false; -- Admin related functions + Functions = false; -- Functions table (contains functions used by the script that don't have a subcategory) + Variables = true; -- Variables table + API_Specific = true; -- API Specific functions + } + + settings.FunCommands = true -- Are fun commands enabled? + settings.PlayerCommands = true -- Are players commands enabled? + settings.ChatCommands = true -- If false you will not be able to run commands via the chat; Instead you MUST use the console or you will be unable to run commands + settings.CreatorPowers = true -- Gives me creator level admin; This is strictly used for debugging; I can't debug without full access to the script + settings.CodeExecution = true -- Enables the use of code execution in Adonis; Scripting related and a few other commands require this + + settings.BanMessage = "Banned" -- Message shown to banned users + settings.LockMessage = "Not Whitelisted" -- Message shown to people when they are kicked while the game is :slocked + settings.SystemTitle = "System Message" -- Title to display in :sm + + settings.MaxLogs = 500 -- Maximum logs to save before deleting the oldest; Too high can lag the game + settings.Notification = true -- Whether or not to show the "You're an admin" and "Updated" notifications + settings.SongHint = true -- Display a hint with the current song name and ID when a song is played via :music + + settings.AutoClean = false -- Will auto clean service.Workspace of things like hats and tools + settings.AutoCleanDelay = 60 -- Time between auto cleans + settings.AutoBackup = not workspace.FilteringEnabled -- Run a map backup command when the server starts, this usually can be false if the server is FE, which means exploits are mostly prevented to require :restoremap. + + settings.CustomChat = false -- Custom chat + settings.PlayerList = false -- Custom playerlist + settings.Console = true -- Command console + + settings.HelpSystem = true -- Allows players to call admins for help using !help + settings.HelpButton = true -- Shows a little help button in the bottom right corner + + settings.DonorCapes = true -- Donors get to show off their capes; Not disruptive :) + settings.DonorCommands = true -- Show your support for the script and let donors use harmless commands like !sparkles + settings.LocalCapes = false -- Makes Donor capes local so only the donors see their cape [All players can still disable capes locally] + + settings.LocalLighting = true -- Enables local lighting; Prevents changes to Lighting and enables the ability for player specific lighting changes; Server scripts can set lighting for the server or specific players using _G.Adonis.SetLighting(property,value) or for players _G.Adonis.SetPlayerLighting(player,property,value) + settings.ReplicationLogs = false -- [May cause lag] Attempts to log who makes and deletes objects in the game + settings.NetworkOwners = false -- [May cause lag] Logs the first network owners of parts created in workspace; Can be used to see who made parts (only parts) in workspace + settings.Detection = true -- Attempts to detect certain known exploits + settings.CheckClients = true -- Checks clients every minute or two to make sure they are still active + + settings.AntiNil = true -- Try's to prevent non-admins from hiding in "nil" + settings.AntiSpeed = true -- Attempts to detect speed exploits + settings.AntiNoclip = true -- Attempts to detect noclipping and kills the player if found + settings.AntiParanoid = false -- Attempts to detect paranoid and kills the player if found + settings.AntiDeleteTool = false -- [May break guns] Attempts to block use of the delete tool and other building tools + settings.AntiDelete = false -- [May cause intense lag] You should enabled Filtering instead! Attempts to prevent deleting of objects in the game (may cause lag; Not recommended for complex games that constantly make/remove things; Should use Filtering instead...) + settings.AntiUnAnchor = false -- [May cause lag] Attempts to prevent the unanchoring of parts + settings.AntiLeak = false -- Attempts to prevent place downloading/saving; Do not use if game saves + settings.AntiBillboardImage = false -- Attempts to find billboard images and remove them; These are usually used to insert inappropriate images into the game + settings.AntiInsert = { -- Can cause lag; You should enabled Filtering instead! Class names blocked from being added to the game or new properties to set for them; Will alter properties if Action = "Change" or delete the object if Action = "Delete"; Add classes to alter/block + Enabled = false; -- If AntiInsert is enabled or not + Explosion = { -- The ClassName to look for; You can add new ClassNames by following the Format provided + Action = "None"; -- Can be set to "Change" to use the set properties or "Delete" to delete the object if it's added; Set to "None" to disable + Properties = { -- Properties to use if change is true; The default properties will basically nerf any explosions + BlastPressure = 0; + BlastRadius = 0; + DestroyJoinRadiusPercent = 0; + ExplosionType = "NoCraters"; + } + }; + Decal = { -- I included some common classnames to replace settings like AntiDecal, NerfExplosions, and AntiSound + Action = "None"; -- Set to "Delete" to prevent decals from being added + }; + Sound = { + Action = "None"; -- Set to "Delete" to prevent new sounds from being added (WARNING THIS IS ALL SOUNDS INCLDING SCRIPT MADE ONES) + }; + } + + --------------------- + -- END OF SETTINGS -- + --------------------- + + --// Setting descriptions used for the in-game settings editor; + + descs.HideScript = [[ Disable if your game saves; When the game starts the Adonis_Loader model will be hidden so other scripts cannot access the settings module ]] + descs.DataStore = [[ DataStore the script will use for saving data; Changing this will lose any saved data ]] + descs.DataStoreKey = [[ Key used to encode all datastore entries; Changing this will lose any saved data ]] + descs.DataStoreEnabled = [[ Disable if you don't want settings and admins to be saveable in-game; PlayerData will still save ]] + descs.Storage = [[ Where things like tools are stored ]] + + descs.Theme = [[ UI theme; ]] + descs.MobileTheme = [[ Theme to use on mobile devices; Mobile themes are optimized for smaller screens; Some GUIs are disabled ]] + + descs.Moderators = [[ Mods; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Admins = [[ Admins; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Owners = [[ Head Admins; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Creators = [[ Anyone to be identified as a place owner; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Banned = [[ List of people banned from the game; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Muted = [[ List of people muted; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Blacklist = [[ List of people banned from using admin; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Whitelist = [[ People who can join if whitelist enabled; Format: {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";} ]] + descs.Permissions = [[ Command permissions; Format: {"Command:NewLevel";} ]] + descs.MusicList = [[ List of songs to appear in the script; Format: {{Name = "somesong",ID = 1234567},{Name = "anotherone",ID = 1243562}} ]] + descs.CapeList = [[ List of capes; Format: {{Name = "somecape",Material = "Fabric",Color = "Bright yellow",ID = 12345567,Reflectance = 1},{etc more stuff here}} ]] + descs.CustomRanks = [[ List of custom AdminLevel ranks Format: {RankName = {"Username"; "Username:UserId"; UserId; "Group:GroupId:GroupRank"; "Group:GroupId"; "Item:ItemID";};} ]] + + descs.OnStartup = [[ List of commands ran at server start Format: {":notif TestNotif"} ]] + descs.OnJoin = [[ List of commands ran as player on join (ignores adminlevel) Format: {":cmds"} ]] + descs.OnSpawn = [[ List off commands ran as player on spawn (ignores adminlevel) Format: {"!fire Really red",":ff me"} ]] + + descs.SaveAdmins = [[ If true anyone you :mod, :admin, or :owner in-game will save; This does not apply to helpers as they are considered temporary ]] + descs.WhitelistEnabled = [[ If true enables the whitelist/server lock; Only lets admins & whitelisted users join ]] + + descs.Prefix = [[ The : in :kill me ]] + descs.PlayerPrefix = [[ The ! in !donate; Mainly used for commands that any player can run ]] + descs.SpecialPrefix = [[ Used for things like "all", "me" and "others" (If changed to ! you would do :kill !me) ]] + descs.SplitKey = [[ The space in :kill me (eg if you change it to / :kill me would be :kill/me) ]] + descs.BatchKey = [[ :kill me | :ff bob | :explode scel ]] + descs.ConsoleKeyCode = [[ Keybind to open the console ]] + + descs.HttpWait = [[ How long things that use the HttpService will wait before updating again ]] + descs.Trello_Enabled = [[ Are the Trello features enabled? ]] + descs.Trello_Primary = [[ Primary Trello board ]] + descs.Trello_Secondary = [[ Secondary Trello boards; Format: {"BoardID";"BoardID2","etc"} ]] + descs.Trello_AppKey = [[ Your Trello AppKey; Link: https://trello.com/app-key ]] + descs.Trello_Token = [[ Trello token (DON'T SHARE WITH ANYONE!); Link: https://trello.com/1/connect?name=Trello_API_Module&response_type=token&expires=never&scope=read,write&key=YOUR_APP_KEY_HERE ]] + + descs.G_API = [[ If true allows other server scripts to access certain functions described in the API module through _G.Adonis ]] + descs.G_Access = [[ If enabled allows other scripts to access Adonis using _G.Adonis.Access; Scripts will still be able to do things like _G.Adonis.CheckAdmin(player) ]] + descs.G_Access_Key = [[ Key required to use the _G access API; Example_Key will not work for obvious reasons ]] + descs.G_Access_Perms = [[ Access perms level ]] + descs.Allowed_API_Calls = [[ Allowed calls ]] + + descs.FunCommands = [[ Are fun commands enabled? ]] + descs.PlayerCommands = [[ Are players commands enabled? ]] + descs.ChatCommands = [[ If false you will not be able to run commands via the chat; Instead you MUST use the console or you will be unable to run commands ]] + + descs.BanMessage = [[ Message shown to banned users ]] + descs.LockMessage = [[ Message shown to people when they are kicked while the game is :slocked ]] + descs.SystemTitle = [[ Title to display in :sm ]] + + descs.CreatorPowers = [[ When true gives me place owner admin; This is strictly used for debugging; I can't debug without access to the script and specific owner commands ]] + descs.MaxLogs = [[ Maximum logs to save before deleting the oldest; Too high can lag the game ]] + descs.Notification = [[ Whether or not to show the "You're an admin" and "Updated" notifications ]] + descs.CodeExecution = [[ Enables the use of code execution in Adonis; Scripting related and a few other commands require this ]] + descs.SongHint = [[ Display a hint with the current song name and ID when a song is played via :music ]] + + descs.AutoClean = [[ Will auto clean service.Workspace of things like hats and tools ]] + descs.AutoCleanDelay = [[ Time between auto cleans ]] + + descs.CustomChat = [[ Custom chat ]] + descs.PlayerList = [[ Custom playerlist ]] + descs.Console = [[ Command console ]] + + descs.DonorCommands = [[ Show your support for the script and let donors use commands like !sparkles ]] + descs.DonorCapes = [[ Determines if donors have capes ]] + descs.LocalCapes = [[ Makes Donor capes local instead of removing them ]] + + descs.HelpSystem = [[ Allows players to call admins for help using !help ]] + descs.HelpButton = [[ Shows a little help button in the bottom right corner ]] + + descs.LocalLighting = [[ Enables local lighting; Prevents changes to Lighting and enables the ability for player specific lighting changes; Server scripts can set lighting for the server or specific players using _G.Adonis.SetLighting(property,value) or for players _G.Adonis.SetPlayerLighting(player,property,value) ]] + descs.ReplicationLogs = [[ Attempts to log who makes and deletes objects in the game ]] + descs.NetworkOwners = [[ Logs the first network owners of parts created in workspace; Can be used to see who made parts (only parts) in workspace ]] + descs.Detection = [[ Attempts to detect certain known exploits ]] + descs.CheckClients = [[ Checks clients every minute or two to make sure they are still active ]] + + descs.AntiNil = [[ Try's to prevent non-admins from hiding in "nil" ]] + descs.AntiSpeed = [[ Attempted to detect speed exploits ]] + descs.AntiNoclip = [[ Attempts to detect noclipping and kills the player if found ]] + descs.AntiParanoid = [[ Attempts to detect paranoid and kills the player if found ]] + descs.AntiDeleteTool = [[ Attempts to block use of the delete tool and other building tools ]] + descs.AntiDelete = [[ Can cause lag; You should enabled Filtering instead! Attempts to prevent deleting of objects in the game (may cause lag; Not recommended for complex games that constantly make/remove things; Should use Filtering instead...) ]] + descs.AntiUnAnchor = [[ Attempts to prevent the unanchoring of parts ]] + descs.AntiLeak = [[ Attempts to prevent place downloading/saving; Do not use if game saves ]] + descs.AntiBillboardImage = [[ Attempts to find billboard images and remove them; These are usually used to insert inappropriate images into the game ]] + descs.AntiInsert = [[ Can cause lag; You should enabled Filtering instead! Class names blocked from being added to the game or new properties to set for them; Will alter properties if Action = "Change" or delete the object if Action = "Delete"; Add classes to alter/block ]] + + order = { + "HideScript"; + "DataStore"; + "DataStoreKey"; + "DataStoreEnabled"; + "Storage"; + " "; + "Theme"; + "MobileTheme"; + " "; + "Moderators"; + "Admins"; + "Owners"; + "Creators"; + "Banned"; + "Muted"; + "Blacklist"; + "Whitelist"; + "MusicList"; + "CapeList"; + "CustomRanks"; + " "; + "OnStartup"; + "OnJoin"; + "OnSpawn"; + " "; + "SaveAdmins"; + "WhitelistEnabled"; + " "; + "Prefix"; + "PlayerPrefix"; + "SpecialPrefix"; + "SplitKey"; + "BatchKey"; + "ConsoleKeyCode"; + " "; + "HttpWait"; + "Trello_Enabled"; + "Trello_Primary"; + "Trello_Secondary"; + "Trello_AppKey"; + "Trello_Token"; + " "; + "G_API"; + "G_Access"; + "G_Access_Key"; + "G_Access_Perms"; + "Allowed_API_Calls"; + " "; + "FunCommands"; + "PlayerCommands"; + "ChatCommands"; + "CreatorPowers"; + "CodeExecution"; + " "; + "BanMessage"; + "LockMessage"; + "SystemTitle"; + " "; + "MaxLogs"; + "Notification"; + "SongHint"; + ""; + "AutoClean"; + "AutoCleanDelay"; + " "; + "CustomChat"; + "PlayerList"; + "Console"; + " "; + "HelpSystem"; + "HelpButton"; + " "; + "DonorCommands"; + "DonorCapes"; + "LocalCapes"; + " "; + "LocalLighting"; + "ReplicationLogs"; + "NetworkOwners"; + "Detection"; + "CheckClients"; + " "; + "AntiNil"; + "AntiSpeed"; + "AntiNoclip"; + "AntiParanoid"; + "AntiDeleteTool"; + "AntiDelete"; + "AntiUnAnchor"; + "AntiLeak"; + "AntiBillboardImage"; + "AntiInsert"; + } + +return {Settings = settings, Descriptions = descs, Order = order} diff --git a/src/assets/Adonis/Loader/Loader/Dropper.lua b/src/assets/Adonis/Loader/Loader/Dropper.lua new file mode 100644 index 0000000..b492bec --- /dev/null +++ b/src/assets/Adonis/Loader/Loader/Dropper.lua @@ -0,0 +1,9 @@ +--[[ + Clone and drop the loader so it can hide in nil. +--]] + +local loader = script.Parent.Loader:clone() +loader.Parent = script.Parent +loader.Name = "\0" +loader.Archivable = false +loader.Disabled = false \ No newline at end of file diff --git a/src/assets/Adonis/Loader/Loader/Loader.lua b/src/assets/Adonis/Loader/Loader/Loader.lua new file mode 100644 index 0000000..c404815 --- /dev/null +++ b/src/assets/Adonis/Loader/Loader/Loader.lua @@ -0,0 +1,119 @@ +--[[ + + CURRENT LOADER: + https://www.roblox.com/library/2373505175/Adonis-Loader-BETA + +--]] + + + + +---------------------------------------------------------------------------------------- +-- Adonis Loader -- +---------------------------------------------------------------------------------------- +-- Epix Incorporated. Not Everything is so Black and White. -- +---------------------------------------------------------------------------------------- +-- Edit settings in-game or using the settings module in the Config folder -- +---------------------------------------------------------------------------------------- +-- This is not designed to work in solo mode -- +---------------------------------------------------------------------------------------- + +if _G["__Adonis_MUTEX"] and type(_G["__Adonis_MUTEX"])=="string" then + warn("\n-----------------------------------------------" + .."\nAdonis is already running! Aborting..." + .."\nRunning Location: ".._G["__Adonis_MUTEX"] + .."\nThis Location: "..script:GetFullName() + .."\n-----------------------------------------------") + script:Destroy() +else + _G["__Adonis_MUTEX"] = script:GetFullName() + + local model = script.Parent.Parent + local config = model.Config + local core = model.Loader + + local dropper = core.Dropper + local loader = core.Loader + local runner = script + + local settings = config.Settings + local plugins = config.Plugins + local themes = config.Themes + + local backup = model:Clone() + local pEvent + + local data = { + Settings = {}; + Descriptions = {}; + ServerPlugins = {}; + ClientPlugins = {}; + Themes = {}; + + Model = model; + Config = config; + Core = core; + + Loader = loader; + Dopper = dropper; + Runner = runner; + + ModuleID = 2373501710; + LoaderID = 2373505175; + + DebugMode = false; + } + + --// Init + script:Destroy() + model.Name = math.random() + local moduleId = data.ModuleID + local a,setTab = pcall(require,settings) + if not a then + warn'::Adonis:: Settings module errored while loading; Using defaults;' + setTab = {} + end + data.Settings, data.Descriptions, data.Order = setTab.Settings,setTab.Descriptions,setTab.Order + for _,Plugin in next,plugins:GetChildren()do if Plugin.Name:sub(1,8)=="Client: " then table.insert(data.ClientPlugins,Plugin) elseif Plugin.Name:sub(1,8)=="Server: " then table.insert(data.ServerPlugins,Plugin) else warn("Unknown Plugin Type for "..tostring(Plugin)) end end + for _,Theme in next,themes:GetChildren()do table.insert(data.Themes,Theme) end + if data.DebugMode then moduleId = model.Parent.MainModule end + local module = require(moduleId) + local response = module(data) + if response == "SUCCESS" then + if (data.Settings and data.Settings.HideScript) and not data.DebugMode then + model.Parent = nil + game:BindToClose(function() model.Parent = game:GetService("ServerScriptService") model.Name = "Adonis_Loader" end) + end + model.Name = "Adonis_Loader" + else + error("MainModule failed to load") + end +end + + --[[ +--___________________________________________________________________________________________-- +--___________________________________________________________________________________________-- +--___________________________________________________________________________________________-- +--___________________________________________________________________________________________-- + + ___________ .__ .___ + \_ _____/_____ |__|__ ___ | | ____ ____ + | __)_\____ \| \ \/ / | |/ \_/ ___\ + | \ |_> > |> < | | | \ \___ + /_______ / __/|__/__/\_ \ |___|___| /\___ > /\ + \/|__| \/ \/ \/ \/ + -------------------------------------------------------- + Epix Incorporated. Not Everything is so Black and White. + -------------------------------------------------------- + +--___________________________________________________________________________________________-- +--___________________________________________________________________________________________-- +--___________________________________________________________________________________________-- +--___________________________________________________________________________________________-- + --]] + + + + + + diff --git a/src/assets/Adonis/Loader/ThumbnailCamera.rbxm b/src/assets/Adonis/Loader/ThumbnailCamera.rbxm new file mode 100644 index 0000000..31362e3 Binary files /dev/null and b/src/assets/Adonis/Loader/ThumbnailCamera.rbxm differ diff --git a/src/assets/Adonis/Server/Core/Admin.lua b/src/assets/Adonis/Server/Core/Admin.lua new file mode 100644 index 0000000..0ea0372 --- /dev/null +++ b/src/assets/Adonis/Server/Core/Admin.lua @@ -0,0 +1,749 @@ +server = nil +service = nil +cPcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Admin +return function() + local Functions, Admin, Anti, Core, HTTP, Logs, Remote, Process, Variables, Settings, Commands + local function Init() + Functions = server.Functions; + Admin = server.Admin; + Anti = server.Anti; + Core = server.Core; + HTTP = server.HTTP; + Logs = server.Logs; + Remote = server.Remote; + Process = server.Process; + Variables = server.Variables; + Settings = server.Settings; + Commands = server.Commands; + + Logs:AddLog("Script", "Admin Module Initialized") + end; + + service.MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player, id, purchased) + if Variables and player.Parent and id == 1348327 and purchased then + Variables.CachedDonors[tostring(player.UserId)] = tick() + end + end) + + server.Admin = { + Init = Init; + PrefixCache = {}; + CommandCache = {}; + SpecialLevels = {}; + GroupRanks = {}; + TempAdmins = {}; + BlankPrefix = false; + + GetTrueRank = function(p, group) + local localRank = Remote.LoadCode(p, [[return service.Player:GetRankInGroup(]]..group..[[)]], true) + if localRank and localRank > 0 then + return localRank + end + end; + + GetPlayerGroup = function(p, group) + local data = Core.GetPlayer(p) + local groups = data.Groups + local isID = type(group) == "number" + if groups then + for i,v in next,groups do + if (isID and group == v.Id) or (not isID and group == v.Name) then + return v + end + end + end + end; + + DoCheck = function(p, check) + local pType = type(p) + local cType = type(check) + if pType == "string" and cType == "string" then + if p == check or check:lower():sub(1,#tostring(p)) == p:lower() then + return true + end + elseif pType == "number" and (cType == "number" or tonumber(check)) then + if p == tonumber(check) then + return true + end + elseif cType == "number" then + if p.userId == check then + return true + end + elseif cType == "string" and pType == "userdata" and p:IsA("Player") then + local isGood = p and p.Parent == service.Players + if isGood and check:match("^Group:(.*):(.*)") then + local sGroup,sRank = check:match("^Group:(.*):(.*)") + local group,rank = tonumber(sGroup),tonumber(sRank) + if group and rank then + local pGroup = Admin.GetPlayerGroup(p, group) + if pGroup then + local pRank = pGroup.Rank + if pRank == rank or (rank < 0 and pRank >= math.abs(rank)) then + return true + end + end + end + elseif isGood and check:sub(1, 6) == "Group:" then --check:match("^Group:(.*)") then + local group = tonumber(check:match("^Group:(.*)")) + if group then + local pGroup = Admin.GetPlayerGroup(p, group) + if pGroup then + return true + end + end + elseif isGood and check:sub(1, 5) == "Item:" then --check:match("^Item:(.*)") then + local item = tonumber(check:match("^Item:(.*)")) + if item then + if service.MarketPlace:PlayerOwnsAsset(p, item) then + return true + end + end + elseif p and check:sub(1, 9) == "GamePass:" then --check:match("^GamePass:(.*)") then + local item = tonumber(check:match("^GamePass:(.*)")) + if item then + if service.MarketPlace:UserOwnsGamePassAsync(p.UserId, item) then + return true + end + end + elseif check:match("^(.*):(.*)") then + local player, sUserid = check:match("^(.*):(.*)") + local userid = tonumber(sUserid) + if player and userid and p.Name == player or p.userId == userid then + return true + end + elseif p.Name == check then + return true + end + elseif cType == "table" and pType == "userdata" and p and p:IsA("Player") then + if check.Group and check.Rank then + local rank = check.Rank + local pGroup = Admin.GetPlayerGroup(p, check.Group) + if pGroup then + local pRank = pGroup.Rank + if pRank == rank or (rank < 0 and pRank >= math.abs(rank)) then + return true + end + end + end + end + end; + + UpdateCachedLevel = function(p) + local data = Core.GetPlayer(p) + data.Groups = service.GroupService:GetGroupsAsync(p.UserId) or {} + data.AdminLevel = Admin.GetUpdatedLevel(p) + data.LastLevelUpdate = tick() + Logs.AddLog("Script", { + Text = "Updating cached level for ".. tostring(p); + Desc = "Updating the cached admin level for ".. tostring(p); + }) + return data.AdminLevel + end; + + LevelToList = function(lvl) + return ({ + [1] = Settings.Moderators; + [2] = Settings.Admins; + [3] = Settings.Owners; + [4] = Settings.Creators; + })[lvl] + end; + + LevelToListName = function(lvl) + return ({ + [0] = "Players"; + [1] = "Moderators"; + [2] = "Admins"; + [3] = "Owners"; + [4] = "Creators"; + })[lvl] + end; + + GetLevel = function(p) + local data = Core.GetPlayer(p) + local level = data.AdminLevel + local lastUpdate = data.LastLevelUpdate + local clients = Remote.Clients + + if clients[tostring(p.userId)] and not level or not lastUpdate or tick()-lastUpdate > 60 then + Admin.UpdateCachedLevel(p) + if level and data.AdminLevel and type(p) == "userdata" and p:IsA("Player") then + if data.AdminLevel < level then + Functions.Hint("Your admin level has been reduced to ".. data.AdminLevel .." ["..Admin.LevelToListName(data.AdminLevel) or "Unknown".."]", {p}) + elseif data.AdminLevel > level then + Functions.Hint("Your admin level has been increased to ".. data.AdminLevel .." ["..Admin.LevelToListName(data.AdminLevel) or "Unknown".."]", {p}) + end + end + end + + return data.AdminLevel or 0 + end; + + GetUpdatedLevel = function(p) + local checkTable = Admin.CheckTable + local doCheck = Admin.DoCheck + + if Admin.IsPlaceOwner(p) then + return 5 + end + + for ind,admin in next,Admin.SpecialLevels do + if doCheck(p,admin.Player) then + return admin.Level + end + end + + local levels = { + { --// Blacklist + Level = 0; + Tables = { + Settings.Blacklist; + HTTP.Trello.Blacklist; + }; + }; + --[[ + { --// Banlist + Level = -1; + Tables = { + Settings.Banned; + HTTP.Trello.Bans; + } + }; + --]] + { --// Creators + Level = 4; + Tables = { + Settings.Creators; + HTTP.Trello.Creators; + } + }; + + { --// Owners + Level = 3; + Tables = { + Settings.Owners; + HTTP.Trello.Owners; + } + }; + + { --// Admins + Level = 2; + Tables = { + Settings.Admins; + HTTP.Trello.Admins; + } + }; + + { --//Moderators + Level = 1; + Tables = { + Settings.Moderators; + HTTP.Trello.Moderators; + } + }; + } + + for i = 1,#levels do --service.CountTable(levels) do + local level = levels[i] + if level then + for ind,tab in next,level.Tables do + if checkTable(p,tab) then + return level.Level + end + end + end + end + + for i,v in next,Settings.CustomRanks do + if checkTable(p, v) then + return 0.5 + end + end + + return 0 + end; + + IsPlaceOwner = function(p) + if type(p) == "userdata" and p:IsA("Player") then + if game.CreatorType == Enum.CreatorType.User then + if p.userId == game.CreatorId then + return true + end + else + local group = Admin.GetPlayerGroup(p, game.CreatorId) + if p and p.Parent == service.Players and group and group.Rank == 255 then-- p:GetRankInGroup(game.CreatorId) == 255 then + return true + end + end + + if Core.DebugMode and p.userId == -1 then + return true + end + + if Settings.CreatorPowers then + for ind,id in next,{1237666,76328606,698712377} do --// These are my accounts; Lately I've been using my game dev account(698712377) more so I'm adding it so I can debug without having to sign out and back in (it's really a pain) + if p.userId == id then --// Disable CreatorPowers in settings if you don't trust me. It's not like I lose or gain anything either way. Just re-enable it BEFORE telling me there's an issue with the script so I can go to your place and test it. + return true + end + end + end + end + end; + + CheckAdmin = function(p) + local level = Admin.GetLevel(p) + if level>0 then + return true + else + return false + end + end; + + SetLevel = function(p,level) + local current = Admin.GetLevel(p) + local list = Admin.LevelToList(current) + if tonumber(level) then + if current>4 then + return false + else + Admin.SpecialLevels[tostring(p.userId)] = {Player = p.userId, Level = level} + end + elseif level == "Reset" then + Admin.SpecialLevels[tostring(p.userId)] = nil + end + Admin.UpdateCachedLevel(p) + end; + + IsTempAdmin = function(p) + for i,v in next,Admin.TempAdmins do + if Admin.DoCheck(p,v) then + return true,i + end + end + end; + + RemoveAdmin = function(p,temp,override) + local current = Admin.GetLevel(p) + local list = Admin.LevelToList(current) + local isTemp,tempInd = Admin.IsTempAdmin(p) + + if isTemp then + temp = true + table.remove(Admin.TempAdmins,tempInd) + end + + if override then + temp = false + end + + if type(p) == "userdata" then + Admin.SetLevel(p,0) + end + + local function doRemove(level,check) + if level == 1 then + Core.DoSave({ + Type = "TableRemove"; + Table = "Moderators"; + Value = check; + }) + elseif level == 2 then + if Settings.SaveAdmins then + Core.DoSave({ + Type = "TableRemove"; + Table = "Admins"; + Value = check; + }) + end + elseif level == 3 then + if Settings.SaveAdmins then + Core.DoSave({ + Type = "TableRemove"; + Table = "Owners"; + Value = check; + }) + end + elseif level == 4 then + if Settings.SaveAdmins then + Core.DoSave({ + Type = "TableRemove"; + Table = "Creators"; + Value = check; + }) + end + end + end + + local function removeFromTable(list,level) + for ind,check in pairs(list) do + if Admin.DoCheck(p,check) and not (type(check) == "string" and (check:match("^Group:") or check:match("^Item:"))) then + table.remove(list,ind) + if not temp and Settings.SaveAdmins then + doRemove(level,check) + end + end + end + end + + removeFromTable(Settings.Moderators,1) + removeFromTable(Settings.Admins,2) + removeFromTable(Settings.Owners,3) + removeFromTable(Settings.Creators,4) + Admin.UpdateCachedLevel(p) + end; + + AddAdmin = function(p,level,temp) + local current = Admin.GetLevel(p) + local list = Admin.LevelToList(current) + + Admin.RemoveAdmin(p,temp) + Admin.SetLevel(p,level) + if temp then table.insert(Admin.TempAdmins,p) end + + if list and type(list)=="table" then + local index,value + for ind,ent in pairs(list) do + if (type(ent)=="number" or type(ent)=="string") and (ent==p.userId or ent:lower()==p.Name:lower() or ent:lower()==(p.Name..":"..p.userId):lower()) then + index = ind + value = ent + end + end + if index and value then + table.remove(list,index) + end + end + + local value = p.Name..":"..p.userId + if level == 1 then + table.insert(Settings.Moderators,value) + if Settings.SaveAdmins and not temp then + Core.DoSave({ + Type = "TableAdd"; + Table = "Moderators"; + Value = value + }) + end + elseif level == 2 then + table.insert(Settings.Admins,value) + if Settings.SaveAdmins and not temp then + Core.DoSave({ + Type = "TableAdd"; + Table = "Admins"; + Value = value + }) + end + elseif level == 3 then + table.insert(Settings.Owners,value) + if Settings.SaveAdmins and not temp then + Core.DoSave({ + Type = "TableAdd"; + Table = "Owners"; + Value = value + }) + end + elseif level == 4 then + table.insert(Settings.Creators,value) + if Settings.SaveAdmins and not temp then + Core.DoSave({ + Type = "TableAdd"; + Table = "Creators"; + Value = value + }) + end + end + + Admin.UpdateCachedLevel(p) + end; + + CheckDonor = function(p) + --if not Settings.DonorPerks then return false end + local key = tostring(p.userId) + if Variables.CachedDonors[key] then + return true + else + if p.userId<0 or (tonumber(p.AccountAge) and tonumber(p.AccountAge)<0) then return false end + for ind,pass in next,Variables.DonorPass do + local ran,ret = pcall(function() return service.MarketPlace:UserOwnsGamePassAsync(p.UserId, pass) end) + if ran and ret then + Variables.CachedDonors[key] = os.time() + return true + end + end + --[[ + for ind,old in pairs(Variables.OldDonorList) do + if p.Name==old.Name or p.userId==old.Id then + Variables.CachedDonors[key] = tick() + return true + end + end + --]] + end + end; + + CheckBan = function(p) + local doCheck = Admin.DoCheck + -- check for bans in LINK + if Settings.Link_Enabled then + local server = Settings.Link_Server + local key = Settings.Link_WEBKEY + local link = HTTP.Link(server, key) + + return link.checkForBan(p.UserId) + end + for ind,admin in next,Settings.Banned do + if doCheck(p,admin) then + return true + end + end + + for ind,ban in next,Core.Variables.TimeBans do + if (p.UserId == ban.UserId) then + if ban.EndTime-os.time() <= 0 then + table.remove(Core.Variables.TimeBans, ind) + else + return true + end + end + end + + for ind,admin in next,HTTP.Trello.Bans do + if doCheck(p,admin) then + return true + end + end + end; + + AddBan = function(p, doSave) + table.insert(Settings.Banned, p.Name..':'..p.userId) + if doSave then + Core.DoSave({ + Type = "TableAdd"; + Table = "Banned"; + Value = p.Name..':'..p.UserId; + }) + end + if not service.Players:FindFirstChild(p.Name) then + Remote.Send(p,'Function','KillClient') + else + if p then pcall(function() p:Kick("You have been banned") end) end + end + end; + + RemoveBan = function(name, doSave) + local ret + for i,v in next,Settings.Banned do + if v:lower():sub(1,#name) == name:lower() or name:lower()=="all" then + table.remove(Settings.Banned, i) + ret = v + if doSave then + Core.DoSave({ + Type = "TableRemove"; + Table = "Banned"; + Value = v; + }) + end + end + end + return ret + end; + + SetPermission = function(cmd,newLevel) + local index,command = Admin.GetCommand(cmd) + if command and newLevel then + command.AdminLevel = newLevel + end + end; + + RunCommand = function(coma,...) + local ind,com = Admin.GetCommand(coma) + if com then + local cmdArgs = com.Args or com.Arguments + local args = Admin.GetArgs(coma,#cmdArgs,...) + --local task,ran,error = service.Threads.TimeoutRunTask("SERVER_COMMAND: "..coma,com.Function,60*5,false,args) + local ran, error = service.TrackTask("Command: ".. tostring(coma), com.Function, false, args) + if error then + --logError("SERVER","Command",error) + end + end + end; + + RunCommandAsPlayer = function(coma,plr,...) + local ind,com = Admin.GetCommand(coma) + if com then + local cmdArgs = com.Args or com.Arguments + local args = Admin.GetArgs(coma,#cmdArgs,...) + local ran, error = service.TrackTask(tostring(plr) ..": ".. coma, com.Function, plr, args) + --local task,ran,error = service.Threads.TimeoutRunTask("COMMAND:"..tostring(plr)..": "..coma,com.Function,60*5,plr,args) + if error then + --logError(plr,"Command",error) + error = error:match(":(.+)$") or "Unknown error" + Remote.MakeGui(plr,'Output',{Title = ''; Message = error; Color = Color3.new(1,0,0)}) + end + end + end; + + GetArgs = function(msg,num,...) + local args = Functions.Split((msg:match("^.-"..Settings.SplitKey..'(.+)') or ''),Settings.SplitKey,num) or {} + for i,v in next,{...} do table.insert(args,v) end + return args + end; + + CacheCommands = function() + local tempTable = {} + local tempPrefix = {} + for ind,data in next,Commands do + for i,cmd in next,data.Commands do + if data.Prefix == "" then Variables.BlankPrefix = true end + tempPrefix[data.Prefix] = true + tempTable[(data.Prefix..cmd):lower()] = ind + end + end + + Admin.PrefixCache = tempPrefix + Admin.CommandCache = tempTable + end; + + GetCommand = function(Command) + if Admin.PrefixCache[Command:sub(1,1)] or Variables.BlankPrefix then + local matched + if Command:find(Settings.SplitKey) then + matched = Command:match("^(%S+)"..Settings.SplitKey) + else + matched = Command:match("^(%S+)") + end + + if matched then + local found = Admin.CommandCache[matched:lower()] + if found then + local real = Commands[found] + if real then + return found,real,matched + end + end + end + end + end; + + FormatCommand = function(command) + local text = command.Prefix..command.Commands[1] + local cmdArgs = command.Args or command.Arguments + local splitter = Settings.SplitKey + + for ind,arg in next,cmdArgs do + text = text..splitter.."<"..arg..">" + end + + return text + end; + + CheckTable = function(p,tab) + local doCheck = Admin.DoCheck + for i,v in next,tab do + if doCheck(p,v) then + return true + end + end + end; + + IsComLevel = function(testLevel, comLevel) + --print("Checking", tostring(testLevel), tostring(comLevel)) + if testLevel == comLevel then + return true + elseif type(testLevel) == "table" then + for i,v in next,testLevel do + if i == comLevel or v == comLevel or (type(i) == "string" and type(comLevel) == "string" and i:lower() == comLevel:lower()) then + -- print("One Match") + return i,v + elseif type(comLevel) == "table" then + for k,m in ipairs(comLevel) do + if i == m or v == m or (type(i) == "string" and type(m) == "string" and i:lower() == m:lower()) then + --print("Found a match") + return i,v + end + end + end + end + elseif type(comLevel) == "string" then + return testLevel:lower() == comLevel:lower() + elseif type(comLevel) == "table" then + for i,v in ipairs(comLevel) do + if testLevel:lower() == v:lower() then + return true + end + end + end + + --print("No Match") + end; + + CheckPermission = function(pDat,cmd) + local allowed = false + local p = pDat.Player + local adminLevel = pDat.Level + local isAgent = pDat.isAgent + local isDonor = (pDat.isDonor and (Settings.DonorCommands or cmd.AllowDonors)) + local comLevel = cmd.AdminLevel + local funAllowed = Settings.FunCommands + local isComLevel = Admin.IsComLevel + + if adminLevel >= 4 then + return true + elseif cmd.Fun and not (funAllowed or adminLevel >= 4) then + return false + elseif cmd.Agents and isAgent then + return true + elseif Core.PanicMode and adminLevel >= 1 and (comLevel == "Helper" or comLevel == "Moderator" or comLevel == "Admin") then + return true + elseif (Settings.PlayerCommands or adminLevel >= 1) and isComLevel("Players", comLevel) then + return true + elseif isDonor and isComLevel("Donors", comLevel)then + return true + elseif adminLevel >= 1 and isComLevel("Moderators", comLevel) then + return true + elseif adminLevel >= 2 and isComLevel("Admins", comLevel) then + return true + elseif adminLevel >= 3 and isComLevel("Owners", comLevel) then + return true + elseif adminLevel >= 4 and isComLevel("Creators", comLevel) then + return true + elseif adminLevel > 0 and isComLevel(Settings.CustomRanks, comLevel) then + if adminLevel >= 1 then + return true + else + for i,v in next,Settings.CustomRanks do + if isComLevel(i, comLevel) and Admin.CheckTable(p, v) then + return true + end + end + end + end + + return false + end; + + SearchCommands = function(p,search) + local checkPerm = Admin.CheckPermission + local tab = {} + local pDat = { + Player = p; + Level = Admin.GetLevel(p); + isAgent = HTTP.Trello.CheckAgent(p); + isDonor = Admin.CheckDonor(p); + } + + for index,command in next,Commands do + if checkPerm(pDat, command) then + tab[index] = command + end + end + + return tab + end; + }; +end diff --git a/src/assets/Adonis/Server/Core/Anti.lua b/src/assets/Adonis/Server/Core/Anti.lua new file mode 100644 index 0000000..5197616 --- /dev/null +++ b/src/assets/Adonis/Server/Core/Anti.lua @@ -0,0 +1,193 @@ +server = nil +service = nil +cPcall = nil +Routine = nil +GetEnv = nil +origEnv = nil +logError = nil + +--// Anti-Exploit +return function() + local Functions, Admin, Anti, Core, HTTP, Logs, Remote, Process, Variables, Settings + local function Init() + Functions = server.Functions; + Admin = server.Admin; + Anti = server.Anti; + Core = server.Core; + HTTP = server.HTTP; + Logs = server.Logs; + Remote = server.Remote; + Process = server.Process; + Variables = server.Variables; + Settings = server.Settings; + + Logs:AddLog("Script", "AntiExploit Module Initialized") + end; + + server.Anti = { + Init = Init; + RemovePlayer = function(p, info) + info = info or "No Reason Given" + pcall(function() service.UnWrap(p):Kick(tostring(info)) end) + --pcall(function() Remote.Send(p,"Function","Kill") end) + wait(1) + pcall(p.Destroy, p) + pcall(service.Delete, p) + Logs.AddLog("Script",{ + Text = "Server removed "..tostring(p); + Desc = tostring(info); + }) + end; + + Sanitize = function(obj, classList) + if Anti.RLocked(obj) then + pcall(service.Delete, obj) + else + for i,child in next,obj:GetChildren() do + if Anti.RLocked(child) or Functions.IsClass(child, classList) then + pcall(service.Delete, child) + else + pcall(Anti.Sanitize, child, classList) + end + end + end + end; + + isFake = function(p) + if Anti.ObjRLocked(p) or not p:IsA("Player") then + return true,1 + else + local players = service.Players:GetChildren() + local found = 0 + + if service.NetworkServer then + local net = false + for i,v in pairs(service.NetworkServer:GetChildren()) do + if v:IsA("NetworkReplicator") and v:GetPlayer() == p then + net = true + end + end + if not net then + return true,1 + end + end + + for i,v in pairs(players) do + if tostring(v) == tostring(p) then + found = found+1 + end + end + + if found>1 then + return true,found + else + return false + end + end + end; + + RemoveIfFake = function(p) + local isFake + local ran,err = pcall(function() isFake = Anti.isFake(p) end) + if isFake or not ran then + Anti.RemovePlayer(p) + end + end; + + FindFakePlayers = function() + for i,v in pairs(service.Players:GetChildren()) do + if Anti.isFake(v) then + Anti.RemovePlayer(v, "Fake") + end + end + end; + + GetClassName = function(obj) + local testName = tostring(math.random()..math.random()) + local ran,err = pcall(function() + local test = obj[testName] + end) + if err then + local class = err:match(testName.." is not a valid member of (.*)") + if class then + return class + end + end + end; + + RLocked = function(obj) + return not pcall(function() return obj.GetFullName(obj) end) + --[[local ran,err = pcall(function() service.New("StringValue", obj):Destroy() end) + if ran then + return false + else + return true + end--]] + end; + + ObjRLocked = function(obj) + return not pcall(function() return obj.GetFullName(obj) end) + --[[local ran,err = pcall(function() obj.Parent = obj.Parent end) + if ran then + return false + else + return true + end--]] + end; + + AssignName = function() + local name = math.random(100000,999999) + return name + end; + + Detected = function(player,action,info) + if Core.DebugMode or service.RunService:IsStudio() then + warn("ANTI-EXPLOIT: "..player.Name.." "..action.." "..info) + elseif service.NetworkServer then + if player then + if action:lower() == 'kick' then + Anti.RemovePlayer(player, info) + --player:Kick("Adonis; Disconnected by server; \n"..tostring(info)) + elseif action:lower() == 'kill' then + player.Character:BreakJoints() + elseif action:lower() == 'crash' then + Remote.Send(player,'Function','Kill') + wait(5) + pcall(function() + local scr = Core.NewScript("LocalScript",[[while true do end]]) + scr.Parent = player.Backpack + scr.Disabled = false + end) + + Anti.RemovePlayer(player, info) + end + end + end + + Logs.AddLog(Logs.Script,{ + Text = "AE Detected "..tostring(player); + Desc = "The Anti-Exploit system detected strange activity from "..tostring(player); + }) + + Logs.AddLog(Logs.Exploit,{ + Text = "[Action: "..tostring(action).."] "..tostring(player); + Desc = tostring(info); + }) + end; + + CheckNameID = function(p) + if p.userId > 0 and p.userId ~= game.CreatorId and p.Character then + local realId = service.Players:GetUserIdFromNameAsync(p.Name) or p.userId + local realName = service.Players:GetNameFromUserIdAsync(p.userId) or p.Name + + if realName and realId then + if (tonumber(realId) and realId~=p.userId) or (tostring(realName)~="nil" and realName~=p.Name) then + Anti.Detected(p,'log','Name/UserId does not match') + end + + Remote.Send(p,"LaunchAnti","NameId",{RealID = realId; RealName = realName}) + end + end + end; + }; +end \ No newline at end of file diff --git a/src/assets/Adonis/Server/Core/Commands.lua b/src/assets/Adonis/Server/Core/Commands.lua new file mode 100644 index 0000000..f0907e7 --- /dev/null +++ b/src/assets/Adonis/Server/Core/Commands.lua @@ -0,0 +1,12075 @@ +server = nil +service = nil +cPcall = nil +Pcall = nil +Routine = nil +GetEnv = nil +logError = nil +sortedPairs = nil + +--// Commands +--// Highly recommended you disable Intellesense before editing this... +return function() + local Settings = server.Settings + local Functions, Admin, Anti, Core, HTTP, Logs, Remote, Process, Variables, Deps + local function Init() + Functions = server.Functions; + Admin = server.Admin; + Anti = server.Anti; + Core = server.Core; + HTTP = server.HTTP; + Logs = server.Logs; + Remote = server.Remote; + Process = server.Process; + Variables = server.Variables; + Deps = server.Deps + + Logs:AddLog("Script", "Commands Module Initialized") + end; + + server.Commands = { + Init = Init; + Sudo = { + Prefix = Settings.Prefix; + Commands = {"sudo"}; + Arguments = {"player", "command"}; + Description = "Runs a command as the target player(s)"; + AdminLevel = "Creators"; + Function = function(plr, args) + assert(args[1] and args[2], "Argument missing or nil"); + for i,v in next,Functions.GetPlayers(plr, args[1]) do + Process.Command(v, args[2], {isSystem = true}); + end + end; + }; + + ClearPlayerData = { + Prefix = Settings.Prefix; + Commands = {"clearplayerdata"}; + Arguments = {"userId"}; + Description = "Clears player data for target"; + AdminLevel = "Creators"; + Function = function(plr, args) + local id = tonumber(args[1]) or plr.UserId + Remote.PlayerData[id] = Core.DefaultData() + Remote.MakeGui(plr,"Notification",{ + Title = "Notification"; + Message = "Cleared data"; + Time = 10; + }) + end; + }; + + TrelloBan = { + Prefix = Settings.Prefix; + Commands = {"trelloban";}; + Args = {"player","reason"}; + Description = "Adds a user to the Trello ban list (Trello needs to be configured)"; + Hidden = false; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + local board = Settings.Trello_Primary + local appkey = Settings.Trello_AppKey + local token = Settings.Trello_Token + + if not Settings.Trello_Enabled or board == "" or appkey == "" or token == "" then server.Functions.Hint('Trello is not configured inside Adonis config, please configure Trello to be able to use this command.', {plr}) return end + + local trello = HTTP.Trello.API(appkey,token) + local lists = trello.getLists(board) + local list = trello.getListObj(lists,{"Banlist","Ban List","Bans"}) + + local level = Admin.GetLevel(plr) + for i,v in next,service.GetPlayers(plr,args[1],false,false,true) do + if level > Admin.GetLevel(v) then + trello.makeCard(list.id,tostring(v)..":".. tostring(v.UserId), + "Administrator: " .. tostring(plr) .. + "\nReason: ".. args[2] or "N/A") + -- Due to trello onEvents, this may be redundant. + --HTTP.Trello.Update() + Functions.Hint("Trello banned ".. tostring(v),{plr}) + end + end + end; + }; + + TestError = { + Hidden = true; + Prefix = ":"; + Commands = {"testerror","debugtest"}; + Args = {"type","msg"}; + Description = "Test Error"; + AdminLevel = "Creators"; + Function = function(plr,args) + --assert(args[1] and args[2],"Argument missing or nil") + Remote.Send(plr, "TestError") + Routine(function() plr.Bobobobobobobo.Hi = 1 end) + if not args[1] then + error("This is an intentional test error") + elseif args[1]:lower() == "error" then + error(args[2]) + elseif args[1]:lower() == "assert" then + assert(false,args[2]) + end + end; + }; + + TestGet = { + Prefix = ":"; + Commands = {"testget"}; + Args = {}; + Description = "Test Error"; + Hidden = true; + AdminLevel = "Creators"; + Function = function(plr,args) + local tack = tick() + print(tack) + print(Remote.Get(plr,"Test")) + local tab = { + { + Children = { + {Class = "sdfhasdfjkasjdf"} + }; + {{Something = "hi"}}; + } + } + + local m, ret = Remote.Get(plr, "Test", tab) + if ret then + print(ret) + for i,v in next, ret do + print(i,v) + for i,v in next,v do + print(i,v) + for i,v in next,v do + print(i,v) + for i,v in next,v do + print(i,v) + end + end + end + end + end + + print(tick()-tack) + print("TESTING EVENT") + Remote.MakeGui(plr,"Settings",{ + IsOwner = true + }) + local testColor = Remote.GetGui(plr,"ColorPicker",{Color = Color3.new(1,1,1)}) + print(testColor) + local ans,event = Remote.GetGui(plr,"YesNoPrompt",{ + Question = "Is this a test question?"; + }), Remote.NewPlayerEvent(plr,"TestEvent",function(...) + print("EVENT WAS FIRED; WE GOT:") + print(...) + print("THAT'D BE ALL") + end) + print("PLAYER ANSWER: "..tostring(ans)) + wait(0.5) + print("SENDING REMOTE EVENT TEST") + Remote.Send(plr,"TestEvent","TestEvent","hi mom I went thru the interwebs") + print("SENT") + end; + }; + + DebugLoadstring = { + Prefix = ":"; + Commands = {"debugloadstring";}; + Args = {"code";}; + Description = "DEBUG LOADSTRING"; + Hidden = true; + NoFilter = true; + Fun = false; + AdminLevel = "Creators"; + Function = function(plr,args) + --error("Disabled", 0) + local func,err = Core.Loadstring(args[1],GetEnv()) + if func then + func() + else + logError("DEBUG",err) + Functions.Hint(err,{plr}) + end + end + }; + + Terminal = { + Prefix = ":"; + Commands = {"terminal";"console";}; + Args = {}; + Hidden = true; + Description = "Opens the the terminal"; + AdminLevel = "Creators"; + Function = function(plr,args) + Remote.MakeGui(plr,"Terminal") + end + }; + + Tasks = { + Hidden = true; + Prefix = ":"; + Commands = {"tasks"}; + Args = {"player"}; + Description = "Displays running tasks"; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[1] then + for i,v in next,Functions.GetPlayers(plr, args[1]) do + local temp = {} + local cTasks = Remote.Get(v, "TaskManager", "GetTasks") or {} + + table.insert(temp,{ + Text = "Client Tasks", + Desc = "Tasks their client is performing"}) + + for k,t in next,cTasks do + table.insert(temp, { + Text = tostring(v.Function).. "- Status: "..v.Status.." - Elapsed: ".. v.CurrentTime - v.Created, + Desc = v.Name; + }) + end + + Remote.MakeGui(plr,"List",{ + Title = v.Name.."'s Tasks", + Table = temp, + Font = "Code", + Update = "ShowTasks", + UpdateArgs = {v}, + AutoUpdate = 1, + Size = {500,400}, + }) + end + else + local temp = {} + local tasks = service.GetTasks() + local cTasks = Remote.Get(plr,"TaskManager","GetTasks") or {} + + table.insert(temp,{Text = "Server Tasks",Desc = "Tasks the server is performing"}) + + for i,v in next,tasks do + table.insert(temp,{ + Text = tostring(v.Function).." - Status: "..v.Status.." - Elapsed: "..(os.time()-v.Created), + Desc = v.Name + }) + end + + table.insert(temp," ") + table.insert(temp,{ + Text = "Client Tasks", + Desc = "Tasks your client is performing" + }) + + for i,v in pairs(cTasks) do + table.insert(temp,{ + Text = tostring(v.Function).." - Status: "..v.Status.." - Elapsed: "..(v.CurrentTime-v.Created), + Desc = v.Name + }) + end + + Remote.MakeGui(plr,"List",{ + Title = "Tasks", + Table = temp, + Font = "Code", + Update = "ShowTasks", + AutoUpdate = 1, + Size = {500, 400}, + }) + end + end + }; + --[[ + TaskManager = { --// Unfinished + Prefix = Settings.Prefix; + Commands = {"taskmgr","taskmanager"}; + Args = {}; + Description = "Task manager"; + Hidden = true; + AdminLevel = "Creators"; + Function = function(plr,args) + Remote.MakeGui(plr,"TaskManager",{}) + end + }; + --]] + CommandBox = { + Prefix = Settings.Prefix; + Commands = {"cmdbox", "commandbox"}; + Args = {}; + Description = "Command Box"; + AdminLevel = "Moderators"; + Function = function(plr,args) + Remote.MakeGui(plr, "Window", { + Title = "Command Box"; + Name = "CommandBox"; + Size = {300,250}; + Ready = true; + Content = { + { + Class = "TextBox"; + Name = "ComText"; + Size = UDim2.new(1, -10, 1, -40); + Text = ""; + BackgroundTransparency = 0.5; + PlaceholderText = "Enter commands here"; + TextYAlignment = "Top"; + MultiLine = true; + ClearTextOnFocus = false; + TextChanged = Core.Bytecode[[ + if not Object.TextFits then + Object.TextYAlignment = "Bottom" + else + Object.TextYAlignment = "Top" + end + ]] + }; + { + Class = "TextButton"; + Name = "Execute"; + Size = UDim2.new(1, -10, 0, 35); + Position = UDim2.new(0, 5, 1, -40); + Text = "Execute"; + OnClick = Core.Bytecode[[ + local textBox = Object.Parent:FindFirstChild("ComText") + if textBox then + client.Remote.Send("ProcessCommand", textBox.Text) + end + ]] + }; + } + }) + end; + }; + + ViewCommands = { + Prefix = Settings.Prefix; + Commands = {"cmds","commands","cmdlist"}; + Args = {}; + Description = "Shows you a list of commands"; + AdminLevel = "Players"; + Function = function(plr,args) + local commands = Admin.SearchCommands(plr,"all") + local tab = {} + local cStr + + for i,v in next,commands do + if not v.Hidden then + if type(v.AdminLevel) == "table" then + cStr = "" + for k,m in ipairs(v.AdminLevel) do + cStr = cStr..m..", " + end + else + cStr = tostring(v.AdminLevel) + end + + table.insert(tab, { + Text = Admin.FormatCommand(v), + Desc = "["..cStr.."] "..v.Description, + Filter = v.AdminLevel + }) + end + end + + Remote.MakeGui(plr,"List", + { + Title = "Commands"; + Table = tab; + } + ) + end + }; + + Prefix = { + Prefix = "!"; + Commands = {"example";}; + Args = {}; + Description = "Shows you the command prefix using the :cmds command"; + AdminLevel = "Players"; + Function = function(plr,args) + Functions.Hint('"'..Settings.Prefix..'cmds"',{plr}) + end + }; + + Repeat = { + Prefix = Settings.Prefix; + Commands = {"repeat";"loop";}; + Args = {"amount";"interval";"command";}; + Description = "Repeats for of times every seconds; Amount cannot exceed 50"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local amount = tonumber(args[1]) + local timer = tonumber(args[2]) + if timer<=0 then timer=0.1 end + if amount>50 then amount=50 end + local command = args[3] + local name = plr.Name:lower() + Variables.CommandLoops[name..command] = true + Functions.Hint("Running "..command.." "..amount.." times every "..timer.." seconds.",{plr}) + for i = 1,amount do + if not Variables.CommandLoops[name..command] then break end + Process.Command(plr,command,{Check = false;}) + wait(timer) + end + Variables.CommandLoops[name..command] = nil + end + }; + + Abort = { + Prefix = Settings.Prefix; + Commands = {"abort";"stoploop";"unloop";"unrepeat";}; + Args = {"username";"command";}; + Description = "Aborts a looped command. Must supply name of player who started the loop or \"me\" if it was you, or \"all\" for all loops. :abort sceleratis :kill bob or :abort all"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local name = args[1]:lower() + if name=="me" then + Variables.CommandLoops[plr.Name:lower()..args[2]] = nil + elseif name=="all" then + for i,v in pairs(server.CommandLoops) do + Variables.CommandLoops[i] = nil + end + elseif args[2] then + Variables.CommandLoops[name..args[2]] = nil + end + end + }; + + TempModerator = { + Prefix = Settings.Prefix; + Commands = {"admin","tempadmin","ta","temp","helper";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) a temporary moderator; Does not save"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + local sendLevel = Admin.GetLevel(plr) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local targLevel = Admin.GetLevel(v) + if sendLevel>targLevel then + Admin.AddAdmin(v,1,true) + Remote.MakeGui(v,"Notification",{ + Title = "Notification"; + Message = "You are an administrator. Click to view commands."; + Time = 10; + OnClick = Core.Bytecode("client.Remote.Send('ProcessCommand','"..Settings.Prefix.."cmds')"); + }) + Functions.Hint(v.Name..' is now a temp moderator',{plr}) + else + Functions.Hint(v.Name.." is the same admin level as you or higher",{plr}) + end + end + end + }; + + Moderator = { + Prefix = Settings.Prefix; + Commands = {"mod";"moderator"}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) a moderator; Saves"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + local sendLevel = Admin.GetLevel(plr) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local targLevel = Admin.GetLevel(v) + if sendLevel>targLevel then + Admin.AddAdmin(v,1) + Remote.MakeGui(v,"Notification",{ + Title = "Notification"; + Message = "You are an administrator. Click to view commands."; + Time = 10; + OnClick = Core.Bytecode("client.Remote.Send('ProcessCommand','"..Settings.Prefix.."cmds')"); + }) + Functions.Hint(v.Name..' is now a moderator',{plr}) + else + Functions.Hint(v.Name.." is the same admin level as you or higher",{plr}) + end + end + end + }; + + Admin = { + Prefix = Settings.Prefix; + Commands = {"permadmin","pa","padmin","fulladmin","realadmin"}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) an admin; Saves"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + local sendLevel = Admin.GetLevel(plr) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local targLevel = Admin.GetLevel(v) + if sendLevel>targLevel then + Admin.AddAdmin(v,2) + Remote.MakeGui(v,"Notification",{ + Title = "Notification"; + Message = "You are an administrator. Click to view commands."; + Time = 10; + OnClick = Core.Bytecode("client.Remote.Send('ProcessCommand','"..Settings.Prefix.."cmds')"); + }) + Functions.Hint(v.Name..' is now an admin',{plr}) + else + Functions.Hint(v.Name.." is the same admin level as you or higher",{plr}) + end + end + end + }; + + Owner = { + Prefix = Settings.Prefix; + Commands = {"owner","oa","headadmin"}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) an owner; Saves"; + Fun = false; + AdminLevel = "Creators"; + Function = function(plr,args) + local sendLevel = Admin.GetLevel(plr) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local targLevel = Admin.GetLevel(v) + if sendLevel>targLevel then + Admin.AddAdmin(v,3) + Remote.MakeGui(v,"Notification",{ + Title = "Notification"; + Message = "You are an administrator. Click to view commands."; + Time = 10; + OnClick = Core.Bytecode("client.Remote.Send('ProcessCommand','"..Settings.Prefix.."cmds')"); + }) + Functions.Hint(v.Name..' is now an owner',{plr}) + else + Functions.Hint(v.Name.." is the same admin level as you or higher",{plr}) + end + end + end + }; + + UnAdmin = { + Prefix = Settings.Prefix; + Commands = {"unadmin";"unmod","unowner","unhelper","unpadmin","unpa";"unoa";"unta";}; + Args = {"player";}; + Hidden = false; + Description = "Removes the target players' admin powers; Saves"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + + local sendLevel = Admin.GetLevel(plr) + local plrs = service.GetPlayers(plr, args[1], true) + if plrs and #plrs>0 then + for i,v in next,plrs do + local targLevel = Admin.GetLevel(v) + if targLevel>0 then + if sendLevel>targLevel then + Admin.RemoveAdmin(v,false,true) + Functions.Hint("Removed "..v.Name.."'s admin powers",{plr}) + else + Functions.Hint("You do not have permission to remove "..v.Name.."'s admin powers",{plr}) + end + else + Functions.Hint(v.Name..' is not an admin',{plr}) + end + end + else + local targLevel = Admin.GetUpdatedLevel(args[1]) + if targLevel then + if sendLevel > targLevel then + local ans = Remote.GetGui(plr,"YesNoPrompt",{ + Question = "Unadmin all saved admins matching '"..tostring(args[1]).."'?"; + }) + if ans == "Yes" then + Admin.RemoveAdmin(args[1]) + Functions.Hint("Removed "..args[1].."'s admin powers",{plr}) + end + else + Functions.Hint("You do not have permission to remove "..args[1].."'s admin powers",{plr}) + end + else + Functions.Hint("No level returned for "..args[1]) + end + end + end + }; + + TempUnAdmin = { + Prefix = Settings.Prefix; + Commands = {"tempunadmin","untempadmin","tunadmin","untadmin"}; + Args = {"player";}; + Hidden = false; + Description = "Removes the target players' admin powers for this server; Does not save"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + + local sendLevel = Admin.GetLevel(plr) + local plrs = service.GetPlayers(plr, args[1], true) + if plrs and #plrs>0 then + for i,v in pairs(plrs) do + local targLevel = Admin.GetLevel(v) + if targLevel>0 then + if sendLevel>targLevel then + Admin.RemoveAdmin(v,true) + Functions.Hint("Removed "..v.Name.."'s admin powers",{plr}) + else + Functions.Hint("You do not have permission to remove "..v.Name.."'s admin powers",{plr}) + end + else + Functions.Hint(v.Name..' is not an admin',{plr}) + end + end + end + end + }; + + CustomRank = { + Prefix = Settings.Prefix; + Commands = {"customrank","ca","crank"}; + Args = {"player";"rankName"}; + Hidden = false; + Description = "Adds the player to a custom rank set in settings.CustomRanks; Does not save"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + + local rank = args[2] + local customRank = Settings.CustomRanks[rank] + + assert(customRank,"Rank not found!") + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Functions.Hint("Added "..v.Name.." to "..rank,{plr}) + table.insert(customRank,v.Name..":"..v.userId) + end + end + }; + + UnCustomRank = { + Prefix = Settings.Prefix; + Commands = {"uncustomrank","unca","uncrank"}; + Args = {"player";"rankName"}; + Hidden = false; + Description = "Removes the player from a custom rank set in settings.CustomRanks; Does not save"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + + local rank = args[2] + local customRank = Settings.CustomRanks[rank] + + assert(customRank,"Rank not found!") + + service.Iterate(customRank,function(i,v) + if v:lower():sub(1,#args[1]) == args[1]:lower() then + table.remove(customRank,i) + Functions.Hint("Removed "..v.Name.." from "..rank,{plr}) + end + end) + end + }; + + CustomRanks = { + Prefix = Settings.Prefix; + Commands = {"customranks","cranks"}; + Args = {}; + Hidden = false; + Description = "Shows custom ranks"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + local tab = {} + service.Iterate(Settings.CustomRanks,function(rank,tab) + table.insert(tab,{Text = rank, Desc = rank}) + end) + Remote.MakeGui(plr,"List",{Title = "Custom Ranks";Table = tab}) + end + }; + + Kick = { + Prefix = Settings.Prefix; + Commands = {"kick";}; + Args = {"player";"optional reason";}; + Filter = true; + Description = "Disconnects the target player from the server"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local plrLevel = Admin.GetLevel(plr) + for i,v in pairs(service.GetPlayers(plr,args[1],false,false,true)) do + local targLevel = Admin.GetLevel(v) + if plrLevel>targLevel then + if not service.Players:FindFirstChild(v.Name) then + Remote.Send(v,'Function','Kill') + else + v:Kick(args[2]) + end + Functions.Hint("Kicked "..tostring(v),{plr}) + end + end + end + }; + --[[ + DataBan = { + Prefix = Settings.Prefix; + Commands = {"databan";"permban";"gameban"}; + Args = {"player";}; + Hidden = false; + Description = "Data persistent ban the target player(s); Undone using :undataban"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1],false,false,true)) do + if not Admin.CheckAdmin(v) then + local ans = Remote.GetGui(plr,"YesNoPrompt",{ + Question = "Are you sure you want to ban "..v.Name + }) + + if ans == "Yes" then + local PlayerData = Core.GetPlayer(v) + PlayerData.Banned = true + v:Kick("You have been banned") + Functions.Hint("Data Banned "..tostring(v),{plr}) + end + else + error(v.Name.." is currently an admin. Unadmin them before trying to perm ban them (this is so you don't accidentally ban an admin)") + end + end + end + }; + --]] + --[[ + UnDataBan = { + Prefix = Settings.Prefix; + Commands = {"undataban";"undban";"untban";"unpermban";}; + Args = {"userid";}; + Hidden = false; + Description = "Removes any data persistence bans (timeban or permban)"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + + local userId = tonumber(args[1]) + assert(userId,tostring(userId).." is not a valid user ID") + local PlayerData = Core.GetData(tostring(userId)) + assert(PlayerData,"No saved data found for "..userId) + PlayerData.TimeBan = false + PlayerData.Banned = false + Core.SaveData(tostring(userId),PlayerData) + Functions.Hint("Removed data ban for "..userId,{plr}) + end + }; + --]] + TimeBan = { + Prefix = Settings.Prefix; + Commands = {"tban";"timedban";"timeban";}; + Args = {"player";"number";}; + Hidden = false; + Description = "Bans the target player(s) for the supplied amount of time; Data Persistent; Undone using :undataban"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + local time = args[2] or '60' + assert(args[1] and args[2], "Argument missing or nil") + if time:lower():sub(#time)=='s' then + time = time:sub(1,#time-1) + elseif time:lower():sub(#time)=='m' then + time = time:sub(1,#time-1) + time = tonumber(time)*60 + elseif time:lower():sub(#time)=='h' then + time = time:sub(1,#time-1) + time = (tonumber(time)*60)*60 + elseif time:lower():sub(#time)=='d' then + time = time:sub(1,#time-1) + time = ((tonumber(time:sub(1,#time-1))*60)*60)*24 + end + + for i,v in next,service.GetPlayers(plr, args[1], false, false, true) do + local endTime = tonumber(os.time())+tonumber(time) + local timebans = Core.Variables.TimeBans + local data = { + Name = v.Name; + UserId = v.UserId; + EndTime = endTime; + } + + table.insert(timebans, data) + Core.DoSave({ + Type = "TableAdd"; + Table = "TimeBans"; + Parent = "Variables"; + Value = data; + }) + + v:Kick("Banned until "..endTime) + Functions.Hint("Banned "..v.Name.." for "..time,{plr}) + end + end + }; + + UnTimeBan = { + Prefix = Settings.Prefix; + Commands = {"untimeban";}; + Args = {"player";}; + Hidden = false; + Description = "UnBan"; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + assert(args[1], "Argument missing or nil") + local timebans = Core.Variables.TimeBans or {} + for i, data in next, timebans do + if data.Name:lower():sub(1,#args[1]) == args[1]:lower() then + table.remove(timebans, i) + Core.DoSave({ + Type = "TableRemove"; + Table = "TimeBans"; + Parent = "Variables"; + Value = data; + }) + Functions.Hint(tostring(data.Name)..' has been Unbanned',{plr}) + end + end + end + }; + + TimeBanList = { + Prefix = Settings.Prefix; + Commands = {"timebanlist";"timebanned";"timebans";}; + Args = {}; + Description = "Shows you the list of time banned users"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local tab = {} + local variables = Core.Variables + local timeBans = Core.Variables.TimeBans or {} + for i,v in next,timeBans do + local timeLeft = v.EndTime-os.time() + local minutes = Functions.RoundToPlace(timeLeft/60, 2) + if timeLeft <= 0 then + table.remove(Core.Variables.TimeBans, i) + else + table.insert(tab,{Text = tostring(v.Name)..":"..tostring(v.UserId),Desc = "Minutes Left: "..tostring(minutes)}) + end + end + Remote.MakeGui(plr,"List",{Title = 'Time Bans', Tab = tab}) + end + }; + + Ban = { + Prefix = Settings.Prefix; + Commands = {"ban";}; + Args = {"player";}; + Description = "Bans the player from the server"; + AdminLevel = "Admins"; + Function = function(plr,args) + local level = Admin.GetLevel(plr) + for i,v in next,service.GetPlayers(plr,args[1],false,false,true) do + if level > Admin.GetLevel(v) then + Admin.AddBan(v) + Functions.Hint("Server banned "..tostring(v),{plr}) + end + end + end + }; + + UnBan = { + Prefix = Settings.Prefix; + Commands = {"unban";}; + Args = {"player";}; + Description = "UnBan"; + AdminLevel = "Admins"; + Function = function(plr,args) + local ret = Admin.RemoveBan(args[1]) + if ret then + Functions.Hint(tostring(ret)..' has been Unbanned',{plr}) + end + end + }; + + GameBan = { + Prefix = Settings.Prefix; + Commands = {"gameban", "saveban", "databan"}; + Args = {"player";}; + Description = "Bans the player from the game (Saves)"; + AdminLevel = "Owners"; + Function = function(plr,args) + local level = Admin.GetLevel(plr) + for i,v in next,service.GetPlayers(plr,args[1],false,false,true) do + if level > Admin.GetLevel(v) then + Admin.AddBan(v, true) + Functions.Hint("Server banned "..tostring(v),{plr}) + end + end + end + }; + + UnGameBan = { + Prefix = Settings.Prefix; + Commands = {"ungameban", "saveunban", "undataban"}; + Args = {"player";}; + Description = "UnBans the player from game (Saves)"; + AdminLevel = "Owners"; + Function = function(plr,args) + local ret = Admin.RemoveBan(args[1], true) + if ret then + Functions.Hint(tostring(ret)..' has been Unbanned',{plr}) + end + end + }; + + Dizzy = { + Prefix = Settings.Prefix; + Commands = {"dizzy";}; + Args = {"player","speed"}; + Description = "Causes motion sickness"; + AdminLevel = "Admins"; + Function = function(plr,args) + local speed = args[2] or 50 + if not speed or not tonumber(speed) then + speed = 1000 + end + for i,v in next,service.GetPlayers(plr,args[1]) do + Remote.Send(v,"Function","Dizzy",tonumber(speed)) + end + end + }; + + UnDizzy = { + Prefix = Settings.Prefix; + Commands = {"undizzy";}; + Args = {"player"}; + Description = "UnDizzy"; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.Send(v,"Function","Dizzy",false) + end + end + }; + + SetFPS = { + Prefix = Settings.Prefix; + Commands = {"setfps";}; + Args = {"player";"fps";}; + Hidden = false; + Description = "Sets the target players's FPS"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + assert(tonumber(args[2]),tostring(args[2]).." is not a valid number") + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.Send(v,"Function","SetFPS",tonumber(args[2])) + end + end + }; + + RestoreFPS = { + Prefix = Settings.Prefix; + Commands = {"restorefps";"revertfps";"unsetfps";}; + Args = {"player";}; + Hidden = false; + Description = "Restores the target players's FPS"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.Send(v,"Function","RestoreFPS") + end + end + }; + + Crash = { + Prefix = Settings.Prefix; + Commands = {"crash";}; + Args = {"player";}; + Hidden = false; + Description = "Crashes the target player(s)"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1],false,false,true)) do + if Admin.GetLevel(plr)>Admin.GetLevel(v) then + Remote.Send(v,'Function','Crash') + end + end + end + }; + + HardCrash = { + Prefix = Settings.Prefix; + Commands = {"hardcrash";}; + Args = {"player";}; + Hidden = false; + Description = "Hard crashes the target player(s)"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1],false,false,true)) do + if Admin.GetLevel(plr)>Admin.GetLevel(v) then + Remote.Send(v,'Function','HardCrash') + end + end + end + }; + + RAMCrash = { + Prefix = Settings.Prefix; + Commands = {"ramcrash";"memcrash"}; + Args = {"player";}; + Hidden = false; + Description = "Crashes the target player(s)"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1],false,false,true)) do + if Admin.GetLevel(plr)>Admin.GetLevel(v) then + Remote.Send(v,'Function','RAMCrash') + end + end + end + }; + + GPUCrash = { + Prefix = Settings.Prefix; + Commands = {"gpucrash";}; + Args = {"player";}; + Hidden = false; + Description = "Crashes the target player(s)"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1],false,false,true)) do + if Admin.GetLevel(plr)>Admin.GetLevel(v) then + Remote.Send(v,'Function','GPUCrash') + end + end + end + }; + + Shutdown = { + Prefix = Settings.Prefix; + Commands = {"shutdown"}; + Args = {"reason"}; + Description = "Shuts the server down"; + PanicMode = true; + Filter = true; + AdminLevel = "Admins"; + Function = function(plr,args) + if not Core.PanicMode then + local logs = Core.GetData("ShutdownLogs") or {} + if plr then + table.insert(logs,1,{User = plr.Name, Time = service.GetTime(), Reason = args[1] or "N/A"}) + else + table.insert(logs,1,{User = "Server/Trello", Time = service.GetTime(), Reason = args[1] or "N/A"}) + end + if #logs>1000 then + table.remove(logs,#logs) + end + Core.SaveData("ShutdownLogs",logs) + end + Functions.Shutdown(args[1]) + end + }; + + --[[FullShutdown = { + Prefix = Settings.Prefix; + Commands = {"fullshutdown"}; + Args = {"reason"}; + Description = "Initiates a shutdown for every running game server"; + PanicMode = true; + AdminLevel = "Owners"; + Function = function(plr,args) + if not Core.PanicMode then + local logs = Core.GetData("ShutdownLogs") or {} + if plr then + table.insert(logs,1,{User=plr.Name,Time=service.GetTime(),Reason=args[2] or "N/A"}) + else + table.insert(logs,1,{User="Server/Trello",Time=service.GetTime(),Reason=args[2] or "N/A"}) + end + if #logs>1000 then + table.remove(logs,#logs) + end + Core.SaveData("ShutdownLogs",logs) + end + + Core.SaveData("FullShutdown", {ID = game.PlaceId; User = tostring(plr or "Server"); Reason = args[2]}) + end + };--]] + + ShutdownLogs = { + Prefix = Settings.Prefix; + Commands = {"shutdownlogs";"shutdownlog";"slogs";"shutdowns";}; + Args = {}; + Hidden = false; + Description = "Shows who shutdown a server and when"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + local logs = Core.GetData("ShutdownLogs") or {} + local tab={} + for i,v in pairs(logs) do + table.insert(tab,1,{Text=v.Time..": "..v.User,Desc="Reason: "..v.Reason}) + end + Remote.MakeGui(plr,"List",{Title = "Shutdown Logs",Table = tab,Update = "shutdownlogs"}) + end + }; + + ServerLock = { + Prefix = Settings.Prefix; + Commands = {"slock","serverlock"}; + Args = {"on/off"}; + Hidden = false; + Description = "Enables/disables server lock"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + if not args[1] or (args[1] and (args[1]:lower() == "on" or args[1]:lower() == "true")) then + Variables.ServerLock = true + Functions.Hint("Server Locked",{plr}) + elseif args[1]:lower() == "off" or args[1]:lower() == "false" then + Variables.ServerLock = false + Functions.Hint("Server Unlocked",{plr}) + end + end + }; + + Whitelist = { + Prefix = Settings.Prefix; + Commands = {"wl","enablewhitelist","whitelist"}; + Args = {"on/off or add/remove","optional player"}; + Hidden = false; + Description = "Enables/disables the whitelist; :wl username to add them to the whitelist"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + if args[1]:lower()=='on' or args[1]:lower()=='enable' then + Variables.Whitelist.Enabled = true + Functions.Hint("Server Whitelisted", service.Players:GetChildren()) + elseif args[1]:lower()=='off' or args[1]:lower()=='disable' then + Variables.Whitelist.Enabled = false + Functions.Hint("Server Unwhitelisted", service.Players:GetChildren()) + elseif args[1]:lower()=="add" then + if args[2] then + local plrs = service.GetPlayers(plr,args[2],true) + if #plrs>0 then + for i,v in pairs(plrs) do + table.insert(Variables.Whitelist.List,v.Name..":"..v.userId) + Functions.Hint("Whitelisted "..v.Name,{plr}) + end + else + table.insert(Variables.Whitelist.List,args[2]) + end + else + error('Missing name to whitelist') + end + elseif args[1]:lower()=="remove" then + if args[2] then + for i,v in pairs(Variables.Whitelist.List) do + if v:lower():sub(1,#args[2]) == args[2]:lower() then + table.remove(Variables.Whitelist.List,i) + Functions.Hint("Removed "..tostring(v).." from the whitelist",{plr}) + end + end + else + error("Missing name to remove from whitelist") + end + else + error("Invalid action; (on/off/add/remove)") + end + end + }; + + Notif = { + Prefix = Settings.Prefix; + Commands = {"setmessage";"notif";"setmsg";}; + Args = {"message OR off";}; + Filter = true; + Description = "Set message"; + AdminLevel = "Admins"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + + if args[1] == "off" or args[1] == "false" then + Variables.NotifMessage = nil + for i,v in pairs(service.GetPlayers()) do + Remote.RemoveGui(v,"Notif") + end + else + Variables.NotifMessage = args[1] --service.LaxFilter(args[1],plr) --// Command processor handles arg filtering + for i,v in pairs(service.GetPlayers()) do + Remote.MakeGui(v,"Notif",{ + Message = Variables.NotifMessage; + }) + end + end + end + }; + + SetBanMessage = { + Prefix = Settings.Prefix; + Commands = {"setbanmessage";"setbmsg"}; + Args = {"message";}; + Filter = true; + Description = "Sets the ban message banned players see"; + AdminLevel = "Admins"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + Variables.BanMessage = args[1] + end + }; + + SetLockMessage = { + Prefix = Settings.Prefix; + Commands = {"setlockmessage";"setlmsg"}; + Args = {"message";}; + Filter = true; + Description = "Sets the lock message unwhitelisted players see if :whitelist or :slock is on"; + AdminLevel = "Admins"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + Variables.LockMessage = args[1] + end + }; + + Notepad = { + Prefix = Settings.PlayerPrefix; + Commands = {"notepad","stickynote"}; + Args = {}; + Description = "Opens a textbox window for you to type into"; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,"Window",{ + Name = "Notepad"; + Title = "Notepad"; + CanvasSize = UDim2.new(0,0,10,0); + Ready = true; + --Menu = { + -- { + -- Class = "TextButton"; + -- Size = UDim2.new(0,50,1,0); + -- Text = "File"; + -- }; + --}; + + Content = { + + { + Class = "TextBox"; + Size = UDim2.new(1,-5,1,0); + Position = UDim2.new(0,0,0,0); + BackgroundColor3 = Color3.new(1,1,1); + TextColor3 = Color3.new(0,0,0); + Font = "Code"; + FontSize = "Size18"; + TextXAlignment = "Left"; + TextYAlignment = "Top"; + TextWrapped = true; + TextScaled = false; + ClearTextOnFocus = false; + MultiLine = true; + Text = ""; + }; + } + }) + end + }; + + Notification = { + Prefix = Settings.Prefix; + Commands = {"notify","notification"}; + Args = {"player","message"}; + Description = "Sends the player a notification"; + Filter = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.MakeGui(v,"Notification",{ + Title = "Notification"; + Message = service.Filter(args[2],plr,v); + }) + end + end + }; + + Countdown = { + Prefix = Settings.Prefix; + Commands = {"countdown", "timer", "cd"}; + Args = {"time";}; + Description = "Countdown"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local num = tonumber(args[1]) --math.min(tonumber(args[1]),120) + if not args[1] then error("Argument 1 missing") end + for i,v in next,service.GetPlayers() do + Remote.MakeGui(v, "Countdown", { + Time = num; + }) + end + --for i = num, 1, -1 do + --Functions.Message("Countdown", tostring(i), service.Players:children(), false, 1.1) + --Functions.Message(" ", i, false, service.Players:children(), 0.8) + --wait(1) + --end + end + }; + + CountdownPM = { + Prefix = Settings.Prefix; + Commands = {"countdownpm", "timerpm", "cdpm"}; + Args = {"player";"time";}; + Description = "Countdown on a target player(s) screen."; + AdminLevel = "Moderators"; + Function = function(plr,args) + local num = tonumber(args[2]) --math.min(tonumber(args[1]),120) + assert(args[1] and args[2],"Argument missing or nil") + for i,v in pairs(service.GetPlayers(plr, args[1])) do + Remote.MakeGui(v, "Countdown", { + Time = num; + }) + end + end + }; + + HintCountdown = { + Prefix = Settings.Prefix; + Commands = {"hcountdown";"hc";}; + Args = {"time";}; + Description = "Hint Countdown"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local num = math.min(tonumber(args[1]),120) + for i = num, 1, -1 do + Functions.Hint(i, service.Players:children(),2.5) + wait(1) + end + end + }; + + TimeMessage = { + Prefix = Settings.Prefix; + Commands = {"tm";"timem";"timedmessage";}; + Args = {"time";"message";}; + Filter = true; + Description = "Make a message and makes it stay for the amount of time (in seconds) you supply"; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2] and tonumber(args[1]),"Argument missing or invalid") + for i,v in pairs(service.Players:GetChildren()) do + Remote.RemoveGui(v,"Message") + Remote.MakeGui(v,"Message",{ + Title = "Message from " .. plr.Name; + Message = args[2]; + Time = tonumber(args[1]); + }) + end + end + }; + + Message = { + Prefix = Settings.Prefix; + Commands = {"m";"message";}; + Args = {"message";}; + Filter = true; + Description = "Makes a message"; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + for i,v in next,service.Players:GetChildren() do + Remote.RemoveGui(v,"Message") + Remote.MakeGui(v,"Message",{ + Title = "Message from " .. plr.Name; + Message = args[1];--service.Filter(args[1],plr,v); + Scroll = true; + Time = (#tostring(args[1])/19)+2.5; + }) + end + end + }; + + SystemMessage = { + Prefix = Settings.Prefix; + Commands = {"sm";"systemmessage";}; + Args = {"message";}; + Filter = true; + Description = "Same as message but says SYSTEM MESSAGE instead of your name, or whatever system message title is server to..."; + AdminLevel = "Admins"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + for i,v in pairs(service.Players:GetChildren()) do + Remote.RemoveGui(v,"Message") + Remote.MakeGui(v,"Message",{ + Title = Settings.SystemTitle; + Message = args[1]; --service.Filter(args[1],plr,v); + }) + end + end + }; + + MessagePM = { + Prefix = Settings.Prefix; + Commands = {"mpm";"messagepm";}; + Args = {"player";"message";}; + Filter = true; + Description = "Makes a message on the target player(s) screen."; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Functions.Message("Message from "..plr.Name,service.Filter(args[2],plr,v),{v}) + end + end + }; + + Notify = { + Prefix = Settings.Prefix; + Commands = {"n","smallmessage","nmessage","nmsg","smsg","smessage"}; + Args = {"message";}; + Filter = true; + Description = "Makes a small message"; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + for i,v in pairs(service.Players:GetChildren()) do + Remote.RemoveGui(v,"Notify") + Remote.MakeGui(v,"Notify",{ + Title = "Message from " .. plr.Name; + Message = service.Filter(args[1],plr,v); + }) + end + end + }; + + NotifyPM = { + Prefix = Settings.Prefix; + Commands = {"npm","smallmessagepm","nmessagepm","nmsgpm","npmmsg","smsgpm","spmmsg", "smessagepm"}; + Args = {"player";"message";}; + Filter = true; + Description = "Makes a small message on the target player(s) screen."; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + for i,v in pairs(service.GetPlayers(plr, args[1])) do + Remote.RemoveGui(v,"Notify") + Remote.MakeGui(v,"Notify",{ + Title = "Message from " .. plr.Name; + Message = service.Filter(args[2],plr,v); + }) + end + end + }; + + Hint = { + Prefix = Settings.Prefix; + Commands = {"h";"hint";}; + Args = {"message";}; + Filter = true; + Description = "Makes a hint"; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + for i,v in pairs(service.Players:GetChildren()) do + Remote.MakeGui(v,"Hint",{ + Message = tostring(plr or "")..": "..service.Filter(args[1],plr,v); + }) + end + end + }; + + Warn = { + Prefix = Settings.Prefix; + Commands = {"warn","warning"}; + Args = {"player","message";}; + Filter = true; + Description = "Warns players"; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + local plrLevel = Admin.GetLevel(plr) + for i,v in next,service.GetPlayers(plr,args[1]) do + local targLevel = Admin.GetLevel(v) + if plrLevel>targLevel then + local data = Core.GetPlayer(v) + table.insert(data.Warnings, {From = tostring(plr), Message = args[2], Time = os.time()}) + Remote.RemoveGui(v,"Notify") + Remote.MakeGui(v,"Notify",{ + Title = "Warning from "..tostring(plr); + Message = args[2]; + }) + + if plr and type(plr) == "userdata" then + Remote.MakeGui(plr,"Hint",{ + Message = "Warned "..tostring(v); + }) + end + end + end + end + }; + + KickWarn = { + Prefix = Settings.Prefix; + Commands = {"kickwarn","kwarn","kickwarning"}; + Args = {"player","message";}; + Filter = true; + Description = "Warns & kicks a player"; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + local plrLevel = Admin.GetLevel(plr) + for i,v in next,service.GetPlayers(plr,args[1]) do + local targLevel = Admin.GetLevel(v) + if plrLevel>targLevel then + local data = Core.GetPlayer(v) + table.insert(data.Warnings, {From = tostring(plr), Message = args[2], Time = os.time()}) + v:Kick(tostring("[Warning from "..tostring(plr).."]\n"..args[2])) + Remote.RemoveGui(v,"Notify") + Remote.MakeGui(v,"Notify",{ + Title = "Warning from "..tostring(plr); + Message = args[2]; + }) + + if plr and type(plr) == "userdata" then + Remote.MakeGui(plr,"Hint",{ + Message = "Warned "..tostring(v); + }) + end + end + end + end + }; + + ShowWarnings = { + Prefix = Settings.Prefix; + Commands = {"warnings","showwarnings"}; + Args = {"player"}; + Description = "Shows warnings a player has"; + AdminLevel = "Moderators"; + Function = function(plr, args) + assert(args[1], "Argument missing or nil") + for i,v in next,service.GetPlayers(plr,args[1]) do + local data = Core.GetPlayer(v) + local tab = {} + + if data.Warnings then + for k,m in next,data.Warnings do + table.insert(tab,{Text = "["..k.."] "..m.Message,Desc = "Given by: "..m.From.."; "..m.Message}) + end + end + + Remote.MakeGui(plr, "List", { + Title = v.Name; + Table = tab; + }) + end + end + }; + + ClearWarnings = { + Prefix = Settings.Prefix; + Commands = {"clearwarnings"}; + Args = {"player"}; + Description = "Clears any warnings on a player"; + AdminLevel = "Moderators"; + Function = function(plr, args) + assert(args[1], "Argument missing or nil") + for i,v in next,service.GetPlayers(plr,args[1]) do + local data = Core.GetPlayer(v) + data.Warnings = {} + if plr and type(plr) == "userdata" then + Remote.MakeGui(plr,"Hint",{ + Message = "Cleared warnings for "..tostring(v); + }) + end + end + end + }; + + NumPlayers = { + Prefix = Settings.Prefix; + Commands = {"pnum","numplayers","howmanyplayers"}; + Args = {}; + Description = "Tells you how many players are in the server"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local num = 0 + local nilNum = 0 + for i,v in pairs(service.GetPlayers()) do + if v.Parent ~= service.Players then + nilNum = nilNum+1 + end + + num = num+1 + end + + if nilNum > 0 then + Functions.Hint("There are currently "..tostring(num).." players; "..tostring(nilNum).." are nil or loading",{plr}) + else + Functions.Hint("There are "..tostring(num).." players",{plr}) + end + end + }; + + ClientTab = { + Prefix = Settings.PlayerPrefix; + Commands = {"client";"clientsettings","playersettings"}; + Args = {}; + Hidden = false; + Description = "Opens the client settings panel"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,"UserPanel",{Tab = "Client"}) + end + }; + + Donate = { + Prefix = Settings.PlayerPrefix; + Commands = {"donate";"change";"changecape";"donorperks";}; + Args = {}; + Hidden = false; + Description = "Opens the donation panel"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,"UserPanel",{Tab = "Donate"}) + end + }; + + DonorUncape = { + Prefix = Settings.PlayerPrefix; + Commands = {"uncape";"removedonorcape";}; + Args = {}; + Hidden = false; + Description = "Remove donor cape"; + Fun = false; + AllowDonors = true; + AdminLevel = "Donors"; + Function = function(plr,args) + Functions.UnCape(plr) + end + }; + + DonorCape = { + Prefix = Settings.PlayerPrefix; + Commands = {"cape";"donorcape";}; + Args = {}; + Hidden = false; + Description = "Get donor cape"; + Fun = false; + AllowDonors = true; + AdminLevel = "Donors"; + Function = function(plr,args) + Functions.Donor(plr) + end + }; + + DonorShirt = { + Prefix = Settings.PlayerPrefix; + Commands = {"shirt";"giveshirt";}; + Args = {"ID";}; + Hidden = false; + Description = "Give you the shirt that belongs to "; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local image = Functions.GetTexture(args[1]) + if image then + if plr.Character and image then + for g,k in pairs(plr.Character:children()) do + if k:IsA("Shirt") then k:Destroy() end + end + service.New('Shirt',plr.Character).ShirtTemplate="http://www.roblox.com/asset/?id="..image + end + else + for g,k in pairs(plr.Character:children()) do + if k:IsA("Shirt") then k:Destroy() end + end + end + end + }; + + DonorPants = { + Prefix = Settings.PlayerPrefix; + Commands = {"pants";"givepants";}; + Args = {"id";}; + Hidden = false; + Description = "Give you the pants that belongs to "; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local image = Functions.GetTexture(args[1]) + if image then + if plr.Character and image then + for g,k in pairs(plr.Character:children()) do + if k:IsA("Pants") then k:Destroy() end + end + service.New('Pants',plr.Character).PantsTemplate="http://www.roblox.com/asset/?id="..image + end + else + for g,k in pairs(plr.Character:children()) do + if k:IsA("Pants") then k:Destroy() end + end + end + end + }; + + DonorFace = { + Prefix = Settings.PlayerPrefix; + Commands = {"face";"giveface";}; + Args = {"id";}; + Hidden = false; + Description = "Gives you the face that belongs to "; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + if plr.Character and plr.Character:findFirstChild("Head") and plr.Character.Head:findFirstChild("face") then + plr.Character.Head:findFirstChild("face"):Destroy() + end + + local id = tonumber(args[1]) + local market = service.MarketPlace + local info = market:GetProductInfo(id) + if info.AssetTypeId == 18 or info.AssetTypeId == 9 then + service.Insert(args[1]).Parent = plr.Character:FindFirstChild("Head") + else + error("Invalid face ID") + end + end + }; + + DonorNeon = { + Prefix = Settings.PlayerPrefix; + Commands = {"neon";}; + Args = {"color";}; + Hidden = false; + Description = "Changes your body material to neon and makes you the (optional) color of your choosing."; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + if plr.Character then + for k,p in pairs(plr.Character:children()) do + if p:IsA("Part") then + if args[1] then + local str = BrickColor.new('Institutional white').Color + local teststr = args[1] + if BrickColor.new(teststr) ~= nil then str = BrickColor.new(teststr) end + p.BrickColor = str + end + p.Material = "Neon" + end + end + end + end + }; + + DonorFire = { + Prefix = Settings.PlayerPrefix; + Commands = {"fire";"donorfire";}; + Args = {"color (optional)";}; + Hidden = false; + Description = "Gives you fire with the specified color (if you specify one)"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + if torso then + local color = Color3.new(1,1,1) + local secondary = Color3.new(1,0,0) + if args[1] then + local str = BrickColor.new('Cyan').Color + local teststr = args[1] + + if BrickColor.new(teststr) ~= nil then + str = BrickColor.new(teststr).Color + end + + color = str + secondary = str + end + + Functions.RemoveParticle(torso,"DONOR_FIRE") + Functions.NewParticle(torso,"Fire",{ + Name = "DONOR_FIRE"; + Color = color; + SecondaryColor = secondary; + }) + Functions.RemoveParticle(torso,"DONOR_FIRE_LIGHT") + Functions.NewParticle(torso,"PointLight",{ + Name = "DONOR_FIRE_LIGHT"; + Color = color; + Range = 15; + Brightness = 5; + }) + end + end + }; + + DonorSparkles = { + Prefix = Settings.PlayerPrefix; + Commands = {"sparkles";"donorsparkles";}; + Args = {"color (optional)";}; + Hidden = false; + Description = "Gives you sparkles with the specified color (if you specify one)"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + if torso then + local color = Color3.new(1,1,1) + if args[1] then + local str = BrickColor.new('Bright orange').Color + local teststr = args[1] + + if BrickColor.new(teststr) ~= nil then + str = BrickColor.new(teststr).Color + end + + color = str + end + + Functions.RemoveParticle(torso,"DONOR_SPARKLES") + Functions.RemoveParticle(torso,"DONOR_SPARKLES_LIGHT") + Functions.NewParticle(torso,"Sparkles",{ + Name = "DONOR_SPARKLES"; + SparkleColor = color; + }) + + Functions.NewParticle(torso,"PointLight",{ + Name = "DONOR_SPARKLES_LIGHT"; + Color = color; + Range = 15; + Brightness = 5; + }) + end + end + }; + + DonorLight = { + Prefix = Settings.PlayerPrefix; + Commands = {"light";"donorlight";}; + Args = {"color (optional)";}; + Hidden = false; + Description = "Gives you a PointLight with the specified color (if you specify one)"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + if torso then + local color = Color3.new(1,1,1) + if args[1] then + local str = BrickColor.new('Cyan').Color + local teststr = args[1] + + if BrickColor.new(teststr) ~= nil then + str = BrickColor.new(teststr).Color + end + + color = str + end + + Functions.RemoveParticle(torso,"DONOR_LIGHT") + Functions.NewParticle(torso,"PointLight",{ + Name = "DONOR_LIGHT"; + Color = color; + Range = 15; + Brightness = 5; + }) + end + end + }; + + DonorParticle = { + Prefix = Settings.PlayerPrefix; + Commands = {"particle";}; + Args = {"textureid";"startColor3";"endColor3";}; + Hidden = false; + Description = "Put a custom particle emitter on your character"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + if torso then + local startColor = {} + local endColor = {} + + if args[2] then + for s in args[2]:gmatch("[%d]+")do + table.insert(startColor,tonumber(s)) + end + end + if args[3] then--276138620 :) + for s in args[3]:gmatch("[%d]+")do + table.insert(endColor,tonumber(s)) + end + end + + local startc = Color3.new(1,1,1) + local endc = Color3.new(1,1,1) + if #startColor==3 then + startc = Color3.new(startColor[1],startColor[2],startColor[3]) + end + if #endColor==3 then + endc = Color3.new(endColor[1],endColor[2],endColor[3]) + end + + Functions.RemoveParticle(torso,"DONOR_PARTICLE") + Functions.NewParticle(torso,"ParticleEmitter",{ + Name = "DONOR_PARTICLE"; + Texture = 'rbxassetid://'..args[1]; --Functions.GetTexture(args[1]); + Size = NumberSequence.new({ + NumberSequenceKeypoint.new(0,0); + NumberSequenceKeypoint.new(.1,.25,.25); + NumberSequenceKeypoint.new(1,.5); + }); + Transparency = NumberSequence.new({ + NumberSequenceKeypoint.new(0,1); + NumberSequenceKeypoint.new(.1,.25,.25); + NumberSequenceKeypoint.new(.9,.5,.25); + NumberSequenceKeypoint.new(1,1); + }); + Lifetime = NumberRange.new(5); + Speed = NumberRange.new(.5,1); + Rotation = NumberRange.new(0,359); + RotSpeed = NumberRange.new(-90,90); + Rate = 11; + VelocitySpread = 180; + Color = ColorSequence.new(startc,endc); + }) + end + end + }; + + DonorUnparticle = { + Prefix = Settings.PlayerPrefix; + Commands = {"unparticle";"removeparticles";}; + Args = {}; + Hidden = false; + Description = "Removes donor particles on you"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + Functions.RemoveParticle(torso,"DONOR_PARTICLE") + end + }; + + DonorUnfire = { + Prefix = Settings.PlayerPrefix; + Commands = {"unfire";"undonorfire";}; + Args = {}; + Hidden = false; + Description = "Removes donor fire on you"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + Functions.RemoveParticle(torso,"DONOR_FIRE") + Functions.RemoveParticle(torso,"DONOR_FIRE_LIGHT") + end + }; + + DonorUnsparkles = { + Prefix = Settings.PlayerPrefix; + Commands = {"unsparkles";"undonorsparkles";}; + Args = {}; + Hidden = false; + Description = "Removes donor sparkles on you"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + Functions.RemoveParticle(torso,"DONOR_SPARKLES") + Functions.RemoveParticle(torso,"DONOR_SPARKLES_LIGHT") + end + }; + + DonorUnlight = { + Prefix = Settings.PlayerPrefix; + Commands = {"unlight";"undonorlight";}; + Args = {}; + Hidden = false; + Description = "Removes donor light on you"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local torso = plr.Character:FindFirstChild("HumanoidRootPart") + Functions.RemoveParticle(torso,"DONOR_LIGHT") + end + }; + + DonorHat = { + Prefix = Settings.PlayerPrefix; + Commands = {"hat";"gethat";}; + Args = {"ID";}; + Hidden = false; + Description = "Gives you the hat specified by "; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + local id = tonumber(args[1]) + local hats = 0 + for i,v in pairs(plr.Character:GetChildren()) do if v:IsA("Accoutrement") then hats = hats+1 end end + if id and hats<15 then + local market = service.MarketPlace + local info = market:GetProductInfo(id) + if info.AssetTypeId == 8 or (info.AssetTypeId >= 41 and info.AssetTypeId <= 47) then + local hat = service.Insert(id) + assert(hat,"Invalid ID") + local banned = { + Script = true; + LocalScript = true; + Tool = true; + HopperBin = true; + ModuleScript = true; + RemoteFunction = true; + RemoteEvent = true; + BindableEvent = true; + Folder = true; + RocketPropulsion = true; + Explosion = true; + } + + local removeScripts; removeScripts = function(obj) + for i,v in pairs(obj:GetChildren()) do + pcall(function() + removeScripts(v) + if banned[v.ClassName] then + v:Destroy() + end + end) + end + end + + removeScripts(hat) + hat.Parent = plr.Character + hat.Changed:connect(function() + if hat.Parent ~= plr.Character then + hat:Destroy() + end + end) + end + end + end + }; + + DonorRemoveHats = { + Prefix = Settings.PlayerPrefix; + Commands = {"removehats";"nohats";}; + Args = {}; + Hidden = false; + Description = "Removes any hats you are currently wearing"; + Fun = false; + AdminLevel = "Donors"; + Function = function(plr,args) + for i,v in pairs(plr.Character:children()) do + if v:IsA("Accoutrement") then + v:Destroy() + end + end + end + }; + + Keybinds = { + Prefix = Settings.PlayerPrefix; + Commands = {"keybinds";"binds";"bind";"keybind";"clearbinds";"removebind";}; + Args = {}; + Hidden = false; + Description = "Opens the keybind manager"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,"UserPanel",{Tab = "KeyBinds"}) + end + }; + + MakeTalk = { + Prefix = Settings.Prefix; + Commands = {"talk";"maketalk";}; + Args = {"player";"message";}; + Filter = true; + Description = "Makes a dialog bubble appear over the target player(s) head with the desired message"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local message = args[2] + for i,p in pairs(service.GetPlayers(plr, args[1])) do + service.ChatService:Chat(p.Character.Head,message,Enum.ChatColor.Blue) + end + end + }; + + ChatNotify = { + Prefix = Settings.Prefix; + Commands = {"chatnotify";"chatmsg";}; + Args = {"player";"message";}; + Filter = true; + Description = "Makes a message in the target player(s)'s chat window"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in next,service.GetPlayers(plr,args[1]) do + Remote.Send(v,"Function","ChatMessage",service.Filter(args[2],plr,v),Color3.new(1,64/255,77/255)) + end + end + }; + + ForceField = { + Prefix = Settings.Prefix; + Commands = {"ff";"forcefield";}; + Args = {"player";}; + Description = "Gives a force field to the target player(s)"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character then service.New("ForceField", v.Character) end + end + end + }; + + UnForcefield = { + Prefix = Settings.Prefix; + Commands = {"unff";"unforcefield";}; + Args = {"player";}; + Description = "Removes force fields on the target player(s)"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + if v.Character then + for z, cl in pairs(v.Character:children()) do if cl:IsA("ForceField") then cl:Destroy() end end + end + end) + end + end + }; + + Punish = { + Prefix = Settings.Prefix; + Commands = {"punish";}; + Args = {"player";}; + Description = "Removes the target player(s)'s character"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character then + v.Character.Parent = service.UnWrap(Settings.Storage); + end + end + end + }; + + UnPunish = { + Prefix = Settings.Prefix; + Commands = {"unpunish";}; + Args = {"player";}; + Description = "UnPunishes the target player(s)"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + v.Character.Parent = service.Workspace + v.Character:MakeJoints() + end + end + }; + + IceFreeze = { + Prefix = Settings.Prefix; + Commands = {"ice";"iceage","icefreeze","funfreeze"}; + Args = {"player";}; + Description = "Freezes the target player(s) in a block of ice"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + if v.Character and v.Character:findFirstChild("HumanoidRootPart") then + for a, obj in pairs(v.Character:children()) do + if obj:IsA("BasePart") and obj.Name~="HumanoidRootPart" then obj.Anchored = true end + end + local ice=service.New("Part",v.Character) + ice.BrickColor=BrickColor.new("Steel blue") + ice.Material="Ice" + ice.Name="Adonis_Ice" + ice.Anchored=true + --ice.CanCollide=false + ice.TopSurface="Smooth" + ice.BottomSurface="Smooth" + ice.FormFactor="Custom" + ice.Size=Vector3.new(5, 6, 5) + ice.Transparency=0.3 + ice.CFrame=v.Character.HumanoidRootPart.CFrame + end + end) + end + end + }; + + Freeze = { + Prefix = Settings.Prefix; + Commands = {"freeze"}; + Args = {"player";}; + Description = "Freezes the target player(s)"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + if v.Character then + for a, obj in pairs(v.Character:children()) do + if obj:IsA("BasePart") and obj.Name~="HumanoidRootPart" then obj.Anchored = true end + end + end + end) + end + end + }; + + Thaw = { + Prefix = Settings.Prefix; + Commands = {"thaw";"unfreeze";"unice"}; + Args = {"player";}; + Description = "UnFreezes the target players, thaws them out"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + if v.Character and v.Character:findFirstChild("HumanoidRootPart") then + local ice = v.Character:FindFirstChild("Adonis_Ice") + local plate + if ice then + plate = service.New("Part",v.Character) + local mesh = service.New("CylinderMesh",plate) + plate.FormFactor = "Custom" + plate.TopSurface = "Smooth" + plate.BottomSurface = "Smooth" + plate.Size = Vector3.new(0.2,0.2,0.2) + plate.BrickColor = BrickColor.new("Steel blue") + plate.Name = "[EISS] Water" + plate.Anchored = true + plate.CanCollide = false + plate.CFrame = v.Character.HumanoidRootPart.CFrame*CFrame.new(0,-3,0) + plate.Transparency = ice.Transparency + + for i = 0.2,3,0.2 do + ice.Size = Vector3.new(5,ice.Size.Y-i,5) + ice.CFrame = v.Character.HumanoidRootPart.CFrame*CFrame.new(0,-i,0) + plate.Size = Vector3.new(i+5,0.2,i+5) + wait() + end + ice:Destroy() + end + + for a, obj in pairs(v.Character:children()) do + if obj:IsA("BasePart") and obj.Name~="HumanoidRootPart" and obj~=plate then obj.Anchored = false end + end + wait(3) + pcall(function() plate:Destroy() end) + end + end) + end + end + }; + + Fire = { + Prefix = Settings.Prefix; + Commands = {"fire";"makefire";"givefire";}; + Args = {"player";"color";}; + Description = "Sets the target player(s) on fire, coloring the fire based on what you server"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local color = Color3.new(1,1,1) + local secondary = Color3.new(1,0,0) + + if args[2] then + local str = BrickColor.new('Bright orange').Color + local teststr = args[2] + + if BrickColor.new(teststr) ~= nil then + str = BrickColor.new(teststr).Color + end + + color = str + secondary = str + end + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + Functions.NewParticle(torso,"Fire",{ + Name = "FIRE"; + Color = color; + SecondaryColor = secondary; + }) + Functions.NewParticle(torso,"PointLight",{ + Name = "FIRE_LIGHT"; + Color = color; + Range = 15; + Brightness = 5; + }) + end + end + end + }; + + UnFire = { + Prefix = Settings.Prefix; + Commands = {"unfire";"removefire";"extinguish";}; + Args = {"player";}; + Description = "Puts out the flames on the target player(s)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + Functions.RemoveParticle(torso,"FIRE") + Functions.RemoveParticle(torso,"FIRE_LIGHT") + end + end + end + }; + + Smoke = { + Prefix = Settings.Prefix; + Commands = {"smoke";"givesmoke";}; + Args = {"player";"color";}; + Description = "Makes smoke come from the target player(s) with the desired color"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local color = Color3.new(1,1,1) + + if args[2] then + local str = BrickColor.new('White').Color + local teststr = args[2] + + if BrickColor.new(teststr) ~= nil then + str = BrickColor.new(teststr).Color + end + + color = str + end + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + Functions.NewParticle(torso,"Smoke",{ + Name = "SMOKE"; + Color = color; + }) + end + end + end + }; + + UnSmoke = { + Prefix = Settings.Prefix; + Commands = {"unsmoke";}; + Args = {"player";}; + Description = "Removes smoke from the target player(s)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + Functions.RemoveParticle(torso,"SMOKE") + end + end + end + }; + + Sparkles = { + Prefix = Settings.Prefix; + Commands = {"sparkles";}; + Args = {"player";"color";}; + Description = "Puts sparkles on the target player(s) with the desired color"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local color = Color3.new(1,1,1) + + if args[2] then + local str = BrickColor.new('Cyan').Color + local teststr = args[2] + + if BrickColor.new(teststr) ~= nil then + str = BrickColor.new(teststr).Color + end + + color = str + end + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + Functions.NewParticle(torso,"Sparkles",{ + Name = "SPARKLES"; + SparkleColor = color; + }) + Functions.NewParticle(torso,"PointLight",{ + Name = "SPARKLES_LIGHT"; + Color = color; + Range = 15; + Brightness = 5; + }) + end + end + end + }; + + UnSparkles = { + Prefix = Settings.Prefix; + Commands = {"unsparkles";}; + Args = {"player";}; + Description = "Removes sparkles from the target player(s)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + Functions.RemoveParticle(torso,"SPARKLES") + Functions.RemoveParticle(torso,"SPARKLES_LIGHT") + end + end + end + }; + + Animation = { + Prefix = Settings.Prefix; + Commands = {"animation";"loadanim";"animate";}; + Args = {"player";"animationID";}; + Description = "Load the animation onto the target"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[1] and not args[2] then args[2] = args[1] args[1] = nil end + + assert(tonumber(args[2]),tostring(args[2]).." is not a valid ID") + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.Send(v,"Function","PlayAnimation",args[2]) + end + end + }; + + AFK = { + Prefix = Settings.Prefix; + Commands = {"afk";}; + Args = {"player";}; + Description = "FFs, Gods, Names, Freezes, and removes the target player's tools until they jump."; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + local ff=service.New("ForceField",v.Character) + local hum=v.Character.Humanoid + local orig=hum.MaxHealth + local tools=service.New("Model") + hum.MaxHealth=math.huge + wait() + hum.Health=hum.MaxHealth + for k,t in pairs(v.Backpack:children()) do + t.Parent=tools + end + Admin.RunCommand(Settings.Prefix.."name",v.Name,"-AFK-_"..v.Name.."_-AFK-") + local torso=v.Character.HumanoidRootPart + local pos=torso.CFrame + local running=true + local event + event = v.Character.Humanoid.Jumping:connect(function() + running = false + ff:Destroy() + hum.Health = orig + hum.MaxHealth = orig + for k,t in pairs(tools:children()) do + t.Parent = v.Backpack + end + Admin.RunCommand(Settings.Prefix.."unname",v.Name) + event:Disconnect() + end) + repeat torso.CFrame = pos wait() until not v or not v.Character or not torso or not running or not torso.Parent + end) + end + end + }; + + Heal = { + Prefix = Settings.Prefix; + Commands = {"heal";}; + Args = {"player";}; + Hidden = false; + Description = "Heals the target player(s) (Regens their health)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v and v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.Health = v.Character.Humanoid.MaxHealth + end + end + end + }; + + God = { + Prefix = Settings.Prefix; + Commands = {"god";"immortal";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) immortal, makes their health so high that normal non-explosive weapons can't kill them"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.MaxHealth = math.huge + v.Character.Humanoid.Health = 9e9 + end + end + end + }; + + UnGod = { + Prefix = Settings.Prefix; + Commands = {"ungod";"mortal";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) mortal again"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v and v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.MaxHealth = 100 + v.Character.Humanoid.Health = v.Character.Humanoid.MaxHealth + end + end + end + }; + + RemoveHats = { + Prefix = Settings.Prefix; + Commands = {"removehats";"nohats";}; + Args = {"player";}; + Hidden = false; + Description = "Removes any hats the target is currently wearing"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for k,p in pairs(service.GetPlayers(plr,args[1])) do + for i,v in pairs(p.Character:children()) do + if v:IsA("Accoutrement") then + v:Destroy() + end + end + end + end + }; + + wat = { --// wat?? + Prefix = "!"; + Commands = {"wat";}; + Args = {}; + Hidden = true; + Description = "???"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + local wot = {227499602,153622804,196917825,217714490,130872377,142633540,130936426,130783238,151758509,259702986} + Remote.Send(plr,"Function","PlayAudio",wot[math.random(1,#wot)]) + end + }; + + ScriptInfo = { + Prefix = Settings.PlayerPrefix; + Commands = {"info";"about";"userpanel";}; + Args = {}; + Hidden = false; + Description = "Shows info about the script"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,"UserPanel",{Tab = "Info"}) + end + }; + + SetCoreGuiEnabled = { + Prefix = Settings.Prefix; + Commands = {"setcoreguienabled";"setcoreenabled";"showcoregui";"setcoregui";"setcge";"setcore"}; + Args = {"player";"element";"true/false";}; + Hidden = false; + Description = "SetCoreGuiEnabled. Enables/Disables CoreGui elements. "; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if args[3]:lower()=='on' or args[3]:lower()=='true' then + Remote.Send(v,'Function','SetCoreGuiEnabled',args[2],true) + elseif args[3]:lower()=='off' or args[3]:lower()=='false' then + Remote.Send(v,'Function','SetCoreGuiEnabled',args[2],false) + end + end + end + }; + + PrivateMessage = { + Prefix = Settings.Prefix; + Commands = {"pm";"privatemessage";}; + Args = {"player";"message";}; + Filter = true; + Description = "Send a private message to a player"; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing") + if Admin.CheckAdmin(plr) then + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.MakeGui(p,"PrivateMessage",{ + Title = "Message from "..plr.Name; + Player = plr; + Message = service.Filter(args[2],plr,p); + }) + end + end + end + }; + + ShowChat = { + Prefix = Settings.Prefix; + Commands = {"chat","customchat"}; + Args = {"player"}; + Description = "Opens the custom chat GUI"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.MakeGui(v,"Chat",{KeepChat = true}) + end + end + }; + + RemoveChat = { + Prefix = Settings.Prefix; + Commands = {"unchat","uncustomchat"}; + Args = {"player"}; + Description = "Opens the custom chat GUI"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.RemoveGui(v,"Chat") + end + end + }; + + BlurEffect = { + Prefix = Settings.Prefix; + Commands = {"blur";"screenblur";"blureffect"}; + Args = {"player";"blur size";}; + Description = "Blur the target player's screen"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local moder = tonumber(args[2]) or 0.5 + if moder>5 then moder=5 end + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.NewLocal(p,"BlurEffect",{ + Name = "WINDOW_BLUR", + Size = tonumber(args[2]) or 24, + Enabled = true, + },"Camera") + end + end + }; + + BloomEffect = { + Prefix = Settings.Prefix; + Commands = {"bloom";"screenbloom";"bloomeffect"}; + Args = {"player";"intensity";"size";"threshold"}; + Description = "Give the player's screen the bloom lighting effect"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.NewLocal(p,"BloomEffect",{ + Name = "WINDOW_BLOOM", + Intensity = tonumber(args[2]) or 0.4, + Size = tonumber(args[3]) or 24, + Threshold = tonumber(args[4]) or 0.95, + Enabled = true, + },"Camera") + end + end + }; + + SunRaysEffect = { + Prefix = Settings.Prefix; + Commands = {"sunrays";"screensunrays";"sunrayseffect"}; + Args = {"player";"intensity";"spread"}; + Description = "Give the player's screen the sunrays lighting effect"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.NewLocal(p,"SunRaysEffect",{ + Name = "WINDOW_SUNRAYS", + Intensity = tonumber(args[2]) or 0.25, + Spread = tonumber(args[3]) or 1, + Enabled = true, + },"Camera") + end + end + }; + + ColorCorrectionEffect = { + Prefix = Settings.Prefix; + Commands = {"colorcorrect";"colorcorrection";"correctioneffect";"correction";"cce"}; + Args = {"player";"brightness","contrast","saturation","tint"}; + Description = "Give the player's screen the sunrays lighting effect"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local r,g,b = 1,1,1 + if args[5] and args[5]:match("(.*),(.*),(.*)") then + r,g,b = args[5]:match("(.*),(.*),(.*)") + end + r,g,b = tonumber(r),tonumber(g),tonumber(b) + if not r or not g or not b then error("Invalid Input") end + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.NewLocal(p,"ColorCorrectionEffect",{ + Name = "WINDOW_COLORCORRECTION", + Brightness = tonumber(args[2]) or 0, + Contrast = tonumber(args[3]) or 0, + Saturation = tonumber(args[4]) or 0, + TintColor = Color3.new(r,g,b), + Enabled = true, + },"Camera") + end + end + }; + + UnColorCorrection = { + Prefix = Settings.Prefix; + Commands = {"uncolorcorrection";"uncorrection";"uncolorcorrectioneffect"}; + Args = {"player";}; + Hidden = false; + Description = "UnColorCorrection the target player's screen"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.RemoveLocal(p,"WINDOW_COLORCORRECTION","Camera") + end + end + }; + + UnSunRays = { + Prefix = Settings.Prefix; + Commands = {"unsunrays"}; + Args = {"player";}; + Hidden = false; + Description = "UnSunrays the target player's screen"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.RemoveLocal(p,"WINDOW_SUNRAYS","Camera") + end + end + }; + + UnBloom = { + Prefix = Settings.Prefix; + Commands = {"unbloom";"unscreenbloom";}; + Args = {"player";}; + Hidden = false; + Description = "UnBloom the target player's screen"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.RemoveLocal(p,"WINDOW_BLOOM","Camera") + end + end + }; + + UnBlur = { + Prefix = Settings.Prefix; + Commands = {"unblur";"unscreenblur";}; + Args = {"player";}; + Hidden = false; + Description = "UnBlur the target player's screen"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.RemoveLocal(p,"WINDOW_BLUR","Camera") + end + end + }; + + UnLightingEffect = { + Prefix = Settings.Prefix; + Commands = {"unlightingeffect";"unscreeneffect";}; + Args = {"player";}; + Hidden = false; + Description = "Remove admin made lighting effects from the target player's screen"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.RemoveLocal(p,"WINDOW_BLUR","Camera") + Remote.RemoveLocal(p,"WINDOW_BLOOM","Camera") + Remote.RemoveLocal(p,"WINDOW_THERMAL","Camera") + Remote.RemoveLocal(p,"WINDOW_SUNRAYS","Camera") + Remote.RemoveLocal(p,"WINDOW_COLORCORRECTION","Camera") + end + end + }; + + ThermalVision = { + Prefix = Settings.Prefix; + Commands = {"thermal","thermalvision","heatvision"}; + Args = {"player"}; + Hidden = false; + Description = "Looks like heat vision"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.NewLocal(p,"ColorCorrectionEffect",{ + Name = "WINDOW_THERMAL", + Brightness = 1, + Contrast = 20, + Saturation = 20, + TintColor = Color3.new(0.5,0.2,1); + Enabled = true, + },"Camera") + Remote.NewLocal(p,"BlurEffect",{ + Name = "WINDOW_THERMAL", + Size = 24, + Enabled = true, + },"Camera") + end + end + }; + + UnThermalVision = { + Prefix = Settings.Prefix; + Commands = {"unthermal";"unthermalvision";}; + Args = {"player";}; + Hidden = false; + Description = "Removes the thermal effect from the target player's screen"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr, args[1])) do + Remote.RemoveLocal(p,"WINDOW_THERMAL","Camera") + end + end + }; + + ZaWarudo = { + Prefix = Settings.Prefix; + Commands = {"zawarudo","stoptime"}; + Args = {}; + Fun = true; + Description = "Freezes everything but the player running the command"; + AdminLevel = "Admins"; + Function = function(plr,args) + local doPause; doPause = function(obj) + if obj:IsA("BasePart") and not obj.Anchored and not obj:IsDescendantOf(plr.Character) then + obj.Anchored = true + table.insert(Variables.FrozenObjects, obj) + end + + for i,v in next,obj:GetChildren() do + doPause(v) + end + end + + if not Variables.ZaWarudoDebounce then + Variables.ZaWarudoDebounce = true + delay(10, function() Variables.ZaWarudoDebounce = false end) + if Variables.ZaWarudo then + local audio = service.New("Sound",workspace) + audio.SoundId = "rbxassetid://676242549" + audio.Volume = 0.5 + audio:Play() + wait(2) + for i,part in next,Variables.FrozenObjects do + part.Anchored = false + end + + local old = service.Lighting:FindFirstChild("ADONIS_ZAWARUDO") + if old then + for i = -2,0,0.1 do + old.Saturation = i + wait(0.01) + end + old:Destroy() + end + + local audio = workspace:FindFirstChild("ADONIS_CLOCK_AUDIO") + if audio then + audio:Stop() + audio:Destroy() + end + + Variables.ZaWarudo:Disconnect() + Variables.FrozenObjects = {} + Variables.ZaWarudo = false + audio:Destroy() + else + local audio = service.New("Sound",workspace) + audio.SoundId = "rbxassetid://274698941" + audio.Volume = 10 + audio:Play() + wait(2.25) + doPause(workspace) + Variables.ZaWarudo = game.DescendantAdded:connect(function(c) + if c:IsA("BasePart") and not c.Anchored and c.Name ~= "HumanoidRootPart" then + c.Anchored = true + table.insert(Variables.FrozenObjects,c) + end + end) + + local cc = service.New("ColorCorrectionEffect",service.Lighting) + cc.Name = "ADONIS_ZAWARUDO" + for i = 0,-2,-0.1 do + cc.Saturation = i + wait(0.01) + end + + audio:Destroy() + local clock = service.New("Sound",workspace) + clock.Name = "ADONIS_CLOCK_AUDIO" + clock.SoundId = "rbxassetid://160189066" + clock.Looped = true + clock.Volume = 1 + clock:Play() + end + Variables.ZaWarudoDebounce = false + end + end + }; + + ShowSBL = { + Prefix = Settings.Prefix; + Commands = {"sbl";"syncedbanlist";"globalbanlist";"trellobans";"trellobanlist";}; + Args = {}; + Hidden = false; + Description = "Shows Trello bans"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + Remote.MakeGui(plr,"List",{ + Title = "Synced Ban List"; + Tab = HTTP.Trello.Bans; + }) + end + }; + + MakeList = { + Prefix = Settings.Prefix; + Commands = {"makelist";"newlist";"newtrellolist";"maketrellolist";}; + Args = {"name";}; + Hidden = false; + Description = "Adds a list to the Trello board set in Settings. AppKey and Token MUST be set and have write perms for this to work."; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + if not args[1] then error("Missing argument") end + local trello = HTTP.Trello.API(Settings.Trello_AppKey,Settings.Trello_Token) + local list = trello.makeList(Settings.Trello_Primary,args[1]) + Functions.Hint("Made list "..list.name,{plr}) + end + }; + + ViewList = { + Prefix = Settings.Prefix; + Commands = {"viewlist";"viewtrellolist";}; + Args = {"name";}; + Hidden = false; + Description = "Views the specified Trello list from the board set in Settings."; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + if not args[1] then error("Missing argument") end + local trello = HTTP.Trello.API(Settings.Trello_AppKey,Settings.Trello_Token) + local list = trello.getList(Settings.Trello_Primary,args[1]) + if not list then error("List not found.") end + local cards = trello.getCards(list.id) + local temp = {} + for i,v in pairs(cards) do + table.insert(temp,{Text=v.name,Desc=v.desc}) + end + Remote.MakeGui(plr,"List",{Title = list.name; Tab = temp}) + end + }; + + MakeCard = { + Prefix = Settings.Prefix; + Commands = {"makecard", "maketrellocard", "createcard"}; + Args = {}; + Hidden = false; + Description = "Opens a gui to make new Trello cards. AppKey and Token MUST be set and have write perms for this to work."; + Fun = false; + AdminLevel = "Owners"; + Function = function(plr,args) + Remote.MakeGui(plr,"CreateCard") + end + }; + + GetScript = { + Prefix = Settings.PlayerPrefix; + Commands = {"getscript";"getadonis"}; + Args = {}; + Hidden = false; + Description = "Get this script."; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + service.MarketPlace:PromptPurchase(plr, Core.LoaderID) + end + }; + + Ping = { + Prefix = Settings.PlayerPrefix; + Commands = {"ping";}; + Args = {}; + Hidden = false; + Description = "Shows you your current ping (in seconds)"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,'Ping') + end + }; + + GetPing = { + Prefix = Settings.Prefix; + Commands = {"getping";}; + Args = {"player";}; + Hidden = false; + Description = "Shows the target player's ping (in seconds)"; + Fun = false; + AdminLevel = "Helpers"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Functions.Hint(v.Name.."'s Ping is "..Remote.Get(v,"Ping").."ms",{plr}) + end + end + }; + + Donors = { + Prefix = Settings.PlayerPrefix; + Commands = {"donors";"donorlist";"donatorlist";}; + Args = {}; + Hidden = false; + Description = "Shows a list of donators who are currently in the server"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + local temptable = {} + for i,v in pairs(service.Players:children()) do + if Admin.CheckDonor(v) then + table.insert(temptable,v.Name) + end + end + Remote.MakeGui(plr,'List',{Title = 'Donors In-Game'; Tab = temptable; Update = 'DonorList'}) + end + }; + + RequestHelp = { + Prefix = Settings.PlayerPrefix; + Commands = {"help";"requesthelp";"gethelp";"lifealert";}; + Args = {}; + Hidden = false; + Description = "Calls admins for help"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + if Settings.HelpSystem == true then + local num = 0 + local answered = false + + if Variables.HelpRequests[plr.Name] ~= nil then + error("You already have a pending request") + else + Functions.Hint("Request sent",{plr}) + Variables.HelpRequests[plr.Name] = true + end + + for ind,p in pairs(service.Players:GetChildren()) do + Routine(function() + if Admin.CheckAdmin(p) then + local ret = Remote.MakeGuiGet(p,"Notification",{ + Title = "Help Request"; + Message = plr.Name.." needs help!"; + Time = 30; + OnClick = Core.Bytecode("return true"); + OnClose = Core.Bytecode("return false"); + OnIgnore = Core.Bytecode("return false"); + }) + + num = num+1 + if ret then + if not answered then + answered = true + Admin.RunCommand(Settings.Prefix.."tp",p.Name,plr.Name) + end + end + end + end) + end + + local w = tick() + repeat wait(0.5) until tick()-w>30 or answered + + Variables.HelpRequests[plr.Name] = nil + + if not answered then + Functions.Message("Help System","Sorry but no one is available to help you right now",{plr}) + end + else + Functions.Message("Help System","Help System Disabled by Place Owner",{plr}) + end + end + }; + + Rejoin = { + Prefix = Settings.PlayerPrefix; + Commands = {"rejoin";}; + Args = {}; + Hidden = false; + Description = "Makes you rejoin the server"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + local succeeded, errorMsg, placeId, instanceId = service.TeleportService:GetPlayerPlaceInstanceAsync(plr.userId) + if succeeded then + service.TeleportService:TeleportToPlaceInstance(placeId, instanceId, plr) + else + Functions.Hint("Could not rejoin.") + end + end + }; + + Join = { + Prefix = Settings.PlayerPrefix; + Commands = {"join";"follow";"followplayer";}; + Args = {"username";}; + Hidden = false; + Description = "Makes you follow the player you gave the username of to the server they are in"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + local player = service.Players:GetUserIdFromNameAsync(args[1]) + if player then + local succeeded, errorMsg, placeId, instanceId = service.TeleportService:GetPlayerPlaceInstanceAsync(player) + if succeeded then + service.TeleportService:TeleportToPlaceInstance(placeId, instanceId, plr) + else + Functions.Hint("Could not follow "..args[1]..". "..errorMsg,{plr}) + end + else + Functions.Hint(args[1].." is not a valid ROBLOX user",{plr}) + end + end + }; + + ShowBackpack = { + Prefix = Settings.Prefix; + Commands = {"showtools";"viewtools";"seebackpack";"viewbackpack";"showbackpack";"displaybackpack";"displaytools";}; + Args = {"player";}; + Hidden = false; + Description = "Shows you a list of items currently in the target player(s) backpack"; + Fun = false; + Agents = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + local tools = {} + table.insert(tools,{Text="==== "..v.Name.."'s Tools ====",Desc=v.Name:lower()}) + for k,t in pairs(v.Backpack:children()) do + if t:IsA("Tool") then + table.insert(tools,{Text=t.Name,Desc="Class: "..t.ClassName.." | ToolTip: "..t.ToolTip.." | Name: "..t.Name}) + elseif t:IsA("HopperBin") then + table.insert(tools,{Text=t.Name,Desc="Class: "..t.ClassName.." | BinType: "..tostring(t.BinType).." | Name: "..t.Name}) + else + table.insert(tools,{Text=t.Name,Desc="Class: "..t.ClassName.." | Name: "..t.Name}) + end + end + Remote.MakeGui(plr,"List",{Title = v.Name,Tab = tools}) + end) + end + end + }; + + PlayerList = { + Prefix = Settings.Prefix; + Commands = {"players","playerlist"}; + Args = {}; + Hidden = false; + Description = "Shows you all players currently in-game, including nil ones"; + Fun = false; + Agents = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local plrs = {} + local playz = Functions.GrabNilPlayers('all') + Functions.Hint('Pinging players. Please wait. No ping = Ping > 5sec.',{plr}) + for i,v in pairs(playz) do + Routine(function() + if type(v)=="String" and v=="NoPlayer" then + table.insert(plrs,{Text="PLAYERLESS CLIENT",Desc="PLAYERLESS SERVERREPLICATOR. COULD BE LOADING/LAG/EXPLOITER. CHECK AGAIN IN A MINUTE!"}) + else + local ping + Routine(function() + ping = Remote.Ping(v).."ms" + end) + for i=0.1,5,0.1 do + if ping then break end + wait(0.1) + end + if v and service.Players:FindFirstChild(v.Name) then + local h = "" + local mh = "" + local ws = "" + local jp = "" + local hn = "" + local hum = (function() return service.Iterate(v.Character,function(v) if v:IsA("Humanoid") then return v end end) end)() + if v.Character and hum then + h=hum.Health + mh=hum.MaxHealth + ws=hum.WalkSpeed + jp=hum.JumpPower + hn=hum.Name + else + h="NO CHARACTER/HUMANOID" + end + + table.insert(plrs,{Text=v.Name.." - "..ping..'s',Desc='Lower: '..v.Name:lower()..' - Health: '..h.." - MaxHealth: "..mh.." - WalkSpeed: "..ws.." - JumpPower: "..jp.." - Humanoid Name: "..hum.Name}) + else + table.insert(plrs,{Text='[NIL] '..v.Name,Desc='Lower: '..v.Name:lower()..' - Ping: '..ping}) + end + end + end) + end + + for i=0.1,5,0.1 do + if Functions.CountTable(plrs)>=Functions.CountTable(playz) then break end + wait(0.1) + end + Remote.MakeGui(plr,'List',{Title = 'Players', Tab = plrs, Update = "PlayerList"}) + end + }; + + Agents = { + Prefix = Settings.PlayerPrefix; + Commands = {"agents";"trelloagents";"showagents";}; + Args = {}; + Hidden = false; + Description = "Shows a list of Trello agents pulled from the configured boards"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + local temp={} + for i,v in pairs(HTTP.Trello.Agents) do + table.insert(temp,{Text = v,Desc = "A Trello agent"}) + end + Remote.MakeGui(plr,"List",{Title = "Agents", Tab = temp}) + end + }; + + Credits = { + Prefix = Settings.PlayerPrefix; + Commands = {"credit";"credits";}; + Args = {}; + Hidden = false; + Description = "Credits"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,"List",{ + Title = 'Credits', + Tab = server.Credits + }) + end + }; + + Alert = { + Prefix = Settings.Prefix; + Commands = {"alert";"alarm";"annoy";}; + Args = {"player";"message";}; + Filter = true; + Description = "Get someone's attention"; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1]:lower())) do + Remote.MakeGui(v,"Alert",{Message = (service.Filter(args[2],plr,v) or "Wake up")}) + end + end + }; + + Usage = { + Prefix = Settings.PlayerPrefix; + Commands = {"usage";}; + Args = {}; + Hidden = false; + Description = "Shows you how to use some syntax related things"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + local usage={ + 'Mouse over things in lists to expand them'; + 'Special Functions: '; + 'Ex: '..Settings.Prefix..'kill FUNCTION, so like '..Settings.Prefix..'kill '..Settings.SpecialPrefix..'all'; + 'Put /e in front to make it silent (/e '..Settings.Prefix..'kill scel)'; + Settings.SpecialPrefix..'me - Runs a command on you'; + Settings.SpecialPrefix..'all - Runs a command on everyone'; + Settings.SpecialPrefix..'admins - Runs a command on all admins in the game'; + Settings.SpecialPrefix..'nonadmins - Same as !admins but for people who are not an admin'; + Settings.SpecialPrefix..'others - Runs command on everyone BUT you'; + Settings.SpecialPrefix..'random - Runs command on a random person'; + Settings.SpecialPrefix..'friends - Runs command on anyone on your friends list'; + Settings.SpecialPrefix..'besties - Runs command on anyone on your best friends list'; + '%TEAMNAME - Runs command on everyone in the team TEAMNAME Ex: '..Settings.Prefix..'kill %raiders'; + '$GROUPID - Run a command on everyone in the group GROUPID, Will default to the GroupId setting if no id is given'; + '-PLAYERNAME - Will remove PLAYERNAME from list of players to run command on. '..Settings.Prefix..'kill all,-scel will kill everyone except scel'; + '#NUMBER - Will run command on NUMBER of random players. '..Settings.Prefix..'ff #5 will ff 5 random players.'; + 'radius-NUMBER -- Lets you run a command on anyone within a NUMBER stud radius of you. '..Settings.Prefix..'ff radius-5 will ff anyone within a 5 stud radius of you.'; + 'Certain commands can be used by anyone, these commands have '..Settings.PlayerPrefix..' infront, such as '..Settings.PlayerPrefix..'clean and '..Settings.PlayerPrefix..'rejoin'; + ''..Settings.Prefix..'kill me,noob1,noob2,'..Settings.SpecialPrefix..'random,%raiders,$123456,!nonadmins,-scel'; + 'Multiple Commands at a time - '..Settings.Prefix..'ff me '..Settings.BatchKey..' '..Settings.Prefix..'sparkles me '..Settings.BatchKey..' '..Settings.Prefix..'rocket jim'; + 'You can add a wait if you want; '..Settings.Prefix..'ff me '..Settings.BatchKey..' !wait 10 '..Settings.BatchKey..' '..Settings.Prefix..'m hi we waited 10 seconds'; + ''..Settings.Prefix..'repeat 10(how many times to run the cmd) 1(how long in between runs) '..Settings.Prefix..'respawn jim'; + 'Place owners can edit some settings in-game via the '..Settings.Prefix..'settings command'; + 'Please refer to the Tips and Tricks section under the settings in the script for more detailed explanations' + } + Remote.MakeGui(plr,"List",{Title = 'Usage', Tab = usage}) + end + }; + + Waypoint = { + Prefix = Settings.Prefix; + Commands = {"waypoint";"wp";"checkpoint";}; + Args = {"name";}; + Filter = true; + Description = "Makes a new waypoint/sets an exiting one to your current position with the name that you can teleport to using :tp me waypoint-"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local name=args[1] or tostring(#Variables.Waypoints+1) + if plr.Character:FindFirstChild('HumanoidRootPart') then + Variables.Waypoints[name] = plr.Character.HumanoidRootPart.Position + Functions.Hint('Made waypoint '..name..' | '..tostring(Variables.Waypoints[name]),{plr}) + end + end + }; + + DeleteWaypoint = { + Prefix = Settings.Prefix; + Commands = {"delwaypoint";"delwp";"delcheckpoint";"deletewaypoint";"deletewp";"deletecheckpoint";}; + Args = {"name";}; + Hidden = false; + Description = "Deletes the waypoint named if it exist"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(Variables.Waypoints) do + if i:lower():sub(1,#args[1])==args[1]:lower() or args[1]:lower()=='all' then + Variables.Waypoints[i]=nil + Functions.Hint('Deleted waypoint '..i,{plr}) + end + end + end + }; + + Waypoints = { + Prefix = Settings.Prefix; + Commands = {"waypoints";}; + Args = {}; + Hidden = false; + Description = "Shows available waypoints, mouse over their names to view their coordinates"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local temp={} + for i,v in pairs(Variables.Waypoints) do + local x,y,z=tostring(v):match('(.*),(.*),(.*)') + table.insert(temp,{Text=i,Desc='X:'..x..' Y:'..y..' Z:'..z}) + end + Remote.MakeGui(plr,"List",{Title = 'Waypoints', Tab = temp}) + end + }; + + Cameras = { + Prefix = Settings.Prefix; + Commands = {"cameras";"cams";}; + Args = {}; + Hidden = false; + Description = "Shows you admin cameras in the server and lets you delete/view them"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local tab = {} + for i,v in pairs(Variables.Cameras) do + table.insert(tab,{Text = v.Name,Desc = "Pos: "..v.Object.Position}) + end + Remote.MakeGui(plr,"List",{Title = "Cameras", Tab = tab}) + end + }; + + MakeCamera = { + Prefix = Settings.Prefix; + Commands = {"makecam";"makecamera";"camera";}; + Args = {"name";}; + Filter = true; + Description = "Makes a camera named whatever you pick"; + AdminLevel = "Moderators"; + Function = function(plr,args) + if plr and plr.Character and plr.Character:FindFirstChild('Head') then + if service.Workspace:FindFirstChild('Camera: '..args[1]) then + Functions.Hint(args[1].." Already Exists!",{plr}) + else + local cam = service.New('Part',service.Workspace) + cam.Position = plr.Character.Head.Position + cam.Anchored = true + cam.BrickColor = BrickColor.new('Really black') + cam.CanCollide = false + cam.Locked = true + cam.FormFactor = 'Custom' + cam.Size = Vector3.new(1,1,1) + cam.TopSurface = 'Smooth' + cam.BottomSurface = 'Smooth' + cam.Name='Camera: '..args[1] + --service.New('PointLight',cam) + cam.Transparency=1--.9 + local mesh=service.New('SpecialMesh',cam) + mesh.Scale=Vector3.new(1,1,1) + mesh.MeshType='Sphere' + table.insert(Variables.Cameras,{Brick = cam, Name = args[1]}) + end + end + end + }; + + ViewCamera = { + Prefix = Settings.Prefix; + Commands = {"viewcam","viewc","camview","watchcam","cam"}; + Args = {"camera";}; + Description = "Makes you view the target player"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(Variables.Cameras) do + if v.Name:sub(1,#args[1]) == args[1] then + Remote.Send(plr,'Function','SetView',v.Brick) + end + end + end + }; + + ForceView = { + Prefix = Settings.Prefix; + Commands = {"fview";"forceview";"forceviewplayer";"fv";}; + Args = {"player1";"player2";}; + Description = "Forces one player to view another"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for k,p in pairs(service.GetPlayers(plr, args[1])) do + for i,v in pairs(service.GetPlayers(plr, args[2])) do + if v and v.Character:FindFirstChild('Humanoid') then + Remote.Send(p,'Function','SetView',v.Character.Humanoid) + end + end + end + end + }; + + View = { + Prefix = Settings.Prefix; + Commands = {"view";"watch";"nsa";"viewplayer";}; + Args = {"player";}; + Description = "Makes you view the target player"; + Agents = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + if v and v.Character:FindFirstChild('Humanoid') then + Remote.Send(plr,'Function','SetView',v.Character.Humanoid) + end + end + end + }; + + ResetView = { + Prefix = Settings.Prefix; + Commands = {"resetview";"rv";"fixview";"fixcam";"unwatch";"unview"}; + Args = {"optional player"}; + Description = "Resets your view"; + Agents = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[1] then + for i,v in pairs(service.GetPlayers(plr,args[1])) do + end + else + Remote.Send(plr,'Function','SetView','reset') + end + end + }; + + GuiView = { + Prefix = Settings.Prefix; + Commands = {"guiview";"showguis";"viewguis"}; + Args = {"player"}; + Description = "Shows you the player's character and any guis in their PlayerGui folder [May take a minute]"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local p + for i,v in pairs(service.GetPlayers(plr,args[1])) do + p = v + end + if p then + Functions.Hint("Loading GUIs",{plr}) + local guis,rlocked = Remote.Get(p,"Function","GetGuiData") + if rlocked then + Functions.Hint("ROBLOXLOCKED GUI FOUND! CANNOT DISPLAY!",{plr}) + end + if guis then + Remote.Send(plr,"Function","LoadGuiData",guis) + end + end + end; + }; + + UnGuiView = { + Prefix = Settings.Prefix; + Commands = {"unguiview","unshowguis","unviewguis"}; + Args = {}; + Description = "Removes the viewed player's GUIs"; + AdminLevel = "Moderators"; + Function = function(plr,args) + Remote.Send(plr,"Function","UnLoadGuiData") + end; + }; + + ServerDetails = { + Prefix = Settings.Prefix; + Commands = {"details";"meters";"gameinfo";"serverinfo";}; + Args = {}; + Hidden = false; + Description = "Shows you information about the current server"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local det={} + local nilplayers=0 + for i,v in pairs(service.NetworkServer:children()) do + if v and v:GetPlayer() and not service.Players:FindFirstChild(v:GetPlayer().Name) then + nilplayers=nilplayers+1 + end + end + if HTTP.CheckHttp() then + det.Http='Enabled' + else + det.Http='Disabled' + end + if pcall(function() loadstring("local hi = 'test'") end) then + det.Loadstring='Enabled' + else + det.Loadstring='Disabled' + end + if service.Workspace.FilteringEnabled then + det.Filtering="Enabled" + else + det.Filtering="Disabled" + end + if service.Workspace.StreamingEnabled then + det.Streaming="Enabled" + else + det.Streaming="Disabled" + end + det.NilPlayers = nilplayers + det.PlaceName = service.MarketPlace:GetProductInfo(game.PlaceId).Name + det.PlaceOwner = service.MarketPlace:GetProductInfo(game.PlaceId).Creator.Name + det.ServerSpeed = service.Round(service.Workspace:GetRealPhysicsFPS()) + --det.AdminVersion = version + det.ServerStartTime = service.GetTime(server.ServerStartTime) + local nonnumber=0 + for i,v in pairs(service.NetworkServer:children()) do + if v and v:GetPlayer() and not Admin.CheckAdmin(v:GetPlayer(),false) then + nonnumber=nonnumber+1 + end + end + det.NonAdmins=nonnumber + local adminnumber=0 + for i,v in pairs(service.NetworkServer:children()) do + if v and v:GetPlayer() and Admin.CheckAdmin(v:GetPlayer(),false) then + adminnumber=adminnumber+1 + end + end + det.CurrentTime=service.GetTime() + det.ServerAge=service.GetTime(os.time()-server.ServerStartTime) + det.Admins=adminnumber + det.Objects=#Variables.Objects + det.Cameras=#Variables.Cameras + + local tab = {} + for i,v in pairs(det) do + table.insert(tab,{Text = i..": "..tostring(v),Desc = tostring(v)}) + end + Remote.MakeGui(plr,"List",{Title = "Server Details", Tab = tab, Update = "ServerDetails"}) + --Remote.Send(plr,'Function','ServerDetails',det) + end + }; + + ChangeLog = { + Prefix = Settings.Prefix; + Commands = {"changelog";"changes";}; + Args = {}; + Description = "Shows you the script's changelog"; + AdminLevel = "Players"; + Function = function(plr,args) + Remote.MakeGui(plr,"List",{ + Title = 'Change Log', + Table = server.Changelog, + Size = {500,400} + }) + end + }; + + AdminList = { + Prefix = Settings.Prefix; + Commands = {"admins";"adminlist";"owners";"Moderators";}; + Args = {}; + Hidden = false; + Description = "Shows you the list of admins, also shows admins that are currently in the server"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local temptable = {} + + for i,v in pairs(Settings.Creators) do + table.insert(temptable,v .. " - Creator") + end + + for i,v in pairs(Settings.Owners) do + table.insert(temptable,v .. " - Owner") + end + + for i,v in pairs(Settings.Admins) do + table.insert(temptable,v .. " - Admin") + end + + for i,v in pairs(Settings.Moderators) do + table.insert(temptable,v .. " - Mod") + end + + for i,v in pairs(HTTP.Trello.Creators) do + table.insert(temptable,v .. " - Creator [Trello]") + end + + for i,v in pairs(HTTP.Trello.Moderators) do + table.insert(temptable,v .. " - Mod [Trello]") + end + + for i,v in pairs(HTTP.Trello.Admins) do + table.insert(temptable,v .. " - Admin [Trello]") + end + + for i,v in pairs(HTTP.Trello.Owners) do + table.insert(temptable,v .. " - Owner [Trello]") + end + + service.Iterate(Settings.CustomRanks,function(rank,tab) + service.Iterate(tab,function(ind,admin) + table.insert(temptable,admin.." - "..rank) + end) + end) + + table.insert(temptable,'==== Admins In-Game ====') + for i,v in pairs(service.GetPlayers()) do + local level = Admin.GetLevel(v) + if level>=4 then + table.insert(temptable,v.Name..' - Creator') + elseif level>=3 then + table.insert(temptable,v.Name..' - Owner') + elseif level>=2 then + table.insert(temptable,v.Name..' - Admin') + elseif level>=1 then + table.insert(temptable,v.Name..' - Mod') + end + + service.Iterate(Settings.CustomRanks,function(rank,tab) + if Admin.CheckTable(v,tab) then + table.insert(temptable,v.Name.." - "..rank) + end + end) + end + + Remote.MakeGui(plr,"List",{Title = 'Admin List',Table = temptable}) + end + }; + + BanList = { + Prefix = Settings.Prefix; + Commands = {"banlist";"banned";"bans";}; + Args = {}; + Hidden = false; + Description = "Shows you the normal ban list"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local tab = {} + for i,v in pairs(Settings.Banned) do + table.insert(tab,{Text = tostring(v),Desc = tostring(v)}) + end + Remote.MakeGui(plr,"List",{Title = 'Ban List', Tab = tab}) + end + }; + + Vote = { + Prefix = Settings.Prefix; + Commands = {"vote";"makevote";"startvote";"question";"survey";}; + Args = {"player";"anwser1,answer2,etc (NO SPACES)";"question";}; + Filter = true; + Description = "Lets you ask players a question with a list of answers and get the results"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local question = args[3] + if not question then error("You forgot to supply a question!") end + local answers = args[2] + local anstab = {} + if not answers then + anstab = {"Yes","No"} + else + for ans in answers:gmatch("([^,]+)") do + table.insert(anstab,ans) + end + end + local responses = {} + local players = service.GetPlayers(plr,args[1]) + + for i,v in pairs(players) do + Routine(function() + local response = Remote.GetGui(v,"Vote",{Question = question,Answers = anstab}) + if response then + table.insert(responses,response) + end + end) + end + + local t = 0 + repeat wait(0.1) t=t+0.1 until t>=60 or #responses>=#players + + local results = {} + + for i,v in pairs(responses) do + if not results[v] then results[v] = 0 end + results[v] = results[v]+1 + end + + local total = #responses + local tab = { + "Question: "..question; + "Total Responses: "..total; + "Didn't Vote: "..#players-total; + } + for i,v in pairs(anstab) do + local ans = v + local num = results[v] + local percent + if not num then + num = 0 + percent = 0 + else + percent = math.floor((num/total)*100) + end + + table.insert(tab,{Text=ans.." | "..percent.."% - "..num.."/"..total,Desc="Number: "..num.."/"..total.." | Percent: "..percent}) + end + Remote.MakeGui(plr,"List",{Title = 'Results', Tab = tab}) + end + }; + + ToolList = { + Prefix = Settings.Prefix; + Commands = {"tools";"toollist";}; + Args = {}; + Hidden = false; + Description = "Shows you a list of tools that can be obtains via the give command"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local prefix = Settings.Prefix + local split = Settings.SplitKey + local num = 0 + local children = { + Core.Bytecode([[Object:ResizeCanvas(false, true, false, false, 5, 5)]]); + } + + for i, v in next,Settings.Storage:GetChildren() do + if v:IsA("Tool") or v:IsA("HopperBin") then + table.insert(children, { + Class = "TextLabel"; + Size = UDim2.new(1, -10, 0, 30); + Position = UDim2.new(0, 5, 0, 30*num); + BackgroundTransparency = 1; + TextXAlignment = "Left"; + Text = " "..v.Name; + ToolTip = v:GetFullName(); + Children = { + { + Class = "TextButton"; + Size = UDim2.new(0, 80, 1, -4); + Position = UDim2.new(1, -82, 0, 2); + Text = "Spawn"; + OnClick = Core.Bytecode([[ + client.Remote.Send("ProcessCommand", "]]..prefix..[[give]]..split..[[me]]..split..v.Name..[["); + ]]); + } + }; + }) + + num = num+1; + end + end + + Remote.MakeGui(plr, "Window", { + Name = "ToolList"; + Title = "Tools"; + Size = {300, 300}; + MinSize = {150, 100}; + Content = children; + Ready = true; + }) + end + }; + + Piano = { + Prefix = Settings.Prefix; + Commands = {"piano";}; + Args = {"player"}; + Hidden = false; + Description = "Gives you a playable keyboard piano. Credit to NickPatella."; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in next,service.GetPlayers(plr, args[1]) do + local piano = Deps.Assets.Piano:clone() + piano.Parent = v:FindFirstChild("PlayerGui") or v.Backpack + piano.Disabled = false + end + end + }; + + Insert = { + Prefix = Settings.Prefix; + Commands = {"insert";"ins";}; + Args = {"id";}; + Hidden = false; + Description = "Inserts whatever object belongs to the ID you supply, the object must be in the place owner's or ROBLOX's inventory"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local obj = service.Insert(tonumber(args[1])) + if obj and plr.Character then + table.insert(Variables.InsertedObjects, obj) + obj.Parent = service.Workspace + pcall(function() obj:MakeJoints() end) + obj:MoveTo(plr.Character:GetModelCFrame().p) + end + end + }; + + InsertClear = { + Prefix = Settings.Prefix; + Commands = {"insclear";"clearinserted";"clrins";"insclr";}; + Args = {}; + Hidden = false; + Description = "Removes inserted objects"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(Variables.InsertedObjects) do + v:Destroy() + table.remove(Variables.InsertedObjects,i) + end + end + }; + + Clean = { + Prefix = Settings.PlayerPrefix; + Commands = {"clean";}; + Args = {}; + Hidden = false; + Description = "Cleans some useless junk out of service.Workspace"; + Fun = false; + AdminLevel = "Players"; + Function = function(plr,args) + Functions.CleanWorkspace() + end + }; + + Chik3n = { + Prefix = Settings.Prefix; + Commands = {"chik3n","zelith","z3lith"}; + Args = {}; + Hidden = false; + Description = "Call on the KFC dark prophet powers of chicken"; + Fun = true; + AdminLevel = "Owners"; + Function = function(plr, args) + local hats = {} + local tempHats = {} + local run = true + local hat = service.Insert(24112667):children()[1] + -- + local scr = Deps.Assets.Quacker:Clone() + scr.Name = "Quacker" + scr.Parent = hat + --]] + hat.Anchored = true + hat.CanCollide = false + hat.ChickenSounds.Disabled = true + table.insert(hats,hat) + table.insert(Variables.Objects,hat) + hat.Parent = workspace + hat.CFrame = plr.Character.Head.CFrame + service.StopLoop("ChickenSpam") + service.StartLoop("ChickenSpam",5,function() + tempHats = {} + for i,v in pairs(hats) do + wait(0.5) + if not hat or not hat.Parent or not scr or not scr.Parent then + break + end + local nhat = hat:Clone() + table.insert(tempHats, v) + table.insert(tempHats,nhat) + table.insert(Variables.Objects,nhat) + nhat.Parent = workspace + nhat.Quacker.Disabled = false + nhat.CFrame = v.CFrame*CFrame.new(math.random(-100,100),math.random(-100,100),math.random(-100,100))*CFrame.Angles(math.random(-360,360),math.random(-360,360),math.random(-360,360)) + end + hats = tempHats + end) + for i,v in pairs(tempHats) do + pcall(function() v:Destroy() end) + table.remove(tempHats,i) + end + for i,v in pairs(hats) do + pcall(function() v:Destroy() end) + table.remove(hats,i) + end + end; + }; + + Clear = { + Prefix = Settings.Prefix; + Commands = {"clear";"cleargame";"clr";}; + Args = {}; + Hidden = false; + Description = "Remove admin objects"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + service.StopLoop("ChickenSpam") + for i,v in pairs(Variables.Objects) do + if v:IsA("Script") or v:IsA("LocalScript") then + v.Disabled = true + end + v:Destroy() + end + + for i,v in pairs(Variables.Cameras) do + if v then + table.remove(Variables.Cameras,i) + v:Destroy() + end + end + + for i,v in pairs(Variables.Jails) do + if not v.Player or not v.Player.Parent then + local ind = v.Index + service.StopLoop(ind.."JAIL") + Pcall(function() v.Jail:Destroy() end) + Variables.Jails[ind] = nil + end + end + + for i,v in pairs(service.Workspace:GetChildren()) do + if v:IsA('Message') or v:IsA('Hint') then + v:Destroy() + end + + if v.Name:match('A_Probe (.*)') then + v:Destroy() + end + end + + Variables.Objects = {} + --RemoveMessage() + end + }; + + FullClear = { + Prefix = Settings.Prefix; + Commands = {"fullclear";"clearinstances";"fullclr";}; + Args = {}; + Description = "Removes any instance created server-side by Adonis; May break things"; + AdminLevel = "Owners"; + Function = function(plr,args) + local objects = service.GetAdonisObjects() + + for i,v in next,objects do + v:Destroy() + table.remove(objects, i) + end + + --for i,v in next,Functions.GetPlayers() do + -- Remote.Send(v, "Function", "ClearAllInstances") + --end + end + }; + + ShowServerInstances = { + Prefix = Settings.Prefix; + Commands = {"serverinstances";}; + Args = {}; + Description = "Shows all instances created server-side by Adonis"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local objects = service.GetAdonisObjects() + local temp = {} + + for i,v in next,objects do + table.insert(temp, { + Text = v:GetFullName(); + Desc = v.ClassName; + }) + end + + Remote.MakeGui(plr, "List", { + Title = "Adonis Instances"; + Table = temp; + Stacking = false; + Update = "Instances"; + }) + end + }; + + ShowClientInstances = { + Prefix = Settings.Prefix; + Commands = {"clientinstances";}; + Args = {"player"}; + Description = "Shows all instances created client-side by Adonis"; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in next,Functions.GetPlayers(plr, args[1]) do + local instList = Remote.Get(v, "InstanceList") + if instList then + Remote.MakeGui(plr, "List", { + Title = v.Name .." Instances"; + Table = instList; + Stacking = false; + Update = "Instances"; + UpdateArg = v; + }) + end + end + end + }; + + ClearGUIs = { + Prefix = Settings.Prefix; + Commands = {"clearguis";"clearmessages";"clearhints";"clrguis";"clrgui";"clearscriptguis";"removescriptguis"}; + Args = {"player","deleteAll?"}; + Hidden = false; + Description = "Remove script GUIs such as :m and :hint"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1] or "all")) do + if tostring(args[2]):lower() == "yes" or tostring(args[2]):lower() == "true" then + Remote.RemoveGui(v,true) + else + Remote.RemoveGui(v,"Message") + Remote.RemoveGui(v,"Hint") + Remote.RemoveGui(v,"Notification") + Remote.RemoveGui(v,"PM") + Remote.RemoveGui(v,"Output") + Remote.RemoveGui(v,"Effect") + Remote.RemoveGui(v,"Alert") + end + end + end + }; + + ResetLighting = { + Prefix = Settings.Prefix; + Commands = {"fix";"resetlighting";"undisco";"unflash";"fixlighting";}; + Args = {}; + Hidden = false; + Description = "Reset lighting back to the setting it had on server start"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + service.StopLoop("LightingTask") + for i,v in pairs(Variables.OriginalLightingSettings) do + if i~="Sky" and service.Lighting[i]~=nil then + Functions.SetLighting(i,v) + end + end + for i,v in pairs(service.Lighting:GetChildren()) do + if v:IsA("Sky") then + service.Delete(v) + end + end + if Variables.OriginalLightingSettings.Sky then + Variables.OriginalLightingSettings.Sky:Clone().Parent = service.Lighting + end + end + }; + + ClearLighting = { + Prefix = Settings.Prefix; + Commands = {"fixplayerlighting","rplighting","clearlighting","serverlighting"}; + Args = {"player"}; + Hidden = false; + Description = "Sets the player's lighting to match the server's"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + for prop,val in pairs(Variables.LightingSettings) do + Remote.SetLighting(v,prop,val) + end + end + end + }; + + Freaky = { + Prefix = Settings.Prefix; + Commands = {"freaky";}; + Args = {"0-600,0-600,0-600";"optional player"}; + Hidden = false; + Description = "Does freaky stuff to lighting. Like a messed up ambient."; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local r,g,b = 100,100,100 + if args[1] and args[1]:match("(.*),(.*),(.*)") then + r,g,b = args[1]:match("(.*),(.*),(.*)") + end + r,g,b = tonumber(r),tonumber(g),tonumber(b) + if not r or not g or not b then error("Invalid Input") end + local num1,num2,num3 = r,g,b + num1="-"..num1.."00000" + num2="-"..num2.."00000" + num3="-"..num3.."00000" + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"FogColor", Color3.new(tonumber(num1),tonumber(num2),tonumber(num3))) + Remote.SetLighting(v,"FogEnd", 9e9) + end + else + Functions.SetLighting("FogColor", Color3.new(tonumber(num1),tonumber(num2),tonumber(num3))) + Functions.SetLighting("FogEnd", 9e9) --Thanks go to Janthran for another neat glitch + end + end + }; + + Info = { + Prefix = Settings.Prefix; + Commands = {"info";"age";}; + Args = {"player";"groupid";}; + Hidden = false; + Description = "Shows you information about the target player"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local plz = service.GetPlayers(plr, args[1]:lower()) + for i,v in pairs(plz) do + if args[2] and tonumber(args[2]) then + local role = v:GetRoleInGroup(tonumber(args[2])) + Functions.Hint("Lower: "..v.Name:lower().." - ID: "..v.userId.." - Age: "..v.AccountAge.." - Rank: "..tostring(role),{plr}) + else + Functions.Hint("Lower: "..v.Name:lower().." - ID: "..v.userId.." - Age: "..v.AccountAge,{plr}) + end + end + end + }; + + ResetStats = { + Prefix = Settings.Prefix; + Commands = {"resetstats","rs"}; + Args = {"player";}; + Hidden = false; + Description = "Sets target player(s)'s leader stats to 0"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr, args[1]:lower())) do + cPcall(function() + if v and v:findFirstChild("leaderstats") then + for a,q in pairs(v.leaderstats:children()) do + if q:IsA("IntValue") then q.Value = 0 end + end + end + end) + end + end + }; + + Gear = { + Prefix = Settings.Prefix; + Commands = {"gear";"givegear";}; + Args = {"player";"id";}; + Hidden = false; + Description = "Gives the target player(s) a gear from the catalog based on the ID you supply"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local gear = service.Insert(tonumber(args[2])) + if gear:IsA("Tool") or gear:IsA("HopperBin") then + service.New("StringValue",gear).Name = Variables.CodeName..gear.Name + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v:findFirstChild("Backpack") then + gear:Clone().Parent = v.Backpack + end + end + end + end + }; + + Sell = { + Prefix = Settings.Prefix; + Commands = {"sell";}; + Args = {"player";"id";"currency";}; + Hidden = false; + Description = "Prompts the player(s) to buy the product belonging to the ID you supply"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local type = args[3] or 'default' + local t + if type:lower()=='tix' or type:lower()=='tickets' or type:lower()=='t' then + t = Enum.CurrencyType.Tix + elseif type:lower()=='robux' or type:lower()=='rb' or type:lower()=='r' then + t = Enum.CurrencyType.Robux + else + t = Enum.CurrencyType.Default + end + for i, v in pairs(service.GetPlayers(plr, args[1])) do + service.MarketPlace:PromptPurchase(v,tonumber(args[2]),false,t) + end + end + }; + + Hat = { + Prefix = Settings.Prefix; + Commands = {"hat";"givehat";}; + Args = {"player";"id";}; + Hidden = false; + Description = "Gives the target player(s) a hat based on the ID you supply"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + if not args[2] then error("Argument missing or nil") end + local id = args[2] + if not tonumber(id) then + local built = { + teapot = 1055299; + } + if built[args[2]:lower()] then + id = built[args[2]:lower()] + end + end + if not tonumber(id) then error("Invalid ID") end + for i,v in pairs(service.GetPlayers(plr, args[1])) do + if v.Character then + local obj = service.Insert(id) + if obj:IsA("Accoutrement") then + obj.Parent = v.Character + end + end + end + end + }; + + Capes = { + Prefix = Settings.Prefix; + Commands = {"capes";"capelist";}; + Args = {}; + Hidden = false; + Description = "Shows you the list of capes for the cape command"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local list={} + for i,v in pairs(Variables.Capes) do + table.insert(list,v.Name) + end + Remote.MakeGui(plr,'List',{Title = 'Cape List',Tab = list}) + end + }; + + Cape = { + Prefix = Settings.Prefix; + Commands = {"cape";"givecape";}; + Args = {"player";"name/color";"material";"reflectance";"id";}; + Hidden = false; + Description = "Gives the target player(s) the cape specified, do Settings.Prefixcapes to view a list of available capes "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local color="White" + if pcall(function() return BrickColor.new(args[2]) end) then color = args[2] end + local mat = args[3] or "Fabric" + local ref = args[4] + local id = args[5] + if args[2] and not args[3] then + for k,cape in pairs(Variables.Capes) do + if args[2]:lower()==cape.Name:lower() then + color = cape.Color + mat = cape.Material + ref = cape.Reflectance + id = cape.ID + end + end + end + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Functions.Cape(v,false,mat,color,id,ref) + end + end + }; + + UnCape = { + Prefix = Settings.Prefix; + Commands = {"uncape";"removecape";}; + Args = {"player";}; + Hidden = false; + Description = "Removes the target player(s)'s cape"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + Functions.UnCape(v) + end + end + }; + + Slippery = { + Prefix = Settings.Prefix; + Commands = {"slippery";"iceskate";"icewalk";"slide";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) slide when they walk"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local vel = service.New('BodyVelocity') + vel.Name = 'ADONIS_IceVelocity' + vel.maxForce = Vector3.new(5000,0,5000) + local scr = Deps.Assets.Slippery:Clone() + + scr.Name = "ADONIS_IceSkates" + + for i, v in pairs(service.GetPlayers(plr, args[1]:lower())) do + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + local vel = vel:Clone() + vel.Parent = v.Character.HumanoidRootPart + local new = scr:Clone() + new.Parent = v.Character.HumanoidRootPart + new.Disabled = false + end + end + + scr:Destroy() + end + }; + + UnSlippery = { + Prefix = Settings.Prefix; + Commands = {"unslippery","uniceskate","unslide"}; + Args = {"player";}; + Hidden = false; + Description = "Get sum friction all up in yo step"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr, args[1]:lower())) do + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + local scr = v.Character.HumanoidRootPart:FindFirstChild("ADONIS_IceSkates") + local vel = v.Character.HumanoidRootPart:FindFirstChild("ADONIS_IceVelocity") + if vel then vel:Destroy() end + if scr then scr.Disabled = true scr:Destroy() end + end + end + end + }; + + NoClip = { + Prefix = Settings.Prefix; + Commands = {"noclip";}; + Args = {"player";}; + Hidden = false; + Description = "NoClips the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local clipper = Deps.Assets.Clipper:Clone() + clipper.Name = "ADONIS_NoClip" + + for i,p in pairs(service.GetPlayers(plr,args[1])) do + Admin.RunCommand(Settings.Prefix.."clip",p.Name) + local new = clipper:Clone() + new.Parent = p.Character.Humanoid + new.Disabled = false + end + end + }; + + FlyNoClip = { + Prefix = Settings.Prefix; + Commands = {"flynoclip";"oldnoclip";}; + Args = {"player";}; + Hidden = false; + Description = "Old flying NoClip"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local scr = Deps.Assets.FlyClipper:Clone() + scr.Name = "ADONIS_NoClip" + + local enabled = service.New("BoolValue",{ + Parent = scr; + Value = true; + Name = "Enabled"; + }) + + for i,p in pairs(service.GetPlayers(plr,args[1])) do + Admin.RunCommand(Settings.Prefix.."clip",p.Name) + local new = scr:Clone() + new.Parent = p.Character.Humanoid + new.Disabled = false + end + end + }; + + Clip = { + Prefix = Settings.Prefix; + Commands = {"clip";"unnoclip";}; + Args = {"player";}; + Hidden = false; + Description = "Un-NoClips the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,p in pairs(service.GetPlayers(plr,args[1])) do + local old = p.Character.Humanoid:FindFirstChild("ADONIS_NoClip") + if old then + local enabled = old:FindFirstChild("Enabled") + if enabled then + enabled.Value = false + wait(0.5) + end + old.Parent = nil + wait(0.5) + old:Destroy() + end + end + end + }; + + Jail = { + Prefix = Settings.Prefix; + Commands = {"jail";"imprison";}; + Args = {"player";}; + Hidden = false; + Description = "Jails the target player(s), removing their tools until they are un-jailed"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr, args[1])) do + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + local cf = CFrame.new(v.Character.HumanoidRootPart.CFrame.p + Vector3.new(0,1,0)) + local origpos = v.Character.HumanoidRootPart.Position + + local mod = service.New("Model", service.Workspace) + mod.Name = v.Name .. "_ADONISJAIL" + local top = service.New("Part", mod) + top.Locked = true + --top.formFactor = "Symmetric" + top.Size = Vector3.new(6,1,6) + top.TopSurface = 0 + top.BottomSurface = 0 + top.Anchored = true + top.CanCollide = true; + top.BrickColor = BrickColor.new("Really black") + top.Transparency = 1 + top.CFrame = cf * CFrame.new(0,3.5,0) + local bottom = top:Clone() + bottom.Transparency = 0 + bottom.Parent = mod + bottom.CanCollide = true + bottom.CFrame = cf * CFrame.new(0,-3.5,0) + local front = top:Clone() + front.Transparency = 1 + front.Reflectance = 0 + front.Parent = mod + front.Size = Vector3.new(6,6,1) + front.CFrame = cf * CFrame.new(0,0,-3) + local back = front:Clone() + back.Transparency = 1 + back.Parent = mod + back.CFrame = cf * CFrame.new(0,0,3) + local right = front:Clone() + right.Transparency = 1 + right.Parent = mod + right.Size = Vector3.new(1,6,6) + right.CFrame = cf * CFrame.new(3,0,0) + local left = right:Clone() + left.Transparency = 1 + left.Parent = mod + left.CFrame = cf * CFrame.new(-3,0,0) + local msh = service.New("BlockMesh", front) + msh.Scale = Vector3.new(1,1,0) + local msh2 = msh:Clone() + msh2.Parent = back + local msh3 = msh:Clone() + msh3.Parent = right + msh3.Scale = Vector3.new(0,1,1) + local msh4 = msh3:Clone() + msh4.Parent = left + local brick = service.New('Part',mod) + local box = service.New('SelectionBox',brick) + box.Adornee = brick + box.Color = BrickColor.new('White') + brick.Anchored = true + brick.CanCollide = false + brick.Transparency = 1 + brick.Size = Vector3.new(5,7,5) + brick.CFrame = cf + --table.insert(Variables.Objects, mod) + + local value = service.New('StringValue',mod) + value.Name = 'Player' + value.Value = v.Name + + v.Character.HumanoidRootPart.CFrame = cf + + local ind = tostring(v.userId) + local jail = { + Player = v; + Name = v.Name; + Index = ind; + Jail = mod; + Tools = {}; + } + + Variables.Jails[ind] = jail + + for l,k in pairs(v.Backpack:GetChildren()) do + if k:IsA("Tool") or k:IsA("HopperBin") then + table.insert(jail.Tools,k) + k.Parent = nil + end + end + + service.TrackTask("Thread: JailLoop"..tostring(ind), function() + while wait() and Variables.Jails[ind] == jail and mod.Parent == service.Workspace do + if Variables.Jails[ind] == jail and v.Parent == service.Players then + if v.Character then + local torso = v.Character:FindFirstChild('HumanoidRootPart') + if torso then + for l,k in pairs(v.Backpack:GetChildren()) do + if k:IsA("Tool") or k:IsA("HopperBin") then + table.insert(jail.Tools,k) + k.Parent = nil + end + end + if (torso.Position-origpos).magnitude>3.3 then + torso.CFrame = cf + end + end + end + elseif Variables.Jails[ind] ~= jail then + mod:Destroy() + break; + end + end + + mod:Destroy() + end) + end + end + end + }; + + UnJail = { + Prefix = Settings.Prefix; + Commands = {"unjail";"free";"release";}; + Args = {"player";}; + Hidden = false; + Description = "UnJails the target player(s) and returns any tools that were taken from them while jailed"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local found = false + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local ind = tostring(v.userId) + local jail = Variables.Jails[ind] + if jail then + --service.StopLoop(ind.."JAIL") + Pcall(function() + for i,tool in pairs(jail.Tools) do + tool.Parent = v.Backpack + end + end) + Pcall(function() jail.Jail:Destroy() end) + Variables.Jails[ind] = nil + found = true + end + end + + if not found then + for i,v in next,Variables.Jails do + if v.Name:lower():sub(1,#args[1]) == args[1]:lower() then + local ind = v.Index + service.StopLoop(ind.."JAIL") + Pcall(function() v.Jail:Destroy() end) + Variables.Jails[ind] = nil + end + end + end + end + }; + + BubbleChat = { + Prefix = Settings.Prefix; + Commands = {"bchat";"dchat";"bubblechat";"dialogchat";}; + Args = {"player";"color(red/green/blue/off)";}; + Description = "Gives the target player(s) a little chat gui, when used will let them chat using dialog bubbles"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local color = Enum.ChatColor.Red + if not args[2] then + color = Enum.ChatColor.Red + elseif args[2]:lower()=='red' then + color = Enum.ChatColor.Red + elseif args[2]:lower()=='green' then + color = Enum.ChatColor.Green + elseif args[2]:lower()=='blue' then + color = Enum.ChatColor.Blue + elseif args[2]:lower()=='off' then + color = "off" + end + for i,v in next,service.GetPlayers(plr,(args[1] or plr.Name)) do + Remote.MakeGui(v,"BubbleChat",{Color = color}) + end + end + }; + + Track = { + Prefix = Settings.Prefix; + Commands = {"track";"trace";"find";}; + Args = {"player";}; + Hidden = false; + Description = "Shows you where the target player(s) is/are"; + Fun = false; + Agents = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in next,service.GetPlayers(plr,args[1]) do + local bb = service.New('BillboardGui') + local la = service.New('SelectionPartLasso',bb) + local Humanoid = plr.Character:FindFirstChild("Humanoid") + local Part = v.Character:FindFirstChild("HumanoidRootPart") + if Part and Humanoid then + la.Part = Part + la.Humanoid = Humanoid + bb.Name = v.Name..'Tracker' + bb.Adornee = v.Character.Head + bb.AlwaysOnTop = true + bb.StudsOffset = Vector3.new(0,2,0) + bb.Size = UDim2.new(0,100,0,40) + local f = service.New('Frame',bb) + f.BackgroundTransparency = 1 + f.Size = UDim2.new(1,0,1,0) + local name = service.New('TextLabel',f) + name.Text = v.Name + name.BackgroundTransparency = 1 + name.Font = "Arial" + name.TextColor3 = Color3.new(1,1,1) + name.TextStrokeColor3 = Color3.new(0,0,0) + name.TextStrokeTransparency = 0 + name.Size = UDim2.new(1,0,0,20) + name.TextScaled = true + name.TextWrapped = true + local arrow = name:clone() + arrow.Parent = f + arrow.Position = UDim2.new(0,0,0,20) + arrow.Text = 'v' + Remote.MakeLocal(plr,bb,false,true) + local event;event = v.CharacterRemoving:connect(function() Remote.RemoveLocal(plr,v.Name..'Tracker') event:Disconnect() end) + local event2;event2 = plr.CharacterRemoving:connect(function() Remote.RemoveLocal(plr,v.Name..'Tracker') event2:Disconnect() end) + end + end + end + }; + + UnTrack = { + Prefix = Settings.Prefix; + Commands = {"untrack";"untrace";"unfind";}; + Args = {"player";}; + Hidden = false; + Description = "Stops tracking the target player(s)"; + Fun = false; + Agents = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[1]:lower() == Settings.SpecialPrefix.."all" then + Remote.RemoveLocal(plr,'Tracker',false,true) + else + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.RemoveLocal(plr,v.Name..'Tracker') + end + end + end + }; + + Glitch = { + Prefix = Settings.Prefix; + Commands = {"glitch";"glitchdisorient";"glitch1";"glitchy";"gd";}; + Args = {"player";"intensity";}; + Hidden = false; + Description = "Makes the target player(s)'s character teleport back and forth rapidly, quite trippy, makes bricks appear to move as the player turns their character"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local num = tostring(args[2] or 15) + local scr = Deps.Assets.Glitcher:Clone() + scr.Num.Value = num + scr.Type.Value = "trippy" + for i,v in pairs(service.GetPlayers(plr, args[1])) do + local new = scr:Clone() + if v.Character then + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + new.Parent = torso + new.Name = "Glitchify" + new.Disabled = false + end + end + end + end + }; + + Glitch2 = { + Prefix = Settings.Prefix; + Commands = {"ghostglitch";"glitch2";"glitchghost";"gg";}; + Args = {"player";"intensity";}; + Hidden = false; + Description = "The same as gd but less trippy, teleports the target player(s) back and forth in the same direction, making two ghost like images of the game"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local num = tostring(args[2] or 150) + local scr = Deps.Assets.Glitcher:Clone() + scr.Num.Value = num + scr.Type.Value = "ghost" + for i,v in pairs(service.GetPlayers(plr, args[1])) do + local new = scr:Clone() + if v.Character then + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + new.Parent = torso + new.Name = "Glitchify" + new.Disabled = false + end + end + end + end + }; + + Vibrate = { + Prefix = Settings.Prefix; + Commands = {"vibrate";"glitchvibrate";"gv";}; + Args = {"player";"intensity";}; + Hidden = false; + Description = "Kinda like gd, but teleports the player to four points instead of two"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local num = tostring(args[2] or 0.1) + local scr = Deps.Assets.Glitcher:Clone() + scr.Num.Value = num + scr.Type.Value = "vibrate" + for i,v in pairs(service.GetPlayers(plr, args[1])) do + local new = scr:Clone() + if v.Character then + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + local scr = torso:FindFirstChild("Glitchify") + if scr then scr:Destroy() end + new.Parent = torso + new.Name = "Glitchify" + new.Disabled = false + end + end + end + end + }; + + UnGlitch = { + Prefix = Settings.Prefix; + Commands = {"unglitch";"unglitchghost";"ungd";"ungg";"ungv";"unvibrate";}; + Args = {"player";}; + Hidden = false; + Description = "UnGlitchs the target player(s)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + local torso = v.Character:FindFirstChild("HumanoidRootPart") + if torso then + local scr = torso:FindFirstChild("Glitchify") + if scr then + scr:Destroy() + end + end + end + end + }; + + Phase = { + Prefix = Settings.Prefix; + Commands = {"phase";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the player(s) character completely local"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + Remote.MakeLocal(v,v.Character) + end + end + }; + + UnPhase = { + Prefix = Settings.Prefix; + Commands = {"unphase";}; + Args = {"player";}; + Hidden = false; + Description = "UnPhases the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + Remote.MoveLocal(v,v.Character.Name,false,service.Workspace) + v.Character.Parent = service.Workspace + end + end + }; + + GiveStarterPack = { + Prefix = Settings.Prefix; + Commands = {"startertools";"starttools";}; + Args = {"player";}; + Hidden = false; + Description = "Gives the target player(s) tools that are in the game's StarterPack"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + if v and v:findFirstChild("Backpack") then + for a,q in pairs(game.StarterPack:children()) do + local q = q:Clone() + if not q:FindFirstChild(Variables.CodeName) then + service.New("StringValue", q).Name = Variables.CodeName + end + q.Parent = v.Backpack + end + end + end + end + }; + + Sword = { + Prefix = Settings.Prefix; + Commands = {"sword";"givesword";}; + Args = {"player";}; + Hidden = false; + Description = "Gives the target player(s) a sword"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v:FindFirstChild("Backpack") then + local sword = service.Insert(125013769) + local config = sword:FindFirstChild("Configurations") + if config then + config.CanTeamkill.Value = true + end + sword.Parent = v.Backpack + end + end + end + }; + + Clone = { + Prefix = Settings.Prefix; + Commands = {"clone";"cloneplayer";}; + Args = {"player";}; + Hidden = false; + Description = "Clones the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + if v and v.Character and v.Character:FindFirstChild("Humanoid") then + v.Character.Archivable = true + local cl = v.Character:Clone() + table.insert(Variables.Objects,cl) + cl.Parent = game.Workspace + cl:MoveTo(v.Character:GetModelCFrame().p) + cl:MakeJoints() + cl:WaitForChild("Humanoid") + v.Character.Archivable = false + repeat wait(0.5) until not cl:FindFirstChild("Humanoid") or cl.Humanoid.Health <= 0 + wait(5) + if cl then cl:Destroy() end + end + end) + end + end + }; + + ClickTeleport = { + Prefix = Settings.Prefix; + Commands = {"clickteleport";"teleporttoclick";"ct";"clicktp";"forceteleport";"ctp";"ctt";}; + Args = {"player";}; + Hidden = false; + Description = "Gives you a tool that lets you click where you want the target player to stand, hold r to rotate them"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local scr = Deps.Assets.ClickTeleport:Clone() + scr.Mode.Value = "Teleport" + scr.Target.Value = v.Name + local tool = service.New('HopperBin') + service.New("StringValue",tool).Name = Variables.CodeName + scr.Parent = tool + scr.Disabled = false + tool.Parent = plr.Backpack + end + end + }; + + ClickWalk = { + Prefix = Settings.Prefix; + Commands = {"clickwalk";"cw";"ctw";"forcewalk";"walktool";"walktoclick";"clickcontrol";"forcewalk";}; + Args = {"player";}; + Hidden = false; + Description = "Gives you a tool that lets you click where you want the target player to walk, hold r to rotate them"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local scr = Deps.Assets.ClickTeleport:Clone() + scr.Mode.Value = "Walk" + scr.Target.Value = v.Name + local tool = service.New('HopperBin') + service.New("StringValue",tool).Name = Variables.CodeName + scr.Parent = tool + scr.Disabled = false + tool.Parent = plr.Backpack + end + end + }; + + BodySwap = { + Prefix = Settings.Prefix; + Commands = {"bodyswap";"bodysteal";"bswap";}; + Args = {"player1";"player2";}; + Hidden = false; + Description = "Swaps player1's and player2's bodies and tools"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + for i2,v2 in pairs(service.GetPlayers(plr,args[2])) do + local temptools=service.New('Model') + local tempcloths=service.New('Model') + local vpos=v.Character.HumanoidRootPart.CFrame + local v2pos=v2.Character.HumanoidRootPart.CFrame + local vface=v.Character.Head.face + local v2face=v2.Character.Head.face + vface.Parent=v2.Character.Head + v2face.Parent=v.Character.Head + for k,p in pairs(v.Character:children()) do + if p:IsA('BodyColors') or p:IsA('CharacterMesh') or p:IsA('Pants') or p:IsA('Shirt') or p:IsA('Accessory') then + p.Parent=tempcloths + elseif p:IsA('Tool') then + p.Parent=temptools + end + end + for k,p in pairs(v.Backpack:children()) do + p.Parent=temptools + end + for k,p in pairs(v2.Character:children()) do + if p:IsA('BodyColors') or p:IsA('CharacterMesh') or p:IsA('Pants') or p:IsA('Shirt') or p:IsA('Accessory') then + p.Parent=v.Character + elseif p:IsA('Tool') then + p.Parent=v.Backpack + end + end + for k,p in pairs(tempcloths:children()) do + p.Parent=v2.Character + end + for k,p in pairs(v2.Backpack:children()) do + p.Parent=v.Backpack + end + for k,p in pairs(temptools:children()) do + p.Parent=v2.Backpack + end + v2.Character.HumanoidRootPart.CFrame=vpos + v.Character.HumanoidRootPart.CFrame=v2pos + end + end + end + }; + + Control = { + Prefix = Settings.Prefix; + Commands = {"control";"takeover";}; + Args = {"player";}; + Hidden = false; + Description = "Lets you take control of the target player"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + if v.Character then + v.Character.Humanoid.PlatformStand = true + local w = service.New("Weld", plr.Character.HumanoidRootPart ) + w.Part0 = plr.Character.HumanoidRootPart + w.Part1 = v.Character.HumanoidRootPart + local w2 = service.New("Weld", plr.Character.Head) + w2.Part0 = plr.Character.Head + w2.Part1 = v.Character.Head + local w3 = service.New("Weld", plr.Character:findFirstChild("Right Arm")) + w3.Part0 = plr.Character:findFirstChild("Right Arm") + w3.Part1 = v.Character:findFirstChild("Right Arm") + local w4 = service.New("Weld", plr.Character:findFirstChild("Left Arm")) + w4.Part0 = plr.Character:findFirstChild("Left Arm") + w4.Part1 = v.Character:findFirstChild("Left Arm") + local w5 = service.New("Weld", plr.Character:findFirstChild("Right Leg")) + w5.Part0 = plr.Character:findFirstChild("Right Leg") + w5.Part1 = v.Character:findFirstChild("Right Leg") + local w6 = service.New("Weld", plr.Character:findFirstChild("Left Leg")) + w6.Part0 = plr.Character:findFirstChild("Left Leg") + w6.Part1 = v.Character:findFirstChild("Left Leg") + plr.Character.Head.face:Destroy() + for i, p in pairs(v.Character:children()) do + if p:IsA("BasePart") then + p.CanCollide = false + end + end + for i, p in pairs(plr.Character:children()) do + if p:IsA("BasePart") then + p.Transparency = 1 + elseif p:IsA("Accoutrement") then + p:Destroy() + end + end + v.Character.Parent = plr.Character + --v.Character.Humanoid.Changed:connect(function() v.Character.Humanoid.PlatformStand = true end) + end + end + end + }; + + Refresh = { + Prefix = Settings.Prefix; + Commands = {"refresh";"reset";}; + Args = {"player";}; + Hidden = false; + Description = "Refreshes the target player(s)'s character"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local pos = v.Character.HumanoidRootPart.CFrame + local temptools = {} + + pcall(function() v.Character.Humanoid:UnequipTools() end) + for k,t in pairs(v.Backpack:children()) do + if t:IsA('Tool') or t:IsA('HopperBin') then + table.insert(temptools,t) + t.Parent = nil; + end + end + + v:LoadCharacter() + v.Character.HumanoidRootPart.CFrame = pos + + for d,f in pairs(v.Character:children()) do + if f:IsA('ForceField') then f:Destroy() end + end + + v:WaitForChild("Backpack") + v.Backpack:ClearAllChildren() + + for l,m in pairs(temptools) do + m.Parent = v.Backpack + end + end + end + }; + + Kill = { + Prefix = Settings.Prefix; + Commands = {"kill";}; + Args = {"player";}; + Hidden = false; + Description = "Kills the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + v.Character:BreakJoints() + end + end + }; + + Respawn = { + Prefix = Settings.Prefix; + Commands = {"respawn";"re"}; + Args = {"player";}; + Hidden = false; + Description = "Repsawns the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + v:LoadCharacter() + Remote.Send(v,'Function','SetView','reset') + end + end + }; + + Trip = { + Prefix = Settings.Prefix; + Commands = {"trip";}; + Args = {"player";"angle";}; + Hidden = false; + Description = "Rotates the target player(s) by 180 degrees or the angle you server"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local angle = 130 or args[2] + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("HumanoidRootPart") then + v.Character.HumanoidRootPart.CFrame = v.Character.HumanoidRootPart.CFrame * CFrame.Angles(0,0,math.rad(angle)) + end + end + end + }; + + Stun = { + Prefix = Settings.Prefix; + Commands = {"stun";}; + Args = {"player";}; + Hidden = false; + Description = "Stuns the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:FindFirstChild("Humanoid") then + v.Character.Humanoid.PlatformStand = true + end + end + end + }; + + UnStun = { + Prefix = Settings.Prefix; + Commands = {"unstun";}; + Args = {"player";}; + Hidden = false; + Description = "UnStuns the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:FindFirstChild("Humanoid") then + v.Character.Humanoid.PlatformStand = false + end + end + end + }; + + Jump = { + Prefix = Settings.Prefix; + Commands = {"jump";}; + Args = {"player";}; + Hidden = false; + Description = "Forces the target player(s) to jump"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.Jump = true + end + end + end + }; + + Sit = { + Prefix = Settings.Prefix; + Commands = {"sit";"seat";}; + Args = {"player";}; + Hidden = false; + Description = "Forces the target player(s) to sit"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.Sit = true + end + end + end + }; + + Invisible = { + Prefix = Settings.Prefix; + Commands = {"invisible";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) invisible"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in next,service.GetPlayers(plr,args[1]) do + if v.Character then + for a, obj in next,v.Character:GetChildren() do + if obj:IsA("BasePart") then + obj.Transparency = 1 + if obj:findFirstChild("face") then + obj.face.Transparency = 1 + end + elseif obj:IsA("Accoutrement") and obj:findFirstChild("Handle") then + obj.Handle.Transparency = 1 + elseif obj:IsA("ForceField") then + obj.Visible = false + elseif obj.Name == "Head" then + local face = obj:FindFirstChildOfClass("Decal") + if face then + face.Transparency = 1 + end + end + end + end + end + end + }; + + Visible = { + Prefix = Settings.Prefix; + Commands = {"visible";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s) visible"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in next,service.GetPlayers(plr,args[1]) do + if v.Character then + for a, obj in next,v.Character:GetChildren() do + if obj:IsA("BasePart") and obj.Name~='HumanoidRootPart' then + obj.Transparency = 0 + if obj:findFirstChild("face") then + obj.face.Transparency = 0 + end + elseif obj:IsA("Accoutrement") and obj:findFirstChild("Handle") then + obj.Handle.Transparency = 0 + elseif obj:IsA("ForceField") then + obj.Visible = true + elseif obj.Name == "Head" then + local face = obj:FindFirstChildOfClass("Decal") + if face then + face.Transparency = 0 + end + end + end + end + end + end + }; + + Lock = { + Prefix = Settings.Prefix; + Commands = {"lock";}; + Args = {"player";}; + Hidden = false; + Description = "Locks the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character then + for a, obj in pairs(v.Character:children()) do + if obj:IsA("BasePart") then + obj.Locked = true + elseif obj:IsA("Accoutrement") and obj:findFirstChild("Handle") then + obj.Handle.Locked = true + end + end + end + end + end + }; + + UnLock = { + Prefix = Settings.Prefix; + Commands = {"unlock";}; + Args = {"player";}; + Hidden = false; + Description = "UnLocks the the target player(s), makes it so you can use btools on them"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character then + for a, obj in pairs(v.Character:children()) do + if obj:IsA("BasePart") then + obj.Locked = false + elseif obj:IsA("Accoutrement") and obj:findFirstChild("Handle") then + obj.Handle.Locked = false + end + end + end + end + end + }; + + Explode = { + Prefix = Settings.Prefix; + Commands = {"explode";"boom";"boomboom";}; + Args = {"player";"radius"}; + Hidden = false; + Description = "Explodes the target player(s)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + local ex = service.New("Explosion", game.Workspace) + ex.Position = v.Character.HumanoidRootPart.Position + ex.BlastRadius = args[2] or 20 + end + end + end + }; + + Light = { + Prefix = Settings.Prefix; + Commands = {"light";}; + Args = {"player";"color";}; + Hidden = false; + Description = "Makes a PointLight on the target player(s) with the color specified"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local str = BrickColor.new('Bright blue').Color + + if args[2] then + local teststr = args[2] + if BrickColor.new(teststr) ~= nil then str = BrickColor.new(teststr).Color end + end + + for i, v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + Functions.NewParticle(v.Character.HumanoidRootPart,"PointLight",{ + Name = "ADONIS_LIGHT"; + Color = str; + Brightness = 5; + Range = 15; + }) + end + end + end + }; + + UnLight = { + Prefix = Settings.Prefix; + Commands = {"unlight";}; + Args = {"player";}; + Hidden = false; + Description = "UnLights the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + Functions.RemoveParticle(v.Character.HumanoidRootPart,"ADONIS_LIGHT") + end + end + end + }; + + Oddliest = { + Prefix = Settings.Prefix; + Commands = {"oddliest";}; + Args = {"player";}; + Hidden = false; + Description = "Turns you into the one and only Oddliest"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Admin.RunCommand(Settings.Prefix.."char",v.Name,"51310503") + end + end + }; + + Sceleratis = { + Prefix = Settings.Prefix; + Commands = {"sceleratis";}; + Args = {"player";}; + Hidden = false; + Description = "Turns you into me <3"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Admin.RunCommand(Settings.Prefix.."char",v.Name,"1237666") + end + end + }; + + HatPets = { + Prefix = Settings.Prefix; + Commands = {"hatpets";}; + Args = {"player";"number[50 MAX]/destroy";}; + Hidden = false; + Description = "Gives the target player(s) hat pets, controled using the !pets command."; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if args[2] and args[2]:lower()=='destroy' then + local hats = v.Character:FindFirstChild('ADONIS_HAT_PETS') + if hats then hats:Destroy() end + else + local num = tonumber(args[2]) or 5 + if num>50 then num = 50 end + if v.Character:FindFirstChild('HumanoidRootPart') then + local m = v.Character:FindFirstChild('ADONIS_HAT_PETS') + local mode + local obj + local hat + if not m then + m = service.New('Model',v.Character) + m.Name = 'ADONIS_HAT_PETS' + table.insert(Variables.Objects,m) + mode = service.New('StringValue',m) + mode.Name = 'Mode' + mode.Value = 'Follow' + obj = service.New('ObjectValue',m) + obj.Name = 'Target' + obj.Value = v.Character.HumanoidRootPart + + local scr = Deps.Assets.HatPets:Clone() + scr.Parent = m + scr.Disabled = false + else + mode = m.Mode + obj = m.Target + end + + for l,h in pairs(v.Character:children()) do + if h:IsA('Accessory') then + hat = h + break + end + end + + if hat then + for k = 1,num do + local cl = hat.Handle:clone() + cl.Name = k + cl.CanCollide = false + cl.Anchored = false + cl.Parent = m + cl:BreakJoints() + local att = cl:FindFirstChild("HatAttachment") + if att then att:Destroy() end + local bpos = service.New("BodyPosition",cl) + bpos.Name = 'bpos' + bpos.position = obj.Value.Position + bpos.maxForce = bpos.maxForce * 10 + end + end + end + end + end + end + }; + + Pets = { + Prefix = Settings.PlayerPrefix; + Commands = {"pets";}; + Args = {"follow/float/swarm/attack";"player";}; + Hidden = false; + Description = "Makes your hat pets do the specified command (follow/float/swarm/attack)"; + Fun = true; + AdminLevel = "Players"; + Function = function(plr,args) + local hats = plr.Character:FindFirstChild('ADONIS_HAT_PETS') + if hats then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + if v.Character:FindFirstChild('HumanoidRootPart') and v.Character.HumanoidRootPart:IsA('Part') then + if args[1]:lower()=='follow' then + hats.Mode.Value='Follow' + hats.Target.Value=v.Character.HumanoidRootPart + elseif args[1]:lower()=='float' then + hats.Mode.Value='Float' + hats.Target.Value=v.Character.HumanoidRootPart + elseif args[1]:lower()=='swarm' then + hats.Mode.Value='Swarm' + hats.Target.Value=v.Character.HumanoidRootPart + elseif args[1]:lower()=='attack' then + hats.Mode.Value='Attack' + hats.Target.Value=v.Character.HumanoidRootPart + end + end + end + else + Functions.Hint("You don't have any hat pets! If you are an admin use the :hatpets command to get some",{plr}) + end + end + }; + + Ambient = { + Prefix = Settings.Prefix; + Commands = {"ambient";}; + Args = {"num,num,num";"optional player"}; + Hidden = false; + Description = "Change Ambient"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local r,g,b = 1,1,1 + if args[1] and args[1]:match("(.*),(.*),(.*)") then + r,g,b = args[1]:match("(.*),(.*),(.*)") + end + r,g,b = tonumber(r),tonumber(g),tonumber(b) + if not r or not g or not b then error("Invalid Input") end + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"Ambient",Color3.new(r,g,b)) + end + else + Functions.SetLighting("Ambient",Color3.new(r,g,b)) + end + end + }; + + OutdoorAmbient = { + Prefix = Settings.Prefix; + Commands = {"oambient";"outdoorambient";}; + Args = {"num,num,num";"optional player"}; + Hidden = false; + Description = "Change OutdoorAmbient"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local r,g,b = 1,1,1 + if args[1] and args[1]:match("(.*),(.*),(.*)") then + r,g,b = args[1]:match("(.*),(.*),(.*)") + end + r,g,b = tonumber(r),tonumber(g),tonumber(b) + if not r or not g or not b then error("Invalid Input") end + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"OutdoorAmbient",Color3.new(r,g,g)) + end + else + Functions.SetLighting("OutdoorAmbient",Color3.new(r,g,b)) + end + end + }; + + RemoveFog = { + Prefix = Settings.Prefix; + Commands = {"nofog";"fogoff";}; + Args = {"optional player"}; + Hidden = false; + Description = "Fog Off"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[1] then + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.SetLighting(v,"FogEnd",1000000000000) + end + else + Functions.SetLighting("FogEnd",1000000000000) + end + end + }; + + Shadows = { + Prefix = Settings.Prefix; + Commands = {"shadows";}; + Args = {"on/off";"optional player"}; + Hidden = false; + Description = "Determines if shadows are on or off"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[1]:lower()=='on' or args[1]:lower()=="true" then + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"GlobalShadows",true) + end + else + Functions.SetLighting("GlobalShadows",true) + end + elseif args[1]:lower()=='off' or args[1]:lower()=="false" then + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"GlobalShadows",false) + end + else + Functions.SetLighting("GlobalShadows",false) + end + end + end + }; + + Outlines = { + Prefix = Settings.Prefix; + Commands = {"outlines";}; + Args = {"on/off";"optional player"}; + Hidden = false; + Description = "Determines if outlines are on or off"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[1]:lower()=='on' or args[1]:lower()=="true" then + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"Outlines",true) + end + else + Functions.SetLighting("Outlines",true) + end + elseif args[1]:lower()=='off' or args[1]:lower()=="false" then + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"Outlines",false) + end + else + Functions.SetLighting("Outlines",false) + end + end + end + }; + + Brightness = { + Prefix = Settings.Prefix; + Commands = {"brightness";}; + Args = {"number";"optional player"}; + Hidden = false; + Description = "Change Brightness"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"Brightness",args[1]) + end + else + Functions.SetLighting("Brightness",args[1]) + end + end + }; + + Time = { + Prefix = Settings.Prefix; + Commands = {"time";"timeofday";}; + Args = {"time";"optional player"}; + Hidden = false; + Description = "Change Time"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[2] then + for i,v in pairs(service.GetPlayers(plr,args[2])) do + Remote.SetLighting(v,"TimeOfDay",args[1]) + end + else + Functions.SetLighting("TimeOfDay",args[1]) + end + end + }; + + + FogColor = { + Prefix = Settings.Prefix; + Commands = {"fogcolor";}; + Args = {"num";"num";"num";"optional player"}; + Hidden = false; + Description = "Fog Color"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[4] then + for i,v in pairs(service.GetPlayers(plr,args[4])) do + Remote.SetLighting(v,"FogColor",Color3.new(args[1],args[2],args[3])) + end + else + Functions.SetLighting("FogColor",Color3.new(args[1],args[2],args[3])) + end + end + }; + + FogStartEnd = { + Prefix = Settings.Prefix; + Commands = {"fog";}; + Args = {"start";"end";"optional player"}; + Hidden = false; + Description = "Fog Start/End"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[3] then + for i,v in pairs(service.GetPlayers(plr,args[3])) do + Remote.SetLighting(v,"FogEnd",args[2]) + Remote.SetLighting(v,"FogStart",args[1]) + end + else + Functions.SetLighting("FogEnd",args[2]) + Functions.SetLighting("FogStart",args[1]) + end + end + }; + + BuildingTools = { + Prefix = Settings.Prefix; + Commands = {"btools";"buildtools";"buildingtools";"buildertools";}; + Args = {"player";}; + Hidden = false; + Description = "Gives the target player(s) basic building tools and the F3X tool"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + local f3x = service.New("Tool") + f3x.CanBeDropped = false + f3x.ManualActivationOnly = false + f3x.ToolTip = "Building Tools by F3X" + for k,m in pairs(Deps.Assets['F3X Deps']:GetChildren()) do + m:Clone().Parent = f3x + end + f3x.Name='Building Tools' + service.New("StringValue",f3x).Name = Variables.CodeName + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + --Send.Remote(v,"Function","setEffectVal","AntiDeleteTool",false) + if v:findFirstChild("Backpack") then + f3x:Clone().Parent = v.Backpack + end + end + end + }; + + StarterGive = { + Prefix = Settings.Prefix; + Commands = {"startergive";}; + Args = {"player";"toolname";}; + Hidden = false; + Description = "Places the desired tool into the target player(s)'s StarterPack"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local found = {} + local temp = service.New("Folder") + for a, tool in pairs(Settings.Storage:GetChildren()) do + if tool:IsA("Tool") or tool:IsA("HopperBin") then + if args[2]:lower() == "all" or tool.Name:lower():sub(1,#args[2])==args[2]:lower() then + tool.Archivable = true + local parent = tool.Parent + if not parent.Archivable then + tool.Parent = temp + end + table.insert(found,tool:Clone()) + tool.Parent = parent + end + end + end + if #found>0 then + for i,v in pairs(service.GetPlayers(plr,args[1])) do + for k,t in pairs(found) do + t:Clone().Parent = v.StarterGear + end + end + else + error("Couldn't find anything to give") + end + if temp then + temp:Destroy() + end + end + }; + + StarterRemove = { + Prefix = Settings.Prefix; + Commands = {"starterremove";}; + Args = {"player";"toolname";}; + Hidden = false; + Description = "Removes the desired tool from the target player(s)'s StarterPack"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i, v in pairs(service.GetPlayers(plr, args[1]:lower())) do + if v:findFirstChild("StarterGear") then + for a,tool in pairs(v.StarterGear:children()) do + if tool:IsA("Tool") or tool:IsA("HopperBin") then + if args[2]:lower() == "all" or tool.Name:lower():find(args[2]:lower()) == 1 then + tool:Destroy() + end + end + end + end + end + end + }; + + Give = { + Prefix = Settings.Prefix; + Commands = {"give";"tool";}; + Args = {"player";"tool";}; + Hidden = false; + Description = "Gives the target player(s) the desired tool(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local found = {} + local temp = service.New("Folder") + for a, tool in pairs(Settings.Storage:GetChildren()) do + if tool:IsA("Tool") or tool:IsA("HopperBin") then + if args[2]:lower() == "all" or tool.Name:lower():sub(1,#args[2])==args[2]:lower() then + tool.Archivable = true + local parent = tool.Parent + if not parent.Archivable then + tool.Parent = temp + end + table.insert(found,tool:Clone()) + tool.Parent = parent + end + end + end + if #found>0 then + for i,v in pairs(service.GetPlayers(plr,args[1])) do + for k,t in pairs(found) do + t:Clone().Parent = v.Backpack + end + end + else + error("Couldn't find anything to give") + end + if temp then + temp:Destroy() + end + end + }; + + Steal = { + Prefix = Settings.Prefix; + Commands = {"steal";"stealtools";}; + Args = {"player1";"player2";}; + Hidden = false; + Description = "Steals player1's tools and gives them to player2"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local p1 = service.GetPlayers(plr, args[1]) + local p2 = service.GetPlayers(plr, args[2]) + for i,v in pairs(p1) do + for k,m in pairs(p2) do + for j,n in pairs(v.Backpack:children()) do + local b = n:clone() + n.Parent = m.Backpack + end + end + v.Backpack:ClearAllChildren() + end + end + }; + + RemoveGuis = { + Prefix = Settings.Prefix; + Commands = {"removeguis";"noguis";}; + Args = {"player";}; + Hidden = false; + Description = "Remove the target player(s)'s screen guis"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.LoadCode(v,[[for i,v in pairs(service.PlayerGui:GetChildren()) do if not client.Core.GetGui(v) then v:Destroy() end end]]) + end + end + }; + + RemoveTools = { + Prefix = Settings.Prefix; + Commands = {"removetools";"notools";}; + Args = {"player";}; + Hidden = false; + Description = "Remove the target player(s)'s tools"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v:findFirstChild("Backpack") then + for a, tool in pairs(v.Character:children()) do if tool:IsA("Tool") or tool:IsA("HopperBin") then tool:Destroy() end end + for a, tool in pairs(v.Backpack:children()) do if tool:IsA("Tool") or tool:IsA("HopperBin") then tool:Destroy() end end + end + end + end + }; + + Rank = { + Prefix = Settings.Prefix; + Commands = {"rank";"getrank";}; + Args = {"player";"groupID";}; + Hidden = false; + Description = "Shows you what rank the target player(s) are in the group specified by groupID"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v:IsInGroup(args[2]) then + Functions.Hint("[" .. v:GetRankInGroup(args[2]) .. "] " .. v:GetRoleInGroup(args[2]), {plr}) + elseif not v:IsInGroup(args[2])then + Functions.Hint(v.Name .. " is not in the group " .. args[2], {plr}) + end + end + end + }; + + Damage = { + Prefix = Settings.Prefix; + Commands = {"damage";"hurt";}; + Args = {"player";"number";}; + Hidden = false; + Description = "Removes HP from the target player(s)"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:FindFirstChild("Humanoid") then + v.Character.Humanoid:TakeDamage(args[2]) + end + end + end + }; + + RestoreGravity = { + Prefix = Settings.Prefix; + Commands = {"grav";"bringtoearth";}; + Args = {"player";}; + Hidden = false; + Description = "Makes the target player(s)'s gravity normal"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("HumanoidRootPart") then + for a, frc in pairs(v.Character.HumanoidRootPart:children()) do + if frc.Name == "ADONIS_GRAVITY" then + frc:Destroy() end + end + end + end + end + }; + + SetGravity = { + Prefix = Settings.Prefix; + Commands = {"setgrav";"gravity";"setgravity";}; + Args = {"player";"number";}; + Hidden = false; + Description = "Set the target player(s)'s gravity"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("HumanoidRootPart") then + for a, frc in pairs(v.Character.HumanoidRootPart:children()) do + if frc.Name == "ADONIS_GRAVITY" then + frc:Destroy() + end + end + + local frc = service.New("BodyForce", v.Character.HumanoidRootPart) + frc.Name = "ADONIS_GRAVITY" + frc.force = Vector3.new(0,0,0) + for a, prt in pairs(v.Character:children()) do + if prt:IsA("BasePart") then + frc.force = frc.force - Vector3.new(0,prt:GetMass()*tonumber(args[2]),0) + elseif prt:IsA("Accoutrement") then + frc.force = frc.force - Vector3.new(0,prt.Handle:GetMass()*tonumber(args[2]),0) + end + end + end + end + end + }; + + NoGravity = { + Prefix = Settings.Prefix; + Commands = {"nograv";"nogravity";"superjump";}; + Args = {"player";}; + Hidden = false; + Description = "NoGrav the target player(s)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v and v.Character and v.Character:findFirstChild("HumanoidRootPart") then + for a, frc in pairs(v.Character.HumanoidRootPart:children()) do + if frc.Name == "ADONIS_GRAVITY" then + frc:Destroy() + end + end + + local frc = service.New("BodyForce", v.Character.HumanoidRootPart) + frc.Name = "ADONIS_GRAVITY" + frc.force = Vector3.new(0,0,0) + for a, prt in pairs(v.Character:children()) do + if prt:IsA("BasePart") then + frc.force = frc.force + Vector3.new(0,prt:GetMass()*196.25,0) + elseif prt:IsA("Accoutrement") then + frc.force = frc.force + Vector3.new(0,prt.Handle:GetMass()*196.25,0) + end + end + end + end + end + }; + + SetHealth = { + Prefix = Settings.Prefix; + Commands = {"health";"sethealth";}; + Args = {"player";"number";}; + Hidden = false; + Description = "Set the target player(s)'s health to "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v and v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.MaxHealth = args[2] + v.Character.Humanoid.Health = v.Character.Humanoid.MaxHealth + end + end + end + }; + + JumpPower = { + Prefix = Settings.Prefix; + Commands = {"jpower";"jpow";"jumppower";}; + Args = {"player";"number";}; + Hidden = false; + Description = "Set the target player(s)'s JumpPower to "; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.JumpPower = args[2] or 60 + end + end + end + }; + + Speed = { + Prefix = Settings.Prefix; + Commands = {"speed";"setspeed";"walkspeed";"ws"}; + Args = {"player";"number";}; + Hidden = false; + Description = "Set the target player(s)'s WalkSpeed to "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1],"Argument missing or nil") + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character and v.Character:findFirstChild("Humanoid") then + v.Character.Humanoid.WalkSpeed = args[2] or 16 + end + end + end + }; + + SetTeam = { + Prefix = Settings.Prefix; + Commands = {"team";"setteam";"changeteam";}; + Args = {"player";"team";}; + Hidden = false; + Description = "Set the target player(s)'s team to "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2],"Argument missing or nil") + for i,v in pairs(service.GetPlayers(plr,args[1])) do + for a, tm in pairs(service.Teams:children()) do + if tm.Name:lower():sub(1,#args[2]) == args[2]:lower() then + v.Team = tm + end + end + end + end + }; + + RandomTeam = { + Prefix = Settings.Prefix; + Commands = {"rteams","rteam","randomizeteams","randomteams","randomteam"}; + Args = {"players","teams"}; + Hidden = false; + Description = "Randomize teams; :rteams or :rteams all or :rteams nonadmins team1,team2,etc"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local tArgs = {} + local teams = {} + local players = service.GetPlayers(plr,args[1] or "all") + local cTeam = 1 + + local function assign() + local pIndex = math.random(1,#players) + local player = players[pIndex] + local team = teams[cTeam] + + cTeam = cTeam+1 + if cTeam > #teams then + cTeam = 1 + end + + if player and player.Parent then + player.Team = team + end + + table.remove(players,pIndex) + if #players > 0 then + assign() + end + end + + if args[2] then + for s in args[2]:gmatch("(%w+)") do + table.insert(tArgs,s) + end + end + + + for i,team in pairs(service.Teams:GetChildren()) do + if #tArgs > 0 then + for ind,check in pairs(tArgs) do + if team.Name:lower():sub(1,#check) == check:lower() then + table.insert(teams,team) + end + end + else + table.insert(teams,team) + end + end + + cTeam = math.random(1,#teams) + assign() + end + }; + + NewTeam = { + Prefix = Settings.Prefix; + Commands = {"newteam","createteam","maketeam"}; + Args = {"name";"BrickColor";}; + Hidden = false; + Description = "Make a new team with the specified name and color"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + local color = BrickColor.new(math.random(1,227)) + if BrickColor.new(args[2])~=nil then color=BrickColor.new(args[2]) end + local team = service.New("Team", service.Teams) + team.Name = args[1] + team.AutoAssignable = false + team.TeamColor = color + end + }; + + RemoveTeam = { + Prefix = Settings.Prefix; + Commands = {"removeteam";}; + Args = {"name";}; + Hidden = false; + Description = "Remove the specified team"; + Fun = false; + AdminLevel = "Admins"; + Function = function(plr,args) + for i,v in pairs(service.Teams:children()) do + if v:IsA("Team") and v.Name:lower():sub(1,#args[1])==args[1]:lower() then + v:Destroy() + end + end + end + }; + + SetFOV = { + Prefix = Settings.Prefix; + Commands = {"fov";"fieldofview";"setfov"}; + Args = {"player";"number";}; + Hidden = false; + Description = "Set the target player(s)'s field of view to (min 1, max 120)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + assert(args[1] and args[2] and tonumber(args[2]), "Argument missing or invalid") + for i,v in next,service.GetPlayers(plr, args[1]) do + Remote.LoadCode(v,[[workspace.CurrentCamera.FieldOfView=]].. math.clamp(tonumber(args[2]), 1, 120)) + end + end + }; + + ForcePlace = { + Prefix = Settings.Prefix; + Commands = {"forceplace";}; + Args = {"player";"placeid/serverName";}; + Hidden = false; + Description = "Force the target player(s) to teleport to the desired place"; + Fun = false; + AdminLevel = "Creators"; + Function = function(plr,args) + local id = tonumber(args[2]) + local players = service.GetPlayers(plr,args[1]) + local servers = Core.GetData("PrivateServers") or {} + local code = servers[args[2]] + if code then + for i,v in pairs(players) do + service.TeleportService:TeleportToPrivateServer(code.ID,code.Code,{v}) + end + elseif id then + for i,v in pairs(players) do + service.TeleportService:Teleport(args[2], v) + end + else + error("Invalid place ID/server name") + end + end + }; + + Place = { + Prefix = Settings.Prefix; + Commands = {"place";}; + Args = {"player";"placeID/serverName";}; + Hidden = false; + Description = "Teleport the target player(s) to the place belonging to or a reserved server"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local id = tonumber(args[2]) + local players = service.GetPlayers(plr,args[1]) + local servers = Core.GetData("PrivateServers") or {} + local code = servers[args[2]] + if code then + for i,v in pairs(players) do + Routine(function() + local tp = Remote.MakeGuiGet(v,"Notification",{ + Title = "Teleport", + Text = "Click to teleport to server "..args[2]..".", + Time = 30, + OnClick = Core.Bytecode("return true") + }) + if tp then + service.TeleportService:TeleportToPrivateServer(code.ID,code.Code,{v}) + end + end) + end + elseif id then + for i,v in pairs(players) do + Remote.MakeGui(v,"Notification",{ + Title = "Teleport", + Text = "Click to teleport to place "..args[2]..".", + Time = 30, + OnClick = Core.Bytecode("service.TeleportService:Teleport("..args[2]..")") + }) + end + else + Functions.Hint("Invalid place ID/server name",{plr}) + end + end + }; + + MakeServer = { + Prefix = Settings.Prefix; + Commands = {"makeserver";"reserveserver";"privateserver";}; + Args = {"serverName";"(optional) placeId";}; + Filter = true; + Description = "Makes a private server that you can teleport yourself and friends to using :place player(s) serverName; Will overwrite servers with the same name; Caps specific"; + AdminLevel = "Moderators"; + Function = function(plr,args) + local place = tonumber(args[2]) or game.PlaceId + local code = service.TeleportService:ReserveServer(place) + local servers = Core.GetData("PrivateServers") or {} + servers[args[1]] = {Code = code,ID = place} + Core.SetData("PrivateServers",servers) + Functions.Hint("Made server "..args[1].." | Place: "..place,{plr}) + end + }; + + DeleteServer = { + Prefix = Settings.Prefix; + Commands = {"delserver";"deleteserver"}; + Args = {"serverName";}; + Hidden = false; + Description = "Deletes a private server from the list."; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local servers = Core.GetData("PrivateServers") or {} + if servers[args[1]] then + servers[args[1]] = nil + Core.SetData("PrivateServers",servers) + Functions.Hint("Removed server "..args[1],{plr}) + else + Functions.Hint("Server "..args[1].." was not found!",{plr}) + end + end + }; + + ListServers = { + Prefix = Settings.Prefix; + Commands = {"servers";"privateservers";}; + Args = {}; + Hidden = false; + Description = "Shows you a list of private servers that were created with :makeserver"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local servers = Core.GetData("PrivateServers") or {} + local tab = {} + for i,v in pairs(servers) do + table.insert(tab,{Text = i,Desc = "Place: "..v.ID.." | Code: "..v.Code}) + end + Remote.MakeGui(plr,"List",{Title = "Servers",Table = tab}) + end + }; + + GRPlaza = { + Prefix = Settings.Prefix; + Commands = {"grplaza";"grouprecruitingplaza";"groupplaza";}; + Args = {"player";}; + Hidden = false; + Description = "Teleports the target player(s) to the Group Recruiting Plaza to look for potential group members"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.MakeGui(v,"Notification",{ + Title = "Teleport", + Text = "Click to teleport to GRP", + Time = 30, + OnClick = Core.Bytecode("service.TeleportService:Teleport(6194809)") + }) + end + end + }; + + BunnyHop = { + Prefix = Settings.Prefix; + Commands = {"bunnyhop";"bhop"}; + Args = {"player";}; + Hidden = false; + Description = "Makes the player jump, and jump... and jump. Just like the rabbit noobs you find in sf games ;)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + local bunnyScript = Deps.Assets.BunnyHop + bunnyScript.Name = "HippityHopitus" + local hat = service.Insert(110891941) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + hat:Clone().Parent = v.Character + local clone = bunnyScript:Clone() + clone.Parent = v.Character + clone.Disabled = false + end + end + }; + + UnBunnyHop = { + Prefix = Settings.Prefix; + Commands = {"unbunnyhop";}; + Args = {"player";}; + Hidden = false; + Description = "Stops the forced hippity hoppening"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local scrapt = v.Character:FindFirstChild("HippityHopitus") + if scrapt then + scrapt.Disabled = true + scrapt:Destroy() + end + end + end + }; + + Teleport = { + Prefix = Settings.Prefix; + Commands = {"tp";"teleport";"transport";}; + Args = {"player1";"player2";}; + Hidden = false; + Description = "Teleport player1(s) to player2, a waypoint, or specific coords, use :tp player1 waypoint-WAYPOINTNAME to use waypoints, x,y,z for coords"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + if args[2]:match('^waypoint%-(.*)') or args[2]:match('wp%-(.*)') then + local m = args[2]:match('^waypoint%-(.*)') or args[2]:match('wp%-(.*)') + local point + + for i,v in pairs(Variables.Waypoints) do + if i:lower():sub(1,#m)==m:lower() then + point=v + end + end + + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if point then + if v.Character.Humanoid.SeatPart~=nil then + Function.RemoveSeatWelds(v.Character.Humanoid.SeatPart) + end + if v.Character.Humanoid.Sit then + v.Character.Humanoid.Sit = false + v.Character.Humanoid.Jump = true + end + wait() + v.Character:MoveTo(point) + end + end + + if not point then Functions.Hint('Waypoint '..m..' was not found.',{plr}) end + elseif args[2]:find(',') then + local x,y,z = args[2]:match('(.*),(.*),(.*)') + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character.Humanoid.SeatPart~=nil then + Function.RemoveSeatWelds(v.Character.Humanoid.SeatPart) + end + if v.Character.Humanoid.Sit then + v.Character.Humanoid.Sit = false + v.Character.Humanoid.Jump = true + end + wait() + v.Character:MoveTo(Vector3.new(tonumber(x),tonumber(y),tonumber(z))) + end + else + local target = service.GetPlayers(plr,args[2])[1] + local players = service.GetPlayers(plr,args[1]) + if #players == 1 and players[1] == target then + local n = players[1] + if n.Character:FindFirstChild("HumanoidRootPart") and target.Character:FindFirstChild("HumanoidRootPart") then + if n.Character.Humanoid.SeatPart~=nil then + Function.RemoveSeatWelds(n.Character.Humanoid.SeatPart) + end + if n.Character.Humanoid.Sit then + n.Character.Humanoid.Sit = false + n.Character.Humanoid.Jump = true + end + wait() + n.Character.HumanoidRootPart.CFrame = (target.Character.HumanoidRootPart.CFrame*CFrame.Angles(0,math.rad(90/#players*1),0)*CFrame.new(5+.2*#players,0,0))*CFrame.Angles(0,math.rad(90),0) + end + else + for k,n in pairs(players) do + if n~=target then + if n.Character.Humanoid.SeatPart~=nil then + Function.RemoveSeatWelds(n.Character.Humanoid.SeatPart) + end + if n.Character.Humanoid.Sit then + n.Character.Humanoid.Sit = false + n.Character.Humanoid.Jump = true + end + wait() + if n.Character:FindFirstChild("HumanoidRootPart") and target.Character:FindFirstChild("HumanoidRootPart") then + n.Character.HumanoidRootPart.CFrame = (target.Character.HumanoidRootPart.CFrame*CFrame.Angles(0,math.rad(90/#players*k),0)*CFrame.new(5+.2*#players,0,0))*CFrame.Angles(0,math.rad(90),0) + end + end + end + end + end + end + }; + + Bring = { + Prefix = Settings.Prefix; + Commands = {"bring";"tptome";}; + Args = {"player";}; + Hidden = false; + Description = "Teleport the target(s) to you"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Admin.RunCommand(Settings.Prefix.."tp",v.Name,plr.Name) + end + end + }; + + To = { + Prefix = Settings.Prefix; + Commands = {"to";"tpmeto";}; + Args = {"player";}; + Hidden = false; + Description = "Teleport you to the target"; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Admin.RunCommand(Settings.Prefix.."tp",plr.Name,v.Name) + end + end + }; + + FreeFall = { + Prefix = Settings.Prefix; + Commands = {"freefall";"skydive";}; + Args = {"player";"height";}; + Hidden = false; + Description = "Teleport the target player(s) up by studs"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character:FindFirstChild('HumanoidRootPart') then + v.Character.HumanoidRootPart.CFrame = v.Character.HumanoidRootPart.CFrame+Vector3.new(0,tonumber(args[2]),0) + end + end + end + }; + + Change = { + Prefix = Settings.Prefix; + Commands = {"change";"leaderstat";"stat";}; + Args = {"player";"stat";"value";}; + Filter = true; + Description = "Change the target player(s)'s leader stat value to "; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v:findFirstChild("leaderstats") then + for a, st in pairs(v.leaderstats:children()) do + if st.Name:lower():find(args[2]:lower()) == 1 then + st.Value = args[3] + end + end + end + end + end + }; + + AddToStat = { + Prefix = Settings.Prefix; + Commands = {"add";"addtostat";"addstat";}; + Args = {"player";"stat";"value";}; + Hidden = false; + Description = "Add to "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v:findFirstChild("leaderstats") then + for a, st in pairs(v.leaderstats:children()) do + if st.Name:lower():find(args[2]:lower()) == 1 and tonumber(st.Value) then + st.Value = tonumber(st.Value)+tonumber(args[3]) + end + end + end + end + end + }; + + SubtractFromStat = { + Prefix = Settings.Prefix; + Commands = {"subtract";"minusfromstat";"minusstat";"subtractstat";}; + Args = {"player";"stat";"value";}; + Hidden = false; + Description = "Subtract from "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v:findFirstChild("leaderstats") then + for a, st in pairs(v.leaderstats:children()) do + if st.Name:lower():find(args[2]:lower()) == 1 and tonumber(st.Value) then + st.Value = tonumber(st.Value)-tonumber(args[3]) + end + end + end + end + end + }; + + Shirt = { + Prefix = Settings.Prefix; + Commands = {"shirt";"giveshirt";}; + Args = {"player";"ID";}; + Hidden = false; + Description = "Give the target player(s) the shirt that belongs to "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local image = Functions.GetTexture(args[2]) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if image then + if v.Character and image then + for g,k in pairs(v.Character:children()) do + if k:IsA("Shirt") then k:Destroy() end + end + service.New('Shirt',v.Character).ShirtTemplate="http://www.roblox.com/asset/?id="..image + end + else + for g,k in pairs(v.Character:children()) do + if k:IsA("Shirt") then k:Destroy() end + end + end + end + end + }; + + Pants = { + Prefix = Settings.Prefix; + Commands = {"pants";"givepants";}; + Args = {"player";"id";}; + Hidden = false; + Description = "Give the target player(s) the pants that belongs to "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + local image = Functions.GetTexture(args[2]) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if image then + if v.Character and image then + for g,k in pairs(v.Character:children()) do + if k:IsA("Pants") then k:Destroy() end + end + service.New('Pants',v.Character).PantsTemplate="http://www.roblox.com/asset/?id="..image + end + else + for g,k in pairs(v.Character:children()) do + if k:IsA("Pants") then k:Destroy() end + end + end + end + end + }; + + Face = { + Prefix = Settings.Prefix; + Commands = {"face";"giveface";}; + Args = {"player";"id";}; + Hidden = false; + Description = "Give the target player(s) the face that belongs to "; + Fun = false; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + --local image=GetTexture(args[2]) + if not v.Character:FindFirstChild("Head") then + return + end + + if v.Character and v.Character:findFirstChild("Head") and v.Character.Head:findFirstChild("face") then + v.Character.Head:findFirstChild("face"):Destroy()--.Texture = "http://www.roblox.com/asset/?id=" .. args[2] + end + + service.Insert(tonumber(args[2])).Parent = v.Character:FindFirstChild("Head") + end + end + }; + + Swagify = { + Prefix = Settings.Prefix; + Commands = {"swagify";"swagger";}; + Args = {"player";}; + Hidden = false; + Description = "Swag the target player(s) up"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + if v.Character then + for i,v in pairs(v.Character:children()) do + if v.Name == "Shirt" then local cl = v:Clone() cl.Parent = v.Parent cl.ShirtTemplate = "http://www.roblox.com/asset/?id=109163376" v:Destroy() end + if v.Name == "Pants" then local cl = v:Clone() cl.Parent = v.Parent cl.PantsTemplate = "http://www.roblox.com/asset/?id=109163376" v:Destroy() end + end + Functions.Cape(v,false,'Fabric','Pink',109301474) + end + end + end + }; + + Shrek = { + Prefix = Settings.Prefix; + Commands = {"shrek";"shrekify";"shrekislife";"swamp";}; + Args = {"player";}; + Hidden = false; + Description = "Shrekify the target player(s)"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Routine(function() + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + Admin.RunCommand(Settings.Prefix.."pants",v.Name,"233373970") + Admin.RunCommand(Settings.Prefix.."shirt",v.Name,"133078195") + + for i,v in pairs(v.Character:children()) do + if v:IsA("Accoutrement") or v:IsA("CharacterMesh") then + v:Destroy() + end + end + + Admin.RunCommand(Settings.Prefix.."hat",v.Name,"20011951") + + local sound = service.New("Sound",v.Character.HumanoidRootPart) + sound.SoundId = "http://www.roblox.com/asset/?id="..130767645 + wait(0.5) + sound:Play() + end + end) + end + end + }; + + Rocket = { + Prefix = Settings.Prefix; + Commands = {"rocket";"firework";}; + Args = {"player";}; + Hidden = false; + Description = "Send the target player(s) to the moon!"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + cPcall(function() + if v.Character and v.Character:FindFirstChild("HumanoidRootPart") then + local speed = 10 + local Part = service.New("Part") + Part.Parent = v.Character + local SpecialMesh = service.New("SpecialMesh") + SpecialMesh.Parent = Part + SpecialMesh.MeshId = "http://www.roblox.com/asset/?id=2251534" + SpecialMesh.MeshType = "FileMesh" + SpecialMesh.TextureId = "43abb6d081e0fbc8666fc92f6ff378c1" + SpecialMesh.Scale = Vector3.new(0.5,0.5,0.5) + local Weld = service.New("Weld") + Weld.Parent = Part + Weld.Part0 = Part + Weld.Part1 = v.Character.HumanoidRootPart + Weld.C0 = CFrame.new(0,-1,0)*CFrame.Angles(-1.5,0,0) + local BodyVelocity = service.New("BodyVelocity") + BodyVelocity.Parent = Part + BodyVelocity.maxForce = Vector3.new(math.huge,math.huge,math.huge) + BodyVelocity.velocity = Vector3.new(0,100*speed,0) + --[[ + cPcall(function() + for i = 1,math.huge do + local Explosion = service.New("Explosion") + Explosion.Parent = Part + Explosion.BlastRadius = 0 + Explosion.Position = Part.Position + Vector3.new(0,0,0) + wait() + end + end) + --]] + wait(5) + BodyVelocity:remove() + service.New("Explosion",service.Workspace).Position = v.Character.HumanoidRootPart.Position + v.Character:BreakJoints() + end + end) + end + end + }; + + Dance = { + Prefix = Settings.Prefix; + Commands = {"dance";}; + Args = {"player";}; + Hidden = false; + Description = "Make the target player(s) dance"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + Remote.Send(v,'Function','PlayAnimation',27789359) + end + end + }; + + BreakDance = { + Prefix = Settings.Prefix; + Commands = {"breakdance";"fundance";"lolwut";}; + Args = {"player";}; + Hidden = false; + Description = "Make the target player(s) break dance"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + cPcall(function() + local color + local num=math.random(1,7) + if num==1 then + color='Really blue' + elseif num==2 then + color='Really red' + elseif num==3 then + color='Magenta' + elseif num==4 then + color='Lime green' + elseif num==5 then + color='Hot pink' + elseif num==6 then + color='New Yeller' + elseif num==7 then + color='White' + end + local hum=v.Character:FindFirstChild('Humanoid') + if not hum then return end + --Remote.Send(v,'Function','Effect','dance') + Admin.RunCommand(Settings.Prefix.."sparkles",v.Name,color) + Admin.RunCommand(Settings.Prefix.."fire",v.Name,color) + Admin.RunCommand(Settings.Prefix.."nograv",v.Name) + Admin.RunCommand(Settings.Prefix.."smoke",v.Name,color) + Admin.RunCommand(Settings.Prefix.."spin",v.Name) + repeat hum.PlatformStand=true wait() until not hum or hum==nil or hum.Parent==nil + end) + end + end + }; + + Puke = { + Prefix = Settings.Prefix; + Commands = {"puke";"barf";"throwup";"vomit";}; + Args = {"player";}; + Hidden = false; + Description = "Make the target player(s) puke"; + Fun = true; + AdminLevel = "Moderators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + cPcall(function() + if (not v:IsA('Player')) or (not v) or (not v.Character) or (not v.Character:FindFirstChild('Head')) or v.Character:FindFirstChild('Epix Puke') then return end + local run=true + local k=service.New('StringValue',v.Character) + k.Name='Epix Puke' + Routine(function() + repeat + wait(0.15) + local p = service.New("Part",v.Character) + p.CanCollide = false + local color = math.random(1, 3) + local bcolor + if color == 1 then + bcolor = BrickColor.new(192) + elseif color == 2 then + bcolor = BrickColor.new(28) + elseif color == 3 then + bcolor = BrickColor.new(105) + end + p.BrickColor = bcolor + local m = service.New('BlockMesh',p) + p.Size = Vector3.new(0.1,0.1,0.1) + m.Scale = Vector3.new(math.random()*0.9, math.random()*0.9, math.random()*0.9) + p.Locked = true + p.TopSurface = "Smooth" + p.BottomSurface = "Smooth" + p.CFrame = v.Character.Head.CFrame * CFrame.new(Vector3.new(0, 0, -1)) + p.Velocity = v.Character.Head.CFrame.lookVector * 20 + Vector3.new(math.random(-5, 5), math.random(-5, 5), math.random(-5, 5)) + p.Anchored = false + m.Name = 'Puke Peice' + p.Name = 'Puke Peice' + p.Touched:connect(function(o) + if o and p and (not service.Players:FindFirstChild(o.Parent.Name)) and o.Name~='Puke Peice' and o.Name~='Blood Peice' and o.Name~='Blood Plate' and o.Name~='Puke Plate' and (o.Parent.Name=='Workspace' or o.Parent:IsA('Model')) and (o.Parent~=p.Parent) and o:IsA('Part') and (o.Parent.Name~=v.Character.Name) and (not o.Parent:IsA('Accessory')) and (not o.Parent:IsA('Tool')) then + local cf = CFrame.new(p.CFrame.X,o.CFrame.Y+o.Size.Y/2,p.CFrame.Z) + p:Destroy() + local g=service.New('Part',service.Workspace) + g.Anchored=true + g.CanCollide=false + g.Size=Vector3.new(0.1,0.1,0.1) + g.Name='Puke Plate' + g.CFrame=cf + g.BrickColor=BrickColor.new(119) + local c=service.New('CylinderMesh',g) + c.Scale=Vector3.new(1,0.2,1) + c.Name='PukeMesh' + wait(10) + g:Destroy() + elseif o and o.Name=='Puke Plate' and p then + p:Destroy() + o.PukeMesh.Scale=o.PukeMesh.Scale+Vector3.new(0.5,0,0.5) + end + end) + until run==false or not k or not k.Parent or (not v) or (not v.Character) or (not v.Character:FindFirstChild('Head')) + end) + wait(10) + run = false + k:Destroy() + end) + end + end + }; + + Cut = { + Prefix = Settings.Prefix; + Commands = {"cut";"stab";"shank";"bleed";}; + Args = {"player";}; + Hidden = false; + Description = "Make the target player(s) bleed"; + Fun = true; + AdminLevel = "FunMod"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr, args[1])) do + cPcall(function() + if (not v:IsA('Player')) or (not v) or (not v.Character) or (not v.Character:FindFirstChild('Head')) or v.Character:FindFirstChild('Epix Bleed') then return end + local run=true + local k=service.New('StringValue',v.Character) + k.Name='ADONIS_BLEED' + Routine(function() + repeat + wait(0.15) + v.Character.Humanoid.Health=v.Character.Humanoid.Health-1 + local p = service.New("Part",v.Character) + p.CanCollide = false + local color = math.random(1, 3) + local bcolor + if color == 1 then + bcolor = BrickColor.new(21) + elseif color == 2 then + bcolor = BrickColor.new(1004) + elseif color == 3 then + bcolor = BrickColor.new(21) + end + p.BrickColor = bcolor + local m=service.New('BlockMesh',p) + p.Size=Vector3.new(0.1,0.1,0.1) + m.Scale = Vector3.new(math.random()*0.9, math.random()*0.9, math.random()*0.9) + p.Locked = true + p.TopSurface = "Smooth" + p.BottomSurface = "Smooth" + p.CFrame = v.Character.HumanoidRootPart.CFrame * CFrame.new(Vector3.new(2, 0, 0)) + p.Velocity = v.Character.Head.CFrame.lookVector * 1 + Vector3.new(math.random(-1, 1), math.random(-1, 1), math.random(-1, 1)) + p.Anchored = false + m.Name='Blood Peice' + p.Name='Blood Peice' + p.Touched:connect(function(o) + if o and p and (not service.Players:FindFirstChild(o.Parent.Name)) and o.Name~='Blood Peice' and o.Name~='Puke Peice' and o.Name~='Puke Plate' and o.Name~='Blood Plate' and (o.Parent.Name=='Workspace' or o.Parent:IsA('Model')) and (o.Parent~=p.Parent) and o:IsA('Part') and (o.Parent.Name~=v.Character.Name) and (not o.Parent:IsA('Accessory')) and (not o.Parent:IsA('Tool')) then + local cf=CFrame.new(p.CFrame.X,o.CFrame.Y+o.Size.Y/2,p.CFrame.Z) + p:Destroy() + local g=service.New('Part',service.Workspace) + g.Anchored=true + g.CanCollide=false + g.Size=Vector3.new(0.1,0.1,0.1) + g.Name='Blood Plate' + g.CFrame=cf + g.BrickColor=BrickColor.new(21) + local c=service.New('CylinderMesh',g) + c.Scale=Vector3.new(1,0.2,1) + c.Name='BloodMesh' + wait(10) + g:Destroy() + elseif o and o.Name=='Blood Plate' and p then + p:Destroy() + o.BloodMesh.Scale=o.BloodMesh.Scale+Vector3.new(0.5,0,0.5) + end + end) + until run==false or not k or not k.Parent or (not v) or (not v.Character) or (not v.Character:FindFirstChild('Head')) + end) + wait(10) + run=false + k:Destroy() + end) + end + end + }; + + PlayerPoints = { + Prefix = Settings.Prefix; + Commands = {"ppoints";"playerpoints";"getpoints";}; + Args = {}; + Hidden = false; + Description = "Shows you the number of player points left in the game"; + Fun = false; + AdminLevel = "Creators"; + Function = function(plr,args) + Functions.Hint('Available Player Points: '..service.PointsService:GetAwardablePoints(),{plr}) + end + }; + + GivePlayerPoints = { + Prefix = Settings.Prefix; + Commands = {"giveppoints";"giveplayerpoints";"sendplayerpoints";}; + Args = {"player";"amount";}; + Hidden = false; + Description = "Lets you give player points"; + Fun = false; + AdminLevel = "Creators"; + Function = function(plr,args) + for i,v in pairs(service.GetPlayers(plr,args[1])) do + local ran,failed = pcall(function() service.PointsService:AwardPoints(v.userId,tonumber(args[2])) end) + if ran and service.PointsService:GetAwardablePoints()>=tonumber(args[2]) then + Functions.Hint('Gave '..args[2]..' points to '..v.Name,{plr}) + elseif service.PointsService:GetAwardablePoints()