From fae0749f6e4ddea8202fc68272490df721ba43dc Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Tue, 8 Aug 2023 23:47:59 +0100 Subject: [PATCH 01/14] Update pnpm and aftman dependencies --- aftman.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aftman.toml b/aftman.toml index 2b57756..2df42eb 100644 --- a/aftman.toml +++ b/aftman.toml @@ -1,3 +1,3 @@ [tools] -darklua = "seaofvoices/darklua@0.9.0" -yue = "pigpigyyy/Yuescript@0.17.8" +darklua = "seaofvoices/darklua@0.10.2" +yue = "pigpigyyy/Yuescript@0.17.14" From 4ef87acda427575bcee617c58ee592bd3cfacb9b Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Mon, 14 Aug 2023 16:09:52 +0100 Subject: [PATCH 02/14] Replace Yuescript corescripts with their original versions due to issues with Yuescript compiler --- aftman.toml | 2 +- compile.sh | 8 +- lua/107893730.lua | 1296 ++++++++++++++ lua/152908679.lua | 278 +++ lua/153556783.lua | 647 +++++++ lua/157877000.lua | 1025 +++++++++++ lua/36868950.lua | 110 ++ lua/37801172.lua | 108 ++ lua/38037565.lua | 239 +++ lua/39250920.lua | 588 +++++++ lua/45284430.lua | 4120 +++++++++++++++++++++++++++++++++++++++++++++ lua/45374389.lua | 20 + lua/46295863.lua | 2417 ++++++++++++++++++++++++++ lua/48488235.lua | 3229 +++++++++++++++++++++++++++++++++++ lua/48488398.lua | 354 ++++ lua/48488451.lua | 72 + lua/53878047.lua | 959 +++++++++++ lua/53878057.lua | 1257 ++++++++++++++ lua/59002209.lua | 0 lua/60595411.lua | 1067 ++++++++++++ lua/60595695.lua | 26 + lua/73157242.lua | 2544 ++++++++++++++++++++++++++++ lua/89449008.lua | 952 +++++++++++ lua/89449093.lua | 476 ++++++ lua/97188756.lua | 1789 ++++++++++++++++++++ lua/host.lua | 201 +++ lua/join.lua | 226 +++ lua/studio.lua | 60 + lua/visit.lua | 127 ++ yue/107893730.yue | 1142 ------------- yue/152908679.yue | 247 --- yue/153556783.yue | 578 ------- yue/157877000.yue | 875 ---------- yue/36868950.yue | 125 -- yue/37801172.yue | 101 -- yue/38037565.yue | 230 --- yue/39250920.yue | 519 ------ yue/45284430.yue | 3636 --------------------------------------- yue/45374389.yue | 17 - yue/46295863.yue | 2257 ------------------------- yue/48488235.yue | 3083 --------------------------------- yue/48488398.yue | 295 ---- yue/48488451.yue | 90 - yue/53878047.yue | 859 ---------- yue/53878057.yue | 1068 ------------ yue/59002209.yue | 2 - yue/60595411.yue | 965 ----------- yue/60595695.yue | 29 - yue/73157242.yue | 2338 ------------------------- yue/89449008.yue | 821 --------- yue/89449093.yue | 412 ----- yue/97188756.yue | 1690 ------------------- yue/host.yue | 221 --- yue/join.yue | 269 --- yue/macros.yue | 4 - yue/studio.yue | 49 - yue/visit.yue | 147 -- 57 files changed, 24190 insertions(+), 22076 deletions(-) create mode 100644 lua/107893730.lua create mode 100644 lua/152908679.lua create mode 100644 lua/153556783.lua create mode 100644 lua/157877000.lua create mode 100644 lua/36868950.lua create mode 100644 lua/37801172.lua create mode 100644 lua/38037565.lua create mode 100644 lua/39250920.lua create mode 100644 lua/45284430.lua create mode 100644 lua/45374389.lua create mode 100644 lua/46295863.lua create mode 100644 lua/48488235.lua create mode 100644 lua/48488398.lua create mode 100644 lua/48488451.lua create mode 100644 lua/53878047.lua create mode 100644 lua/53878057.lua create mode 100644 lua/59002209.lua create mode 100644 lua/60595411.lua create mode 100644 lua/60595695.lua create mode 100644 lua/73157242.lua create mode 100644 lua/89449008.lua create mode 100644 lua/89449093.lua create mode 100644 lua/97188756.lua create mode 100644 lua/host.lua create mode 100644 lua/join.lua create mode 100644 lua/studio.lua create mode 100644 lua/visit.lua delete mode 100644 yue/107893730.yue delete mode 100644 yue/152908679.yue delete mode 100644 yue/153556783.yue delete mode 100644 yue/157877000.yue delete mode 100644 yue/36868950.yue delete mode 100644 yue/37801172.yue delete mode 100644 yue/38037565.yue delete mode 100644 yue/39250920.yue delete mode 100644 yue/45284430.yue delete mode 100644 yue/45374389.yue delete mode 100644 yue/46295863.yue delete mode 100644 yue/48488235.yue delete mode 100644 yue/48488398.yue delete mode 100644 yue/48488451.yue delete mode 100644 yue/53878047.yue delete mode 100644 yue/53878057.yue delete mode 100644 yue/59002209.yue delete mode 100644 yue/60595411.yue delete mode 100644 yue/60595695.yue delete mode 100644 yue/73157242.yue delete mode 100644 yue/89449008.yue delete mode 100644 yue/89449093.yue delete mode 100644 yue/97188756.yue delete mode 100644 yue/host.yue delete mode 100644 yue/join.yue delete mode 100644 yue/macros.yue delete mode 100644 yue/studio.yue delete mode 100644 yue/visit.yue diff --git a/aftman.toml b/aftman.toml index 2df42eb..fb250cc 100644 --- a/aftman.toml +++ b/aftman.toml @@ -1,3 +1,3 @@ [tools] darklua = "seaofvoices/darklua@0.10.2" -yue = "pigpigyyy/Yuescript@0.17.14" +stylua = "JohnnyMorganz/StyLua@0.18.1" diff --git a/compile.sh b/compile.sh index 96feaaa..1017991 100644 --- a/compile.sh +++ b/compile.sh @@ -1,13 +1,9 @@ -yue ./yue - echo "Processing corescripts..." -for file in yue/[0-9]*.lua; do +for file in lua/[0-9]*.lua; do darklua process -c dense.json5 $file processed/$(basename "$file") done echo "Processing other corescripts..." -for file in yue/[a-z]*.lua; do +for file in lua/[a-z]*.lua; do darklua process -c lines.json5 $file processed/$(basename "$file") done - -rm -f ./yue/*.lua diff --git a/lua/107893730.lua b/lua/107893730.lua new file mode 100644 index 0000000..94c3211 --- /dev/null +++ b/lua/107893730.lua @@ -0,0 +1,1296 @@ +-- this script creates the gui and sends the web requests for in game purchase prompts + +-- wait for important items to appear +while not Game do + wait(0.1) +end +while not game:GetService "MarketplaceService" do + wait(0.1) +end +while not game:FindFirstChild "CoreGui" do + wait(0.1) +end +while not game.CoreGui:FindFirstChild "RobloxGui" do + wait(0.1) +end + +-------------------------------- Global Variables ---------------------------------------- +-- utility variables +local RbxUtility = nil +local baseUrl = game:GetService("ContentProvider").BaseUrl:lower() + +-- data variables +local currentProductInfo, currentAssetId, currentCurrencyType, currentCurrencyAmount, currentEquipOnPurchase, currentProductId, currentServerResponseTable +local checkingPlayerFunds = false +local openBCUpSellWindowConnection = nil +local purchasingConsumable = false +local enableBrowserWindowClosedEvent = true + +-- gui variables +local openBuyCurrencyWindowConnection = nil +local currentlyPrompting = false +local purchaseDialog = nil +local tweenTime = 0.3 +local showPosition = UDim2.new(0.5, -330, 0.5, -200) +local hidePosition = UDim2.new(0.5, -330, 1, 25) +local isSmallScreen = nil +local spinning = false +local spinnerIcons = nil +local smallScreenThreshold = 450 + +-- user facing images +local assetUrls = {} +local assetUrl = "http://www.roblox.com/Asset/?id=" +local errorImageUrl = assetUrl .. "42557901" +table.insert(assetUrls, errorImageUrl) +local buyImageUrl = assetUrl .. "104651457" +table.insert(assetUrls, buyImageUrl) +local buyImageDownUrl = assetUrl .. "104651515" +table.insert(assetUrls, buyImageDownUrl) +local buyImageDisabledUrl = assetUrl .. "104651532" +table.insert(assetUrls, buyImageDisabledUrl) +local cancelButtonImageUrl = assetUrl .. "104651592" +table.insert(assetUrls, cancelButtonImageUrl) +local cancelButtonDownUrl = assetUrl .. "104651639" +table.insert(assetUrls, cancelButtonDownUrl) +local okButtonUrl = assetUrl .. "104651665" +table.insert(assetUrls, okButtonUrl) +local okButtonPressedrl = assetUrl .. "104651707" +table.insert(assetUrls, okButtonPressedrl) +local freeButtonImageUrl = assetUrl .. "104651733" +table.insert(assetUrls, freeButtonImageUrl) +local freeButtonImageDownUrl = assetUrl .. "104651761" +table.insert(assetUrls, freeButtonImageDownUrl) +local tixIcon = assetUrl .. "102481431" +table.insert(assetUrls, tixIcon) +local robuxIcon = assetUrl .. "102481419" +table.insert(assetUrls, robuxIcon) + +-- user facing string +local buyHeaderText = "Buy" +local takeHeaderText = "Take" +local buyFailedHeaderText = "An Error Occurred" + +local errorPurchasesDisabledText = "in-game purchases are disabled" +local errorPurchasesUnknownText = "Roblox is performing maintenance" + +local purchaseSucceededText = "Your purchase of itemName succeeded!" +local purchaseFailedText = + "Your purchase of itemName failed because errorReason. Your account has not been charged. Please try again soon." +local productPurchaseText = "Would you like to buy 'itemName' for currencyType currencyAmount?" +local freeItemPurchaseText = "Would you like to take the assetType 'itemName' for FREE?" +local freeItemBalanceText = "Your balance of Robux or Tix will not be affected by this transaction." + +-------------------------------- End Global Variables ---------------------------------------- + +----------------------------- Util Functions --------------------------------------------- +function getSecureApiBaseUrl() + local secureApiUrl = baseUrl + secureApiUrl = string.gsub(secureApiUrl, "http", "https") + secureApiUrl = string.gsub(secureApiUrl, "www", "api") + return secureApiUrl +end + +function getRbxUtility() + if not RbxUtility then + RbxUtility = LoadLibrary "RbxUtility" + end + return RbxUtility +end + +function preloadAssets() + for i = 1, #assetUrls do + game:GetService("ContentProvider"):Preload(assetUrls[i]) + end +end +----------------------------- End Util Functions --------------------------------------------- + +-------------------------------- Accept/Decline Functions -------------------------------------- +function removeCurrentPurchaseInfo() + currentAssetId = nil + currentCurrencyType = nil + currentCurrencyAmount = nil + currentEquipOnPurchase = nil + currentProductId = nil + currentProductInfo = nil + currentServerResponseTable = nil + + checkingPlayerFunds = false +end + +function closePurchasePrompt() + purchaseDialog:TweenPosition( + hidePosition, + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + tweenTime, + true, + function() + game.GuiService:RemoveCenterDialog(purchaseDialog) + hidePurchasing() + purchaseDialog.Visible = false + currentlyPrompting = false + end + ) +end + +function userPurchaseActionsEnded(isSuccess) + checkingPlayerFunds = false + + if isSuccess then -- show the user we bought the item successfully, when they close this dialog we will call signalPromptEnded + local newPurchasedSucceededText = + string.gsub(purchaseSucceededText, "itemName", tostring(currentProductInfo["Name"])) + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText + setButtonsVisible(purchaseDialog.BodyFrame.OkPurchasedButton) + hidePurchasing() + else -- otherwise we didn't purchase, no need to show anything, just signal and close dialog + signalPromptEnded(isSuccess) + end +end + +function signalPromptEnded(isSuccess) + closePurchasePrompt() + if purchasingConsumable then + game:GetService("MarketplaceService") + :SignalPromptProductPurchaseFinished(game.Players.LocalPlayer.userId, currentProductId, isSuccess) + else + game:GetService("MarketplaceService") + :SignalPromptPurchaseFinished(game.Players.LocalPlayer, currentAssetId, isSuccess) + end + removeCurrentPurchaseInfo() +end + +-- make sure our gui displays the proper purchase data, and set the productid we will try and buy if use specifies a buy action +function updatePurchasePromptData(_) + local newItemDescription = "" + + -- id to use when we request a purchase + if not currentProductId then + currentProductId = currentProductInfo["ProductId"] + end + + if isFreeItem() then + newItemDescription = string.gsub(freeItemPurchaseText, "itemName", tostring(currentProductInfo["Name"])) + newItemDescription = + string.gsub(newItemDescription, "assetType", tostring(assetTypeToString(currentProductInfo["AssetTypeId"]))) + setHeaderText(takeHeaderText) + else -- otherwise item costs something, so different prompt + newItemDescription = string.gsub(productPurchaseText, "itemName", tostring(currentProductInfo["Name"])) + newItemDescription = + string.gsub(newItemDescription, "currencyType", tostring(currencyTypeToString(currentCurrencyType))) + newItemDescription = string.gsub(newItemDescription, "currencyAmount", tostring(currentCurrencyAmount)) + setHeaderText(buyHeaderText) + end + + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newItemDescription + + if purchasingConsumable then + purchaseDialog.BodyFrame.ItemPreview.Image = baseUrl + .. "thumbs/asset.ashx?assetid=" + .. tostring(currentProductInfo["IconImageAssetId"]) + .. "&x=100&y=100&format=png" + else + purchaseDialog.BodyFrame.ItemPreview.Image = baseUrl + .. "thumbs/asset.ashx?assetid=" + .. tostring(currentAssetId) + .. "&x=100&y=100&format=png" + end +end + +function doPlayerFundsCheck(checkIndefinitely) + if checkingPlayerFunds then + local canPurchase, insufficientFunds = canPurchaseItem() -- check again to see if we can buy item + if canPurchase and insufficientFunds then -- wait a bit and try a few more times + local retries = 1000 + while (retries > 0 or checkIndefinitely) and insufficientFunds and checkingPlayerFunds and canPurchase do + wait(1 / 10) + canPurchase, insufficientFunds = canPurchaseItem() + retries = retries - 1 + end + end + if canPurchase and not insufficientFunds then + -- we can buy item! set our buttons up and we will exit this loop + setButtonsVisible( + purchaseDialog.BodyFrame.BuyButton, + purchaseDialog.BodyFrame.CancelButton, + purchaseDialog.BodyFrame.AfterBalanceButton + ) + end + end +end + +function showPurchasePrompt() + local canPurchase, insufficientFunds, notRightBC, override, descText = canPurchaseItem() + + if canPurchase then + updatePurchasePromptData() + + if override and descText then + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = descText + purchaseDialog.BodyFrame.AfterBalanceButton.Visible = false + end + game.GuiService:AddCenterDialog( + purchaseDialog, + Enum.CenterDialogType.ModalDialog, + --ShowFunction + function() + -- set the state for our buttons + purchaseDialog.Visible = true + if isFreeItem() then + setButtonsVisible( + purchaseDialog.BodyFrame.FreeButton, + purchaseDialog.BodyFrame.CancelButton, + purchaseDialog.BodyFrame.AfterBalanceButton + ) + elseif notRightBC then + purchaseDialog.BodyFrame.AfterBalanceButton.Text = + "You require an upgrade to your Builders Club membership to purchase this item. Click here to upgrade." + if not openBCUpSellWindowConnection then + openBCUpSellWindowConnection = purchaseDialog.BodyFrame.AfterBalanceButton.MouseButton1Click:connect( + function() + if + purchaseDialog.BodyFrame.AfterBalanceButton.Text + == "You require an upgrade to your Builders Club membership to purchase this item. Click here to upgrade." + then + openBCUpSellWindow() + end + end + ) + end + setButtonsVisible( + purchaseDialog.BodyFrame.BuyDisabledButton, + purchaseDialog.BodyFrame.CancelButton, + purchaseDialog.BodyFrame.AfterBalanceButton + ) + elseif insufficientFunds then + setButtonsVisible( + purchaseDialog.BodyFrame.BuyDisabledButton, + purchaseDialog.BodyFrame.CancelButton, + purchaseDialog.BodyFrame.AfterBalanceButton + ) + elseif override then + setButtonsVisible(purchaseDialog.BodyFrame.BuyDisabledButton, purchaseDialog.BodyFrame.CancelButton) -- , purchaseDialog.BodyFrame.AfterBalanceButton) + else + setButtonsVisible(purchaseDialog.BodyFrame.BuyButton, purchaseDialog.BodyFrame.CancelButton) -- , purchaseDialog.BodyFrame.AfterBalanceButton) + end + + purchaseDialog:TweenPosition( + showPosition, + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + tweenTime, + true + ) + + if canPurchase and insufficientFunds and not enableBrowserWindowClosedEvent then + checkingPlayerFunds = true + doPlayerFundsCheck(true) + end + end, + --HideFunction + function() + purchaseDialog.Visible = false + end + ) + else -- we failed in prompting a purchase, do a decline + doDeclinePurchase() + end +end + +-- given an asset id, this function will grab that asset from the website, and return the first "Tool" object found inside it +function getToolAssetID(assetID) + local newTool = game:GetService("InsertService"):LoadAsset(assetID) + if not newTool then + return nil + end + + if newTool:IsA "Tool" then + return newTool + end + + local toolChildren = newTool:GetChildren() + for i = 1, #toolChildren do + if toolChildren[i]:IsA "Tool" then + return toolChildren[i] + end + end + return nil +end + +-- the user tried to purchase by clicking the purchase button, but something went wrong. +-- let them know their account was not charged, and that they do not own the item yet. +function purchaseFailed(inGamePurchasesDisabled) + local name = "Item" + if currentProductInfo then + name = currentProductInfo["Name"] + end + + local newPurchasedFailedText = string.gsub(purchaseFailedText, "itemName", tostring(name)) + if inGamePurchasesDisabled then + newPurchasedFailedText = + string.gsub(newPurchasedFailedText, "errorReason", tostring(errorPurchasesDisabledText)) + else + newPurchasedFailedText = string.gsub(newPurchasedFailedText, "errorReason", tostring(errorPurchasesUnknownText)) + end + + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedFailedText + purchaseDialog.BodyFrame.ItemPreview.Image = errorImageUrl + + setButtonsVisible(purchaseDialog.BodyFrame.OkButton) + + setHeaderText(buyFailedHeaderText) + + hidePurchasing() +end + +-- user has specified they want to buy an item, now try to attempt to buy it for them +function doAcceptPurchase(_) + showPurchasing() -- shows a purchasing ui (shows spinner) + + local startTime = tick() + + -- http call to do the purchase + local response = "none" + local url = nil + + -- consumables need to use a different url + if purchasingConsumable then + url = getSecureApiBaseUrl() + .. "marketplace/submitpurchase?productId=" + .. tostring(currentProductId) + .. "¤cyTypeId=" + .. tostring(currencyEnumToInt(currentCurrencyType)) + .. "&expectedUnitPrice=" + .. tostring(currentCurrencyAmount) + .. "&placeId=" + .. tostring(Game.PlaceId) + else + url = getSecureApiBaseUrl() + .. "marketplace/purchase?productId=" + .. tostring(currentProductId) + .. "¤cyTypeId=" + .. tostring(currencyEnumToInt(currentCurrencyType)) + .. "&purchasePrice=" + .. tostring(currentCurrencyAmount) + .. "&locationType=Game" + .. "&locationId=" + .. Game.PlaceId + end + + local success, reason = ypcall(function() + response = game:HttpPostAsync(url, "RobloxPurchaseRequest") + end) + + -- debug output for us (found in the logs from local) + print("doAcceptPurchase success from ypcall is ", success, "reason is", reason) + + if (tick() - startTime) < 1 then + wait(1) -- allow the purchasing waiting dialog to at least be readable (otherwise it might flash, looks bad)... + end + + -- check to make sure purchase actually happened on the web end + if response == "none" or response == nil or response == "" then + print("did not get a proper response from web on purchase of", currentAssetId, currentProductId) + purchaseFailed() + return + end + + -- parse our response, decide how to react + response = getRbxUtility().DecodeJSON(response) + + if response then + if response["success"] == false then + if response["status"] ~= "AlreadyOwned" then + print("web return response of fail on purchase of", currentAssetId, currentProductId) + purchaseFailed((response["status"] == "EconomyDisabled")) + return + end + end + else + print("web return response of non parsable JSON on purchase of", currentAssetId) + purchaseFailed() + return + end + + -- check to see if this item was bought, and if we want to equip it (also need to make sure the asset type was gear) + if currentEquipOnPurchase and success and currentAssetId and tonumber(currentProductInfo["AssetTypeId"]) == 19 then + local tool = getToolAssetID(tonumber(currentAssetId)) + if tool then + tool.Parent = game.Players.LocalPlayer.Backpack + end + end + + if purchasingConsumable then + if not response["receipt"] then + print("tried to buy productId, but no receipt returned. productId was", currentProductId) + purchaseFailed() + return + end + Game:GetService("MarketplaceService") + :SignalClientPurchaseSuccess( + tostring(response["receipt"]), + game.Players.LocalPlayer.userId, + currentProductId + ) + else + userPurchaseActionsEnded(success) + end +end + +-- user pressed the cancel button, just remove all purchasing prompts +function doDeclinePurchase() + userPurchaseActionsEnded(false) +end +-------------------------------- End Accept/Decline Functions -------------------------------------- + +---------------------------------------------- Currency Functions --------------------------------------------- +-- enums have no implicit conversion to numbers in lua, has to have a function to do this +function currencyEnumToInt(currencyEnum) + if currencyEnum == Enum.CurrencyType.Robux or currencyEnum == Enum.CurrencyType.Default then + return 1 + elseif currencyEnum == Enum.CurrencyType.Tix then + return 2 + end +end + +-- oi, this is ugly +function assetTypeToString(assetType) + if assetType == 1 then + return "Image" + elseif assetType == 2 then + return "T-Shirt" + elseif assetType == 3 then + return "Audio" + elseif assetType == 4 then + return "Mesh" + elseif assetType == 5 then + return "Lua" + elseif assetType == 6 then + return "HTML" + elseif assetType == 7 then + return "Text" + elseif assetType == 8 then + return "Hat" + elseif assetType == 9 then + return "Place" + elseif assetType == 10 then + return "Model" + elseif assetType == 11 then + return "Shirt" + elseif assetType == 12 then + return "Pants" + elseif assetType == 13 then + return "Decal" + elseif assetType == 16 then + return "Avatar" + elseif assetType == 17 then + return "Head" + elseif assetType == 18 then + return "Face" + elseif assetType == 19 then + return "Gear" + elseif assetType == 21 then + return "Badge" + elseif assetType == 22 then + return "Group Emblem" + elseif assetType == 24 then + return "Animation" + elseif assetType == 25 then + return "Arms" + elseif assetType == 26 then + return "Legs" + elseif assetType == 27 then + return "Torso" + elseif assetType == 28 then + return "Right Arm" + elseif assetType == 29 then + return "Left Arm" + elseif assetType == 30 then + return "Left Leg" + elseif assetType == 31 then + return "Right Leg" + elseif assetType == 32 then + return "Package" + elseif assetType == 33 then + return "YouTube Video" + elseif assetType == 34 then + return "Game Pass" + elseif assetType == 0 then + return "Product" + end + + return "" +end + +function currencyTypeToString(currencyType) + if currencyType == Enum.CurrencyType.Tix then + return "Tix" + else + return "R$" + end +end + +-- figure out what currency to use based on the currency you can actually sell the item in and what the script specified +function setCurrencyAmountAndType(priceInRobux, priceInTix) + if currentCurrencyType == Enum.CurrencyType.Default or currentCurrencyType == Enum.CurrencyType.Robux then -- sell for default (user doesn't care) or robux + if priceInRobux ~= nil and priceInRobux ~= 0 then -- we can sell for robux + currentCurrencyAmount = priceInRobux + currentCurrencyType = Enum.CurrencyType.Robux + else -- have to use tix + currentCurrencyAmount = priceInTix + currentCurrencyType = Enum.CurrencyType.Tix + end + elseif currentCurrencyType == Enum.CurrencyType.Tix then -- we want to sell for tix + if priceInTix ~= nil and priceInTix ~= 0 then -- we can sell for tix + currentCurrencyAmount = priceInTix + currentCurrencyType = Enum.CurrencyType.Tix + else -- have to use robux + currentCurrencyAmount = priceInRobux + currentCurrencyType = Enum.CurrencyType.Robux + end + else + return false + end + + if currentCurrencyAmount == nil then + return false + end + + return true +end + +-- will get the player's balance of robux and tix, return in a table +function getPlayerBalance() + local playerBalance = nil + local success, errorCode = ypcall(function() + playerBalance = game:HttpGetAsync(getSecureApiBaseUrl() .. "currency/balance") + end) + if not success then + print("Get player balance failed because", errorCode) + return nil + end + + if playerBalance == "" then + return nil + end + + playerBalance = getRbxUtility().DecodeJSON(playerBalance) + + return playerBalance +end + +-- should open an external default browser window to this url +function openBuyCurrencyWindow() + checkingPlayerFunds = true + game:GetService("GuiService"):OpenBrowserWindow(baseUrl .. "Upgrades/Robux.aspx") +end + +function openBCUpSellWindow() + Game:GetService("GuiService"):OpenBrowserWindow(baseUrl .. "Upgrades/BuildersClubMemberships.aspx") +end + +-- set up the gui text at the bottom of the prompt (alerts user to how much money they will have left, or if they need to buy more to buy the item) +function updateAfterBalanceText(playerBalance, notRightBc) + if isFreeItem() then + purchaseDialog.BodyFrame.AfterBalanceButton.Text = freeItemBalanceText + return true, false + end + + local keyWord = nil + if currentCurrencyType == Enum.CurrencyType.Robux then + keyWord = "robux" + elseif currentCurrencyType == Enum.CurrencyType.Tix then + keyWord = "tickets" + end + + if not keyWord then + return false + end + + local playerBalanceNumber = tonumber(playerBalance[keyWord]) + if not playerBalanceNumber then + return false + end + + local afterBalanceNumber = playerBalanceNumber - currentCurrencyAmount + + -- check to see if we have enough of the desired currency to allow a purchase, if not we need to prompt user to buy robux + if not notRightBc then + if afterBalanceNumber < 0 and keyWord == "robux" then + if openBuyCurrencyWindowConnection == nil then + openBuyCurrencyWindowConnection = + purchaseDialog.BodyFrame.AfterBalanceButton.MouseButton1Click:connect(openBuyCurrencyWindow) + end + purchaseDialog.BodyFrame.AfterBalanceButton.Text = "You need " + .. currencyTypeToString(currentCurrencyType) + .. " " + .. tostring(-afterBalanceNumber) + .. " more to buy this, click here to purchase more." + return true, true + elseif afterBalanceNumber < 0 and keyWord == "tickets" then + purchaseDialog.BodyFrame.AfterBalanceButton.Text = "You need " + .. tostring(-afterBalanceNumber) + .. " " + .. currencyTypeToString(currentCurrencyType) + .. " more to buy this item." + return true, true -- user can't buy more tickets, so we say fail the transaction (maybe instead we can prompt them to trade currency???) + end + end + + -- this ensures that we only have one connection to openBuyCurrencyWindow at a time (otherwise might open multiple browser windows) + if openBuyCurrencyWindowConnection then + openBuyCurrencyWindowConnection:disconnect() + openBuyCurrencyWindowConnection = nil + end + purchaseDialog.BodyFrame.AfterBalanceButton.Text = "Your balance after this transaction will be " + .. currencyTypeToString(currentCurrencyType) + .. " " + .. tostring(afterBalanceNumber) + .. "." + return true, false +end + +function isFreeItem() + -- if both of these are true, then the item is free, just prompt user if they want to take one + return currentProductInfo + and currentProductInfo["IsForSale"] == true + and currentProductInfo["IsPublicDomain"] == true +end +---------------------------------------------- End Currency Functions --------------------------------------------- + +---------------------------------------------- Data Functions ----------------------------------------------------- + +-- more enum to int fun! +function membershipTypeToNumber(membership) + if membership == Enum.MembershipType.None then + return 0 + elseif membership == Enum.MembershipType.BuildersClub then + return 1 + elseif membership == Enum.MembershipType.TurboBuildersClub then + return 2 + elseif membership == Enum.MembershipType.OutrageousBuildersClub then + return 3 + end + + return -1 +end + +-- This functions checks to make sure the purchase is even possible, if not it returns false and we don't prompt user (some situations require user feedback when we won't prompt) +function canPurchaseItem() + -- first we see if player already owns the asset/get the productinfo + local playerOwnsAsset = false + local notRightBc = false + local descText = nil + local success = false + + if purchasingConsumable then + local currentProductInfoRaw = nil + success = ypcall(function() + currentProductInfoRaw = Game:HttpGetAsync( + getSecureApiBaseUrl() .. "marketplace/productDetails?productid=" .. tostring(currentProductId) + ) + end) + if success then + currentProductInfo = getRbxUtility().DecodeJSON(currentProductInfoRaw) + end + else + success = ypcall(function() + currentProductInfo = game:GetService("MarketplaceService"):GetProductInfo(currentAssetId) + end) + end + + if currentProductInfo == nil or not success then + descText = "In-game sales are temporarily disabled. Please try again later." + return true, nil, nil, true, descText + end + + if not purchasingConsumable then + if not currentAssetId then + print "current asset id is nil, this should always have a value" + return false + end + if currentAssetId <= 0 then + print "current asset id is negative, this should always be positive" + return false + end + + local success, errorCode = ypcall(function() + playerOwnsAsset = game:HttpGetAsync( + getSecureApiBaseUrl() + .. "ownership/hasAsset?userId=" + .. tostring(game.Players.LocalPlayer.userId) + .. "&assetId=" + .. tostring(currentAssetId) + ) + end) + + if not success then + print("could not tell if player owns asset because", errorCode) + return false + end + + if playerOwnsAsset == true or playerOwnsAsset == "true" then + descText = "You already own this item." + return true, nil, nil, true, descText + end + end + + purchaseDialog.BodyFrame.AfterBalanceButton.Visible = true + + -- next we parse through product info and see if we can purchase + + if type(currentProductInfo) ~= "table" then + currentProductInfo = getRbxUtility().DecodeJSON(currentProductInfo) + end + + if not currentProductInfo then + descText = "Could not get product info. Please try again later." + return true, nil, nil, true, descText + end + + if currentProductInfo["IsForSale"] == false and currentProductInfo["IsPublicDomain"] == false then + descText = "This item is no longer for sale." + return true, nil, nil, true, descText + end + + -- now we start talking money, making sure we are going to be able to purchase this + if + not setCurrencyAmountAndType( + tonumber(currentProductInfo["PriceInRobux"]), + tonumber(currentProductInfo["PriceInTickets"]) + ) + then + descText = "We could retrieve the price of the item correctly. Please try again later." + return true, nil, nil, true, descText + end + + local playerBalance = getPlayerBalance() + if not playerBalance then + descText = "Could not retrieve your balance. Please try again later." + return true, nil, nil, true, descText + end + + if + tonumber(currentProductInfo["MinimumMembershipLevel"]) + > membershipTypeToNumber(game.Players.LocalPlayer.MembershipType) + then + notRightBc = true + end + + local updatedBalance, insufficientFunds = updateAfterBalanceText(playerBalance, notRightBc) + + if notRightBc then + purchaseDialog.BodyFrame.AfterBalanceButton.Active = true + return true, insufficientFunds, notRightBc, false + end + + if currentProductInfo["ContentRatingTypeId"] == 1 then + if game.Players.LocalPlayer:GetUnder13() then + descText = "Your account is under 13 so purchase of this item is not allowed." + return true, nil, nil, true, descText + end + end + + if + (currentProductInfo["IsLimited"] == true or currentProductInfo["IsLimitedUnique"] == true) + and ( + currentProductInfo["Remaining"] == "" + or currentProductInfo["Remaining"] == 0 + or currentProductInfo["Remaining"] == nil + ) + then + descText = "All copies of this item have been sold out! Try buying from other users on the website." + return true, nil, nil, true, descText + end + + if not updatedBalance then + descText = "Could not update your balance. Please check back after some time." + return true, nil, nil, true, descText + end + + -- we use insufficient funds to display a prompt to buy more robux + purchaseDialog.BodyFrame.AfterBalanceButton.Active = true + return true, insufficientFunds +end + +-- function computeSpaceString(pLabel) +-- local nString = " " +-- local tempSpaceLabel = Instance.new "TextButton" +-- tempSpaceLabel.Size = UDim2.new(0, pLabel.AbsoluteSize.X, 0, pLabel.AbsoluteSize.Y) +-- tempSpaceLabel.FontSize = pLabel.FontSize +-- tempSpaceLabel.Parent = pLabel.Parent +-- tempSpaceLabel.BackgroundTransparency = 1 +-- tempSpaceLabel.Text = nString +-- tempSpaceLabel.Name = "SpaceButton" + +-- while tempSpaceLabel.TextBounds.X < pLabel.TextBounds.X do +-- nString = nString .. " " +-- tempSpaceLabel.Text = nString +-- end +-- nString = nString .. " " +-- tempSpaceLabel.Text = "" +-- return nString +-- end + +---------------------------------------------- End Data Functions ----------------------------------------------------- + +---------------------------------------------- Gui Functions ---------------------------------------------- +function startSpinner() + spinning = true + Spawn(function() + local spinPos = 0 + while spinning do + local pos = 0 + + while pos < 8 do + if pos == spinPos or pos == ((spinPos + 1) % 8) then + spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset/?id=45880668" + else + spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset/?id=45880710" + end + + pos = pos + 1 + end + spinPos = (spinPos + 1) % 8 + wait(1 / 15) + end + end) +end + +function stopSpinner() + spinning = false +end + +-- convenience method to say exactly what buttons should be visible (all others are not!) +function setButtonsVisible(...) + local args = { ... } + local argCount = select("#", ...) + + local bodyFrameChildren = purchaseDialog.BodyFrame:GetChildren() + for i = 1, #bodyFrameChildren do + if bodyFrameChildren[i]:IsA "GuiButton" then + bodyFrameChildren[i].Visible = false + for j = 1, argCount do + if bodyFrameChildren[i] == args[j] then + bodyFrameChildren[i].Visible = true + break + end + end + end + end +end + +-- used for the "Purchasing..." frame +function createSpinner(size, position, parent) + local spinnerFrame = Instance.new "Frame" + spinnerFrame.Name = "Spinner" + spinnerFrame.Size = size + spinnerFrame.Position = position + spinnerFrame.BackgroundTransparency = 1 + spinnerFrame.ZIndex = 10 + spinnerFrame.Parent = parent + + spinnerIcons = {} + local spinnerNum = 1 + while spinnerNum <= 8 do + local spinnerImage = Instance.new "ImageLabel" + spinnerImage.Name = "Spinner" .. spinnerNum + spinnerImage.Size = UDim2.new(0, 16, 0, 16) + spinnerImage.Position = UDim2.new( + 0.5 + 0.3 * math.cos(math.rad(45 * spinnerNum)), + -8, + 0.5 + 0.3 * math.sin(math.rad(45 * spinnerNum)), + -8 + ) + spinnerImage.BackgroundTransparency = 1 + spinnerImage.ZIndex = 10 + spinnerImage.Image = "http://www.roblox.com/Asset/?id=45880710" + spinnerImage.Parent = spinnerFrame + + spinnerIcons[spinnerNum] = spinnerImage + spinnerNum = spinnerNum + 1 + end +end + +-- all the gui init. Would be nice if this didn't have to be a script +function createPurchasePromptGui() + purchaseDialog = Instance.new "Frame" + purchaseDialog.Name = "PurchaseFrame" + purchaseDialog.Size = UDim2.new(0, 660, 0, 400) + purchaseDialog.Position = hidePosition + purchaseDialog.Visible = false + purchaseDialog.BackgroundColor3 = Color3.new(141 / 255, 141 / 255, 141 / 255) + purchaseDialog.BorderColor3 = Color3.new(204 / 255, 204 / 255, 204 / 255) + purchaseDialog.Parent = game.CoreGui.RobloxGui + + local bodyFrame = Instance.new "Frame" + bodyFrame.Name = "BodyFrame" + bodyFrame.Size = UDim2.new(1, 0, 1, -60) + bodyFrame.Position = UDim2.new(0, 0, 0, 60) + bodyFrame.BackgroundColor3 = Color3.new(67 / 255, 67 / 255, 67 / 255) + bodyFrame.BorderSizePixel = 0 + bodyFrame.ZIndex = 8 + bodyFrame.Parent = purchaseDialog + + local titleLabel = createTextObject("TitleLabel", "Buy Item", "TextLabel", Enum.FontSize.Size48) + titleLabel.ZIndex = 8 + titleLabel.Size = UDim2.new(1, 0, 0, 60) + local titleBackdrop = titleLabel:Clone() + titleBackdrop.Name = "TitleBackdrop" + titleBackdrop.TextColor3 = Color3.new(32 / 255, 32 / 255, 32 / 255) + titleBackdrop.BackgroundTransparency = 0.0 + titleBackdrop.BackgroundColor3 = Color3.new(54 / 255, 96 / 255, 171 / 255) + titleBackdrop.Position = UDim2.new(0, 0, 0, -2) + titleBackdrop.ZIndex = 8 + titleBackdrop.Parent = purchaseDialog + titleLabel.Parent = purchaseDialog + + local distanceBetweenButtons = 90 + + local cancelButton = createImageButton "CancelButton" + cancelButton.Position = UDim2.new(0.5, (distanceBetweenButtons / 2), 1, -120) + cancelButton.BackgroundTransparency = 1 + cancelButton.BorderSizePixel = 0 + cancelButton.Parent = bodyFrame + cancelButton.Modal = true + cancelButton.ZIndex = 8 + cancelButton.Image = cancelButtonImageUrl + cancelButton.MouseButton1Down:connect(function() + cancelButton.Image = cancelButtonDownUrl + end) + cancelButton.MouseButton1Up:connect(function() + cancelButton.Image = cancelButtonImageUrl + end) + cancelButton.MouseLeave:connect(function() + cancelButton.Image = cancelButtonImageUrl + end) + cancelButton.MouseButton1Click:connect(doDeclinePurchase) + + local buyButton = createImageButton "BuyButton" + buyButton.Position = UDim2.new(0.5, -153 - (distanceBetweenButtons / 2), 1, -120) + buyButton.BackgroundTransparency = 1 + buyButton.BorderSizePixel = 0 + buyButton.Image = buyImageUrl + buyButton.ZIndex = 8 + buyButton.MouseButton1Down:connect(function() + buyButton.Image = buyImageDownUrl + end) + buyButton.MouseButton1Up:connect(function() + buyButton.Image = buyImageUrl + end) + buyButton.MouseLeave:connect(function() + buyButton.Image = buyImageUrl + end) + buyButton.Parent = bodyFrame + + local buyDisabledButton = buyButton:Clone() + buyDisabledButton.Name = "BuyDisabledButton" + buyDisabledButton.AutoButtonColor = false + buyDisabledButton.Visible = false + buyDisabledButton.Active = false + buyDisabledButton.Image = buyImageDisabledUrl + buyDisabledButton.ZIndex = 8 + buyDisabledButton.Parent = bodyFrame + + local freeButton = buyButton:Clone() + freeButton.BackgroundTransparency = 1 + freeButton.Name = "FreeButton" + freeButton.Visible = false + freeButton.ZIndex = 8 + freeButton.Image = freeButtonImageUrl + freeButton.MouseButton1Down:connect(function() + freeButton.Image = freeButtonImageDownUrl + end) + freeButton.MouseButton1Up:connect(function() + freeButton.Image = freeButtonImageUrl + end) + freeButton.MouseLeave:connect(function() + freeButton.Image = freeButtonImageUrl + end) + freeButton.Parent = bodyFrame + + local okButton = buyButton:Clone() + okButton.Name = "OkButton" + okButton.BackgroundTransparency = 1 + okButton.Visible = false + okButton.Position = UDim2.new(0.5, -okButton.Size.X.Offset / 2, 1, -120) + okButton.Modal = true + okButton.Image = okButtonUrl + okButton.ZIndex = 8 + okButton.MouseButton1Down:connect(function() + okButton.Image = okButtonPressedrl + end) + okButton.MouseButton1Up:connect(function() + okButton.Image = okButtonUrl + end) + okButton.MouseLeave:connect(function() + okButton.Image = okButtonUrl + end) + okButton.Parent = bodyFrame + + local okPurchasedButton = okButton:Clone() + okPurchasedButton.ZIndex = 8 + okPurchasedButton.Name = "OkPurchasedButton" + okPurchasedButton.MouseButton1Down:connect(function() + okPurchasedButton.Image = okButtonPressedrl + end) + okPurchasedButton.MouseButton1Up:connect(function() + okPurchasedButton.Image = okButtonUrl + end) + okPurchasedButton.MouseLeave:connect(function() + okPurchasedButton.Image = okButtonUrl + end) + okPurchasedButton.Parent = bodyFrame + + okButton.MouseButton1Click:connect(function() + userPurchaseActionsEnded(false) + end) + okPurchasedButton.MouseButton1Click:connect(function() + if purchasingConsumable then + userPurchaseProductActionsEnded(true) + else + signalPromptEnded(true) + end + end) + buyButton.MouseButton1Click:connect(function() + doAcceptPurchase(Enum.CurrencyType.Robux) + end) + freeButton.MouseButton1Click:connect(function() + doAcceptPurchase(false) + end) + + local itemPreview = Instance.new "ImageLabel" + itemPreview.Name = "ItemPreview" + itemPreview.BackgroundColor3 = Color3.new(32 / 255, 32 / 255, 32 / 255) + itemPreview.BorderColor3 = Color3.new(141 / 255, 141 / 255, 141 / 255) + itemPreview.Position = UDim2.new(0, 30, 0, 20) + itemPreview.Size = UDim2.new(0, 180, 0, 180) + itemPreview.ZIndex = 9 + itemPreview.Parent = bodyFrame + + local itemDescription = createTextObject( + "ItemDescription", + "Would you like to buy the 'itemName' for currencyType currencyAmount?", + "TextLabel", + Enum.FontSize.Size24 + ) + itemDescription.Position = UDim2.new(1, 20, 0, 0) + itemDescription.Size = UDim2.new(0, 410, 1, 0) + itemDescription.ZIndex = 8 + itemDescription.Parent = itemPreview + + local afterBalanceButton = createTextObject( + "AfterBalanceButton", + "Place holder text ip sum lorem dodo ashs", + "TextButton", + Enum.FontSize.Size24 + ) + afterBalanceButton.AutoButtonColor = false + afterBalanceButton.TextColor3 = Color3.new(222 / 255, 59 / 255, 30 / 255) + afterBalanceButton.Position = UDim2.new(0, 5, 1, -55) + afterBalanceButton.Size = UDim2.new(1, -10, 0, 50) + afterBalanceButton.ZIndex = 8 + afterBalanceButton.Parent = bodyFrame + + local purchasingFrame = Instance.new "Frame" + purchasingFrame.Name = "PurchasingFrame" + purchasingFrame.Size = UDim2.new(1, 0, 1, 0) + purchasingFrame.BackgroundColor3 = Color3.new(0, 0, 0) + purchasingFrame.BackgroundTransparency = 0.2 + purchasingFrame.BorderSizePixel = 0 + purchasingFrame.ZIndex = 9 + purchasingFrame.Visible = false + purchasingFrame.Active = true + purchasingFrame.Parent = purchaseDialog + + local purchasingLabel = createTextObject("PurchasingLabel", "Purchasing...", "TextLabel", Enum.FontSize.Size48) + purchasingLabel.Size = UDim2.new(1, 0, 1, 0) + purchasingLabel.ZIndex = 10 + purchasingLabel.Parent = purchasingFrame + + createSpinner(UDim2.new(0, 50, 0, 50), UDim2.new(0.5, -25, 0.5, 30), purchasingLabel) +end + +-- next two functions control the "Purchasing..." overlay +function showPurchasing() + startSpinner() + purchaseDialog.PurchasingFrame.Visible = true +end + +function hidePurchasing() + purchaseDialog.PurchasingFrame.Visible = false + stopSpinner() +end + +-- next 2 functions are convenienvce creation functions for guis +function createTextObject(name, text, type, size) + local textLabel = Instance.new(type) + textLabel.Font = Enum.Font.ArialBold + textLabel.TextColor3 = Color3.new(217 / 255, 217 / 255, 217 / 255) + textLabel.TextWrapped = true + textLabel.Name = name + textLabel.Text = text + textLabel.BackgroundTransparency = 1 + textLabel.BorderSizePixel = 0 + textLabel.FontSize = size + + return textLabel +end + +function createImageButton(name) + local imageButton = Instance.new "ImageButton" + imageButton.Size = UDim2.new(0, 153, 0, 46) + imageButton.Name = name + return imageButton +end + +function setHeaderText(text) + purchaseDialog.TitleLabel.Text = text + purchaseDialog.TitleBackdrop.Text = text +end + +function cutSizeInHalfRecursive(_) + -- todo: change the gui size based on how much space we have + --[[changeSize(instance,0.5) + + local children = instance:GetChildren() + for i = 1, #children do + cutSizeInHalfRecursive(children[i]) + end]] +end + +function doubleSizeRecursive(_) + -- todo: change the gui size based on how much space we have + --[[changeSize(instance,2) + + local children = instance:GetChildren() + for i = 1, #children do + doubleSizeRecursive(children[i]) + end]] +end + +function modifyForSmallScreen() + cutSizeInHalfRecursive(purchaseDialog) +end + +function modifyForLargeScreen() + doubleSizeRecursive(purchaseDialog) +end + +-- depending on screen size, we need to change the gui +function changeGuiToScreenSize(smallScreen) + if smallScreen then + modifyForSmallScreen() + else + modifyForLargeScreen() + end +end + +function doPurchasePrompt(player, assetId, equipIfPurchased, currencyType, productId) + if not purchaseDialog then + createPurchasePromptGui() + end + + if player == game.Players.LocalPlayer then + if currentlyPrompting then + return + end + + currentlyPrompting = true + + currentAssetId = assetId + currentProductId = productId + currentCurrencyType = currencyType + currentEquipOnPurchase = equipIfPurchased + + purchasingConsumable = (currentProductId ~= nil) + + showPurchasePrompt() + end +end + +function userPurchaseProductActionsEnded(userIsClosingDialog) + checkingPlayerFunds = false + + if userIsClosingDialog then + closePurchasePrompt() + if currentServerResponseTable then + local isPurchased = false + if tostring(currentServerResponseTable["isValid"]):lower() == "true" then + isPurchased = true + end + + Game:GetService("MarketplaceService"):SignalPromptProductPurchaseFinished( + tonumber(currentServerResponseTable["playerId"]), + tonumber(currentServerResponseTable["productId"]), + isPurchased + ) + else + print "Something went wrong, no currentServerResponseTable" + end + removeCurrentPurchaseInfo() + else + local newPurchasedSucceededText = + string.gsub(purchaseSucceededText, "itemName", tostring(currentProductInfo["Name"])) + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText + setButtonsVisible(purchaseDialog.BodyFrame.OkPurchasedButton) + hidePurchasing() + end +end + +function doProcessServerPurchaseResponse(serverResponseTable) + if not serverResponseTable then + print "Server response table was nil, cancelling purchase" + purchaseFailed() + return + end + + if + serverResponseTable["playerId"] + and tonumber(serverResponseTable["playerId"]) == game.Players.LocalPlayer.userId + then + currentServerResponseTable = serverResponseTable + userPurchaseProductActionsEnded(false) + end +end + +---------------------------------------------- End Gui Functions ---------------------------------------------- + +---------------------------------------------- Script Event start/initialization ---------------------------------------------- +preloadAssets() + +game:GetService("MarketplaceService").PromptProductPurchaseRequested + :connect(function(player, productId, equipIfPurchased, currencyType) + doPurchasePrompt(player, nil, equipIfPurchased, currencyType, productId) + end) + +Game:GetService("MarketplaceService").PromptPurchaseRequested + :connect(function(player, assetId, equipIfPurchased, currencyType) + doPurchasePrompt(player, assetId, equipIfPurchased, currencyType, nil) + end) + +Game:GetService("MarketplaceService").ServerPurchaseVerification:connect(function(serverResponseTable) + doProcessServerPurchaseResponse(serverResponseTable) +end) + +if enableBrowserWindowClosedEvent then + Game:GetService("GuiService").BrowserWindowClosed:connect(function() + doPlayerFundsCheck(false) + end) +end + +Game.CoreGui.RobloxGui.Changed:connect(function() + local nowIsSmallScreen = (game.CoreGui.RobloxGui.AbsoluteSize.Y <= smallScreenThreshold) + if nowIsSmallScreen and not isSmallScreen then + changeGuiToScreenSize(true) + elseif not nowIsSmallScreen and isSmallScreen then + changeGuiToScreenSize(false) + end + + isSmallScreen = nowIsSmallScreen +end) + +isSmallScreen = (game.CoreGui.RobloxGui.AbsoluteSize.Y <= smallScreenThreshold) +if isSmallScreen then + changeGuiToScreenSize(true) +end diff --git a/lua/152908679.lua b/lua/152908679.lua new file mode 100644 index 0000000..ee0d5a7 --- /dev/null +++ b/lua/152908679.lua @@ -0,0 +1,278 @@ +-- ContextActionTouch.lua +-- 2014, created by Ben Tkacheff +-- this script controls ui and firing of lua functions that are bound in ContextActionService for touch inputs +-- Essentially a user can bind a lua function to a key code, input type (mousebutton1 etc.) and this + +-- Variables +local contextActionService = Game:GetService "ContextActionService" +local isTouchDevice = Game:GetService("UserInputService").TouchEnabled +local functionTable = {} +local buttonVector = {} +local buttonScreenGui = nil +local buttonFrame = nil + +local ContextDownImage = "http://www.banland.xyz/asset/?id=97166756" +local ContextUpImage = "http://www.banland.xyz/asset/?id=97166444" + +local oldTouches = {} + +local buttonPositionTable = { + [1] = UDim2.new(0, 123, 0, 70), + [2] = UDim2.new(0, 30, 0, 60), + [3] = UDim2.new(0, 180, 0, 160), + [4] = UDim2.new(0, 85, 0, -25), + [5] = UDim2.new(0, 185, 0, -25), + [6] = UDim2.new(0, 185, 0, 260), + [7] = UDim2.new(0, 216, 0, 65), +} +local maxButtons = #buttonPositionTable + +-- Preload images +Game:GetService("ContentProvider"):Preload(ContextDownImage) +Game:GetService("ContentProvider"):Preload(ContextUpImage) + +while not Game.Players do + wait() +end + +while not Game.Players.LocalPlayer do + wait() +end + +function createContextActionGui() + if not buttonScreenGui and isTouchDevice then + buttonScreenGui = Instance.new "ScreenGui" + buttonScreenGui.Name = "ContextActionGui" + + buttonFrame = Instance.new "Frame" + buttonFrame.BackgroundTransparency = 1 + buttonFrame.Size = UDim2.new(0.3, 0, 0.5, 0) + buttonFrame.Position = UDim2.new(0.7, 0, 0.5, 0) + buttonFrame.Name = "ContextButtonFrame" + buttonFrame.Parent = buttonScreenGui + end +end + +-- functions +-- function setButtonSizeAndPosition(object) +-- local buttonSize = 55 +-- local xOffset = 10 +-- local yOffset = 95 + +-- -- todo: better way to determine mobile sized screens +-- local onSmallScreen = (game.CoreGui.RobloxGui.AbsoluteSize.X < 600) +-- if not onSmallScreen then +-- buttonSize = 85 +-- xOffset = 40 +-- end + +-- object.Size = UDim2.new(0, buttonSize, 0, buttonSize) +-- end + +function contextButtonDown(button, inputObject, actionName) + if inputObject.UserInputType == Enum.UserInputType.Touch then + button.Image = ContextDownImage + contextActionService:CallFunction(actionName, Enum.UserInputState.Begin, inputObject) + end +end + +function contextButtonMoved(button, inputObject, actionName) + if inputObject.UserInputType == Enum.UserInputType.Touch then + button.Image = ContextDownImage + contextActionService:CallFunction(actionName, Enum.UserInputState.Change, inputObject) + end +end + +function contextButtonUp(button, inputObject, actionName) + button.Image = ContextUpImage + if + inputObject.UserInputType == Enum.UserInputType.Touch + and inputObject.UserInputState == Enum.UserInputState.End + then + contextActionService:CallFunction(actionName, Enum.UserInputState.End, inputObject) + end +end + +function isSmallScreenDevice() + return Game:GetService("GuiService"):GetScreenResolution().y <= 320 +end + +function createNewButton(actionName, functionInfoTable) + local contextButton = Instance.new "ImageButton" + contextButton.Name = "ContextActionButton" + contextButton.BackgroundTransparency = 1 + contextButton.Size = UDim2.new(0, 90, 0, 90) + contextButton.Active = true + if isSmallScreenDevice() then + contextButton.Size = UDim2.new(0, 70, 0, 70) + end + contextButton.Image = ContextUpImage + contextButton.Parent = buttonFrame + + local currentButtonTouch = nil + + Game:GetService("UserInputService").InputEnded:connect(function(inputObject) + oldTouches[inputObject] = nil + end) + contextButton.InputBegan:connect(function(inputObject) + if oldTouches[inputObject] then + return + end + + if inputObject.UserInputState == Enum.UserInputState.Begin and currentButtonTouch == nil then + currentButtonTouch = inputObject + contextButtonDown(contextButton, inputObject, actionName) + end + end) + contextButton.InputChanged:connect(function(inputObject) + if oldTouches[inputObject] then + return + end + if currentButtonTouch ~= inputObject then + return + end + + contextButtonMoved(contextButton, inputObject, actionName) + end) + contextButton.InputEnded:connect(function(inputObject) + if oldTouches[inputObject] then + return + end + if currentButtonTouch ~= inputObject then + return + end + + currentButtonTouch = nil + oldTouches[inputObject] = true + contextButtonUp(contextButton, inputObject, actionName) + end) + + local actionIcon = Instance.new "ImageLabel" + actionIcon.Name = "ActionIcon" + actionIcon.Position = UDim2.new(0.175, 0, 0.175, 0) + actionIcon.Size = UDim2.new(0.65, 0, 0.65, 0) + actionIcon.BackgroundTransparency = 1 + if functionInfoTable["image"] and type(functionInfoTable["image"]) == "string" then + actionIcon.Image = functionInfoTable["image"] + end + actionIcon.Parent = contextButton + + local actionTitle = Instance.new "TextLabel" + actionTitle.Name = "ActionTitle" + actionTitle.Size = UDim2.new(1, 0, 1, 0) + actionTitle.BackgroundTransparency = 1 + actionTitle.Font = Enum.Font.SourceSansBold + actionTitle.TextColor3 = Color3.new(1, 1, 1) + actionTitle.TextStrokeTransparency = 0 + actionTitle.FontSize = Enum.FontSize.Size18 + actionTitle.TextWrapped = true + actionTitle.Text = "" + if functionInfoTable["title"] and type(functionInfoTable["title"]) == "string" then + actionTitle.Text = functionInfoTable["title"] + end + actionTitle.Parent = contextButton + + return contextButton +end + +function createButton(actionName, functionInfoTable) + local button = createNewButton(actionName, functionInfoTable) + + local position = nil + for i = 1, #buttonVector do + if buttonVector[i] == "empty" then + position = i + break + end + end + + if not position then + position = #buttonVector + 1 + end + + if position > maxButtons then + return -- todo: let user know we have too many buttons already? + end + + buttonVector[position] = button + functionTable[actionName]["button"] = button + + button.Position = buttonPositionTable[position] + button.Parent = buttonFrame + + if buttonScreenGui and buttonScreenGui.Parent == nil then + buttonScreenGui.Parent = Game.Players.LocalPlayer.PlayerGui + end +end + +function removeAction(actionName) + if not functionTable[actionName] then + return + end + + local actionButton = functionTable[actionName]["button"] + + if actionButton then + actionButton.Parent = nil + + for i = 1, #buttonVector do + if buttonVector[i] == actionButton then + buttonVector[i] = "empty" + break + end + end + + actionButton:Destroy() + end + + functionTable[actionName] = nil +end + +function addAction(actionName, createTouchButton, functionInfoTable) + if functionTable[actionName] then + removeAction(actionName) + end + functionTable[actionName] = { functionInfoTable } + if createTouchButton and isTouchDevice then + createContextActionGui() + createButton(actionName, functionInfoTable) + end +end + +-- Connections +contextActionService.BoundActionChanged:connect(function(actionName, changeName, changeTable) + if functionTable[actionName] and changeTable then + local button = functionTable[actionName]["button"] + if button then + if changeName == "image" then + button.ActionIcon.Image = changeTable[changeName] + elseif changeName == "title" then + button.ActionTitle.Text = changeTable[changeName] + -- elseif changeName == "description" then + -- -- todo: add description to menu + elseif changeName == "position" then + button.Position = changeTable[changeName] + end + end + end +end) + +contextActionService.BoundActionAdded:connect(function(actionName, createTouchButton, functionInfoTable) + addAction(actionName, createTouchButton, functionInfoTable) +end) + +contextActionService.BoundActionRemoved:connect(function(actionName, _) + removeAction(actionName) +end) + +contextActionService.GetActionButtonEvent:connect(function(actionName) + if functionTable[actionName] then + contextActionService:FireActionButtonFoundSignal(actionName, functionTable[actionName]["button"]) + end +end) + +-- make sure any bound data before we setup connections is handled +local boundActions = contextActionService:GetAllBoundActionInfo() +for actionName, actionData in pairs(boundActions) do + addAction(actionName, actionData["createTouchButton"], actionData) +end diff --git a/lua/153556783.lua b/lua/153556783.lua new file mode 100644 index 0000000..61509bf --- /dev/null +++ b/lua/153556783.lua @@ -0,0 +1,647 @@ +-- This is responsible for all touch controls we show (as of this writing, only on iOS) +-- this includes character move thumbsticks, and buttons for jump, use of items, camera, etc. +-- Written by Ben Tkacheff, 2013 + +-- obligatory stuff to make sure we don't access nil data +while not Game do + wait() +end +while not Game:FindFirstChild "Players" do + wait() +end +while not Game.Players.LocalPlayer do + wait() +end +while not Game:FindFirstChild "CoreGui" do + wait() +end +while not Game.CoreGui:FindFirstChild "RobloxGui" do + wait() +end + +local userInputService = Game:GetService "UserInputService" +local success = pcall(function() + userInputService:IsLuaTouchControls() +end) +if not success then + script:Destroy() +end + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- +-- Variables +local screenResolution = Game:GetService("GuiService"):GetScreenResolution() +function isSmallScreenDevice() + return screenResolution.y <= 320 +end + +local localPlayer = Game.Players.LocalPlayer +local thumbstickSize = 120 +if isSmallScreenDevice() then + thumbstickSize = 70 +end + +local touchControlsSheet = "rbxasset://textures/ui/TouchControlsSheet.png" +local ThumbstickDeadZone = 5 +local ThumbstickMaxPercentGive = 0.92 +local thumbstickTouches = {} + +local jumpButtonSize = 90 +if isSmallScreenDevice() then + jumpButtonSize = 70 +end +local oldJumpTouches = {} +local currentJumpTouch = nil + +local CameraRotateSensitivity = 0.007 +local CameraRotateDeadZone = CameraRotateSensitivity * 16 +local CameraZoomSensitivity = 0.03 +local PinchZoomDelay = 0.2 +local cameraTouch = nil + +-- make sure all of our images are good to go +Game:GetService("ContentProvider"):Preload(touchControlsSheet) + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- +-- Functions + +function DistanceBetweenTwoPoints(point1, point2) + local dx = point2.x - point1.x + local dy = point2.y - point1.y + return math.sqrt((dx * dx) + (dy * dy)) +end + +function transformFromCenterToTopLeft(pointToTranslate, guiObject) + return UDim2.new( + 0, + pointToTranslate.x - guiObject.AbsoluteSize.x / 2, + 0, + pointToTranslate.y - guiObject.AbsoluteSize.y / 2 + ) +end + +function rotatePointAboutLocation(pointToRotate, pointToRotateAbout, radians) + local sinAnglePercent = math.sin(radians) + local cosAnglePercent = math.cos(radians) + + local transformedPoint = pointToRotate + + -- translate point back to origin: + transformedPoint = Vector2.new(transformedPoint.x - pointToRotateAbout.x, transformedPoint.y - pointToRotateAbout.y) + + -- rotate point + local xNew = transformedPoint.x * cosAnglePercent - transformedPoint.y * sinAnglePercent + local yNew = transformedPoint.x * sinAnglePercent + transformedPoint.y * cosAnglePercent + + -- translate point back: + transformedPoint = Vector2.new(xNew + pointToRotateAbout.x, yNew + pointToRotateAbout.y) + + return transformedPoint +end + +function dotProduct(v1, v2) + return ((v1.x * v2.x) + (v1.y * v2.y)) +end + +function stationaryThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation) + local thumbstickOuterCenterPosition = Vector2.new( + thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, + thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2 + ) + local centerDiff = DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenterPosition) + + -- thumbstick is moving outside our region, need to cap its distance + if centerDiff > (thumbstickSize / 2) then + local thumbVector = Vector2.new( + touchLocation.x - thumbstickOuterCenterPosition.x, + touchLocation.y - thumbstickOuterCenterPosition.y + ) + local normal = thumbVector.unit + if normal.x == math.nan or normal.x == math.inf then + normal = Vector2.new(0, normal.y) + end + if normal.y == math.nan or normal.y == math.inf then + normal = Vector2.new(normal.x, 0) + end + + local newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize / 2)) + thumbstickFrame.Position = transformFromCenterToTopLeft(newThumbstickInnerPosition, thumbstickFrame) + else + thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame) + end + + return Vector2.new( + thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset, + thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset + ) +end + +function followThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation) + local thumbstickOuterCenter = Vector2.new( + thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, + thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2 + ) + + -- thumbstick is moving outside our region, need to position outer thumbstick texture carefully (to make look and feel like actual joystick controller) + if DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) > thumbstickSize / 2 then + local thumbstickInnerCenter = Vector2.new( + thumbstickFrame.Position.X.Offset + thumbstickFrame.AbsoluteSize.x / 2, + thumbstickFrame.Position.Y.Offset + thumbstickFrame.AbsoluteSize.y / 2 + ) + local movementVectorUnit = + Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit + + local outerToInnerVectorCurrent = Vector2.new( + thumbstickInnerCenter.x - thumbstickOuterCenter.x, + thumbstickInnerCenter.y - thumbstickOuterCenter.y + ) + local outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit + local movementVector = + Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y) + + -- First, find the angle between the new thumbstick movement vector, + -- and the vector between thumbstick inner and thumbstick outer. + -- We will use this to pivot thumbstick outer around thumbstick inner, gives a nice joystick feel + local crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y) + - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x) + local angle = + math.atan2(crossOuterToInnerWithMovement, dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit)) + local anglePercent = angle * math.min(movementVector.magnitude / outerToInnerVectorCurrent.magnitude, 1.0) + + -- If angle is significant, rotate about the inner thumbsticks current center + if math.abs(anglePercent) > 0.00001 then + local outerThumbCenter = + rotatePointAboutLocation(thumbstickOuterCenter, thumbstickInnerCenter, anglePercent) + thumbstickOuter.Position = + transformFromCenterToTopLeft(Vector2.new(outerThumbCenter.x, outerThumbCenter.y), thumbstickOuter) + end + + -- now just translate outer thumbstick to make sure it stays nears inner thumbstick + thumbstickOuter.Position = UDim2.new( + 0, + thumbstickOuter.Position.X.Offset + movementVector.x, + 0, + thumbstickOuter.Position.Y.Offset + movementVector.y + ) + end + + thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame) + + -- a bit of error checking to make sure thumbsticks stay close to eachother + local thumbstickFramePosition = Vector2.new(thumbstickFrame.Position.X.Offset, thumbstickFrame.Position.Y.Offset) + local thumbstickOuterPosition = Vector2.new(thumbstickOuter.Position.X.Offset, thumbstickOuter.Position.Y.Offset) + if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize / 2 then + local vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize / 2 + thumbstickOuter.Position = UDim2.new( + 0, + thumbstickFramePosition.x + vectorWithLength.x, + 0, + thumbstickFramePosition.y + vectorWithLength.y + ) + end + + return Vector2.new( + thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset, + thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset + ) +end + +function movementOutsideDeadZone(movementVector) + return ((math.abs(movementVector.x) > ThumbstickDeadZone) or (math.abs(movementVector.y) > ThumbstickDeadZone)) +end + +function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThumbstick) + local thumbstickFrame = Instance.new "Frame" + thumbstickFrame.Name = "ThumbstickFrame" + thumbstickFrame.Active = true + thumbstickFrame.Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize) + thumbstickFrame.Position = defaultThumbstickPos + thumbstickFrame.BackgroundTransparency = 1 + + local outerThumbstick = Instance.new "ImageLabel" + outerThumbstick.Name = "OuterThumbstick" + outerThumbstick.Image = touchControlsSheet + outerThumbstick.ImageRectOffset = Vector2.new(0, 0) + outerThumbstick.ImageRectSize = Vector2.new(220, 220) + outerThumbstick.BackgroundTransparency = 1 + outerThumbstick.Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize) + outerThumbstick.Position = defaultThumbstickPos + outerThumbstick.Parent = Game.CoreGui.RobloxGui + + local innerThumbstick = Instance.new "ImageLabel" + innerThumbstick.Name = "InnerThumbstick" + innerThumbstick.Image = touchControlsSheet + innerThumbstick.ImageRectOffset = Vector2.new(220, 0) + innerThumbstick.ImageRectSize = Vector2.new(111, 111) + innerThumbstick.BackgroundTransparency = 1 + innerThumbstick.Size = UDim2.new(0, thumbstickSize / 2, 0, thumbstickSize / 2) + innerThumbstick.Position = UDim2.new( + 0, + thumbstickFrame.Size.X.Offset / 2 - thumbstickSize / 4, + 0, + thumbstickFrame.Size.Y.Offset / 2 - thumbstickSize / 4 + ) + innerThumbstick.Parent = thumbstickFrame + innerThumbstick.ZIndex = 2 + + local thumbstickTouch = nil + local userInputServiceTouchMovedCon = nil + local userInputSeviceTouchEndedCon = nil + + local startInputTracking = function(inputObject) + if thumbstickTouch then + return + end + if inputObject == cameraTouch then + return + end + if inputObject == currentJumpTouch then + return + end + if inputObject.UserInputType ~= Enum.UserInputType.Touch then + return + end + + thumbstickTouch = inputObject + table.insert(thumbstickTouches, thumbstickTouch) + + thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position, thumbstickFrame) + outerThumbstick.Position = thumbstickFrame.Position + + userInputServiceTouchMovedCon = userInputService.TouchMoved:connect(function(movedInput) + if movedInput == thumbstickTouch then + local movementVector = nil + if stationaryThumbstick then + movementVector = stationaryThumbstickTouchMove( + thumbstickFrame, + outerThumbstick, + Vector2.new(movedInput.Position.x, movedInput.Position.y) + ) + else + movementVector = followThumbstickTouchMove( + thumbstickFrame, + outerThumbstick, + Vector2.new(movedInput.Position.x, movedInput.Position.y) + ) + end + + if updateFunction then + updateFunction(movementVector, outerThumbstick.Size.X.Offset / 2) + end + end + end) + userInputSeviceTouchEndedCon = userInputService.TouchEnded:connect(function(endedInput) + if endedInput == thumbstickTouch then + if updateFunction then + updateFunction(Vector2.new(0, 0), 1) + end + + userInputSeviceTouchEndedCon:disconnect() + userInputServiceTouchMovedCon:disconnect() + + thumbstickFrame.Position = defaultThumbstickPos + outerThumbstick.Position = defaultThumbstickPos + + for i, object in pairs(thumbstickTouches) do + if object == thumbstickTouch then + table.remove(thumbstickTouches, i) + break + end + end + thumbstickTouch = nil + end + end) + end + + userInputService.Changed:connect(function(prop) + if prop == "ModalEnabled" then + thumbstickFrame.Visible = not userInputService.ModalEnabled + outerThumbstick.Visible = not userInputService.ModalEnabled + end + end) + + thumbstickFrame.InputBegan:connect(startInputTracking) + return thumbstickFrame +end + +function setupCharacterMovement(parentFrame) + local lastMovementVector, lastMaxMovement = nil + local moveCharacterFunc = localPlayer.MoveCharacter + local moveCharacterFunction = function(movementVector, maxMovement) + if localPlayer then + if movementOutsideDeadZone(movementVector) then + lastMovementVector = movementVector + lastMaxMovement = maxMovement + -- sometimes rounding error will not allow us to go max speed at some + -- thumbstick angles, fix this with a bit of fudging near 100% throttle + if movementVector.magnitude / maxMovement > ThumbstickMaxPercentGive then + maxMovement = movementVector.magnitude - 1 + end + moveCharacterFunc(localPlayer, movementVector, maxMovement) + else + lastMovementVector = Vector2.new(0, 0) + lastMaxMovement = 1 + moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement) + end + end + end + + local thumbstickPos = UDim2.new(0, thumbstickSize / 2, 1, -thumbstickSize * 1.75) + if isSmallScreenDevice() then + thumbstickPos = UDim2.new(0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20) + end + local characterThumbstick = constructThumbstick(thumbstickPos, moveCharacterFunction, false) + characterThumbstick.Name = "CharacterThumbstick" + characterThumbstick.Parent = parentFrame + + local refreshCharacterMovement = function() + if localPlayer and moveCharacterFunc and lastMovementVector and lastMaxMovement then + moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement) + end + end + return refreshCharacterMovement +end + +function setupJumpButton(parentFrame) + local jumpButton = Instance.new "ImageButton" + jumpButton.Name = "JumpButton" + jumpButton.BackgroundTransparency = 1 + jumpButton.Image = touchControlsSheet + jumpButton.ImageRectOffset = Vector2.new(176, 222) + jumpButton.ImageRectSize = Vector2.new(174, 174) + jumpButton.Size = UDim2.new(0, jumpButtonSize, 0, jumpButtonSize) + if isSmallScreenDevice() then + jumpButton.Position = UDim2.new(1, -(jumpButtonSize * 2.25), 1, -jumpButtonSize - 20) + else + jumpButton.Position = UDim2.new(1, -(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120) + end + + local playerJumpFunc = localPlayer.JumpCharacter + + local doJumpLoop = function() + while currentJumpTouch do + if localPlayer then + playerJumpFunc(localPlayer) + end + wait(1 / 60) + end + end + + jumpButton.InputBegan:connect(function(inputObject) + if inputObject.UserInputType ~= Enum.UserInputType.Touch then + return + end + if currentJumpTouch then + return + end + if inputObject == cameraTouch then + return + end + for _, touch in pairs(oldJumpTouches) do + if touch == inputObject then + return + end + end + + currentJumpTouch = inputObject + jumpButton.ImageRectOffset = Vector2.new(0, 222) + jumpButton.ImageRectSize = Vector2.new(174, 174) + doJumpLoop() + end) + jumpButton.InputEnded:connect(function(inputObject) + if inputObject.UserInputType ~= Enum.UserInputType.Touch then + return + end + + jumpButton.ImageRectOffset = Vector2.new(176, 222) + jumpButton.ImageRectSize = Vector2.new(174, 174) + + if inputObject == currentJumpTouch then + table.insert(oldJumpTouches, currentJumpTouch) + currentJumpTouch = nil + end + end) + userInputService.InputEnded:connect(function(globalInputObject) + for i, touch in pairs(oldJumpTouches) do + if touch == globalInputObject then + table.remove(oldJumpTouches, i) + break + end + end + end) + + userInputService.Changed:connect(function(prop) + if prop == "ModalEnabled" then + jumpButton.Visible = not userInputService.ModalEnabled + end + end) + + jumpButton.Parent = parentFrame +end + +function isTouchUsedByJumpButton(touch) + if touch == currentJumpTouch then + return true + end + for _, touchToCompare in pairs(oldJumpTouches) do + if touch == touchToCompare then + return true + end + end + + return false +end + +function isTouchUsedByThumbstick(touch) + for _, touchToCompare in pairs(thumbstickTouches) do + if touch == touchToCompare then + return true + end + end + + return false +end + +function setupCameraControl(parentFrame, refreshCharacterMoveFunc) + local lastPos = nil + local hasRotatedCamera = false + local rotateCameraFunc = userInputService.RotateCamera + + local pinchTime = -1 + local shouldPinch = false + local lastPinchScale = nil + local zoomCameraFunc = userInputService.ZoomCamera + local pinchTouches = {} + local pinchFrame = nil + + local resetCameraRotateState = function() + cameraTouch = nil + hasRotatedCamera = false + lastPos = nil + end + + local resetPinchState = function() + pinchTouches = {} + lastPinchScale = nil + shouldPinch = false + pinchFrame:Destroy() + pinchFrame = nil + end + + local startPinch = function(firstTouch, secondTouch) + -- track pinching in new frame + if pinchFrame then + pinchFrame:Destroy() + end -- make sure we didn't track in any mud + pinchFrame = Instance.new "Frame" + pinchFrame.Name = "PinchFrame" + pinchFrame.BackgroundTransparency = 1 + pinchFrame.Parent = parentFrame + pinchFrame.Size = UDim2.new(1, 0, 1, 0) + + pinchFrame.InputChanged:connect(function(inputObject) + if not shouldPinch then + resetPinchState() + return + end + resetCameraRotateState() + + if lastPinchScale == nil then -- first pinch move, just set up scale + if inputObject == firstTouch then + lastPinchScale = (inputObject.Position - secondTouch.Position).magnitude + firstTouch = inputObject + elseif inputObject == secondTouch then + lastPinchScale = (inputObject.Position - firstTouch.Position).magnitude + secondTouch = inputObject + end + else -- we are now actually pinching, do comparison to last pinch size + local newPinchDistance = 0 + if inputObject == firstTouch then + newPinchDistance = (inputObject.Position - secondTouch.Position).magnitude + firstTouch = inputObject + elseif inputObject == secondTouch then + newPinchDistance = (inputObject.Position - firstTouch.Position).magnitude + secondTouch = inputObject + end + if newPinchDistance ~= 0 then + local pinchDiff = newPinchDistance - lastPinchScale + if pinchDiff ~= 0 then + zoomCameraFunc(userInputService, (pinchDiff * CameraZoomSensitivity)) + end + lastPinchScale = newPinchDistance + end + end + end) + pinchFrame.InputEnded:connect(function(inputObject) -- pinch is over, destroy all + if inputObject == firstTouch or inputObject == secondTouch then + resetPinchState() + end + end) + end + + local pinchGestureReceivedTouch = function(inputObject) + if #pinchTouches < 1 then + table.insert(pinchTouches, inputObject) + pinchTime = tick() + shouldPinch = false + elseif #pinchTouches == 1 then + shouldPinch = ((tick() - pinchTime) <= PinchZoomDelay) + + if shouldPinch then + table.insert(pinchTouches, inputObject) + startPinch(pinchTouches[1], pinchTouches[2]) + else -- shouldn't ever get here, but just in case + pinchTouches = {} + end + end + end + + parentFrame.InputBegan:connect(function(inputObject) + if inputObject.UserInputType ~= Enum.UserInputType.Touch then + return + end + if isTouchUsedByJumpButton(inputObject) then + return + end + + local usedByThumbstick = isTouchUsedByThumbstick(inputObject) + if not usedByThumbstick then + pinchGestureReceivedTouch(inputObject) + end + + if cameraTouch == nil and not usedByThumbstick then + cameraTouch = inputObject + lastPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y) + -- lastTick = tick() + end + end) + userInputService.InputChanged:connect(function(inputObject) + if inputObject.UserInputType ~= Enum.UserInputType.Touch then + return + end + if cameraTouch ~= inputObject then + return + end + + local newPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y) + local touchDiff = (lastPos - newPos) * CameraRotateSensitivity + + -- first time rotating outside deadzone, just setup for next changed event + if not hasRotatedCamera and (touchDiff.magnitude > CameraRotateDeadZone) then + hasRotatedCamera = true + lastPos = newPos + end + + -- fire everytime after we have rotated out of deadzone + if hasRotatedCamera and (lastPos ~= newPos) then + rotateCameraFunc(userInputService, touchDiff) + refreshCharacterMoveFunc() + lastPos = newPos + end + end) + userInputService.InputEnded:connect(function(inputObject) + if cameraTouch == inputObject or cameraTouch == nil then + resetCameraRotateState() + end + + for i, touch in pairs(pinchTouches) do + if touch == inputObject then + table.remove(pinchTouches, i) + end + end + end) +end + +function setupTouchControls() + local touchControlFrame = Instance.new "Frame" + touchControlFrame.Name = "TouchControlFrame" + touchControlFrame.Size = UDim2.new(1, 0, 1, 0) + touchControlFrame.BackgroundTransparency = 1 + touchControlFrame.Parent = Game.CoreGui.RobloxGui + + local refreshCharacterMoveFunc = setupCharacterMovement(touchControlFrame) + setupJumpButton(touchControlFrame) + setupCameraControl(touchControlFrame, refreshCharacterMoveFunc) + + userInputService.ProcessedEvent:connect(function(inputObject, processed) + if not processed then + return + end + + -- kill camera pan if the touch is used by some user controls + if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin then + cameraTouch = nil + end + end) +end + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- +-- Start of Script + +if true then --userInputService:IsLuaTouchControls() then + setupTouchControls() +else + script:Destroy() +end diff --git a/lua/157877000.lua b/lua/157877000.lua new file mode 100644 index 0000000..0bc6726 --- /dev/null +++ b/lua/157877000.lua @@ -0,0 +1,1025 @@ +--Include +local Create = assert(LoadLibrary "RbxUtility").Create + +-- A Few Script Globals +local gui +if script.Parent:FindFirstChild "ControlFrame" then + gui = script.Parent:FindFirstChild "ControlFrame" +else + gui = script.Parent +end + +-- Dev-Console Root + +local Dev_Container = Create "Frame" { + Name = "DevConsoleContainer", + Parent = gui, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.9, + Position = UDim2.new(0, 100, 0, 10), + Size = UDim2.new(0.5, 20, 0.5, 20), + Visible = false, +} + +local ToggleConsole = Create "BindableFunction" { + Name = "ToggleDevConsole", + Parent = gui, +} + +local devConsoleInitialized = false +function initializeDeveloperConsole() + if devConsoleInitialized then + return + end + devConsoleInitialized = true + + ---Dev-Console Variables + local LOCAL_CONSOLE = 1 + local SERVER_CONSOLE = 2 + + local MAX_LIST_SIZE = 1000 + + local minimumSize = Vector2.new(245, 180) + local currentConsole = LOCAL_CONSOLE + + local localMessageList = {} + local serverMessageList = {} + + local localOffset = 0 + local serverOffset = 0 + + local errorToggleOn = true + local warningToggleOn = true + local infoToggleOn = true + local outputToggleOn = true + local wordWrapToggleOn = false + + local textHolderSize = 0 + + local frameNumber = 0 + + --Create Dev-Console + + local Dev_Body = Create "Frame" { + Name = "Body", + Parent = Dev_Container, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(0, 0, 0, 21), + Size = UDim2.new(1, 0, 1, -25), + } + + local Dev_OptionsHolder = Create "Frame" { + Name = "OptionsHolder", + Parent = Dev_Body, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 1, + Position = UDim2.new(0, 220, 0, 0), + Size = UDim2.new(1, -255, 0, 24), + ClipsDescendants = true, + } + + local Dev_OptionsBar = Create "Frame" { + Name = "OptionsBar", + Parent = Dev_OptionsHolder, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 1, + Position = UDim2.new(0, -250, 0, 4), + Size = UDim2.new(0, 234, 0, 18), + } + + local Dev_ErrorToggleFilter = Create "TextButton" { + Name = "ErrorToggleButton", + Parent = Dev_OptionsBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BorderColor3 = Color3.new(1, 0, 0), + Position = UDim2.new(0, 115, 0, 0), + Size = UDim2.new(0, 18, 0, 18), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "", + TextColor3 = Color3.new(1, 0, 0), + } + + Create "Frame" { + Name = "CheckFrame", + Parent = Dev_ErrorToggleFilter, + BackgroundColor3 = Color3.new(1, 0, 0), + BorderColor3 = Color3.new(1, 0, 0), + Position = UDim2.new(0, 4, 0, 4), + Size = UDim2.new(0, 10, 0, 10), + } + + local Dev_InfoToggleFilter = Create "TextButton" { + Name = "InfoToggleButton", + Parent = Dev_OptionsBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BorderColor3 = Color3.new(0.4, 0.5, 1.0), + Position = UDim2.new(0, 65, 0, 0), + Size = UDim2.new(0, 18, 0, 18), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "", + TextColor3 = Color3.new(0.4, 0.5, 1.0), + } + + Create "Frame" { + Name = "CheckFrame", + Parent = Dev_InfoToggleFilter, + BackgroundColor3 = Color3.new(0.4, 0.5, 1.0), + BorderColor3 = Color3.new(0.4, 0.5, 1.0), + Position = UDim2.new(0, 4, 0, 4), + Size = UDim2.new(0, 10, 0, 10), + } + + local Dev_OutputToggleFilter = Create "TextButton" { + Name = "OutputToggleButton", + Parent = Dev_OptionsBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BorderColor3 = Color3.new(1, 1, 1.0), + Position = UDim2.new(0, 40, 0, 0), + Size = UDim2.new(0, 18, 0, 18), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "", + TextColor3 = Color3.new(1, 1, 1.0), + } + + Create "Frame" { + Name = "CheckFrame", + Parent = Dev_OutputToggleFilter, + BackgroundColor3 = Color3.new(1, 1, 1.0), + BorderColor3 = Color3.new(1, 1, 1.0), + Position = UDim2.new(0, 4, 0, 4), + Size = UDim2.new(0, 10, 0, 10), + } + + local Dev_WarningToggleFilter = Create "TextButton" { + Name = "WarningToggleButton", + Parent = Dev_OptionsBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BorderColor3 = Color3.new(1, 0.6, 0.4), + Position = UDim2.new(0, 90, 0, 0), + Size = UDim2.new(0, 18, 0, 18), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "", + TextColor3 = Color3.new(1, 0.6, 0.4), + } + + Create "Frame" { + Name = "CheckFrame", + Parent = Dev_WarningToggleFilter, + BackgroundColor3 = Color3.new(1, 0.6, 0.4), + BorderColor3 = Color3.new(1, 0.6, 0.4), + Position = UDim2.new(0, 4, 0, 4), + Size = UDim2.new(0, 10, 0, 10), + } + + local Dev_WordWrapToggle = Create "TextButton" { + Name = "WordWrapToggleButton", + Parent = Dev_OptionsBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BorderColor3 = Color3.new(0.8, 0.8, 0.8), + Position = UDim2.new(0, 215, 0, 0), + Size = UDim2.new(0, 18, 0, 18), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "", + TextColor3 = Color3.new(0.8, 0.8, 0.8), + } + + Create "Frame" { + Name = "CheckFrame", + Parent = Dev_WordWrapToggle, + BackgroundColor3 = Color3.new(0.8, 0.8, 0.8), + BorderColor3 = Color3.new(0.8, 0.8, 0.8), + Position = UDim2.new(0, 4, 0, 4), + Size = UDim2.new(0, 10, 0, 10), + Visible = false, + } + + Create "TextLabel" { + Name = "Filter", + Parent = Dev_OptionsBar, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(0, 40, 0, 18), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "Filter", + TextColor3 = Color3.new(1, 1, 1), + } + + Create "TextLabel" { + Name = "WordWrap", + Parent = Dev_OptionsBar, + BackgroundTransparency = 1, + Position = UDim2.new(0, 150, 0, 0), + Size = UDim2.new(0, 50, 0, 18), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "Word Wrap", + TextColor3 = Color3.new(1, 1, 1), + } + + local Dev_ScrollBar = Create "Frame" { + Name = "ScrollBar", + Parent = Dev_Body, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.9, + Position = UDim2.new(1, -20, 0, 26), + Size = UDim2.new(0, 20, 1, -50), + Visible = false, + } + + local Dev_ScrollArea = Create "Frame" { + Name = "ScrollArea", + Parent = Dev_ScrollBar, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 23), + Size = UDim2.new(1, 0, 1, -46), + } + + local Dev_Handle = Create "ImageButton" { + Name = "Handle", + Parent = Dev_ScrollArea, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(0, 0, 0.2, 0), + Size = UDim2.new(0, 20, 0, 40), + } + + Create "ImageLabel" { + Name = "ImageLabel", + Parent = Dev_Handle, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0.5, -8), + Rotation = 180, + Size = UDim2.new(1, 0, 0, 16), + Image = "http://www.roblox.com/Asset?id=151205881", + } + + local Dev_DownButton = Create "ImageButton" { + Name = "Down", + Parent = Dev_ScrollBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(0, 0, 1, -20), + Size = UDim2.new(0, 20, 0, 20), + } + + Create "ImageLabel" { + Name = "ImageLabel", + Parent = Dev_DownButton, + BackgroundTransparency = 1, + Position = UDim2.new(0, 3, 0, 3), + Size = UDim2.new(0, 14, 0, 14), + Rotation = 180, + Image = "http://www.roblox.com/Asset?id=151205813", + } + + local Dev_UpButton = Create "ImageButton" { + Name = "Up", + Parent = Dev_ScrollBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(0, 20, 0, 20), + } + + Create "ImageLabel" { + Name = "ImageLabel", + Parent = Dev_UpButton, + BackgroundTransparency = 1, + Position = UDim2.new(0, 3, 0, 3), + Size = UDim2.new(0, 14, 0, 14), + Image = "http://www.roblox.com/Asset?id=151205813", + } + + local Dev_TextBox = Create "Frame" { + Name = "TextBox", + Parent = Dev_Body, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.6, + Position = UDim2.new(0, 2, 0, 26), + Size = UDim2.new(1, -4, 1, -28), + ClipsDescendants = true, + } + + local Dev_TextHolder = Create "Frame" { + Name = "TextHolder", + Parent = Dev_TextBox, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 1, 0), + } + + local Dev_OptionsButton = Create "ImageButton" { + Name = "OptionsButton", + Parent = Dev_Body, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 1, + Position = UDim2.new(0, 200, 0, 2), + Size = UDim2.new(0, 20, 0, 20), + } + + Create "ImageLabel" { + Name = "ImageLabel", + Parent = Dev_OptionsButton, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 1, 0), + Rotation = 0, + Image = "http://www.roblox.com/Asset?id=152093917", + } + + local Dev_ResizeButton = Create "ImageButton" { + Name = "ResizeButton", + Parent = Dev_Body, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(1, -20, 1, -20), + Size = UDim2.new(0, 20, 0, 20), + } + + Create "ImageLabel" { + Name = "ImageLabel", + Parent = Dev_ResizeButton, + BackgroundTransparency = 1, + Position = UDim2.new(0, 6, 0, 6), + Size = UDim2.new(0.8, 0, 0.8, 0), + Rotation = 135, + Image = "http://www.roblox.com/Asset?id=151205813", + } + + Create "TextButton" { + Name = "LocalConsole", + Parent = Dev_Body, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.6, + Position = UDim2.new(0, 7, 0, 5), + Size = UDim2.new(0, 90, 0, 20), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "Local Console", + TextColor3 = Color3.new(1, 1, 1), + TextYAlignment = Enum.TextYAlignment.Center, + } + + Create "TextButton" { + Name = "ServerConsole", + Parent = Dev_Body, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.8, + Position = UDim2.new(0, 102, 0, 5), + Size = UDim2.new(0, 90, 0, 17), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size14, + Text = "Server Console", + TextColor3 = Color3.new(1, 1, 1), + TextYAlignment = Enum.TextYAlignment.Center, + } + + local Dev_TitleBar = Create "Frame" { + Name = "TitleBar", + Parent = Dev_Container, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 0, 20), + } + + local Dev_CloseButton = Create "ImageButton" { + Name = "CloseButton", + Parent = Dev_TitleBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(1, -20, 0, 0), + Size = UDim2.new(0, 20, 0, 20), + } + + Create "ImageLabel" { + Parent = Dev_CloseButton, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 1, + Position = UDim2.new(0, 3, 0, 3), + Size = UDim2.new(0, 14, 0, 14), + Image = "http://www.roblox.com/Asset?id=151205852", + } + + Create "TextButton" { + Name = "TextButton", + Parent = Dev_TitleBar, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.5, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, -23, 1, 0), + Text = "", + } + + Create "TextLabel" { + Name = "TitleText", + Parent = Dev_TitleBar, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(0, 185, 0, 20), + Font = "SourceSansBold", + FontSize = Enum.FontSize.Size18, + -- Text = "Server Console", + TextColor3 = Color3.new(1, 1, 1), + Text = "Roblox Developer Console", + TextYAlignment = Enum.TextYAlignment.Top, + } + + ---Saved Mouse Information + local previousMousePos = nil + local pPos = nil + + local previousMousePosResize = nil + local pSize = nil + + local previousMousePosScroll = nil + + local pScrollHandle = nil + + local pOffset = nil + + local scrollUpIsDown = false + local scrollDownIsDown = false + + function clean() + previousMousePos = nil + pPos = nil + previousMousePosResize = nil + pSize = nil + previousMousePosScroll = nil + pScrollHandle = nil + pOffset = nil + scrollUpIsDown = false + scrollDownIsDown = false + end + + ---Handle Dev-Console Position + function refreshConsolePosition(x, y) + if not previousMousePos then + return + end + + local delta = Vector2.new(x, y) - previousMousePos + Dev_Container.Position = UDim2.new(0, pPos.X + delta.X, 0, pPos.Y + delta.Y) + end + + Dev_TitleBar.TextButton.MouseButton1Down:connect(function(x, y) + previousMousePos = Vector2.new(x, y) + pPos = Dev_Container.AbsolutePosition + end) + + Dev_TitleBar.TextButton.MouseButton1Up:connect(function(_, _) + clean() + end) + + ---Handle Dev-Console Size + function refreshConsoleSize(x, y) + if not previousMousePosResize then + return + end + + local delta = Vector2.new(x, y) - previousMousePosResize + Dev_Container.Size = + UDim2.new(0, math.max(pSize.X + delta.X, minimumSize.X), 0, math.max(pSize.Y + delta.Y, minimumSize.Y)) + end + Dev_Container.Body.ResizeButton.MouseButton1Down:connect(function(x, y) + previousMousePosResize = Vector2.new(x, y) + pSize = Dev_Container.AbsoluteSize + end) + + Dev_Container.Body.ResizeButton.MouseButton1Up:connect(function(_, _) + clean() + end) + + ---Handle Dev-Console Close Button + Dev_TitleBar.CloseButton.MouseButton1Down:connect(function(_, _) + Dev_Container.Visible = false + end) + + Dev_Container.TitleBar.CloseButton.MouseButton1Up:connect(function() + clean() + end) + + local optionsHidden = true + local animating = false + --Options + function startAnimation() + if animating then + return + end + animating = true + + repeat + if optionsHidden then + frameNumber = frameNumber - 1 + else + frameNumber = frameNumber + 1 + end + + local x = frameNumber / 5 + local smoothStep = x * x * (3 - (2 * x)) + Dev_OptionsButton.ImageLabel.Rotation = smoothStep * 5 * 9 + Dev_OptionsBar.Position = UDim2.new(0, (smoothStep * 5 * 50) - 250, 0, 4) + + wait() + if (frameNumber <= 0 and optionsHidden) or (frameNumber >= 5 and not optionsHidden) then + animating = false + end + until not animating + end + + Dev_OptionsButton.MouseButton1Down:connect(function(_, _) + optionsHidden = not optionsHidden + startAnimation() + end) + + --Scroll Position + + function changeOffset(value) + if currentConsole == LOCAL_CONSOLE then + localOffset = localOffset + value + elseif currentConsole == SERVER_CONSOLE then + serverOffset = serverOffset + value + end + + repositionList() + end + + --Refresh Dev-Console Text + function refreshTextHolderForReal() + local childMessages = Dev_TextHolder:GetChildren() + + local messageList + + if currentConsole == LOCAL_CONSOLE then + messageList = localMessageList + elseif currentConsole == SERVER_CONSOLE then + messageList = serverMessageList + end + + local posOffset = 0 + + for i = 1, #childMessages do + childMessages[i].Visible = false + end + + for i = 1, #messageList do + local message + + local movePosition = false + + if i > #childMessages then + message = Create "TextLabel" { + Name = "Message", + Parent = Dev_TextHolder, + BackgroundTransparency = 1, + TextXAlignment = "Left", + Size = UDim2.new(1, 0, 0, 14), + FontSize = "Size10", + ZIndex = 1, + } + movePosition = true + else + message = childMessages[i] + end + + if + (outputToggleOn or messageList[i].Type ~= Enum.MessageType.MessageOutput) + and (infoToggleOn or messageList[i].Type ~= Enum.MessageType.MessageInfo) + and (warningToggleOn or messageList[i].Type ~= Enum.MessageType.MessageWarning) + and (errorToggleOn or messageList[i].Type ~= Enum.MessageType.MessageError) + then + message.TextWrapped = wordWrapToggleOn + message.Size = UDim2.new(0.98, 0, 0, 2000) + message.Parent = Dev_Container + message.Text = messageList[i].Time .. " -- " .. messageList[i].Message + + message.Size = UDim2.new(0.98, 0, 0, message.TextBounds.Y) + message.Position = UDim2.new(0, 5, 0, posOffset) + message.Parent = Dev_TextHolder + posOffset = posOffset + message.TextBounds.Y + + if movePosition then + if + (currentConsole == LOCAL_CONSOLE and localOffset > 0) + or (currentConsole == SERVER_CONSOLE and serverOffset > 0) + then + changeOffset(message.TextBounds.Y) + end + end + + message.Visible = true + + if messageList[i].Type == Enum.MessageType.MessageError then + message.TextColor3 = Color3.new(1, 0, 0) + elseif messageList[i].Type == Enum.MessageType.MessageInfo then + message.TextColor3 = Color3.new(0.4, 0.5, 1) + elseif messageList[i].Type == Enum.MessageType.MessageWarning then + message.TextColor3 = Color3.new(1, 0.6, 0.4) + else + message.TextColor3 = Color3.new(1, 1, 1) + end + end + end + + textHolderSize = posOffset + end + + -- Refreshing the textholder every 0.1 (if needed) is good enough, surely fast enough + -- We don't want it to update 50x in a tick because there are 50 messages in that tick + -- (Whenever for one reason or another a lot of output comes in, it can lag + -- This will make it behave better in a situation of a lot of output comming in) + local refreshQueued = false + function refreshTextHolder() + if refreshQueued then + return + end + Delay(0.1, function() + refreshQueued = false + refreshTextHolderForReal() + end) + refreshQueued = true + end + + --Handle Dev-Console Scrollbar + + local inside = 0 + function holdingUpButton() + if scrollUpIsDown then + return + end + scrollUpIsDown = true + wait(0.6) + inside = inside + 1 + while scrollUpIsDown and inside < 2 do + wait() + changeOffset(12) + end + inside = inside - 1 + end + + function holdingDownButton() + if scrollDownIsDown then + return + end + scrollDownIsDown = true + wait(0.6) + inside = inside + 1 + while scrollDownIsDown and inside < 2 do + wait() + changeOffset(-12) + end + inside = inside - 1 + end + + Dev_Container.Body.ScrollBar.Up.MouseButton1Click:connect(function() + changeOffset(10) + end) + + Dev_Container.Body.ScrollBar.Up.MouseButton1Down:connect(function() + changeOffset(10) + holdingUpButton() + end) + + Dev_Container.Body.ScrollBar.Up.MouseButton1Up:connect(function() + clean() + end) + + Dev_Container.Body.ScrollBar.Down.MouseButton1Down:connect(function() + changeOffset(-10) + holdingDownButton() + end) + + Dev_Container.Body.ScrollBar.Down.MouseButton1Up:connect(function() + clean() + end) + + function handleScroll(x, y) + if not previousMousePosScroll then + return + end + + local delta = (Vector2.new(x, y) - previousMousePosScroll).Y + + local backRatio = 1 - (Dev_Container.Body.TextBox.AbsoluteSize.Y / Dev_TextHolder.AbsoluteSize.Y) + + local movementSize = Dev_ScrollArea.AbsoluteSize.Y - Dev_ScrollArea.Handle.AbsoluteSize.Y + local normalDelta = math.max(math.min(delta, movementSize), 0 - movementSize) + local normalRatio = normalDelta / movementSize + + local textMovementSize = (backRatio * Dev_TextHolder.AbsoluteSize.Y) + local offsetChange = textMovementSize * normalRatio + + if currentConsole == LOCAL_CONSOLE then + localOffset = pOffset - offsetChange + elseif currentConsole == SERVER_CONSOLE then + serverOffset = pOffset - offsetChange + end + end + + Dev_ScrollArea.Handle.MouseButton1Down:connect(function(x, y) + previousMousePosScroll = Vector2.new(x, y) + pScrollHandle = Dev_ScrollArea.Handle.AbsolutePosition + if currentConsole == LOCAL_CONSOLE then + pOffset = localOffset + elseif currentConsole == SERVER_CONSOLE then + pOffset = serverOffset + end + end) + + Dev_ScrollArea.Handle.MouseButton1Up:connect(function(_, _) + clean() + end) + + local function existsInsideContainer(container, x, y) + local pos = container.AbsolutePosition + local size = container.AbsoluteSize + if x < pos.X or x > pos.X + size.X or y < pos.y or y > pos.y + size.y then + return false + end + return true + end + + --Refresh Dev-Console Message Positions + function repositionList() + if currentConsole == LOCAL_CONSOLE then + localOffset = math.min(math.max(localOffset, 0), textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y) + Dev_TextHolder.Size = UDim2.new(1, 0, 0, textHolderSize) + elseif currentConsole == SERVER_CONSOLE then + serverOffset = + math.min(math.max(serverOffset, 0), textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y) + Dev_TextHolder.Size = UDim2.new(1, 0, 0, textHolderSize) + end + + local ratio = Dev_Container.Body.TextBox.AbsoluteSize.Y / Dev_TextHolder.AbsoluteSize.Y + + if ratio >= 1 then + Dev_Container.Body.ScrollBar.Visible = false + Dev_Container.Body.TextBox.Size = UDim2.new(1, -4, 1, -28) + + if currentConsole == LOCAL_CONSOLE or currentConsole == SERVER_CONSOLE then + Dev_TextHolder.Position = UDim2.new(0, 0, 1, 0 - textHolderSize) + end + else + Dev_Container.Body.ScrollBar.Visible = true + Dev_Container.Body.TextBox.Size = UDim2.new(1, -25, 1, -28) + + local backRatio = 1 - ratio + local offsetRatio + + if currentConsole == LOCAL_CONSOLE then + offsetRatio = localOffset / Dev_TextHolder.AbsoluteSize.Y + elseif currentConsole == SERVER_CONSOLE then + offsetRatio = serverOffset / Dev_TextHolder.AbsoluteSize.Y + end + + local topRatio = math.max(0, backRatio - offsetRatio) + + local scrollHandleSize = math.max(Dev_ScrollArea.AbsoluteSize.Y * ratio, 21) + + local scrollRatio = scrollHandleSize / Dev_ScrollArea.AbsoluteSize.Y + local ratioConversion = (1 - scrollRatio) / (1 - ratio) + + local topScrollRatio = topRatio * ratioConversion + + local sPos = math.min( + Dev_ScrollArea.AbsoluteSize.Y * topScrollRatio, + Dev_ScrollArea.AbsoluteSize.Y - scrollHandleSize + ) + + Dev_ScrollArea.Handle.Size = UDim2.new(1, 0, 0, scrollHandleSize) + Dev_ScrollArea.Handle.Position = UDim2.new(0, 0, 0, sPos) + + if currentConsole == LOCAL_CONSOLE then + Dev_TextHolder.Position = UDim2.new(0, 0, 1, 0 - textHolderSize + localOffset) + elseif currentConsole == SERVER_CONSOLE then + Dev_TextHolder.Position = UDim2.new(0, 0, 1, 0 - textHolderSize + serverOffset) + end + end + end + + -- Easy, fast, and working nicely + local function numberWithZero(num) + return (num < 10 and "0" or "") .. num + end + + local str = "%s:%s:%s" + + function ConvertTimeStamp(timeStamp) + local localTime = timeStamp - os.time() + math.floor(tick()) + local dayTime = localTime % 86400 + + local hour = math.floor(dayTime / 3600) + + dayTime = dayTime - (hour * 3600) + local minute = math.floor(dayTime / 60) + + dayTime = dayTime - (minute * 60) + + local h = numberWithZero(hour) + local m = numberWithZero(minute) + local s = numberWithZero(dayTime) + + return str:format(h, m, s) + end + + --Filter + + Dev_OptionsBar.ErrorToggleButton.MouseButton1Down:connect(function(_, _) + errorToggleOn = not errorToggleOn + Dev_OptionsBar.ErrorToggleButton.CheckFrame.Visible = errorToggleOn + refreshTextHolder() + repositionList() + end) + + Dev_OptionsBar.WarningToggleButton.MouseButton1Down:connect(function(_, _) + warningToggleOn = not warningToggleOn + Dev_OptionsBar.WarningToggleButton.CheckFrame.Visible = warningToggleOn + refreshTextHolder() + repositionList() + end) + + Dev_OptionsBar.InfoToggleButton.MouseButton1Down:connect(function(_, _) + infoToggleOn = not infoToggleOn + Dev_OptionsBar.InfoToggleButton.CheckFrame.Visible = infoToggleOn + refreshTextHolder() + repositionList() + end) + + Dev_OptionsBar.OutputToggleButton.MouseButton1Down:connect(function(_, _) + outputToggleOn = not outputToggleOn + Dev_OptionsBar.OutputToggleButton.CheckFrame.Visible = outputToggleOn + refreshTextHolder() + repositionList() + end) + + Dev_OptionsBar.WordWrapToggleButton.MouseButton1Down:connect(function(_, _) + wordWrapToggleOn = not wordWrapToggleOn + Dev_OptionsBar.WordWrapToggleButton.CheckFrame.Visible = wordWrapToggleOn + refreshTextHolder() + repositionList() + end) + + ---Dev-Console Message Functionality + function AddLocalMessage(str, messageType, timeStamp) + localMessageList[#localMessageList + 1] = + { Message = str, Time = ConvertTimeStamp(timeStamp), Type = messageType } + while #localMessageList > MAX_LIST_SIZE do + table.remove(localMessageList, 1) + end + + refreshTextHolder() + + repositionList() + end + + function AddServerMessage(str, messageType, timeStamp) + serverMessageList[#serverMessageList + 1] = + { Message = str, Time = ConvertTimeStamp(timeStamp), Type = messageType } + while #serverMessageList > MAX_LIST_SIZE do + table.remove(serverMessageList, 1) + end + + refreshTextHolder() + + repositionList() + end + + --Handle Dev-Console Local/Server Buttons + Dev_Container.Body.LocalConsole.MouseButton1Click:connect(function(_, _) + if currentConsole == SERVER_CONSOLE then + currentConsole = LOCAL_CONSOLE + local localConsole = Dev_Container.Body.LocalConsole + local serverConsole = Dev_Container.Body.ServerConsole + + localConsole.Size = UDim2.new(0, 90, 0, 20) + serverConsole.Size = UDim2.new(0, 90, 0, 17) + localConsole.BackgroundTransparency = 0.6 + serverConsole.BackgroundTransparency = 0.8 + + if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + local mouse = game.Players.LocalPlayer:GetMouse() + refreshConsolePosition(mouse.X, mouse.Y) + refreshConsoleSize(mouse.X, mouse.Y) + handleScroll(mouse.X, mouse.Y) + end + + refreshTextHolder() + repositionList() + end + end) + + Dev_Container.Body.LocalConsole.MouseButton1Up:connect(function() + clean() + end) + + local serverHistoryRequested = false + + Dev_Container.Body.ServerConsole.MouseButton1Click:connect(function(_, _) + if not serverHistoryRequested then + serverHistoryRequested = true + game:GetService("LogService"):RequestServerOutput() + end + + if currentConsole == LOCAL_CONSOLE then + currentConsole = SERVER_CONSOLE + local localConsole = Dev_Container.Body.LocalConsole + local serverConsole = Dev_Container.Body.ServerConsole + + serverConsole.Size = UDim2.new(0, 90, 0, 20) + localConsole.Size = UDim2.new(0, 90, 0, 17) + serverConsole.BackgroundTransparency = 0.6 + localConsole.BackgroundTransparency = 0.8 + + if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + local mouse = game.Players.LocalPlayer:GetMouse() + refreshConsolePosition(mouse.X, mouse.Y) + refreshConsoleSize(mouse.X, mouse.Y) + handleScroll(mouse.X, mouse.Y) + end + + refreshTextHolder() + repositionList() + end + end) + + ---Extra Mouse Handlers for Dev-Console + Dev_Container.Body.ServerConsole.MouseButton1Up:connect(function() + clean() + end) + + if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + local LocalMouse = game.Players.LocalPlayer:GetMouse() + LocalMouse.Move:connect(function() + if not Dev_Container.Visible then + return + end + local mouse = game.Players.LocalPlayer:GetMouse() + refreshConsolePosition(mouse.X, mouse.Y) + refreshConsoleSize(mouse.X, mouse.Y) + handleScroll(mouse.X, mouse.Y) + + refreshTextHolder() + repositionList() + end) + + LocalMouse.Button1Up:connect(function() + clean() + end) + + LocalMouse.WheelForward:connect(function() + if not Dev_Container.Visible then + return + end + if existsInsideContainer(Dev_Container, LocalMouse.X, LocalMouse.Y) then + changeOffset(10) + end + end) + + LocalMouse.WheelBackward:connect(function() + if not Dev_Container.Visible then + return + end + if existsInsideContainer(Dev_Container, LocalMouse.X, LocalMouse.Y) then + changeOffset(-10) + end + end) + end + + Dev_ScrollArea.Handle.MouseButton1Down:connect(function() + repositionList() + end) + + ---Populate Dev-Console with dummy messages + + local history = game:GetService("LogService"):GetLogHistory() + + for i = 1, #history do + AddLocalMessage(history[i].message, history[i].messageType, history[i].timestamp) + end + + game:GetService("LogService").MessageOut:connect(function(message, messageType) + AddLocalMessage(message, messageType, os.time()) + end) + + game:GetService("LogService").ServerMessageOut:connect(AddServerMessage) +end + +local currentlyToggling = false +function ToggleConsole.OnInvoke() + if currentlyToggling then + return + end + + currentlyToggling = true + initializeDeveloperConsole() + Dev_Container.Visible = not Dev_Container.Visible + currentlyToggling = false +end diff --git a/lua/36868950.lua b/lua/36868950.lua new file mode 100644 index 0000000..455d653 --- /dev/null +++ b/lua/36868950.lua @@ -0,0 +1,110 @@ +local controlFrame = script.Parent:FindFirstChild "ControlFrame" + +if not controlFrame then + return +end + +local bottomLeftControl = controlFrame:FindFirstChild "BottomLeftControl" +local bottomRightControl = controlFrame:FindFirstChild "BottomRightControl" + +local frameTip = Instance.new "TextLabel" +frameTip.Name = "ToolTip" +frameTip.Text = "" +frameTip.Font = Enum.Font.ArialBold +frameTip.FontSize = Enum.FontSize.Size12 +frameTip.TextColor3 = Color3.new(1, 1, 1) +frameTip.BorderSizePixel = 0 +frameTip.ZIndex = 10 +frameTip.Size = UDim2.new(2, 0, 1, 0) +frameTip.Position = UDim2.new(1, 0, 0, 0) +frameTip.BackgroundColor3 = Color3.new(0, 0, 0) +frameTip.BackgroundTransparency = 1 +frameTip.TextTransparency = 1 +frameTip.TextWrap = true + +local inside = Instance.new "BoolValue" +inside.Name = "inside" +inside.Value = false +inside.Parent = frameTip + +function setUpListeners(frameToListen) + local fadeSpeed = 0.1 + frameToListen.Parent.MouseEnter:connect(function() + if frameToListen:FindFirstChild "inside" then + frameToListen.inside.Value = true + wait(1.2) + if frameToListen.inside.Value then + while frameToListen.inside.Value and frameToListen.BackgroundTransparency > 0 do + frameToListen.BackgroundTransparency = frameToListen.BackgroundTransparency - fadeSpeed + frameToListen.TextTransparency = frameToListen.TextTransparency - fadeSpeed + wait() + end + end + end + end) + function killTip(killFrame) + killFrame.inside.Value = false + killFrame.BackgroundTransparency = 1 + killFrame.TextTransparency = 1 + end + frameToListen.Parent.MouseLeave:connect(function() + killTip(frameToListen) + end) + frameToListen.Parent.MouseButton1Click:connect(function() + killTip(frameToListen) + end) +end + +function createSettingsButtonTip(parent) + if parent == nil then + parent = bottomLeftControl:FindFirstChild "SettingsButton" + end + + local toolTip = frameTip:clone() + toolTip.RobloxLocked = true + toolTip.Text = "Settings/Leave Game" + toolTip.Position = UDim2.new(0, 0, 0, -18) + toolTip.Size = UDim2.new(0, 120, 0, 20) + toolTip.Parent = parent + setUpListeners(toolTip) +end + +wait(5) -- make sure we are loaded in, won't need tool tips for first 5 seconds anyway + +---------------- set up Bottom Left Tool Tips ------------------------- + +local bottomLeftChildren = bottomLeftControl:GetChildren() + +for i = 1, #bottomLeftChildren do + if bottomLeftChildren[i].Name == "Exit" then + local exitTip = frameTip:clone() + exitTip.RobloxLocked = true + exitTip.Text = "Leave Place" + exitTip.Position = UDim2.new(0, 0, -1, 0) + exitTip.Size = UDim2.new(1, 0, 1, 0) + exitTip.Parent = bottomLeftChildren[i] + setUpListeners(exitTip) + elseif bottomLeftChildren[i].Name == "SettingsButton" then + createSettingsButtonTip(bottomLeftChildren[i]) + end +end + +---------------- set up Bottom Right Tool Tips ------------------------- + +local bottomRightChildren = bottomRightControl:GetChildren() + +for i = 1, #bottomRightChildren do + if bottomRightChildren[i].Name:find "Camera" ~= nil then + local cameraTip = frameTip:clone() + cameraTip.RobloxLocked = true + cameraTip.Text = "Camera View" + if bottomRightChildren[i].Name:find "Zoom" then + cameraTip.Position = UDim2.new(-1, 0, -1.5) + else + cameraTip.Position = UDim2.new(0, 0, -1.5, 0) + end + cameraTip.Size = UDim2.new(2, 0, 1.25, 0) + cameraTip.Parent = bottomRightChildren[i] + setUpListeners(cameraTip) + end +end diff --git a/lua/37801172.lua b/lua/37801172.lua new file mode 100644 index 0000000..79efa68 --- /dev/null +++ b/lua/37801172.lua @@ -0,0 +1,108 @@ +-- Creates all neccessary scripts for the gui on initial load, everything except build tools +-- Created by Ben T. 10/29/10 +-- Please note that these are loaded in a specific order to diminish errors/perceived load time by user +local scriptContext = game:GetService "ScriptContext" +local touchEnabled = false +pcall(function() + touchEnabled = game:GetService("UserInputService").TouchEnabled +end) + +-- library registration +scriptContext:AddCoreScript(60595695, scriptContext, "/Libraries/LibraryRegistration/LibraryRegistration") + +local function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end +end +-- local function waitForProperty(instance, property) +-- while not instance[property] do +-- instance.Changed:wait() +-- end +-- end + +-- Responsible for tracking logging items +local scriptContext = game:GetService "ScriptContext" +scriptContext:AddCoreScript(59002209, scriptContext, "CoreScripts/Sections") + +waitForChild(game:GetService "CoreGui", "RobloxGui") +local screenGui = game:GetService("CoreGui"):FindFirstChild "RobloxGui" + +if not touchEnabled then + -- ToolTipper (creates tool tips for gui) + scriptContext:AddCoreScript(36868950, screenGui, "CoreScripts/ToolTip") + -- SettingsScript + scriptContext:AddCoreScript(46295863, screenGui, "CoreScripts/Settings") +else + scriptContext:AddCoreScript(153556783, screenGui, "CoreScripts/TouchControls") +end + +-- MainBotChatScript +scriptContext:AddCoreScript(39250920, screenGui, "CoreScripts/MainBotChatScript") + +-- Popup Script +scriptContext:AddCoreScript(48488451, screenGui, "CoreScripts/PopupScript") +-- Friend Notification Script (probably can use this script to expand out to other notifications) +scriptContext:AddCoreScript(48488398, screenGui, "CoreScripts/NotificationScript") +-- Chat script +scriptContext:AddCoreScript(97188756, screenGui, "CoreScripts/ChatScript") +-- Purchase Prompt Script +scriptContext:AddCoreScript(107893730, screenGui, "CoreScripts/PurchasePromptScript") + +if not touchEnabled or screenGui.AbsoluteSize.Y > 600 then + -- New Player List + scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript") +else + delay(5, function() + if screenGui.AbsoluteSize.Y >= 600 then + -- New Player List + scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript") + end + end) +end + +if game.CoreGui.Version >= 3 and game.PlaceId ~= 130815926 then --todo: remove placeid hack for halloween + -- Backpack Builder, creates most of the backpack gui + scriptContext:AddCoreScript(53878047, screenGui, "CoreScripts/BackpackScripts/BackpackBuilder") + + waitForChild(screenGui, "CurrentLoadout") + waitForChild(screenGui, "Backpack") + local Backpack = screenGui.Backpack + + -- Manager handles all big backpack state changes, other scripts subscribe to this and do things accordingly + if game.CoreGui.Version >= 7 then + scriptContext:AddCoreScript(89449093, Backpack, "CoreScripts/BackpackScripts/BackpackManager") + end + + -- Backpack Gear (handles all backpack gear tab stuff) + game:GetService("ScriptContext"):AddCoreScript(89449008, Backpack, "CoreScripts/BackpackScripts/BackpackGear") + -- Loadout Script, used for gear hotkeys + scriptContext:AddCoreScript(53878057, screenGui.CurrentLoadout, "CoreScripts/BackpackScripts/LoadoutScript") + if game.CoreGui.Version >= 8 then + -- Wardrobe script handles all character dressing operations + scriptContext:AddCoreScript(-1, Backpack, "CoreScripts/BackpackScripts/BackpackWardrobe") + end +end + +local IsPersonalServer = not not game.Workspace:FindFirstChild "PSVariable" +if IsPersonalServer then + game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager") +end +game.Workspace.ChildAdded:connect(function(nchild) + if nchild.Name == "PSVariable" and nchild:IsA "BoolValue" then + IsPersonalServer = true + game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager") + end +end) + +if touchEnabled then -- touch devices don't use same control frame + -- only used for touch device button generation + scriptContext:AddCoreScript(152908679, screenGui, "CoreScripts/ContextActionTouch") + + waitForChild(screenGui, "ControlFrame") + waitForChild(screenGui.ControlFrame, "BottomLeftControl") + screenGui.ControlFrame.BottomLeftControl.Visible = false + + waitForChild(screenGui.ControlFrame, "TopLeftControl") + screenGui.ControlFrame.TopLeftControl.Visible = false +end diff --git a/lua/38037565.lua b/lua/38037565.lua new file mode 100644 index 0000000..ea37dbe --- /dev/null +++ b/lua/38037565.lua @@ -0,0 +1,239 @@ +local damageGuiWidth = 5.0 +local damageGuiHeight = 5.0 + +function waitForChild(parent, childName) + local child = parent:findFirstChild(childName) + if child then + return child + end + while true do + child = parent.ChildAdded:wait() + if child.Name == childName then + return child + end + end +end + +-- declarations +local Figure = script.Parent +local Humanoid = waitForChild(Figure, "Humanoid") +local Torso = waitForChild(Figure, "Torso") + +local config = Figure:FindFirstChild "PlayerStats" + +local inCharTag = Instance.new "BoolValue" +inCharTag.Name = "InCharTag" + +local hider = Instance.new "BoolValue" +hider.Name = "RobloxBuildTool" + +local currentChildren +local backpackTools + +if config == nil then + config = Instance.new "Configuration" + config.Parent = Figure + config.Name = "PlayerStats" +end + +local myHealth = config:FindFirstChild "MaxHealth" +if myHealth == nil then + myHealth = Instance.new "NumberValue" + myHealth.Parent = config + myHealth.Value = 100 + myHealth.Name = "MaxHealth" +end + +Humanoid.MaxHealth = myHealth.Value +Humanoid.Health = myHealth.Value + +function onMaxHealthChange() + Humanoid.MaxHealth = myHealth.Value + Humanoid.Health = myHealth.Value +end + +myHealth.Changed:connect(onMaxHealthChange) + +--Humanoid.MaxHealth = myHealth.Value +--Humanoid.Health = Humanoid.MaxHealth + +local vPlayer = game.Players:GetPlayerFromCharacter(script.Parent) +local dotGui = vPlayer.PlayerGui:FindFirstChild "DamageOverTimeGui" +if dotGui == nil then + dotGui = Instance.new "BillboardGui" + dotGui.Name = "DamageOverTimeGui" + dotGui.Parent = vPlayer.PlayerGui + dotGui.Adornee = script.Parent:FindFirstChild "Head" + dotGui.Active = true + dotGui.size = UDim2.new(damageGuiWidth, 0, damageGuiHeight, 0.0) + dotGui.StudsOffset = Vector3.new(0, 2.0, 0.0) +end + +print "newHealth declarations finished" + +function billboardHealthChange(dmg) + local textLabel = Instance.new "TextLabel" + if dmg > 0 then + textLabel.Text = tostring(dmg) + textLabel.TextColor3 = Color3.new(0, 1, 0) + else + textLabel.Text = tostring(dmg) + textLabel.TextColor3 = Color3.new(1, 0, 1) + end + textLabel.size = UDim2.new(1, 0, 1, 0.0) + textLabel.Active = true + textLabel.FontSize = 6 + textLabel.BackgroundTransparency = 1 + textLabel.Parent = dotGui + + for t = 1, 10 do + wait(0.1) + textLabel.TextTransparency = t / 10 + textLabel.Position = UDim2.new(0, 0, 0, -t * 5) + textLabel.FontSize = 6 - t * 0.6 + end + + textLabel:remove() +end + +function setMaxHealth() + --print(Humanoid.Health) + if myHealth.Value >= 0 then + Humanoid.MaxHealth = myHealth.Value + print(Humanoid.MaxHealth) + if Humanoid.Health > Humanoid.MaxHealth then + Humanoid.Health = Humanoid.MaxHealth + end + end +end + +myHealth.Changed:connect(setMaxHealth) + +-- Visual Effects -- + +local fireEffect = Instance.new "Fire" +fireEffect.Heat = 0.1 +fireEffect.Size = 3.0 +fireEffect.Name = "FireEffect" +fireEffect.Enabled = false +-- + +-- regeneration +while true do + local s = wait(1) + local health = Humanoid.Health + if health > 0 then -- and health < Humanoid.MaxHealth then + local delta = 0 + if config then + local regen = config:FindFirstChild "Regen" + local poison = config:FindFirstChild "Poison" + local ice = config:FindFirstChild "Ice" + local fire = config:FindFirstChild "Fire" + local stun = config:FindFirstChild "Stun" + if regen then + delta = delta + regen.Value.X + if regen.Value.Y >= 0 then + regen.Value = Vector3.new(regen.Value.X + regen.Value.Z, regen.Value.Y - s, regen.Value.Z) -- maybe have 3rd parameter be an increaser/decreaser? + elseif regen.Value.Y == -1 then + regen.Value = Vector3.new(regen.Value.X + regen.Value.Z, -1, regen.Value.Z) + else + regen:remove() + end -- infinity is -1 + end + if poison then + delta = delta - poison.Value.X + if poison.Value.Y >= 0 then + poison.Value = Vector3.new(poison.Value.X + poison.Value.Z, poison.Value.Y - s, poison.Value.Z) + elseif poison.Value.Y == -1 then + poison.Value = Vector3.new(poison.Value.X + poison.Value.Z, -1, poison.Value.Z) + else + poison:remove() + end -- infinity is -1 + end + + if ice then + --print("IN ICE") + delta = delta - ice.Value.X + if ice.Value.Y >= 0 then + ice.Value = Vector3.new(ice.Value.X, ice.Value.Y - s, ice.Value.Z) + else + ice:remove() + end + end + + if fire then + fireEffect.Enabled = true + fireEffect.Parent = Figure.Torso + delta = delta - fire.Value.X + if fire.Value.Y >= 0 then + fire.Value = Vector3.new(fire.Value.X, fire.Value.Y - s, fire.Value.Z) + else + fire:remove() + fireEffect.Enabled = false + fireEffect.Parent = nil + end + end + + if stun then + if stun.Value > 0 then + Torso.Anchored = true + currentChildren = script.Parent:GetChildren() + backpackTools = game.Players:GetPlayerFromCharacter(script.Parent).Backpack:GetChildren() + for i = 1, #currentChildren do + if currentChildren[i].className == "Tool" then + inCharTag:Clone().Parent = currentChildren[i] + print(backpackTools) + table.insert(backpackTools, currentChildren[i]) + end + end + for i = 1, #backpackTools do + if backpackTools[i]:FindFirstChild "RobloxBuildTool" == nil then + hider:Clone().Parent = backpackTools[i] + backpackTools[i].Parent = game.Lighting + end + end + wait(0.2) + for i = 1, #backpackTools do + backpackTools[i].Parent = game.Players:GetPlayerFromCharacter(script.Parent).Backpack + end + stun.Value = stun.Value - s + else + Torso.Anchored = false + for i = 1, #backpackTools do + local rbTool = backpackTools[i]:FindFirstChild "RobloxBuildTool" + if rbTool then + rbTool:Remove() + end + backpackTools[i].Parent = game.Lighting + end + wait(0.2) + for i = 1, #backpackTools do + local wasInChar = backpackTools[i]:FindFirstChild "InCharTag" + if wasInChar then + wasInChar:Remove() + backpackTools[i].Parent = script.Parent + else + backpackTools[i].Parent = game.Players:GetPlayerFromCharacter(script.Parent).Backpack + end + end + stun:Remove() + end + end + + if delta ~= 0 then + coroutine.resume(coroutine.create(billboardHealthChange), delta) + end + --delta = delta * .01 + end + --health = health + delta * s * Humanoid.MaxHealth + + health = Humanoid.Health + delta * s + if health * 1.01 < Humanoid.MaxHealth then + Humanoid.Health = health + --myHealth.Value = math.floor(Humanoid.Health) + elseif delta > 0 then + Humanoid.Health = Humanoid.MaxHealth + --myHealth.Value = Humanoid.Health + end + end +end diff --git a/lua/39250920.lua b/lua/39250920.lua new file mode 100644 index 0000000..0f1f30a --- /dev/null +++ b/lua/39250920.lua @@ -0,0 +1,588 @@ +function waitForProperty(instance, name) + while not instance[name] do + instance.Changed:wait() + end +end + +function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end +end + +local mainFrame +local choices = {} +local lastChoice +local choiceMap = {} +local currentConversationDialog +local currentConversationPartner +local currentAbortDialogScript + +local tooFarAwayMessage = "You are too far away to chat!" +local tooFarAwaySize = 300 +local characterWanderedOffMessage = "Chat ended because you walked away" +local characterWanderedOffSize = 350 +local conversationTimedOut = "Chat ended because you didn't reply" +local conversationTimedOutSize = 350 + +local player +local chatNotificationGui +local messageDialog +local timeoutScript +local reenableDialogScript +local dialogMap = {} +local dialogConnections = {} + +local gui = nil +waitForChild(game, "CoreGui") +waitForChild(game.CoreGui, "RobloxGui") +if game.CoreGui.RobloxGui:FindFirstChild "ControlFrame" then + gui = game.CoreGui.RobloxGui.ControlFrame +else + gui = game.CoreGui.RobloxGui +end + +function currentTone() + if currentConversationDialog then + return currentConversationDialog.Tone + else + return Enum.DialogTone.Neutral + end +end + +function createChatNotificationGui() + chatNotificationGui = Instance.new "BillboardGui" + chatNotificationGui.Name = "ChatNotificationGui" + chatNotificationGui.ExtentsOffset = Vector3.new(0, 1, 0) + chatNotificationGui.Size = UDim2.new(4, 0, 5.42857122, 0) + chatNotificationGui.SizeOffset = Vector2.new(0, 0) + chatNotificationGui.StudsOffset = Vector3.new(0.4, 4.3, 0) + chatNotificationGui.Enabled = true + chatNotificationGui.RobloxLocked = true + chatNotificationGui.Active = true + + local image = Instance.new "ImageLabel" + image.Name = "Image" + image.Active = false + image.BackgroundTransparency = 1 + image.Position = UDim2.new(0, 0, 0, 0) + image.Size = UDim2.new(1, 0, 1, 0) + image.Image = "" + image.RobloxLocked = true + image.Parent = chatNotificationGui + + local button = Instance.new "ImageButton" + button.Name = "Button" + button.AutoButtonColor = false + button.Position = UDim2.new(0.0879999995, 0, 0.0529999994, 0) + button.Size = UDim2.new(0.829999983, 0, 0.460000008, 0) + button.Image = "" + button.BackgroundTransparency = 1 + button.RobloxLocked = true + button.Parent = image +end + +function getChatColor(tone) + if tone == Enum.DialogTone.Neutral then + return Enum.ChatColor.Blue + elseif tone == Enum.DialogTone.Friendly then + return Enum.ChatColor.Green + elseif tone == Enum.DialogTone.Enemy then + return Enum.ChatColor.Red + end +end + +function styleChoices(tone) + for _, obj in pairs(choices) do + resetColor(obj, tone) + end + resetColor(lastChoice, tone) +end + +function styleMainFrame(tone) + if tone == Enum.DialogTone.Neutral then + mainFrame.Style = Enum.FrameStyle.ChatBlue + mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" + elseif tone == Enum.DialogTone.Friendly then + mainFrame.Style = Enum.FrameStyle.ChatGreen + mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botGreen_tailRight.png" + elseif tone == Enum.DialogTone.Enemy then + mainFrame.Style = Enum.FrameStyle.ChatRed + mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botRed_tailRight.png" + end + + styleChoices(tone) +end +function setChatNotificationTone(gui, purpose, tone) + if tone == Enum.DialogTone.Neutral then + gui.Image.Image = "rbxasset://textures/chatBubble_botBlue_notify_bkg.png" + elseif tone == Enum.DialogTone.Friendly then + gui.Image.Image = "rbxasset://textures/chatBubble_botGreen_notify_bkg.png" + elseif tone == Enum.DialogTone.Enemy then + gui.Image.Image = "rbxasset://textures/chatBubble_botRed_notify_bkg.png" + end + if purpose == Enum.DialogPurpose.Quest then + gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_bang.png" + elseif purpose == Enum.DialogPurpose.Help then + gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_question.png" + elseif purpose == Enum.DialogPurpose.Shop then + gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_money.png" + end +end + +function createMessageDialog() + messageDialog = Instance.new "Frame" + messageDialog.Name = "DialogScriptMessage" + messageDialog.Style = Enum.FrameStyle.RobloxRound + messageDialog.Visible = false + + local text = Instance.new "TextLabel" + text.Name = "Text" + text.Position = UDim2.new(0, 0, 0, -1) + text.Size = UDim2.new(1, 0, 1, 0) + text.FontSize = Enum.FontSize.Size14 + text.BackgroundTransparency = 1 + text.TextColor3 = Color3.new(1, 1, 1) + text.RobloxLocked = true + text.Parent = messageDialog +end + +function showMessage(msg, size) + messageDialog.Text.Text = msg + messageDialog.Size = UDim2.new(0, size, 0, 40) + messageDialog.Position = UDim2.new(0.5, -size / 2, 0.5, -40) + messageDialog.Visible = true + wait(2) + messageDialog.Visible = false +end + +function variableDelay(str) + local length = math.min(string.len(str), 100) + wait(0.75 + ((length / 75) * 1.5)) +end + +function resetColor(frame, tone) + if tone == Enum.DialogTone.Neutral then + frame.BackgroundColor3 = Color3.new(0 / 255, 0 / 255, 179 / 255) + frame.Number.TextColor3 = Color3.new(45 / 255, 142 / 255, 245 / 255) + elseif tone == Enum.DialogTone.Friendly then + frame.BackgroundColor3 = Color3.new(0 / 255, 77 / 255, 0 / 255) + frame.Number.TextColor3 = Color3.new(0 / 255, 190 / 255, 0 / 255) + elseif tone == Enum.DialogTone.Enemy then + frame.BackgroundColor3 = Color3.new(140 / 255, 0 / 255, 0 / 255) + frame.Number.TextColor3 = Color3.new(255 / 255, 88 / 255, 79 / 255) + end +end + +function highlightColor(frame, tone) + if tone == Enum.DialogTone.Neutral then + frame.BackgroundColor3 = Color3.new(2 / 255, 108 / 255, 255 / 255) + frame.Number.TextColor3 = Color3.new(1, 1, 1) + elseif tone == Enum.DialogTone.Friendly then + frame.BackgroundColor3 = Color3.new(0 / 255, 128 / 255, 0 / 255) + frame.Number.TextColor3 = Color3.new(1, 1, 1) + elseif tone == Enum.DialogTone.Enemy then + frame.BackgroundColor3 = Color3.new(204 / 255, 0 / 255, 0 / 255) + frame.Number.TextColor3 = Color3.new(1, 1, 1) + end +end + +function endDialog() + if currentAbortDialogScript then + currentAbortDialogScript:Remove() + currentAbortDialogScript = nil + end + + local dialog = currentConversationDialog + currentConversationDialog = nil + if dialog and dialog.InUse then + local reenableScript = reenableDialogScript:Clone() + reenableScript.archivable = false + reenableScript.Disabled = false + reenableScript.Parent = dialog + end + + for dialog, gui in pairs(dialogMap) do + if dialog and gui then + gui.Enabled = not dialog.InUse + end + end + + currentConversationPartner = nil +end + +function wanderDialog() + print "Wander" + mainFrame.Visible = false + endDialog() + showMessage(characterWanderedOffMessage, characterWanderedOffSize) +end + +function timeoutDialog() + print "Timeout" + mainFrame.Visible = false + endDialog() + showMessage(conversationTimedOut, conversationTimedOutSize) +end +function normalEndDialog() + print "Done" + endDialog() +end + +function sanitizeMessage(msg) + if string.len(msg) == 0 then + return "..." + else + return msg + end +end + +function selectChoice(choice) + renewKillswitch(currentConversationDialog) + + --First hide the Gui + mainFrame.Visible = false + if choice == lastChoice then + game.Chat:Chat(game.Players.LocalPlayer.Character, "Goodbye!", getChatColor(currentTone())) + + normalEndDialog() + else + local dialogChoice = choiceMap[choice] + + game.Chat:Chat( + game.Players.LocalPlayer.Character, + sanitizeMessage(dialogChoice.UserDialog), + getChatColor(currentTone()) + ) + wait(1) + currentConversationDialog:SignalDialogChoiceSelected(player, dialogChoice) + game.Chat:Chat( + currentConversationPartner, + sanitizeMessage(dialogChoice.ResponseDialog), + getChatColor(currentTone()) + ) + + variableDelay(dialogChoice.ResponseDialog) + presentDialogChoices(currentConversationPartner, dialogChoice:GetChildren()) + end +end + +function newChoice(numberText) + local frame = Instance.new "TextButton" + frame.BackgroundColor3 = Color3.new(0 / 255, 0 / 255, 179 / 255) + frame.AutoButtonColor = false + frame.BorderSizePixel = 0 + frame.Text = "" + frame.MouseEnter:connect(function() + highlightColor(frame, currentTone()) + end) + frame.MouseLeave:connect(function() + resetColor(frame, currentTone()) + end) + frame.MouseButton1Click:connect(function() + selectChoice(frame) + end) + frame.RobloxLocked = true + + local number = Instance.new "TextLabel" + number.Name = "Number" + number.TextColor3 = Color3.new(127 / 255, 212 / 255, 255 / 255) + number.Text = numberText + number.FontSize = Enum.FontSize.Size14 + number.BackgroundTransparency = 1 + number.Position = UDim2.new(0, 4, 0, 2) + number.Size = UDim2.new(0, 20, 0, 24) + number.TextXAlignment = Enum.TextXAlignment.Left + number.TextYAlignment = Enum.TextYAlignment.Top + number.RobloxLocked = true + number.Parent = frame + + local prompt = Instance.new "TextLabel" + prompt.Name = "UserPrompt" + prompt.BackgroundTransparency = 1 + prompt.TextColor3 = Color3.new(1, 1, 1) + prompt.FontSize = Enum.FontSize.Size14 + prompt.Position = UDim2.new(0, 28, 0, 2) + prompt.Size = UDim2.new(1, -32, 1, -4) + prompt.TextXAlignment = Enum.TextXAlignment.Left + prompt.TextYAlignment = Enum.TextYAlignment.Top + prompt.TextWrap = true + prompt.RobloxLocked = true + prompt.Parent = frame + + return frame +end +function initialize(parent) + choices[1] = newChoice "1)" + choices[2] = newChoice "2)" + choices[3] = newChoice "3)" + choices[4] = newChoice "4)" + + lastChoice = newChoice "5)" + lastChoice.UserPrompt.Text = "Goodbye!" + lastChoice.Size = UDim2.new(1, 0, 0, 28) + + mainFrame = Instance.new "Frame" + mainFrame.Name = "UserDialogArea" + mainFrame.Size = UDim2.new(0, 350, 0, 200) + mainFrame.Style = Enum.FrameStyle.ChatBlue + mainFrame.Visible = false + + local imageLabel = Instance.new "ImageLabel" + imageLabel.Name = "Tail" + imageLabel.Size = UDim2.new(0, 62, 0, 53) + imageLabel.Position = UDim2.new(1, 8, 0.25) + imageLabel.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" + imageLabel.BackgroundTransparency = 1 + imageLabel.RobloxLocked = true + imageLabel.Parent = mainFrame + + for _, obj in pairs(choices) do + obj.RobloxLocked = true + obj.Parent = mainFrame + end + lastChoice.RobloxLocked = true + lastChoice.Parent = mainFrame + + mainFrame.RobloxLocked = true + mainFrame.Parent = parent +end + +function presentDialogChoices(talkingPart, dialogChoices) + if not currentConversationDialog then + return + end + + currentConversationPartner = talkingPart + local sortedDialogChoices = {} + for _, obj in pairs(dialogChoices) do + if obj:IsA "DialogChoice" then + table.insert(sortedDialogChoices, obj) + end + end + table.sort(sortedDialogChoices, function(a, b) + return a.Name < b.Name + end) + + if #sortedDialogChoices == 0 then + normalEndDialog() + return + end + + local pos = 1 + local yPosition = 0 + choiceMap = {} + for _, obj in pairs(choices) do + obj.Visible = false + end + + for _, obj in pairs(sortedDialogChoices) do + if pos <= #choices then + --3 lines is the maximum, set it to that temporarily + choices[pos].Size = UDim2.new(1, 0, 0, 24 * 3) + choices[pos].UserPrompt.Text = obj.UserDialog + local height = math.ceil(choices[pos].UserPrompt.TextBounds.Y / 24) * 24 + + choices[pos].Position = UDim2.new(0, 0, 0, yPosition) + choices[pos].Size = UDim2.new(1, 0, 0, height) + choices[pos].Visible = true + + choiceMap[choices[pos]] = obj + + yPosition = yPosition + height + pos = pos + 1 + end + end + + lastChoice.Position = UDim2.new(0, 0, 0, yPosition) + lastChoice.Number.Text = pos .. ")" + + mainFrame.Size = UDim2.new(0, 350, 0, yPosition + 24 + 32) + mainFrame.Position = UDim2.new(0, 20, 0, -mainFrame.Size.Y.Offset - 20) + styleMainFrame(currentTone()) + mainFrame.Visible = true +end + +function doDialog(dialog) + while not Instance.Lock(dialog, player) do + wait() + end + + if dialog.InUse then + Instance.Unlock(dialog) + return + else + dialog.InUse = true + Instance.Unlock(dialog) + end + + currentConversationDialog = dialog + game.Chat:Chat(dialog.Parent, dialog.InitialPrompt, getChatColor(dialog.Tone)) + variableDelay(dialog.InitialPrompt) + + presentDialogChoices(dialog.Parent, dialog:GetChildren()) +end + +function renewKillswitch(dialog) + if currentAbortDialogScript then + currentAbortDialogScript:Remove() + currentAbortDialogScript = nil + end + + currentAbortDialogScript = timeoutScript:Clone() + currentAbortDialogScript.archivable = false + currentAbortDialogScript.Disabled = false + currentAbortDialogScript.Parent = dialog +end + +function checkForLeaveArea() + while currentConversationDialog do + if + currentConversationDialog.Parent + and ( + player:DistanceFromCharacter(currentConversationDialog.Parent.Position) + >= currentConversationDialog.ConversationDistance + ) + then + wanderDialog() + end + wait(1) + end +end + +function startDialog(dialog) + if dialog.Parent and dialog.Parent:IsA "BasePart" then + if player:DistanceFromCharacter(dialog.Parent.Position) >= dialog.ConversationDistance then + showMessage(tooFarAwayMessage, tooFarAwaySize) + return + end + + for dialog, gui in pairs(dialogMap) do + if dialog and gui then + gui.Enabled = false + end + end + + renewKillswitch(dialog) + + delay(1, checkForLeaveArea) + doDialog(dialog) + end +end + +function removeDialog(dialog) + if dialogMap[dialog] then + dialogMap[dialog]:Remove() + dialogMap[dialog] = nil + end + if dialogConnections[dialog] then + dialogConnections[dialog]:disconnect() + dialogConnections[dialog] = nil + end +end + +function addDialog(dialog) + if dialog.Parent then + if dialog.Parent:IsA "BasePart" then + local chatGui = chatNotificationGui:clone() + chatGui.Enabled = not dialog.InUse + chatGui.Adornee = dialog.Parent + chatGui.RobloxLocked = true + chatGui.Parent = game.CoreGui + chatGui.Image.Button.MouseButton1Click:connect(function() + startDialog(dialog) + end) + setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) + + dialogMap[dialog] = chatGui + + dialogConnections[dialog] = dialog.Changed:connect(function(prop) + if prop == "Parent" and dialog.Parent then + --This handles the reparenting case, seperate from removal case + removeDialog(dialog) + addDialog(dialog) + elseif prop == "InUse" then + chatGui.Enabled = not currentConversationDialog and not dialog.InUse + if dialog == currentConversationDialog then + timeoutDialog() + end + elseif prop == "Tone" or prop == "Purpose" then + setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) + end + end) + else -- still need to listen to parent changes even if current parent is not a BasePart + dialogConnections[dialog] = dialog.Changed:connect(function(prop) + if prop == "Parent" and dialog.Parent then + --This handles the reparenting case, seperate from removal case + removeDialog(dialog) + addDialog(dialog) + end + end) + end + end +end + +function fetchScripts() + local model = game:GetService("InsertService"):LoadAsset(39226062) + if type(model) == "string" then -- load failed, lets try again + wait(0.1) + model = game:GetService("InsertService"):LoadAsset(39226062) + end + if type(model) == "string" then -- not going to work, lets bail + return + end + + waitForChild(model, "TimeoutScript") + timeoutScript = model.TimeoutScript + waitForChild(model, "ReenableDialogScript") + reenableDialogScript = model.ReenableDialogScript +end + +function onLoad() + waitForProperty(game.Players, "LocalPlayer") + player = game.Players.LocalPlayer + waitForProperty(player, "Character") + + --print("Fetching Scripts") + fetchScripts() + + --print("Creating Guis") + createChatNotificationGui() + + --print("Creating MessageDialog") + createMessageDialog() + messageDialog.RobloxLocked = true + messageDialog.Parent = gui + + --print("Waiting for BottomLeftControl") + waitForChild(gui, "BottomLeftControl") + + --print("Initializing Frame") + local frame = Instance.new "Frame" + frame.Name = "DialogFrame" + frame.Position = UDim2.new(0, 0, 0, 0) + frame.Size = UDim2.new(0, 0, 0, 0) + frame.BackgroundTransparency = 1 + frame.RobloxLocked = true + frame.Parent = gui.BottomLeftControl + initialize(frame) + + --print("Adding Dialogs") + game.CollectionService.ItemAdded:connect(function(obj) + if obj:IsA "Dialog" then + addDialog(obj) + end + end) + game.CollectionService.ItemRemoved:connect(function(obj) + if obj:IsA "Dialog" then + removeDialog(obj) + end + end) + for _, obj in pairs(game.CollectionService:GetCollection "Dialog") do + if obj:IsA "Dialog" then + addDialog(obj) + end + end +end + +onLoad() diff --git a/lua/45284430.lua b/lua/45284430.lua new file mode 100644 index 0000000..5bf7042 --- /dev/null +++ b/lua/45284430.lua @@ -0,0 +1,4120 @@ +local t = {} + +local function ScopedConnect(parentInstance, instance, event, signalFunc, syncFunc, removeFunc) + local eventConnection = nil + + --Connection on parentInstance is scoped by parentInstance (when destroyed, it goes away) + local tryConnect = function() + if game:IsAncestorOf(parentInstance) then + --Entering the world, make sure we are connected/synced + if not eventConnection then + eventConnection = instance[event]:connect(signalFunc) + if syncFunc then + syncFunc() + end + end + else + --Probably leaving the world, so disconnect for now + if eventConnection then + eventConnection:disconnect() + if removeFunc then + removeFunc() + end + end + end + end + + --Hook it up to ancestryChanged signal + local connection = parentInstance.AncestryChanged:connect(tryConnect) + + --Now connect us if we're already in the world + tryConnect() + + return connection +end + +local function getScreenGuiAncestor(instance) + local localInstance = instance + while localInstance and not localInstance:IsA "ScreenGui" do + localInstance = localInstance.Parent + end + return localInstance +end + +local function CreateButtons(frame, buttons, yPos, ySize) + local buttonNum = 1 + local buttonObjs = {} + for _, obj in ipairs(buttons) do + local button = Instance.new "TextButton" + button.Name = "Button" .. buttonNum + button.Font = Enum.Font.Arial + button.FontSize = Enum.FontSize.Size18 + button.AutoButtonColor = true + button.Modal = true + if obj["Style"] then + button.Style = obj.Style + else + button.Style = Enum.ButtonStyle.RobloxButton + end + button.Text = obj.Text + button.TextColor3 = Color3.new(1, 1, 1) + button.MouseButton1Click:connect(obj.Function) + button.Parent = frame + buttonObjs[buttonNum] = button + + buttonNum = buttonNum + 1 + end + local numButtons = buttonNum - 1 + + if numButtons == 1 then + frame.Button1.Position = UDim2.new(0.35, 0, yPos.Scale, yPos.Offset) + frame.Button1.Size = UDim2.new(0.4, 0, ySize.Scale, ySize.Offset) + elseif numButtons == 2 then + frame.Button1.Position = UDim2.new(0.1, 0, yPos.Scale, yPos.Offset) + frame.Button1.Size = UDim2.new(0.8 / 3, 0, ySize.Scale, ySize.Offset) + + frame.Button2.Position = UDim2.new(0.55, 0, yPos.Scale, yPos.Offset) + frame.Button2.Size = UDim2.new(0.35, 0, ySize.Scale, ySize.Offset) + elseif numButtons >= 3 then + local spacing = 0.1 / numButtons + local buttonSize = 0.9 / numButtons + + buttonNum = 1 + while buttonNum <= numButtons do + buttonObjs[buttonNum].Position = + UDim2.new(spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, yPos.Scale, yPos.Offset) + buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) + buttonNum = buttonNum + 1 + end + end +end + +local function setSliderPos(newAbsPosX, slider, sliderPosition, bar, steps) + local newStep = steps - 1 --otherwise we really get one more step than we want + local relativePosX = math.min(1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X)) + local wholeNum, remainder = math.modf(relativePosX * newStep) + if remainder > 0.5 then + wholeNum = wholeNum + 1 + end + relativePosX = wholeNum / newStep + + local result = math.ceil(relativePosX * newStep) + if sliderPosition.Value ~= (result + 1) then --only update if we moved a step + sliderPosition.Value = result + 1 + slider.Position = + UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset) + end +end + +local function cancelSlide(areaSoak) + areaSoak.Visible = false + if areaSoakMouseMoveCon then + areaSoakMouseMoveCon:disconnect() + end +end + +t.CreateStyledMessageDialog = function(title, message, style, buttons) + local frame = Instance.new "Frame" + frame.Size = UDim2.new(0.5, 0, 0, 165) + frame.Position = UDim2.new(0.25, 0, 0.5, -72.5) + frame.Name = "MessageDialog" + frame.Active = true + frame.Style = Enum.FrameStyle.RobloxRound + + local styleImage = Instance.new "ImageLabel" + styleImage.Name = "StyleImage" + styleImage.BackgroundTransparency = 1 + styleImage.Position = UDim2.new(0, 5, 0, 15) + if style == "error" or style == "Error" then + styleImage.Size = UDim2.new(0, 71, 0, 71) + styleImage.Image = "http://www.roblox.com/asset?id=42565285" + elseif style == "notify" or style == "Notify" then + styleImage.Size = UDim2.new(0, 71, 0, 71) + styleImage.Image = "http://www.roblox.com/asset?id=42604978" + elseif style == "confirm" or style == "Confirm" then + styleImage.Size = UDim2.new(0, 74, 0, 76) + styleImage.Image = "http://www.roblox.com/asset?id=42557901" + else + return t.CreateMessageDialog(title, message, buttons) + end + styleImage.Parent = frame + + local titleLabel = Instance.new "TextLabel" + titleLabel.Name = "Title" + titleLabel.Text = title + titleLabel.TextStrokeTransparency = 0 + titleLabel.BackgroundTransparency = 1 + titleLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) + titleLabel.Position = UDim2.new(0, 80, 0, 0) + titleLabel.Size = UDim2.new(1, -80, 0, 40) + titleLabel.Font = Enum.Font.ArialBold + titleLabel.FontSize = Enum.FontSize.Size36 + titleLabel.TextXAlignment = Enum.TextXAlignment.Center + titleLabel.TextYAlignment = Enum.TextYAlignment.Center + titleLabel.Parent = frame + + local messageLabel = Instance.new "TextLabel" + messageLabel.Name = "Message" + messageLabel.Text = message + messageLabel.TextStrokeTransparency = 0 + messageLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) + messageLabel.Position = UDim2.new(0.025, 80, 0, 45) + messageLabel.Size = UDim2.new(0.95, -80, 0, 55) + messageLabel.BackgroundTransparency = 1 + messageLabel.Font = Enum.Font.Arial + messageLabel.FontSize = Enum.FontSize.Size18 + messageLabel.TextWrap = true + messageLabel.TextXAlignment = Enum.TextXAlignment.Left + messageLabel.TextYAlignment = Enum.TextYAlignment.Top + messageLabel.Parent = frame + + CreateButtons(frame, buttons, UDim.new(0, 105), UDim.new(0, 40)) + + return frame +end + +t.CreateMessageDialog = function(title, message, buttons) + local frame = Instance.new "Frame" + frame.Size = UDim2.new(0.5, 0, 0.5, 0) + frame.Position = UDim2.new(0.25, 0, 0.25, 0) + frame.Name = "MessageDialog" + frame.Active = true + frame.Style = Enum.FrameStyle.RobloxRound + + local titleLabel = Instance.new "TextLabel" + titleLabel.Name = "Title" + titleLabel.Text = title + titleLabel.BackgroundTransparency = 1 + titleLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) + titleLabel.Position = UDim2.new(0, 0, 0, 0) + titleLabel.Size = UDim2.new(1, 0, 0.15, 0) + titleLabel.Font = Enum.Font.ArialBold + titleLabel.FontSize = Enum.FontSize.Size36 + titleLabel.TextXAlignment = Enum.TextXAlignment.Center + titleLabel.TextYAlignment = Enum.TextYAlignment.Center + titleLabel.Parent = frame + + local messageLabel = Instance.new "TextLabel" + messageLabel.Name = "Message" + messageLabel.Text = message + messageLabel.TextColor3 = Color3.new(221 / 255, 221 / 255, 221 / 255) + messageLabel.Position = UDim2.new(0.025, 0, 0.175, 0) + messageLabel.Size = UDim2.new(0.95, 0, 0.55, 0) + messageLabel.BackgroundTransparency = 1 + messageLabel.Font = Enum.Font.Arial + messageLabel.FontSize = Enum.FontSize.Size18 + messageLabel.TextWrap = true + messageLabel.TextXAlignment = Enum.TextXAlignment.Left + messageLabel.TextYAlignment = Enum.TextYAlignment.Top + messageLabel.Parent = frame + + CreateButtons(frame, buttons, UDim.new(0.8, 0), UDim.new(0.15, 0)) + + return frame +end + +t.CreateDropDownMenu = function(items, onSelect, forRoblox) + local width = UDim.new(0, 100) + local height = UDim.new(0, 32) + + local frame = Instance.new "Frame" + frame.Name = "DropDownMenu" + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(width, height) + + local dropDownMenu = Instance.new "TextButton" + dropDownMenu.Name = "DropDownMenuButton" + dropDownMenu.TextWrap = true + dropDownMenu.TextColor3 = Color3.new(1, 1, 1) + dropDownMenu.Text = "Choose One" + dropDownMenu.Font = Enum.Font.ArialBold + dropDownMenu.FontSize = Enum.FontSize.Size18 + dropDownMenu.TextXAlignment = Enum.TextXAlignment.Left + dropDownMenu.TextYAlignment = Enum.TextYAlignment.Center + dropDownMenu.BackgroundTransparency = 1 + dropDownMenu.AutoButtonColor = true + dropDownMenu.Style = Enum.ButtonStyle.RobloxButton + dropDownMenu.Size = UDim2.new(1, 0, 1, 0) + dropDownMenu.Parent = frame + dropDownMenu.ZIndex = 2 + + local dropDownIcon = Instance.new "ImageLabel" + dropDownIcon.Name = "Icon" + dropDownIcon.Active = false + dropDownIcon.Image = "http://www.roblox.com/asset/?id=45732894" + dropDownIcon.BackgroundTransparency = 1 + dropDownIcon.Size = UDim2.new(0, 11, 0, 6) + dropDownIcon.Position = UDim2.new(1, -11, 0.5, -2) + dropDownIcon.Parent = dropDownMenu + dropDownIcon.ZIndex = 2 + + local itemCount = #items + local dropDownItemCount = #items + local useScrollButtons = false + if dropDownItemCount > 6 then + useScrollButtons = true + dropDownItemCount = 6 + end + + local droppedDownMenu = Instance.new "TextButton" + droppedDownMenu.Name = "List" + droppedDownMenu.Text = "" + droppedDownMenu.BackgroundTransparency = 1 + --droppedDownMenu.AutoButtonColor = true + droppedDownMenu.Style = Enum.ButtonStyle.RobloxButton + droppedDownMenu.Visible = false + droppedDownMenu.Active = true --Blocks clicks + droppedDownMenu.Position = UDim2.new(0, 0, 0, 0) + droppedDownMenu.Size = UDim2.new(1, 0, (1 + dropDownItemCount) * 0.8, 0) + droppedDownMenu.Parent = frame + droppedDownMenu.ZIndex = 2 + + local choiceButton = Instance.new "TextButton" + choiceButton.Name = "ChoiceButton" + choiceButton.BackgroundTransparency = 1 + choiceButton.BorderSizePixel = 0 + choiceButton.Text = "ReplaceMe" + choiceButton.TextColor3 = Color3.new(1, 1, 1) + choiceButton.TextXAlignment = Enum.TextXAlignment.Left + choiceButton.TextYAlignment = Enum.TextYAlignment.Center + choiceButton.BackgroundColor3 = Color3.new(1, 1, 1) + choiceButton.Font = Enum.Font.Arial + choiceButton.FontSize = Enum.FontSize.Size18 + if useScrollButtons then + choiceButton.Size = UDim2.new(1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) + else + choiceButton.Size = UDim2.new(1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) + end + choiceButton.TextWrap = true + choiceButton.ZIndex = 2 + + local areaSoak = Instance.new "TextButton" + areaSoak.Name = "AreaSoak" + areaSoak.Text = "" + areaSoak.BackgroundTransparency = 1 + areaSoak.Active = true + areaSoak.Size = UDim2.new(1, 0, 1, 0) + areaSoak.Visible = false + areaSoak.ZIndex = 3 + + local dropDownSelected = false + + local scrollUpButton + local scrollDownButton + local scrollMouseCount = 0 + + local setZIndex = function(baseZIndex) + droppedDownMenu.ZIndex = baseZIndex + 1 + if scrollUpButton then + scrollUpButton.ZIndex = baseZIndex + 3 + end + if scrollDownButton then + scrollDownButton.ZIndex = baseZIndex + 3 + end + + local children = droppedDownMenu:GetChildren() + if children then + for _, child in ipairs(children) do + if child.Name == "ChoiceButton" then + child.ZIndex = baseZIndex + 2 + elseif child.Name == "ClickCaptureButton" then + child.ZIndex = baseZIndex + end + end + end + end + + local scrollBarPosition = 1 + local updateScroll = function() + if scrollUpButton then + scrollUpButton.Active = scrollBarPosition > 1 + end + if scrollDownButton then + scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount + end + + local children = droppedDownMenu:GetChildren() + if not children then + return + end + + local childNum = 1 + for _, obj in ipairs(children) do + if obj.Name == "ChoiceButton" then + if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount then + obj.Visible = false + else + obj.Position = + UDim2.new(0, 0, ((childNum - scrollBarPosition + 1) * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) + obj.Visible = true + end + obj.TextColor3 = Color3.new(1, 1, 1) + obj.BackgroundTransparency = 1 + + childNum = childNum + 1 + end + end + end + local toggleVisibility = function() + dropDownSelected = not dropDownSelected + + areaSoak.Visible = not areaSoak.Visible + dropDownMenu.Visible = not dropDownSelected + droppedDownMenu.Visible = dropDownSelected + if dropDownSelected then + setZIndex(4) + else + setZIndex(2) + end + if useScrollButtons then + updateScroll() + end + end + droppedDownMenu.MouseButton1Click:connect(toggleVisibility) + + local updateSelection = function(text) + local foundItem = false + local children = droppedDownMenu:GetChildren() + local childNum = 1 + if children then + for _, obj in ipairs(children) do + if obj.Name == "ChoiceButton" then + if obj.Text == text then + obj.Font = Enum.Font.ArialBold + foundItem = true + scrollBarPosition = childNum + else + obj.Font = Enum.Font.Arial + end + childNum = childNum + 1 + end + end + end + if not text then + dropDownMenu.Text = "Choose One" + scrollBarPosition = 1 + else + if not foundItem then + error("Invalid Selection Update -- " .. text) + end + + if scrollBarPosition + dropDownItemCount > itemCount + 1 then + scrollBarPosition = itemCount - dropDownItemCount + 1 + end + + dropDownMenu.Text = text + end + end + + local function scrollDown() + if scrollBarPosition + dropDownItemCount <= itemCount then + scrollBarPosition = scrollBarPosition + 1 + updateScroll() + return true + end + return false + end + local function scrollUp() + if scrollBarPosition > 1 then + scrollBarPosition = scrollBarPosition - 1 + updateScroll() + return true + end + return false + end + + if useScrollButtons then + --Make some scroll buttons + scrollUpButton = Instance.new "ImageButton" + scrollUpButton.Name = "ScrollUpButton" + scrollUpButton.BackgroundTransparency = 1 + scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" + scrollUpButton.Size = UDim2.new(0, 17, 0, 17) + scrollUpButton.Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) + scrollUpButton.MouseButton1Click:connect(function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollUpButton.MouseLeave:connect(function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollUpButton.MouseButton1Down:connect(function() + scrollMouseCount = scrollMouseCount + 1 + + scrollUp() + local val = scrollMouseCount + wait(0.5) + while val == scrollMouseCount do + if scrollUp() == false then + break + end + wait(0.1) + end + end) + + scrollUpButton.Parent = droppedDownMenu + + scrollDownButton = Instance.new "ImageButton" + scrollDownButton.Name = "ScrollDownButton" + scrollDownButton.BackgroundTransparency = 1 + scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" + scrollDownButton.Size = UDim2.new(0, 17, 0, 17) + scrollDownButton.Position = UDim2.new(1, -11, 1, -11) + scrollDownButton.Parent = droppedDownMenu + scrollDownButton.MouseButton1Click:connect(function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollDownButton.MouseLeave:connect(function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollDownButton.MouseButton1Down:connect(function() + scrollMouseCount = scrollMouseCount + 1 + + scrollDown() + local val = scrollMouseCount + wait(0.5) + while val == scrollMouseCount do + if scrollDown() == false then + break + end + wait(0.1) + end + end) + + local scrollbar = Instance.new "ImageLabel" + scrollbar.Name = "ScrollBar" + scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" + scrollbar.BackgroundTransparency = 1 + scrollbar.Size = UDim2.new(0, 18, (dropDownItemCount * 0.8) / ((dropDownItemCount + 1) * 0.8), -17 - 11 - 4) + scrollbar.Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 17 + 2) + scrollbar.Parent = droppedDownMenu + end + + for _, item in ipairs(items) do + -- needed to maintain local scope for items in event listeners below + local button = choiceButton:clone() + if forRoblox then + button.RobloxLocked = true + end + button.Text = item + button.Parent = droppedDownMenu + button.MouseButton1Click:connect(function() + --Remove Highlight + button.TextColor3 = Color3.new(1, 1, 1) + button.BackgroundTransparency = 1 + + updateSelection(item) + onSelect(item) + + toggleVisibility() + end) + button.MouseEnter:connect(function() + --Add Highlight + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundTransparency = 0 + end) + + button.MouseLeave:connect(function() + --Remove Highlight + button.TextColor3 = Color3.new(1, 1, 1) + button.BackgroundTransparency = 1 + end) + end + + --This does the initial layout of the buttons + updateScroll() + + frame.AncestryChanged:connect(function(_, parent) + if parent == nil then + areaSoak.Parent = nil + else + areaSoak.Parent = getScreenGuiAncestor(frame) + end + end) + + dropDownMenu.MouseButton1Click:connect(toggleVisibility) + areaSoak.MouseButton1Click:connect(toggleVisibility) + return frame, updateSelection +end + +t.CreatePropertyDropDownMenu = function(instance, property, enum) + local items = enum:GetEnumItems() + local names = {} + local nameToItem = {} + for i, obj in ipairs(items) do + names[i] = obj.Name + nameToItem[obj.Name] = obj + end + + local frame + local updateSelection + frame, updateSelection = t.CreateDropDownMenu(names, function(text) + instance[property] = nameToItem[text] + end) + + ScopedConnect(frame, instance, "Changed", function(prop) + if prop == property then + updateSelection(instance[property].Name) + end + end, function() + updateSelection(instance[property].Name) + end) + + return frame +end + +t.GetFontHeight = function(font, fontSize) + if font == nil or fontSize == nil then + error "Font and FontSize must be non-nil" + end + + if font == Enum.Font.Legacy then + if fontSize == Enum.FontSize.Size8 then + return 12 + elseif fontSize == Enum.FontSize.Size9 then + return 14 + elseif fontSize == Enum.FontSize.Size10 then + return 15 + elseif fontSize == Enum.FontSize.Size11 then + return 17 + elseif fontSize == Enum.FontSize.Size12 then + return 18 + elseif fontSize == Enum.FontSize.Size14 then + return 21 + elseif fontSize == Enum.FontSize.Size18 then + return 27 + elseif fontSize == Enum.FontSize.Size24 then + return 36 + elseif fontSize == Enum.FontSize.Size36 then + return 54 + elseif fontSize == Enum.FontSize.Size48 then + return 72 + else + error "Unknown FontSize" + end + elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold then + if fontSize == Enum.FontSize.Size8 then + return 8 + elseif fontSize == Enum.FontSize.Size9 then + return 9 + elseif fontSize == Enum.FontSize.Size10 then + return 10 + elseif fontSize == Enum.FontSize.Size11 then + return 11 + elseif fontSize == Enum.FontSize.Size12 then + return 12 + elseif fontSize == Enum.FontSize.Size14 then + return 14 + elseif fontSize == Enum.FontSize.Size18 then + return 18 + elseif fontSize == Enum.FontSize.Size24 then + return 24 + elseif fontSize == Enum.FontSize.Size36 then + return 36 + elseif fontSize == Enum.FontSize.Size48 then + return 48 + else + error "Unknown FontSize" + end + else + error("Unknown Font " .. font) + end +end + +local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) + local totalPixels = frame.AbsoluteSize.Y + local pixelsRemaining = frame.AbsoluteSize.Y + for _, child in ipairs(guiObjects) do + if child:IsA "TextLabel" or child:IsA "TextButton" then + local isLabel = child:IsA "TextLabel" + if isLabel then + pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] + else + pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] + end + child.Position = + UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining) + + if child.TextFits and child.TextBounds.Y < pixelsRemaining then + child.Visible = true + if isLabel then + child.Size = UDim2.new( + child.Size.X.Scale, + child.Size.X.Offset, + 0, + child.TextBounds.Y + settingsTable["TextLabelSizePadY"] + ) + else + child.Size = UDim2.new( + child.Size.X.Scale, + child.Size.X.Offset, + 0, + child.TextBounds.Y + settingsTable["TextButtonSizePadY"] + ) + end + + while not child.TextFits do + child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1) + end + pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + + if isLabel then + pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] + else + pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] + end + else + child.Visible = false + pixelsRemaining = -1 + end + else + --GuiObject + child.Position = + UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + child.Visible = (pixelsRemaining >= 0) + end + end +end + +t.LayoutGuiObjects = function(frame, guiObjects, settingsTable) + if not frame:IsA "GuiObject" then + error "Frame must be a GuiObject" + end + for _, child in ipairs(guiObjects) do + if not child:IsA "GuiObject" then + error "All elements that are layed out must be of type GuiObject" + end + end + + if not settingsTable then + settingsTable = {} + end + + if not settingsTable["TextLabelSizePadY"] then + settingsTable["TextLabelSizePadY"] = 0 + end + if not settingsTable["TextLabelPositionPadY"] then + settingsTable["TextLabelPositionPadY"] = 0 + end + if not settingsTable["TextButtonSizePadY"] then + settingsTable["TextButtonSizePadY"] = 12 + end + if not settingsTable["TextButtonPositionPadY"] then + settingsTable["TextButtonPositionPadY"] = 2 + end + + --Wrapper frame takes care of styled objects + local wrapperFrame = Instance.new "Frame" + wrapperFrame.Name = "WrapperFrame" + wrapperFrame.BackgroundTransparency = 1 + wrapperFrame.Size = UDim2.new(1, 0, 1, 0) + wrapperFrame.Parent = frame + + for _, child in ipairs(guiObjects) do + child.Parent = wrapperFrame + end + + local recalculate = function() + wait() + layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) + end + + frame.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + --Wait a heartbeat for it to sync in + recalculate(nil) + end + end) + frame.AncestryChanged:connect(recalculate) + + layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) +end + +t.CreateSlider = function(steps, width, position) + local sliderGui = Instance.new "Frame" + sliderGui.Size = UDim2.new(1, 0, 1, 0) + sliderGui.BackgroundTransparency = 1 + sliderGui.Name = "SliderGui" + + local sliderSteps = Instance.new "IntValue" + sliderSteps.Name = "SliderSteps" + sliderSteps.Value = steps + sliderSteps.Parent = sliderGui + + local areaSoak = Instance.new "TextButton" + areaSoak.Name = "AreaSoak" + areaSoak.Text = "" + areaSoak.BackgroundTransparency = 1 + areaSoak.Active = false + areaSoak.Size = UDim2.new(1, 0, 1, 0) + areaSoak.Visible = false + areaSoak.ZIndex = 4 + + sliderGui.AncestryChanged:connect(function(_, parent) + if parent == nil then + areaSoak.Parent = nil + else + areaSoak.Parent = getScreenGuiAncestor(sliderGui) + end + end) + + local sliderPosition = Instance.new "IntValue" + sliderPosition.Name = "SliderPosition" + sliderPosition.Value = 0 + sliderPosition.Parent = sliderGui + + local bar = Instance.new "TextButton" + bar.Text = "" + bar.AutoButtonColor = false + bar.Name = "Bar" + bar.BackgroundColor3 = Color3.new(0, 0, 0) + if type(width) == "number" then + bar.Size = UDim2.new(0, width, 0, 5) + else + bar.Size = UDim2.new(0, 200, 0, 5) + end + bar.BorderColor3 = Color3.new(95 / 255, 95 / 255, 95 / 255) + bar.ZIndex = 2 + bar.Parent = sliderGui + + if + position["X"] + and position["X"]["Scale"] + and position["X"]["Offset"] + and position["Y"] + and position["Y"]["Scale"] + and position["Y"]["Offset"] + then + bar.Position = position + end + + local slider = Instance.new "ImageButton" + slider.Name = "Slider" + slider.BackgroundTransparency = 1 + slider.Image = "rbxasset://textures/ui/Slider.png" + slider.Position = UDim2.new(0, 0, 0.5, -10) + slider.Size = UDim2.new(0, 20, 0, 20) + slider.ZIndex = 3 + slider.Parent = bar + + local areaSoakMouseMoveCon = nil + + areaSoak.MouseLeave:connect(function() + if areaSoak.Visible then + cancelSlide(areaSoak) + end + end) + areaSoak.MouseButton1Up:connect(function() + if areaSoak.Visible then + cancelSlide(areaSoak) + end + end) + + slider.MouseButton1Down:connect(function() + areaSoak.Visible = true + if areaSoakMouseMoveCon then + areaSoakMouseMoveCon:disconnect() + end + areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x, _) + setSliderPos(x, slider, sliderPosition, bar, steps) + end) + end) + + slider.MouseButton1Up:connect(function() + cancelSlide(areaSoak) + end) + + sliderPosition.Changed:connect(function(_) + sliderPosition.Value = math.min(steps, math.max(1, sliderPosition.Value)) + local relativePosX = (sliderPosition.Value - 1) / (steps - 1) + slider.Position = + UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset) + end) + + bar.MouseButton1Down:connect(function(x, _) + setSliderPos(x, slider, sliderPosition, bar, steps) + end) + + return sliderGui, sliderPosition, sliderSteps +end + +t.CreateTrueScrollingFrame = function() + local lowY = nil + local highY = nil + + local dragCon = nil + local upCon = nil + + local internalChange = false + + local descendantsChangeConMap = {} + + local scrollingFrame = Instance.new "Frame" + scrollingFrame.Name = "ScrollingFrame" + scrollingFrame.Active = true + scrollingFrame.Size = UDim2.new(1, 0, 1, 0) + scrollingFrame.ClipsDescendants = true + + local controlFrame = Instance.new "Frame" + controlFrame.Name = "ControlFrame" + controlFrame.BackgroundTransparency = 1 + controlFrame.Size = UDim2.new(0, 18, 1, 0) + controlFrame.Position = UDim2.new(1, -20, 0, 0) + controlFrame.Parent = scrollingFrame + + local scrollBottom = Instance.new "BoolValue" + scrollBottom.Value = false + scrollBottom.Name = "ScrollBottom" + scrollBottom.Parent = controlFrame + + local scrollUp = Instance.new "BoolValue" + scrollUp.Value = false + scrollUp.Name = "scrollUp" + scrollUp.Parent = controlFrame + + local scrollUpButton = Instance.new "TextButton" + scrollUpButton.Name = "ScrollUpButton" + scrollUpButton.Text = "" + scrollUpButton.AutoButtonColor = false + scrollUpButton.BackgroundColor3 = Color3.new(0, 0, 0) + scrollUpButton.BorderColor3 = Color3.new(1, 1, 1) + scrollUpButton.BackgroundTransparency = 0.5 + scrollUpButton.Size = UDim2.new(0, 18, 0, 18) + scrollUpButton.ZIndex = 2 + scrollUpButton.Parent = controlFrame + for i = 1, 6 do + local triFrame = Instance.new "Frame" + triFrame.BorderColor3 = Color3.new(1, 1, 1) + triFrame.Name = "tri" .. tostring(i) + triFrame.ZIndex = 3 + triFrame.BackgroundTransparency = 0.5 + triFrame.Size = UDim2.new(0, 12 - ((i - 1) * 2), 0, 0) + triFrame.Position = UDim2.new(0, 3 + (i - 1), 0.5, 2 - (i - 1)) + triFrame.Parent = scrollUpButton + end + scrollUpButton.MouseEnter:connect(function() + scrollUpButton.BackgroundTransparency = 0.1 + local upChildren = scrollUpButton:GetChildren() + for i = 1, #upChildren do + upChildren[i].BackgroundTransparency = 0.1 + end + end) + scrollUpButton.MouseLeave:connect(function() + scrollUpButton.BackgroundTransparency = 0.5 + local upChildren = scrollUpButton:GetChildren() + for i = 1, #upChildren do + upChildren[i].BackgroundTransparency = 0.5 + end + end) + + local scrollDownButton = scrollUpButton:clone() + scrollDownButton.Name = "ScrollDownButton" + scrollDownButton.Position = UDim2.new(0, 0, 1, -18) + local downChildren = scrollDownButton:GetChildren() + for i = 1, #downChildren do + downChildren[i].Position = UDim2.new(0, 3 + (i - 1), 0.5, -2 + (i - 1)) + end + scrollDownButton.MouseEnter:connect(function() + scrollDownButton.BackgroundTransparency = 0.1 + local downChildren = scrollDownButton:GetChildren() + for i = 1, #downChildren do + downChildren[i].BackgroundTransparency = 0.1 + end + end) + scrollDownButton.MouseLeave:connect(function() + scrollDownButton.BackgroundTransparency = 0.5 + local downChildren = scrollDownButton:GetChildren() + for i = 1, #downChildren do + downChildren[i].BackgroundTransparency = 0.5 + end + end) + scrollDownButton.Parent = controlFrame + + local scrollTrack = Instance.new "Frame" + scrollTrack.Name = "ScrollTrack" + scrollTrack.BackgroundTransparency = 1 + scrollTrack.Size = UDim2.new(0, 18, 1, -38) + scrollTrack.Position = UDim2.new(0, 0, 0, 19) + scrollTrack.Parent = controlFrame + + local scrollbar = Instance.new "TextButton" + scrollbar.BackgroundColor3 = Color3.new(0, 0, 0) + scrollbar.BorderColor3 = Color3.new(1, 1, 1) + scrollbar.BackgroundTransparency = 0.5 + scrollbar.AutoButtonColor = false + scrollbar.Text = "" + scrollbar.Active = true + scrollbar.Name = "ScrollBar" + scrollbar.ZIndex = 2 + scrollbar.BackgroundTransparency = 0.5 + scrollbar.Size = UDim2.new(0, 18, 0.1, 0) + scrollbar.Position = UDim2.new(0, 0, 0, 0) + scrollbar.Parent = scrollTrack + + local scrollNub = Instance.new "Frame" + scrollNub.Name = "ScrollNub" + scrollNub.BorderColor3 = Color3.new(1, 1, 1) + scrollNub.Size = UDim2.new(0, 10, 0, 0) + scrollNub.Position = UDim2.new(0.5, -5, 0.5, 0) + scrollNub.ZIndex = 2 + scrollNub.BackgroundTransparency = 0.5 + scrollNub.Parent = scrollbar + + local newNub = scrollNub:clone() + newNub.Position = UDim2.new(0.5, -5, 0.5, -2) + newNub.Parent = scrollbar + + local lastNub = scrollNub:clone() + lastNub.Position = UDim2.new(0.5, -5, 0.5, 2) + lastNub.Parent = scrollbar + + scrollbar.MouseEnter:connect(function() + scrollbar.BackgroundTransparency = 0.1 + scrollNub.BackgroundTransparency = 0.1 + newNub.BackgroundTransparency = 0.1 + lastNub.BackgroundTransparency = 0.1 + end) + scrollbar.MouseLeave:connect(function() + scrollbar.BackgroundTransparency = 0.5 + scrollNub.BackgroundTransparency = 0.5 + newNub.BackgroundTransparency = 0.5 + lastNub.BackgroundTransparency = 0.5 + end) + + local mouseDrag = Instance.new "ImageButton" + mouseDrag.Active = false + mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) + mouseDrag.AutoButtonColor = false + mouseDrag.BackgroundTransparency = 1 + mouseDrag.Name = "mouseDrag" + mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) + mouseDrag.ZIndex = 10 + + local function positionScrollBar(_, y, offset) + local oldPos = scrollbar.Position + + if y < scrollTrack.AbsolutePosition.y then + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0) + return (oldPos ~= scrollbar.Position) + end + + local relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y + + if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0) + return (oldPos ~= scrollbar.Position) + end + local newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset) / scrollTrack.AbsoluteSize.y + if newScaleYPos + relativeSize > 1 then + newScaleYPos = 1 - relativeSize + scrollBottom.Value = true + scrollUp.Value = false + elseif newScaleYPos <= 0 then + newScaleYPos = 0 + scrollUp.Value = true + scrollBottom.Value = false + else + scrollUp.Value = false + scrollBottom.Value = false + end + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, newScaleYPos, 0) + + return (oldPos ~= scrollbar.Position) + end + + local function drillDownSetHighLow(instance) + if not instance or not instance:IsA "GuiObject" then + return + end + if instance == controlFrame then + return + end + if instance:IsDescendantOf(controlFrame) then + return + end + if not instance.Visible then + return + end + + if (lowY and lowY > instance.AbsolutePosition.Y) or not lowY then + lowY = instance.AbsolutePosition.Y + end + if (highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y)) or not highY then + highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y + end + local children = instance:GetChildren() + for i = 1, #children do + drillDownSetHighLow(children[i]) + end + end + + local function resetHighLow() + local firstChildren = scrollingFrame:GetChildren() + + for i = 1, #firstChildren do + drillDownSetHighLow(firstChildren[i]) + end + end + + local function recalculate() + internalChange = true + + local percentFrame = 0 + if scrollbar.Position.Y.Scale > 0 then + if scrollbar.Visible then + percentFrame = scrollbar.Position.Y.Scale + / ((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) / scrollTrack.AbsoluteSize.Y) + else + percentFrame = 0 + end + end + if percentFrame > 0.99 then + percentFrame = 1 + end + + local hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame + + local guiChildren = scrollingFrame:GetChildren() + for i = 1, #guiChildren do + if guiChildren[i] ~= controlFrame then + guiChildren[i].Position = UDim2.new( + guiChildren[i].Position.X.Scale, + guiChildren[i].Position.X.Offset, + 0, + math.ceil(guiChildren[i].AbsolutePosition.Y) - math.ceil(lowY) + hiddenYAmount + ) + end + end + + lowY = nil + highY = nil + resetHighLow() + internalChange = false + end + + local function setSliderSizeAndPosition() + if not highY or not lowY then + return + end + + local totalYSpan = math.abs(highY - lowY) + if totalYSpan == 0 then + scrollbar.Visible = false + scrollDownButton.Visible = false + scrollUpButton.Visible = false + + if dragCon then + dragCon:disconnect() + dragCon = nil + end + if upCon then + upCon:disconnect() + upCon = nil + end + return + end + + local percentShown = scrollingFrame.AbsoluteSize.Y / totalYSpan + if percentShown >= 1 then + scrollbar.Visible = false + scrollDownButton.Visible = false + scrollUpButton.Visible = false + recalculate() + else + scrollbar.Visible = true + scrollDownButton.Visible = true + scrollUpButton.Visible = true + + scrollbar.Size = UDim2.new(scrollbar.Size.X.Scale, scrollbar.Size.X.Offset, percentShown, 0) + end + + local percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY) / totalYSpan + scrollbar.Position = UDim2.new( + scrollbar.Position.X.Scale, + scrollbar.Position.X.Offset, + percentPosition, + -scrollbar.AbsoluteSize.X / 2 + ) + + if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y then + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0) + end + + if + (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) + > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) + then + local relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0) + end + end + + local buttonScrollAmountPixels = 7 + local reentrancyGuardScrollUp = false + local function doScrollUp() + if reentrancyGuardScrollUp then + return + end + + reentrancyGuardScrollUp = true + if positionScrollBar(0, scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels, 0) then + recalculate() + end + reentrancyGuardScrollUp = false + end + + local reentrancyGuardScrollDown = false + local function doScrollDown() + if reentrancyGuardScrollDown then + return + end + + reentrancyGuardScrollDown = true + if positionScrollBar(0, scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels, 0) then + recalculate() + end + reentrancyGuardScrollDown = false + end + + local function scrollUp(mouseYPos) + if scrollUpButton.Active then + local scrollStamp = tick() + local current = scrollStamp + local upCon + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + upCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollUp() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollUp() + if mouseYPos and mouseYPos > scrollbar.AbsolutePosition.y then + break + end + if not scrollUpButton.Active then + break + end + if tick() - t > 5 then + w = 0 + elseif tick() - t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + local function scrollDown(mouseYPos) + if scrollDownButton.Active then + local scrollStamp = tick() + local current = scrollStamp + local downCon + downCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + downCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollDown() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollDown() + if mouseYPos and mouseYPos < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x) then + break + end + if not scrollDownButton.Active then + break + end + if tick() - t > 5 then + w = 0 + elseif tick() - t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + scrollbar.MouseButton1Down:connect(function(_, y) + if scrollbar.Active then + local scrollStamp = tick() + local mouseOffset = y - scrollbar.AbsolutePosition.y + if dragCon then + dragCon:disconnect() + dragCon = nil + end + if upCon then + upCon:disconnect() + upCon = nil + end + local reentrancyGuardMouseScroll = false + dragCon = mouseDrag.MouseMoved:connect(function(x, y) + if reentrancyGuardMouseScroll then + return + end + + reentrancyGuardMouseScroll = true + if positionScrollBar(x, y, mouseOffset) then + recalculate() + end + reentrancyGuardMouseScroll = false + end) + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + dragCon:disconnect() + dragCon = nil + upCon:disconnect() + drag = nil + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + end + end) + + local scrollMouseCount = 0 + + scrollUpButton.MouseButton1Down:connect(function() + scrollUp() + end) + scrollDownButton.MouseButton1Down:connect(function() + scrollDown() + end) + + local function scrollTick() + scrollStamp = tick() + end + + scrollUpButton.MouseButton1Up:connect(scrollTick) + scrollDownButton.MouseButton1Up:connect(scrollTick) + scrollbar.MouseButton1Up:connect(scrollTick) + + -- local function heightCheck(instance) + -- if (highY and (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) > highY) or not highY then + -- highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y + -- end + -- setSliderSizeAndPosition() + -- end + + local function highLowRecheck() + local oldLowY = lowY + local oldHighY = highY + lowY = nil + highY = nil + resetHighLow() + + if (lowY ~= oldLowY) or (highY ~= oldHighY) then + setSliderSizeAndPosition() + end + end + + local function descendantChanged(this, prop) + if internalChange then + return + end + if not this.Visible then + return + end + + if prop == "Size" or prop == "Position" then + wait() + highLowRecheck() + end + end + + scrollingFrame.DescendantAdded:connect(function(instance) + if not instance:IsA "GuiObject" then + return + end + + if instance.Visible then + wait() -- wait a heartbeat for sizes to reconfig + highLowRecheck() + end + + descendantsChangeConMap[instance] = instance.Changed:connect(function(prop) + descendantChanged(instance, prop) + end) + end) + + scrollingFrame.DescendantRemoving:connect(function(instance) + if not instance:IsA "GuiObject" then + return + end + if descendantsChangeConMap[instance] then + descendantsChangeConMap[instance]:disconnect() + descendantsChangeConMap[instance] = nil + end + wait() -- wait a heartbeat for sizes to reconfig + highLowRecheck() + end) + + scrollingFrame.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + if not highY or not lowY then + return + end + + highLowRecheck() + setSliderSizeAndPosition() + end + end) + + return scrollingFrame, controlFrame +end + +t.CreateScrollingFrame = function(orderList, scrollStyle) + local frame = Instance.new "Frame" + frame.Name = "ScrollingFrame" + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(1, 0, 1, 0) + + local scrollUpButton = Instance.new "ImageButton" + scrollUpButton.Name = "ScrollUpButton" + scrollUpButton.BackgroundTransparency = 1 + scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" + scrollUpButton.Size = UDim2.new(0, 17, 0, 17) + + local scrollDownButton = Instance.new "ImageButton" + scrollDownButton.Name = "ScrollDownButton" + scrollDownButton.BackgroundTransparency = 1 + scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" + scrollDownButton.Size = UDim2.new(0, 17, 0, 17) + + local scrollbar = Instance.new "ImageButton" + scrollbar.Name = "ScrollBar" + scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" + scrollbar.BackgroundTransparency = 1 + scrollbar.Size = UDim2.new(0, 18, 0, 150) + + local scrollStamp = 0 + + local scrollDrag = Instance.new "ImageButton" + scrollDrag.Image = "http://www.roblox.com/asset/?id=61367186" + scrollDrag.Size = UDim2.new(1, 0, 0, 16) + scrollDrag.BackgroundTransparency = 1 + scrollDrag.Name = "ScrollDrag" + scrollDrag.Active = true + scrollDrag.Parent = scrollbar + + local mouseDrag = Instance.new "ImageButton" + mouseDrag.Active = false + mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) + mouseDrag.AutoButtonColor = false + mouseDrag.BackgroundTransparency = 1 + mouseDrag.Name = "mouseDrag" + mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) + mouseDrag.ZIndex = 10 + + local style = "simple" + if scrollStyle and tostring(scrollStyle) then + style = scrollStyle + end + + local scrollPosition = 1 + local rowSize = 0 + local howManyDisplayed = 0 + + local layoutGridScrollBar = function() + howManyDisplayed = 0 + local guiObjects = {} + if orderList then + for _, child in ipairs(orderList) do + if child.Parent == frame then + table.insert(guiObjects, child) + end + end + else + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA "GuiObject" then + table.insert(guiObjects, child) + end + end + end + end + if #guiObjects == 0 then + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + end + + if scrollPosition > #guiObjects then + scrollPosition = #guiObjects + end + + if scrollPosition < 1 then + scrollPosition = 1 + end + + local totalPixelsY = frame.AbsoluteSize.Y + local pixelsRemainingY = frame.AbsoluteSize.Y + + local totalPixelsX = frame.AbsoluteSize.X + + local xCounter = 0 + local rowSizeCounter = 0 + local setRowSize = true + + local pixelsBelowScrollbar = 0 + local pos = #guiObjects + + local currentRowY = 0 + + pos = scrollPosition + --count up from current scroll position to fill out grid + while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY do + xCounter = xCounter + guiObjects[pos].AbsoluteSize.X + --previous pos was the end of a row + if xCounter >= totalPixelsX then + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + currentRowY = 0 + xCounter = guiObjects[pos].AbsoluteSize.X + end + if guiObjects[pos].AbsoluteSize.Y > currentRowY then + currentRowY = guiObjects[pos].AbsoluteSize.Y + end + pos = pos + 1 + end + --Count wherever current row left off + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + currentRowY = 0 + + pos = scrollPosition - 1 + xCounter = 0 + + --objects with varying X,Y dimensions can rarely cause minor errors + --rechecking every new scrollPosition is necessary to avoid 100% of errors + + --count backwards from current scrollPosition to see if we can add more rows + while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 do + xCounter = xCounter + guiObjects[pos].AbsoluteSize.X + rowSizeCounter = rowSizeCounter + 1 + if xCounter >= totalPixelsX then + rowSize = rowSizeCounter - 1 + rowSizeCounter = 0 + xCounter = guiObjects[pos].AbsoluteSize.X + if pixelsBelowScrollbar + currentRowY <= totalPixelsY then + --It fits, so back up our scroll position + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + if scrollPosition <= rowSize then + scrollPosition = 1 + break + else + scrollPosition = scrollPosition - rowSize + end + currentRowY = 0 + else + break + end + end + + if guiObjects[pos].AbsoluteSize.Y > currentRowY then + currentRowY = guiObjects[pos].AbsoluteSize.Y + end + + pos = pos - 1 + end + + --Do check last time if pos = 0 + if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) then + scrollPosition = 1 + end + + xCounter = 0 + --pos = scrollPosition + rowSizeCounter = 0 + setRowSize = true + local lastChildSize = 0 + + local xOffset, yOffset = 0 + if guiObjects[1] then + yOffset = math.ceil(math.floor(math.fmod(totalPixelsY, guiObjects[1].AbsoluteSize.X)) / 2) + xOffset = math.ceil(math.floor(math.fmod(totalPixelsX, guiObjects[1].AbsoluteSize.Y)) / 2) + end + + for i, child in ipairs(guiObjects) do + if i < scrollPosition then + --print("Hiding " .. child.Name) + child.Visible = false + else + if pixelsRemainingY < 0 then + --print("Out of Space " .. child.Name) + child.Visible = false + else + --print("Laying out " .. child.Name) + --GuiObject + if setRowSize then + rowSizeCounter = rowSizeCounter + 1 + end + if xCounter + child.AbsoluteSize.X >= totalPixelsX then + if setRowSize then + rowSize = rowSizeCounter - 1 + setRowSize = false + end + xCounter = 0 + pixelsRemainingY = pixelsRemainingY - child.AbsoluteSize.Y + end + child.Position = UDim2.new( + child.Position.X.Scale, + xCounter + xOffset, + 0, + totalPixelsY - pixelsRemainingY + yOffset + ) + xCounter = xCounter + child.AbsoluteSize.X + child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) + if child.Visible then + howManyDisplayed = howManyDisplayed + 1 + end + lastChildSize = child.AbsoluteSize + end + end + end + + scrollUpButton.Active = (scrollPosition > 1) + if lastChildSize == 0 then + scrollDownButton.Active = false + else + scrollDownButton.Active = ((pixelsRemainingY - lastChildSize.Y) < 0) + end + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active + end + + local layoutSimpleScrollBar = function() + local guiObjects = {} + howManyDisplayed = 0 + + if orderList then + for _, child in ipairs(orderList) do + if child.Parent == frame then + table.insert(guiObjects, child) + end + end + else + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA "GuiObject" then + table.insert(guiObjects, child) + end + end + end + end + if #guiObjects == 0 then + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + end + + if scrollPosition > #guiObjects then + scrollPosition = #guiObjects + end + + local totalPixels = frame.AbsoluteSize.Y + local pixelsRemaining = frame.AbsoluteSize.Y + + local pixelsBelowScrollbar = 0 + local pos = #guiObjects + while pixelsBelowScrollbar < totalPixels and pos >= 1 do + if pos >= scrollPosition then + pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + else + if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels then + --It fits, so back up our scroll position + pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + if scrollPosition <= 1 then + scrollPosition = 1 + break + else + --local ("Backing up ScrollPosition from -- " ..scrollPosition) + scrollPosition = scrollPosition - 1 + end + else + break + end + end + pos = pos - 1 + end + + pos = scrollPosition + for i, child in ipairs(guiObjects) do + if i < scrollPosition then + --print("Hiding " .. child.Name) + child.Visible = false + else + if pixelsRemaining < 0 then + --print("Out of Space " .. child.Name) + child.Visible = false + else + --print("Laying out " .. child.Name) + --GuiObject + child.Position = + UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + if pixelsRemaining >= 0 then + child.Visible = true + howManyDisplayed = howManyDisplayed + 1 + else + child.Visible = false + end + end + end + end + scrollUpButton.Active = (scrollPosition > 1) + scrollDownButton.Active = (pixelsRemaining < 0) + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active + end + + local moveDragger = function() + local guiObjects = 0 + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA "GuiObject" then + guiObjects = guiObjects + 1 + end + end + end + + if not scrollDrag.Parent then + return + end + + local dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1 / (guiObjects - howManyDisplayed + 1)) + if dragSizeY < 16 then + dragSizeY = 16 + end + scrollDrag.Size = + UDim2.new(scrollDrag.Size.X.Scale, scrollDrag.Size.X.Offset, scrollDrag.Size.Y.Scale, dragSizeY) + + local relativeYPos = (scrollPosition - 1) / (guiObjects - howManyDisplayed) + if relativeYPos > 1 then + relativeYPos = 1 + elseif relativeYPos < 0 then + relativeYPos = 0 + end + local absYPos = 0 + + if relativeYPos ~= 0 then + absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) + end + + scrollDrag.Position = + UDim2.new(scrollDrag.Position.X.Scale, scrollDrag.Position.X.Offset, scrollDrag.Position.Y.Scale, absYPos) + end + + local reentrancyGuard = false + local recalculate = function() + if reentrancyGuard then + return + end + reentrancyGuard = true + wait() + local success, err = nil + if style == "grid" then + success, err = pcall(function() + layoutGridScrollBar() + end) + elseif style == "simple" then + success, err = pcall(function() + layoutSimpleScrollBar() + end) + end + if not success then + print(err) + end + moveDragger() + reentrancyGuard = false + end + + local doScrollUp = function() + scrollPosition = scrollPosition - rowSize + if scrollPosition < 1 then + scrollPosition = 1 + end + recalculate(nil) + end + + local doScrollDown = function() + scrollPosition = scrollPosition + rowSize + recalculate(nil) + end + + local scrollUp = function(mouseYPos) + if scrollUpButton.Active then + scrollStamp = tick() + local current = scrollStamp + local upCon + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + upCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollUp() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollUp() + if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y then + break + end + if not scrollUpButton.Active then + break + end + if tick() - t > 5 then + w = 0 + elseif tick() - t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + local scrollDown = function(mouseYPos) + if scrollDownButton.Active then + scrollStamp = tick() + local current = scrollStamp + local downCon + downCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + downCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollDown() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollDown() + if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) then + break + end + if not scrollDownButton.Active then + break + end + if tick() - t > 5 then + w = 0 + elseif tick() - t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + -- local y = 0 + scrollDrag.MouseButton1Down:connect(function(_, y) + if scrollDrag.Active then + scrollStamp = tick() + local mouseOffset = y - scrollDrag.AbsolutePosition.y + local dragCon + local upCon + dragCon = mouseDrag.MouseMoved:connect(function(_, y) + local barAbsPos = scrollbar.AbsolutePosition.y + local barAbsSize = scrollbar.AbsoluteSize.y + + local dragAbsSize = scrollDrag.AbsoluteSize.y + local barAbsOne = barAbsPos + barAbsSize - dragAbsSize + y = y - mouseOffset + y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y + y = y - barAbsPos + + local guiObjects = 0 + local children = frame:GetChildren() + if children then + for _, child in ipairs(children) do + if child:IsA "GuiObject" then + guiObjects = guiObjects + 1 + end + end + end + + local doublePercent = y / (barAbsSize - dragAbsSize) + local rowDiff = rowSize + local totalScrollCount = guiObjects - (howManyDisplayed - 1) + local newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff + if newScrollPosition < scrollPosition then + rowDiff = -rowDiff + end + + if newScrollPosition < 1 then + newScrollPosition = 1 + end + + scrollPosition = newScrollPosition + recalculate(nil) + end) + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + dragCon:disconnect() + dragCon = nil + upCon:disconnect() + drag = nil + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + end + end) + + local scrollMouseCount = 0 + + scrollUpButton.MouseButton1Down:connect(function() + scrollUp() + end) + scrollUpButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + + scrollDownButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollDownButton.MouseButton1Down:connect(function() + scrollDown() + end) + + scrollbar.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollbar.MouseButton1Down:connect(function(_, y) + if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y) then + scrollDown(y) + elseif y < scrollDrag.AbsolutePosition.y then + scrollUp(y) + end + end) + + frame.ChildAdded:connect(function() + recalculate(nil) + end) + + frame.ChildRemoved:connect(function() + recalculate(nil) + end) + + frame.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + --Wait a heartbeat for it to sync in + recalculate(nil) + end + end) + frame.AncestryChanged:connect(function() + recalculate(nil) + end) + + return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar +end +local function binaryGrow(min, max, fits) + if min > max then + return min + end + local biggestLegal = min + + while min <= max do + local mid = min + math.floor((max - min) / 2) + if fits(mid) and (biggestLegal == nil or biggestLegal < mid) then + biggestLegal = mid + + --Try growing + min = mid + 1 + else + --Doesn't fit, shrink + max = mid - 1 + end + end + return biggestLegal +end + +local function binaryShrink(min, max, fits) + if min > max then + return min + end + local smallestLegal = max + + while min <= max do + local mid = min + math.floor((max - min) / 2) + if fits(mid) and (smallestLegal == nil or smallestLegal > mid) then + smallestLegal = mid + + --It fits, shrink + max = mid - 1 + else + --Doesn't fit, grow + min = mid + 1 + end + end + return smallestLegal +end + +local function getGuiOwner(instance) + while instance ~= nil do + if instance:IsA "ScreenGui" or instance:IsA "BillboardGui" then + return instance + end + instance = instance.Parent + end + return nil +end + +t.AutoTruncateTextObject = function(textLabel) + local text = textLabel.Text + + local fullLabel = textLabel:Clone() + fullLabel.Name = "Full" .. textLabel.Name + fullLabel.BorderSizePixel = 0 + fullLabel.BackgroundTransparency = 0 + fullLabel.Text = text + fullLabel.TextXAlignment = Enum.TextXAlignment.Center + fullLabel.Position = UDim2.new(0, -3, 0, 0) + fullLabel.Size = UDim2.new(0, 100, 1, 0) + fullLabel.Visible = false + fullLabel.Parent = textLabel + + local shortText = nil + local mouseEnterConnection = nil + local mouseLeaveConnection = nil + + local checkForResize = function() + if getGuiOwner(textLabel) == nil then + return + end + textLabel.Text = text + if textLabel.TextFits then + --Tear down the rollover if it is active + if mouseEnterConnection then + mouseEnterConnection:disconnect() + mouseEnterConnection = nil + end + if mouseLeaveConnection then + mouseLeaveConnection:disconnect() + mouseLeaveConnection = nil + end + else + local len = string.len(text) + textLabel.Text = text .. "~" + + --Shrink the text + local textSize = binaryGrow(0, len, function(pos) + if pos == 0 then + textLabel.Text = "~" + else + textLabel.Text = string.sub(text, 1, pos) .. "~" + end + return textLabel.TextFits + end) + shortText = string.sub(text, 1, textSize) .. "~" + textLabel.Text = shortText + + --Make sure the fullLabel fits + if not fullLabel.TextFits then + --Already too small, grow it really bit to start + fullLabel.Size = UDim2.new(0, 10000, 1, 0) + end + + --Okay, now try to binary shrink it back down + local fullLabelSize = binaryShrink(textLabel.AbsoluteSize.X, fullLabel.AbsoluteSize.X, function(size) + fullLabel.Size = UDim2.new(0, size, 1, 0) + return fullLabel.TextFits + end) + fullLabel.Size = UDim2.new(0, fullLabelSize + 6, 1, 0) + + --Now setup the rollover effects, if they are currently off + if mouseEnterConnection == nil then + mouseEnterConnection = textLabel.MouseEnter:connect(function() + fullLabel.ZIndex = textLabel.ZIndex + 1 + fullLabel.Visible = true + --textLabel.Text = "" + end) + end + if mouseLeaveConnection == nil then + mouseLeaveConnection = textLabel.MouseLeave:connect(function() + fullLabel.Visible = false + --textLabel.Text = shortText + end) + end + end + end + textLabel.AncestryChanged:connect(checkForResize) + textLabel.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + checkForResize() + end + end) + + checkForResize() + + local function changeText(newText) + text = newText + fullLabel.Text = text + checkForResize() + end + + return textLabel, changeText +end + +local function TransitionTutorialPages(fromPage, toPage, transitionFrame, currentPageValue) + if fromPage then + fromPage.Visible = false + if transitionFrame.Visible == false then + transitionFrame.Size = fromPage.Size + transitionFrame.Position = fromPage.Position + end + else + if transitionFrame.Visible == false then + transitionFrame.Size = UDim2.new(0, 50, 0, 50) + transitionFrame.Position = UDim2.new(0.5, -25, 0.5, -25) + end + end + transitionFrame.Visible = true + currentPageValue.Value = nil + + local newSize, newPosition + if toPage then + --Make it visible so it resizes + toPage.Visible = true + + newSize = toPage.Size + newPosition = toPage.Position + + toPage.Visible = false + else + newSize = UDim2.new(0, 50, 0, 50) + newPosition = UDim2.new(0.5, -25, 0.5, -25) + end + transitionFrame:TweenSizeAndPosition( + newSize, + newPosition, + Enum.EasingDirection.InOut, + Enum.EasingStyle.Quad, + 0.3, + true, + function(state) + if state == Enum.TweenStatus.Completed then + transitionFrame.Visible = false + if toPage then + toPage.Visible = true + currentPageValue.Value = toPage + end + end + end + ) +end + +t.CreateTutorial = function(name, tutorialKey, createButtons) + local frame = Instance.new "Frame" + frame.Name = "Tutorial-" .. name + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(0.6, 0, 0.6, 0) + frame.Position = UDim2.new(0.2, 0, 0.2, 0) + + local transitionFrame = Instance.new "Frame" + transitionFrame.Name = "TransitionFrame" + transitionFrame.Style = Enum.FrameStyle.RobloxRound + transitionFrame.Size = UDim2.new(0.6, 0, 0.6, 0) + transitionFrame.Position = UDim2.new(0.2, 0, 0.2, 0) + transitionFrame.Visible = false + transitionFrame.Parent = frame + + local currentPageValue = Instance.new "ObjectValue" + currentPageValue.Name = "CurrentTutorialPage" + currentPageValue.Value = nil + currentPageValue.Parent = frame + + local boolValue = Instance.new "BoolValue" + boolValue.Name = "Buttons" + boolValue.Value = createButtons + boolValue.Parent = frame + + local pages = Instance.new "Frame" + pages.Name = "Pages" + pages.BackgroundTransparency = 1 + pages.Size = UDim2.new(1, 0, 1, 0) + pages.Parent = frame + + local function getVisiblePageAndHideOthers() + local visiblePage = nil + local children = pages:GetChildren() + if children then + for _, child in ipairs(children) do + if child.Visible then + if visiblePage then + child.Visible = false + else + visiblePage = child + end + end + end + end + return visiblePage + end + + local showTutorial = function(alwaysShow) + if alwaysShow or UserSettings().GameSettings:GetTutorialState(tutorialKey) == false then + print("Showing tutorial-", tutorialKey) + local currentTutorialPage = getVisiblePageAndHideOthers() + + local firstPage = pages:FindFirstChild "TutorialPage1" + if firstPage then + TransitionTutorialPages(currentTutorialPage, firstPage, transitionFrame, currentPageValue) + else + error "Could not find TutorialPage1" + end + end + end + + local dismissTutorial = function() + local currentTutorialPage = getVisiblePageAndHideOthers() + + if currentTutorialPage then + TransitionTutorialPages(currentTutorialPage, nil, transitionFrame, currentPageValue) + end + + UserSettings().GameSettings:SetTutorialState(tutorialKey, true) + end + + local gotoPage = function(pageNum) + local page = pages:FindFirstChild("TutorialPage" .. pageNum) + local currentTutorialPage = getVisiblePageAndHideOthers() + TransitionTutorialPages(currentTutorialPage, page, transitionFrame, currentPageValue) + end + + return frame, showTutorial, dismissTutorial, gotoPage +end + +local function CreateBasicTutorialPage(name, handleResize, skipTutorial, giveDoneButton) + local frame = Instance.new "Frame" + frame.Name = "TutorialPage" + frame.Style = Enum.FrameStyle.RobloxRound + frame.Size = UDim2.new(0.6, 0, 0.6, 0) + frame.Position = UDim2.new(0.2, 0, 0.2, 0) + frame.Visible = false + + local frameHeader = Instance.new "TextLabel" + frameHeader.Name = "Header" + frameHeader.Text = name + frameHeader.BackgroundTransparency = 1 + frameHeader.FontSize = Enum.FontSize.Size24 + frameHeader.Font = Enum.Font.ArialBold + frameHeader.TextColor3 = Color3.new(1, 1, 1) + frameHeader.TextXAlignment = Enum.TextXAlignment.Center + frameHeader.TextWrap = true + frameHeader.Size = UDim2.new(1, -55, 0, 22) + frameHeader.Position = UDim2.new(0, 0, 0, 0) + frameHeader.Parent = frame + + local skipButton = Instance.new "ImageButton" + skipButton.Name = "SkipButton" + skipButton.AutoButtonColor = false + skipButton.BackgroundTransparency = 1 + skipButton.Image = "rbxasset://textures/ui/closeButton.png" + skipButton.MouseButton1Click:connect(function() + skipTutorial() + end) + skipButton.MouseEnter:connect(function() + skipButton.Image = "rbxasset://textures/ui/closeButton_dn.png" + end) + skipButton.MouseLeave:connect(function() + skipButton.Image = "rbxasset://textures/ui/closeButton.png" + end) + skipButton.Size = UDim2.new(0, 25, 0, 25) + skipButton.Position = UDim2.new(1, -25, 0, 0) + skipButton.Parent = frame + + if giveDoneButton then + local doneButton = Instance.new "TextButton" + doneButton.Name = "DoneButton" + doneButton.Style = Enum.ButtonStyle.RobloxButtonDefault + doneButton.Text = "Done" + doneButton.TextColor3 = Color3.new(1, 1, 1) + doneButton.Font = Enum.Font.ArialBold + doneButton.FontSize = Enum.FontSize.Size18 + doneButton.Size = UDim2.new(0, 100, 0, 50) + doneButton.Position = UDim2.new(0.5, -50, 1, -50) + + if skipTutorial then + doneButton.MouseButton1Click:connect(function() + skipTutorial() + end) + end + + doneButton.Parent = frame + end + + local innerFrame = Instance.new "Frame" + innerFrame.Name = "ContentFrame" + innerFrame.BackgroundTransparency = 1 + innerFrame.Position = UDim2.new(0, 0, 0, 25) + innerFrame.Parent = frame + + local nextButton = Instance.new "TextButton" + nextButton.Name = "NextButton" + nextButton.Text = "Next" + nextButton.TextColor3 = Color3.new(1, 1, 1) + nextButton.Font = Enum.Font.Arial + nextButton.FontSize = Enum.FontSize.Size18 + nextButton.Style = Enum.ButtonStyle.RobloxButtonDefault + nextButton.Size = UDim2.new(0, 80, 0, 32) + nextButton.Position = UDim2.new(0.5, 5, 1, -32) + nextButton.Active = false + nextButton.Visible = false + nextButton.Parent = frame + + local prevButton = Instance.new "TextButton" + prevButton.Name = "PrevButton" + prevButton.Text = "Previous" + prevButton.TextColor3 = Color3.new(1, 1, 1) + prevButton.Font = Enum.Font.Arial + prevButton.FontSize = Enum.FontSize.Size18 + prevButton.Style = Enum.ButtonStyle.RobloxButton + prevButton.Size = UDim2.new(0, 80, 0, 32) + prevButton.Position = UDim2.new(0.5, -85, 1, -32) + prevButton.Active = false + prevButton.Visible = false + prevButton.Parent = frame + + if giveDoneButton then + innerFrame.Size = UDim2.new(1, 0, 1, -75) + else + innerFrame.Size = UDim2.new(1, 0, 1, -22) + end + + local parentConnection = nil + + local function basicHandleResize() + if frame.Visible and frame.Parent then + local maxSize = math.min(frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y) + handleResize(200, maxSize) + end + end + + frame.Changed:connect(function(prop) + if prop == "Parent" then + if parentConnection ~= nil then + parentConnection:disconnect() + parentConnection = nil + end + if frame.Parent and frame.Parent:IsA "GuiObject" then + parentConnection = frame.Parent.Changed:connect(function(parentProp) + if parentProp == "AbsoluteSize" then + wait() + basicHandleResize() + end + end) + basicHandleResize() + end + end + + if prop == "Visible" then + basicHandleResize() + end + end) + + return frame, innerFrame +end + +t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) + local frame = nil + local contentFrame = nil + + local textLabel = Instance.new "TextLabel" + textLabel.BackgroundTransparency = 1 + textLabel.TextColor3 = Color3.new(1, 1, 1) + textLabel.Text = text + textLabel.TextWrap = true + textLabel.TextXAlignment = Enum.TextXAlignment.Left + textLabel.TextYAlignment = Enum.TextYAlignment.Center + textLabel.Font = Enum.Font.Arial + textLabel.FontSize = Enum.FontSize.Size14 + textLabel.Size = UDim2.new(1, 0, 1, 0) + + local function handleResize(minSize, maxSize) + local size = binaryShrink(minSize, maxSize, function(size) + frame.Size = UDim2.new(0, size, 0, size) + return textLabel.TextFits + end) + frame.Size = UDim2.new(0, size, 0, size) + frame.Position = UDim2.new(0.5, -size / 2, 0.5, -size / 2) + end + + frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) + textLabel.Parent = contentFrame + + return frame +end + +t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) + local frame = nil + local contentFrame = nil + + local imageLabel = Instance.new "ImageLabel" + imageLabel.BackgroundTransparency = 1 + imageLabel.Image = imageAsset + imageLabel.Size = UDim2.new(0, x, 0, y) + imageLabel.Position = UDim2.new(0.5, -x / 2, 0.5, -y / 2) + + local function handleResize(minSize, maxSize) + local size = binaryShrink(minSize, maxSize, function(size) + return size >= x and size >= y + end) + if size >= x and size >= y then + imageLabel.Size = UDim2.new(0, x, 0, y) + imageLabel.Position = UDim2.new(0.5, -x / 2, 0.5, -y / 2) + else + if x > y then + --X is limiter, so + imageLabel.Size = UDim2.new(1, 0, y / x, 0) + imageLabel.Position = UDim2.new(0, 0, 0.5 - (y / x) / 2, 0) + else + --Y is limiter + imageLabel.Size = UDim2.new(x / y, 0, 1, 0) + imageLabel.Position = UDim2.new(0.5 - (x / y) / 2, 0, 0, 0) + end + end + size = size + 50 + frame.Size = UDim2.new(0, size, 0, size) + frame.Position = UDim2.new(0.5, -size / 2, 0.5, -size / 2) + end + + frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc, giveDoneButton) + imageLabel.Parent = contentFrame + + return frame +end + +t.AddTutorialPage = function(tutorial, tutorialPage) + local transitionFrame = tutorial.TransitionFrame + local currentPageValue = tutorial.CurrentTutorialPage + + if not tutorial.Buttons.Value then + tutorialPage.NextButton.Parent = nil + tutorialPage.PrevButton.Parent = nil + end + + local children = tutorial.Pages:GetChildren() + if children and #children > 0 then + tutorialPage.Name = "TutorialPage" .. (#children + 1) + local previousPage = children[#children] + if not previousPage:IsA "GuiObject" then + error "All elements under Pages must be GuiObjects" + end + + if tutorial.Buttons.Value then + if previousPage.NextButton.Active then + error "NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function" + end + previousPage.NextButton.MouseButton1Click:connect(function() + TransitionTutorialPages(previousPage, tutorialPage, transitionFrame, currentPageValue) + end) + previousPage.NextButton.Active = true + previousPage.NextButton.Visible = true + + if tutorialPage.PrevButton.Active then + error "PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function" + end + tutorialPage.PrevButton.MouseButton1Click:connect(function() + TransitionTutorialPages(tutorialPage, previousPage, transitionFrame, currentPageValue) + end) + tutorialPage.PrevButton.Active = true + tutorialPage.PrevButton.Visible = true + end + + tutorialPage.Parent = tutorial.Pages + else + --First child + tutorialPage.Name = "TutorialPage1" + tutorialPage.Parent = tutorial.Pages + end +end + +t.CreateSetPanel = + function(userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) + if not userIdsForSets then + error "CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids" + end + if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" then + error( + "CreateSetPanel: userIdsForSets (first arg) is of type " + .. type(userIdsForSets) + .. ", should be of type table or userdata" + ) + end + if not objectSelected then + error "CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!" + end + if type(objectSelected) ~= "function" then + error( + "CreateSetPanel: objectSelected (second arg) is of type " + .. type(objectSelected) + .. ", should be of type function!" + ) + end + if dialogClosed and type(dialogClosed) ~= "function" then + error( + "CreateSetPanel: dialogClosed (third arg) is of type " + .. type(dialogClosed) + .. ", should be of type function!" + ) + end + + if showAdminCategories == nil then -- by default, don't show beta sets + showAdminCategories = false + end + + local arrayPosition = 1 + local insertButtons = {} + local insertButtonCons = {} + local contents = nil + local setGui = nil + + -- used for water selections + local waterForceDirection = "NegX" + local waterForce = "None" + local waterGui, waterTypeChangedEvent = nil + + local Data = {} + Data.CurrentCategory = nil + Data.Category = {} + local SetCache = {} + + local userCategoryButtons = nil + + local buttonWidth = 64 + local buttonHeight = buttonWidth + + local SmallThumbnailUrl = nil + local LargeThumbnailUrl = nil + local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() + + if useAssetVersionId then + LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=" + SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" + else + LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=" + SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" + end + + local function drillDownSetZIndex(parent, index) + local children = parent:GetChildren() + for i = 1, #children do + if children[i]:IsA "GuiObject" then + children[i].ZIndex = index + end + drillDownSetZIndex(children[i], index) + end + end + + -- for terrain stamping + local currTerrainDropDownFrame = nil + local terrainShapes = + { "Block", "Vertical Ramp", "Corner Wedge", "Inverse Corner Wedge", "Horizontal Ramp", "Auto-Wedge" } + local terrainShapeMap = {} + for i = 1, #terrainShapes do + terrainShapeMap[terrainShapes[i]] = i - 1 + end + terrainShapeMap[terrainShapes[#terrainShapes]] = 6 + + local function createWaterGui() + local waterForceDirections = { "NegX", "X", "NegY", "Y", "NegZ", "Z" } + local waterForces = { "None", "Small", "Medium", "Strong", "Max" } + + local waterFrame = Instance.new "Frame" + waterFrame.Name = "WaterFrame" + waterFrame.Style = Enum.FrameStyle.RobloxSquare + waterFrame.Size = UDim2.new(0, 150, 0, 110) + waterFrame.Visible = false + + local waterForceLabel = Instance.new "TextLabel" + waterForceLabel.Name = "WaterForceLabel" + waterForceLabel.BackgroundTransparency = 1 + waterForceLabel.Size = UDim2.new(1, 0, 0, 12) + waterForceLabel.Font = Enum.Font.ArialBold + waterForceLabel.FontSize = Enum.FontSize.Size12 + waterForceLabel.TextColor3 = Color3.new(1, 1, 1) + waterForceLabel.TextXAlignment = Enum.TextXAlignment.Left + waterForceLabel.Text = "Water Force" + waterForceLabel.Parent = waterFrame + + local waterForceDirLabel = waterForceLabel:Clone() + waterForceDirLabel.Name = "WaterForceDirectionLabel" + waterForceDirLabel.Text = "Water Force Direction" + waterForceDirLabel.Position = UDim2.new(0, 0, 0, 50) + waterForceDirLabel.Parent = waterFrame + + local waterTypeChangedEvent = Instance.new "BindableEvent" + waterTypeChangedEvent.Name = "WaterTypeChangedEvent" + waterTypeChangedEvent.Parent = waterFrame + + local waterForceDirectionSelectedFunc = function(newForceDirection) + waterForceDirection = newForceDirection + waterTypeChangedEvent:Fire { waterForce, waterForceDirection } + end + local waterForceSelectedFunc = function(newForce) + waterForce = newForce + waterTypeChangedEvent:Fire { waterForce, waterForceDirection } + end + + local waterForceDirectionDropDown, forceWaterDirectionSelection = + t.CreateDropDownMenu(waterForceDirections, waterForceDirectionSelectedFunc) + waterForceDirectionDropDown.Size = UDim2.new(1, 0, 0, 25) + waterForceDirectionDropDown.Position = UDim2.new(0, 0, 1, 3) + forceWaterDirectionSelection "NegX" + waterForceDirectionDropDown.Parent = waterForceDirLabel + + local waterForceDropDown, forceWaterForceSelection = + t.CreateDropDownMenu(waterForces, waterForceSelectedFunc) + forceWaterForceSelection "None" + waterForceDropDown.Size = UDim2.new(1, 0, 0, 25) + waterForceDropDown.Position = UDim2.new(0, 0, 1, 3) + waterForceDropDown.Parent = waterForceLabel + + return waterFrame, waterTypeChangedEvent + end + + -- Helper Function that contructs gui elements + local function createSetGui() + local setGui = Instance.new "ScreenGui" + setGui.Name = "SetGui" + + local setPanel = Instance.new "Frame" + setPanel.Name = "SetPanel" + setPanel.Active = true + setPanel.BackgroundTransparency = 1 + if position then + setPanel.Position = position + else + setPanel.Position = UDim2.new(0.2, 29, 0.1, 24) + end + if size then + setPanel.Size = size + else + setPanel.Size = UDim2.new(0.6, -58, 0.64, 0) + end + setPanel.Style = Enum.FrameStyle.RobloxRound + setPanel.ZIndex = 6 + setPanel.Parent = setGui + + -- Children of SetPanel + local itemPreview = Instance.new "Frame" + itemPreview.Name = "ItemPreview" + itemPreview.BackgroundTransparency = 1 + itemPreview.Position = UDim2.new(0.8, 5, 0.085, 0) + itemPreview.Size = UDim2.new(0.21, 0, 0.9, 0) + itemPreview.ZIndex = 6 + itemPreview.Parent = setPanel + + -- Children of ItemPreview + local textPanel = Instance.new "Frame" + textPanel.Name = "TextPanel" + textPanel.BackgroundTransparency = 1 + textPanel.Position = UDim2.new(0, 0, 0.45, 0) + textPanel.Size = UDim2.new(1, 0, 0.55, 0) + textPanel.ZIndex = 6 + textPanel.Parent = itemPreview + + -- Children of TextPanel + local rolloverText = Instance.new "TextLabel" + rolloverText.Name = "RolloverText" + rolloverText.BackgroundTransparency = 1 + rolloverText.Size = UDim2.new(1, 0, 0, 48) + rolloverText.ZIndex = 6 + rolloverText.Font = Enum.Font.ArialBold + rolloverText.FontSize = Enum.FontSize.Size24 + rolloverText.Text = "" + rolloverText.TextColor3 = Color3.new(1, 1, 1) + rolloverText.TextWrap = true + rolloverText.TextXAlignment = Enum.TextXAlignment.Left + rolloverText.TextYAlignment = Enum.TextYAlignment.Top + rolloverText.Parent = textPanel + + local largePreview = Instance.new "ImageLabel" + largePreview.Name = "LargePreview" + largePreview.BackgroundTransparency = 1 + largePreview.Image = "" + largePreview.Size = UDim2.new(1, 0, 0, 170) + largePreview.ZIndex = 6 + largePreview.Parent = itemPreview + + local sets = Instance.new "Frame" + sets.Name = "Sets" + sets.BackgroundTransparency = 1 + sets.Position = UDim2.new(0, 0, 0, 5) + sets.Size = UDim2.new(0.23, 0, 1, -5) + sets.ZIndex = 6 + sets.Parent = setPanel + + -- Children of Sets + local line = Instance.new "Frame" + line.Name = "Line" + line.BackgroundColor3 = Color3.new(1, 1, 1) + line.BackgroundTransparency = 0.7 + line.BorderSizePixel = 0 + line.Position = UDim2.new(1, -3, 0.06, 0) + line.Size = UDim2.new(0, 3, 0.9, 0) + line.ZIndex = 6 + line.Parent = sets + + local setsLists, controlFrame = t.CreateTrueScrollingFrame() + setsLists.Size = UDim2.new(1, -6, 0.94, 0) + setsLists.Position = UDim2.new(0, 0, 0.06, 0) + setsLists.BackgroundTransparency = 1 + setsLists.Name = "SetsLists" + setsLists.ZIndex = 6 + setsLists.Parent = sets + drillDownSetZIndex(controlFrame, 7) + + local setsHeader = Instance.new "TextLabel" + setsHeader.Name = "SetsHeader" + setsHeader.BackgroundTransparency = 1 + setsHeader.Size = UDim2.new(0, 47, 0, 24) + setsHeader.ZIndex = 6 + setsHeader.Font = Enum.Font.ArialBold + setsHeader.FontSize = Enum.FontSize.Size24 + setsHeader.Text = "Sets" + setsHeader.TextColor3 = Color3.new(1, 1, 1) + setsHeader.TextXAlignment = Enum.TextXAlignment.Left + setsHeader.TextYAlignment = Enum.TextYAlignment.Top + setsHeader.Parent = sets + + local cancelButton = Instance.new "TextButton" + cancelButton.Name = "CancelButton" + cancelButton.Position = UDim2.new(1, -32, 0, -2) + cancelButton.Size = UDim2.new(0, 34, 0, 34) + cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault + cancelButton.ZIndex = 6 + cancelButton.Text = "" + cancelButton.Modal = true + cancelButton.Parent = setPanel + + -- Children of Cancel Button + local cancelImage = Instance.new "ImageLabel" + cancelImage.Name = "CancelImage" + cancelImage.BackgroundTransparency = 1 + cancelImage.Image = "http://www.roblox.com/asset?id=54135717" + cancelImage.Position = UDim2.new(0, -2, 0, -2) + cancelImage.Size = UDim2.new(0, 16, 0, 16) + cancelImage.ZIndex = 6 + cancelImage.Parent = cancelButton + + return setGui + end + + local function createSetButton(text) + local setButton = Instance.new "TextButton" + + if text then + setButton.Text = text + else + setButton.Text = "" + end + + setButton.AutoButtonColor = false + setButton.BackgroundTransparency = 1 + setButton.BackgroundColor3 = Color3.new(1, 1, 1) + setButton.BorderSizePixel = 0 + setButton.Size = UDim2.new(1, -5, 0, 18) + setButton.ZIndex = 6 + setButton.Visible = false + setButton.Font = Enum.Font.Arial + setButton.FontSize = Enum.FontSize.Size18 + setButton.TextColor3 = Color3.new(1, 1, 1) + setButton.TextXAlignment = Enum.TextXAlignment.Left + + return setButton + end + + local function buildSetButton(name, setId, _, _, _) + local button = createSetButton(name) + button.Text = name + button.Name = "SetButton" + button.Visible = true + + local setValue = Instance.new "IntValue" + setValue.Name = "SetId" + setValue.Value = setId + setValue.Parent = button + + local setName = Instance.new "StringValue" + setName.Name = "SetName" + setName.Value = name + setName.Parent = button + + return button + end + + local function processCategory(sets) + local setButtons = {} + local numSkipped = 0 + for i = 1, #sets do + if not showAdminCategories and sets[i].Name == "Beta" then + numSkipped = numSkipped + 1 + else + setButtons[i - numSkipped] = + buildSetButton(sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets) + end + end + return setButtons + end + + local function handleResize() + wait() -- neccessary to insure heartbeat happened + + local itemPreview = setGui.SetPanel.ItemPreview + + itemPreview.LargePreview.Size = UDim2.new(1, 0, 0, itemPreview.AbsoluteSize.X) + itemPreview.LargePreview.Position = UDim2.new(0.5, -itemPreview.LargePreview.AbsoluteSize.X / 2, 0, 0) + itemPreview.TextPanel.Position = UDim2.new(0, 0, 0, itemPreview.LargePreview.AbsoluteSize.Y) + itemPreview.TextPanel.Size = + UDim2.new(1, 0, 0, itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y) + end + + local function makeInsertAssetButton() + local insertAssetButtonExample = Instance.new "Frame" + insertAssetButtonExample.Name = "InsertAssetButtonExample" + insertAssetButtonExample.Position = UDim2.new(0, 128, 0, 64) + insertAssetButtonExample.Size = UDim2.new(0, 64, 0, 64) + insertAssetButtonExample.BackgroundTransparency = 1 + insertAssetButtonExample.ZIndex = 6 + insertAssetButtonExample.Visible = false + + local assetId = Instance.new "IntValue" + assetId.Name = "AssetId" + assetId.Value = 0 + assetId.Parent = insertAssetButtonExample + + local assetName = Instance.new "StringValue" + assetName.Name = "AssetName" + assetName.Value = "" + assetName.Parent = insertAssetButtonExample + + local button = Instance.new "TextButton" + button.Name = "Button" + button.Text = "" + button.Style = Enum.ButtonStyle.RobloxButton + button.Position = UDim2.new(0.025, 0, 0.025, 0) + button.Size = UDim2.new(0.95, 0, 0.95, 0) + button.ZIndex = 6 + button.Parent = insertAssetButtonExample + + local buttonImage = Instance.new "ImageLabel" + buttonImage.Name = "ButtonImage" + buttonImage.Image = "" + buttonImage.Position = UDim2.new(0, -7, 0, -7) + buttonImage.Size = UDim2.new(1, 14, 1, 14) + buttonImage.BackgroundTransparency = 1 + buttonImage.ZIndex = 7 + buttonImage.Parent = button + + local configIcon = buttonImage:clone() + configIcon.Name = "ConfigIcon" + configIcon.Visible = false + configIcon.Position = UDim2.new(1, -23, 1, -24) + configIcon.Size = UDim2.new(0, 16, 0, 16) + configIcon.Image = "" + configIcon.ZIndex = 6 + configIcon.Parent = insertAssetButtonExample + + return insertAssetButtonExample + end + + local function showLargePreview(insertButton) + if insertButton:FindFirstChild "AssetId" then + delay(0, function() + game:GetService("ContentProvider"):Preload( + LargeThumbnailUrl .. tostring(insertButton.AssetId.Value) + ) + setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl + .. tostring(insertButton.AssetId.Value) + end) + end + if insertButton:FindFirstChild "AssetName" then + setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value + end + end + + local function selectTerrainShape(shape) + if currTerrainDropDownFrame then + objectSelected( + tostring(currTerrainDropDownFrame.AssetName.Value), + tonumber(currTerrainDropDownFrame.AssetId.Value), + shape + ) + end + end + + local function createTerrainTypeButton(name, parent) + local dropDownTextButton = Instance.new "TextButton" + dropDownTextButton.Name = name .. "Button" + dropDownTextButton.Font = Enum.Font.ArialBold + dropDownTextButton.FontSize = Enum.FontSize.Size14 + dropDownTextButton.BorderSizePixel = 0 + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + dropDownTextButton.Text = name + dropDownTextButton.TextXAlignment = Enum.TextXAlignment.Left + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.ZIndex = parent.ZIndex + 1 + dropDownTextButton.Size = UDim2.new(0, parent.Size.X.Offset - 2, 0, 16) + dropDownTextButton.Position = UDim2.new(0, 1, 0, 0) + + dropDownTextButton.MouseEnter:connect(function() + dropDownTextButton.BackgroundTransparency = 0 + dropDownTextButton.TextColor3 = Color3.new(0, 0, 0) + end) + + dropDownTextButton.MouseLeave:connect(function() + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + end) + + dropDownTextButton.MouseButton1Click:connect(function() + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + if dropDownTextButton.Parent and dropDownTextButton.Parent:IsA "GuiObject" then + dropDownTextButton.Parent.Visible = false + end + selectTerrainShape(terrainShapeMap[dropDownTextButton.Text]) + end) + + return dropDownTextButton + end + + local function createTerrainDropDownMenu(zIndex) + local dropDown = Instance.new "Frame" + dropDown.Name = "TerrainDropDown" + dropDown.BackgroundColor3 = Color3.new(0, 0, 0) + dropDown.BorderColor3 = Color3.new(1, 0, 0) + dropDown.Size = UDim2.new(0, 200, 0, 0) + dropDown.Visible = false + dropDown.ZIndex = zIndex + dropDown.Parent = setGui + + for i = 1, #terrainShapes do + local shapeButton = createTerrainTypeButton(terrainShapes[i], dropDown) + shapeButton.Position = UDim2.new(0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset) + shapeButton.Parent = dropDown + dropDown.Size = UDim2.new(0, 200, 0, dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset) + end + + dropDown.MouseLeave:connect(function() + dropDown.Visible = false + end) + end + + local function createDropDownMenuButton(parent) + local dropDownButton = Instance.new "ImageButton" + dropDownButton.Name = "DropDownButton" + dropDownButton.Image = "http://www.roblox.com/asset/?id=67581509" + dropDownButton.BackgroundTransparency = 1 + dropDownButton.Size = UDim2.new(0, 16, 0, 16) + dropDownButton.Position = UDim2.new(1, -24, 0, 6) + dropDownButton.ZIndex = parent.ZIndex + 2 + dropDownButton.Parent = parent + + if not setGui:FindFirstChild "TerrainDropDown" then + createTerrainDropDownMenu(8) + end + + dropDownButton.MouseButton1Click:connect(function() + setGui.TerrainDropDown.Visible = true + setGui.TerrainDropDown.Position = UDim2.new(0, parent.AbsolutePosition.X, 0, parent.AbsolutePosition.Y) + currTerrainDropDownFrame = parent + end) + end + + local function buildInsertButton() + local insertButton = makeInsertAssetButton() + insertButton.Name = "InsertAssetButton" + insertButton.Visible = true + + if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then + createDropDownMenuButton(insertButton) + end + + local lastEnter = nil + local mouseEnterCon = insertButton.MouseEnter:connect(function() + lastEnter = insertButton + delay(0.1, function() + if lastEnter == insertButton then + showLargePreview(insertButton) + end + end) + end) + return insertButton, mouseEnterCon + end + + local function realignButtonGrid(columns) + local x = 0 + local y = 0 + for i = 1, #insertButtons do + insertButtons[i].Position = UDim2.new(0, buttonWidth * x, 0, buttonHeight * y) + x = x + 1 + if x >= columns then + x = 0 + y = y + 1 + end + end + end + + local function setInsertButtonImageBehavior(insertFrame, visible, name, assetId) + if visible then + insertFrame.AssetName.Value = name + insertFrame.AssetId.Value = assetId + local newImageUrl = SmallThumbnailUrl .. assetId + if newImageUrl ~= insertFrame.Button.ButtonImage.Image then + delay(0, function() + game:GetService("ContentProvider"):Preload(SmallThumbnailUrl .. assetId) + insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId + end) + end + table.insert( + insertButtonCons, + insertFrame.Button.MouseButton1Click:connect(function() + -- special case for water, show water selection gui + local isWaterSelected = (name == "Water") + and (Data.Category[Data.CurrentCategory].SetName == "High Scalability") + waterGui.Visible = isWaterSelected + if isWaterSelected then + objectSelected(name, tonumber(assetId), nil) + else + objectSelected(name, tonumber(assetId)) + end + end) + ) + insertFrame.Visible = true + else + insertFrame.Visible = false + end + end + + local function loadSectionOfItems(setGui, rows, columns) + local pageSize = rows * columns + + if arrayPosition > #contents then + return + end + + local origArrayPos = arrayPosition + + for _ = 1, pageSize + 1 do + if arrayPosition >= #contents + 1 then + break + end + + local buttonCon + insertButtons[arrayPosition], buttonCon = buildInsertButton() + table.insert(insertButtonCons, buttonCon) + insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame + arrayPosition = arrayPosition + 1 + end + realignButtonGrid(columns) + + -- local indexCopy = origArrayPos + for index = origArrayPos, arrayPosition do + if insertButtons[index] then + if contents[index] then + -- we don't want water to have a drop down button + if contents[index].Name == "Water" then + if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then + insertButtons[index]:FindFirstChild("DropDownButton", true):Destroy() + end + end + + local assetId + if useAssetVersionId then + assetId = contents[index].AssetVersionId + else + assetId = contents[index].AssetId + end + setInsertButtonImageBehavior(insertButtons[index], true, contents[index].Name, assetId) + else + break + end + else + break + end + -- indexCopy = index + end + end + + local function setSetIndex() + Data.Category[Data.CurrentCategory].Index = 0 + + local rows = 7 + local columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) + + contents = Data.Category[Data.CurrentCategory].Contents + if contents then + -- remove our buttons and their connections + for i = 1, #insertButtons do + insertButtons[i]:remove() + end + for i = 1, #insertButtonCons do + if insertButtonCons[i] then + insertButtonCons[i]:disconnect() + end + end + insertButtonCons = {} + insertButtons = {} + + arrayPosition = 1 + loadSectionOfItems(setGui, rows, columns) + end + end + + local function selectSet(button, setName, setId, _) + if button and Data.Category[Data.CurrentCategory] ~= nil then + if button ~= Data.Category[Data.CurrentCategory].Button then + Data.Category[Data.CurrentCategory].Button = button + + if SetCache[setId] == nil then + SetCache[setId] = game:GetService("InsertService"):GetCollection(setId) + end + Data.Category[Data.CurrentCategory].Contents = SetCache[setId] + + Data.Category[Data.CurrentCategory].SetName = setName + Data.Category[Data.CurrentCategory].SetId = setId + end + setSetIndex() + end + end + + local function selectCategoryPage(buttons, _) + if buttons ~= Data.CurrentCategory then + if Data.CurrentCategory then + for _, button in pairs(Data.CurrentCategory) do + button.Visible = false + end + end + + Data.CurrentCategory = buttons + if Data.Category[Data.CurrentCategory] == nil then + Data.Category[Data.CurrentCategory] = {} + if #buttons > 0 then + selectSet(buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0) + end + else + Data.Category[Data.CurrentCategory].Button = nil + selectSet( + Data.Category[Data.CurrentCategory].ButtonFrame, + Data.Category[Data.CurrentCategory].SetName, + Data.Category[Data.CurrentCategory].SetId, + Data.Category[Data.CurrentCategory].Index + ) + end + end + end + + local function selectCategory(category) + selectCategoryPage(category, 0) + end + + local function resetAllSetButtonSelection() + local setButtons = setGui.SetPanel.Sets.SetsLists:GetChildren() + for i = 1, #setButtons do + if setButtons[i]:IsA "TextButton" then + setButtons[i].Selected = false + setButtons[i].BackgroundTransparency = 1 + setButtons[i].TextColor3 = Color3.new(1, 1, 1) + setButtons[i].BackgroundColor3 = Color3.new(1, 1, 1) + end + end + end + + local function populateSetsFrame() + local currRow = 0 + for i = 1, #userCategoryButtons do + local button = userCategoryButtons[i] + button.Visible = true + button.Position = UDim2.new(0, 5, 0, currRow * button.Size.Y.Offset) + button.Parent = setGui.SetPanel.Sets.SetsLists + + if i == 1 then -- we will have this selected by default, so show it + button.Selected = true + button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundTransparency = 0 + end + + button.MouseEnter:connect(function() + if not button.Selected then + button.BackgroundTransparency = 0 + button.TextColor3 = Color3.new(0, 0, 0) + end + end) + button.MouseLeave:connect(function() + if not button.Selected then + button.BackgroundTransparency = 1 + button.TextColor3 = Color3.new(1, 1, 1) + end + end) + button.MouseButton1Click:connect(function() + resetAllSetButtonSelection() + button.Selected = not button.Selected + button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundTransparency = 0 + selectSet(button, button.Text, userCategoryButtons[i].SetId.Value, 0) + end) + + currRow = currRow + 1 + end + + local buttons = setGui.SetPanel.Sets.SetsLists:GetChildren() + + -- set first category as loaded for default + if buttons then + for i = 1, #buttons do + if buttons[i]:IsA "TextButton" then + selectSet(buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0) + selectCategory(userCategoryButtons) + break + end + end + end + end + + setGui = createSetGui() + waterGui, waterTypeChangedEvent = createWaterGui() + waterGui.Position = UDim2.new(0, 55, 0, 0) + waterGui.Parent = setGui + setGui.Changed:connect(function(prop) -- this resizes the preview image to always be the right size + if prop == "AbsoluteSize" then + handleResize() + setSetIndex() + end + end) + + local scrollFrame, controlFrame = t.CreateTrueScrollingFrame() + scrollFrame.Size = UDim2.new(0.54, 0, 0.85, 0) + scrollFrame.Position = UDim2.new(0.24, 0, 0.085, 0) + scrollFrame.Name = "ItemsFrame" + scrollFrame.ZIndex = 6 + scrollFrame.Parent = setGui.SetPanel + scrollFrame.BackgroundTransparency = 1 + + drillDownSetZIndex(controlFrame, 7) + + controlFrame.Parent = setGui.SetPanel + controlFrame.Position = UDim2.new(0.76, 5, 0, 0) + + local debounce = false + controlFrame.ScrollBottom.Changed:connect(function(_) + if controlFrame.ScrollBottom.Value == true then + if debounce then + return + end + debounce = true + loadSectionOfItems(setGui, rows, columns) + debounce = false + end + end) + + local userData = {} + for id = 1, #userIdsForSets do + local newUserData = game:GetService("InsertService"):GetUserSets(userIdsForSets[id]) + if newUserData and #newUserData > 2 then + -- start at #3 to skip over My Decals and My Models for each account + for category = 3, #newUserData do + if newUserData[category].Name == "High Scalability" then -- we want high scalability parts to show first + table.insert(userData, 1, newUserData[category]) + else + table.insert(userData, newUserData[category]) + end + end + end + end + if userData then + userCategoryButtons = processCategory(userData) + end + + rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight) + columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) + + populateSetsFrame() + + --[[local insertPanelCloseCon = ]] + setGui.SetPanel.CancelButton.MouseButton1Click:connect(function() + setGui.SetPanel.Visible = false + if dialogClosed then + dialogClosed() + end + end) + + local setVisibilityFunction = function(visible) + if visible then + setGui.SetPanel.Visible = true + else + setGui.SetPanel.Visible = false + end + end + + local getVisibilityFunction = function() + if setGui then + if setGui:FindFirstChild "SetPanel" then + return setGui.SetPanel.Visible + end + end + + return false + end + + return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent + end + +t.CreateTerrainMaterialSelector = function(size, position) + local terrainMaterialSelectionChanged = Instance.new "BindableEvent" + terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" + + local selectedButton = nil + + local frame = Instance.new "Frame" + frame.Name = "TerrainMaterialSelector" + if size then + frame.Size = size + else + frame.Size = UDim2.new(0, 245, 0, 230) + end + if position then + frame.Position = position + end + frame.BorderSizePixel = 0 + frame.BackgroundColor3 = Color3.new(0, 0, 0) + frame.Active = true + + terrainMaterialSelectionChanged.Parent = frame + + local waterEnabled = true -- todo: turn this on when water is ready + + local materialToImageMap = {} + local materialNames = { + "Grass", + "Sand", + "Brick", + "Granite", + "Asphalt", + "Iron", + "Aluminum", + "Gold", + "Plank", + "Log", + "Gravel", + "Cinder Block", + "Stone Wall", + "Concrete", + "Plastic (red)", + "Plastic (blue)", + } + if waterEnabled then + table.insert(materialNames, "Water") + end + local currentMaterial = 1 + + function getEnumFromName(choice) + if choice == "Grass" then + return 1 + end + if choice == "Sand" then + return 2 + end + if choice == "Erase" then + return 0 + end + if choice == "Brick" then + return 3 + end + if choice == "Granite" then + return 4 + end + if choice == "Asphalt" then + return 5 + end + if choice == "Iron" then + return 6 + end + if choice == "Aluminum" then + return 7 + end + if choice == "Gold" then + return 8 + end + if choice == "Plank" then + return 9 + end + if choice == "Log" then + return 10 + end + if choice == "Gravel" then + return 11 + end + if choice == "Cinder Block" then + return 12 + end + if choice == "Stone Wall" then + return 13 + end + if choice == "Concrete" then + return 14 + end + if choice == "Plastic (red)" then + return 15 + end + if choice == "Plastic (blue)" then + return 16 + end + if choice == "Water" then + return 17 + end + end + + function getNameFromEnum(choice) + if choice == Enum.CellMaterial.Grass or choice == 1 then + return "Grass" + elseif choice == Enum.CellMaterial.Sand or choice == 2 then + return "Sand" + elseif choice == Enum.CellMaterial.Empty or choice == 0 then + return "Erase" + elseif choice == Enum.CellMaterial.Brick or choice == 3 then + return "Brick" + elseif choice == Enum.CellMaterial.Granite or choice == 4 then + return "Granite" + elseif choice == Enum.CellMaterial.Asphalt or choice == 5 then + return "Asphalt" + elseif choice == Enum.CellMaterial.Iron or choice == 6 then + return "Iron" + elseif choice == Enum.CellMaterial.Aluminum or choice == 7 then + return "Aluminum" + elseif choice == Enum.CellMaterial.Gold or choice == 8 then + return "Gold" + elseif choice == Enum.CellMaterial.WoodPlank or choice == 9 then + return "Plank" + elseif choice == Enum.CellMaterial.WoodLog or choice == 10 then + return "Log" + elseif choice == Enum.CellMaterial.Gravel or choice == 11 then + return "Gravel" + elseif choice == Enum.CellMaterial.CinderBlock or choice == 12 then + return "Cinder Block" + elseif choice == Enum.CellMaterial.MossyStone or choice == 13 then + return "Stone Wall" + elseif choice == Enum.CellMaterial.Cement or choice == 14 then + return "Concrete" + elseif choice == Enum.CellMaterial.RedPlastic or choice == 15 then + return "Plastic (red)" + elseif choice == Enum.CellMaterial.BluePlastic or choice == 16 then + return "Plastic (blue)" + end + + if waterEnabled then + if choice == Enum.CellMaterial.Water or choice == 17 then + return "Water" + end + end + end + + local function updateMaterialChoice(choice) + currentMaterial = getEnumFromName(choice) + terrainMaterialSelectionChanged:Fire(currentMaterial) + end + + -- we so need a better way to do this + for _, v in pairs(materialNames) do + materialToImageMap[v] = {} + if v == "Grass" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=56563112" + elseif v == "Sand" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=62356652" + elseif v == "Brick" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=65961537" + elseif v == "Granite" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532153" + elseif v == "Asphalt" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532038" + elseif v == "Iron" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532093" + elseif v == "Aluminum" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531995" + elseif v == "Gold" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532118" + elseif v == "Plastic (red)" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531848" + elseif v == "Plastic (blue)" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531924" + elseif v == "Plank" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532015" + elseif v == "Log" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532051" + elseif v == "Gravel" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532206" + elseif v == "Cinder Block" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532103" + elseif v == "Stone Wall" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531804" + elseif v == "Concrete" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532059" + elseif v == "Water" then + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=81407474" + else + materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=66887593" -- fill in the rest here!! + end + end + + local scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame(nil, "grid") + scrollFrame.Size = UDim2.new(0.85, 0, 1, 0) + scrollFrame.Position = UDim2.new(0, 0, 0, 0) + scrollFrame.Parent = frame + + scrollUp.Parent = frame + scrollUp.Visible = true + scrollUp.Position = UDim2.new(1, -19, 0, 0) + + scrollDown.Parent = frame + scrollDown.Visible = true + scrollDown.Position = UDim2.new(1, -19, 1, -17) + + local function goToNewMaterial(buttonWrap, materialName) + updateMaterialChoice(materialName) + buttonWrap.BackgroundTransparency = 0 + selectedButton.BackgroundTransparency = 1 + selectedButton = buttonWrap + end + + local function createMaterialButton(name) + local buttonWrap = Instance.new "TextButton" + buttonWrap.Text = "" + buttonWrap.Size = UDim2.new(0, 32, 0, 32) + buttonWrap.BackgroundColor3 = Color3.new(1, 1, 1) + buttonWrap.BorderSizePixel = 0 + buttonWrap.BackgroundTransparency = 1 + buttonWrap.AutoButtonColor = false + buttonWrap.Name = tostring(name) + + local imageButton = Instance.new "ImageButton" + imageButton.AutoButtonColor = false + imageButton.BackgroundTransparency = 1 + imageButton.Size = UDim2.new(0, 30, 0, 30) + imageButton.Position = UDim2.new(0, 1, 0, 1) + imageButton.Name = tostring(name) + imageButton.Parent = buttonWrap + imageButton.Image = materialToImageMap[name].Regular + + local enumType = Instance.new "NumberValue" + enumType.Name = "EnumType" + enumType.Parent = buttonWrap + enumType.Value = 0 + + imageButton.MouseEnter:connect(function() + buttonWrap.BackgroundTransparency = 0 + end) + imageButton.MouseLeave:connect(function() + if selectedButton ~= buttonWrap then + buttonWrap.BackgroundTransparency = 1 + end + end) + imageButton.MouseButton1Click:connect(function() + if selectedButton ~= buttonWrap then + goToNewMaterial(buttonWrap, tostring(name)) + end + end) + + return buttonWrap + end + + for i = 1, #materialNames do + local imageButton = createMaterialButton(materialNames[i]) + + if materialNames[i] == "Grass" then -- always start with grass as the default + selectedButton = imageButton + imageButton.BackgroundTransparency = 0 + end + + imageButton.Parent = scrollFrame + end + + local forceTerrainMaterialSelection = function(newMaterialType) + if not newMaterialType then + return + end + if currentMaterial == newMaterialType then + return + end + + local matName = getNameFromEnum(newMaterialType) + local buttons = scrollFrame:GetChildren() + for i = 1, #buttons do + if buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)" then + goToNewMaterial(buttons[i], matName) + return + end + if buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)" then + goToNewMaterial(buttons[i], matName) + return + end + if string.find(buttons[i].Name, matName) then + goToNewMaterial(buttons[i], matName) + return + end + end + end + + frame.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + recalculateScroll() + end + end) + + recalculateScroll() + return frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection +end + +t.CreateLoadingFrame = function(name, size, position) + game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=35238053" + + local loadingFrame = Instance.new "Frame" + loadingFrame.Name = "LoadingFrame" + loadingFrame.Style = Enum.FrameStyle.RobloxRound + + if size then + loadingFrame.Size = size + else + loadingFrame.Size = UDim2.new(0, 300, 0, 160) + end + if position then + loadingFrame.Position = position + else + loadingFrame.Position = UDim2.new(0.5, -150, 0.5, -80) + end + + local loadingBar = Instance.new "Frame" + loadingBar.Name = "LoadingBar" + loadingBar.BackgroundColor3 = Color3.new(0, 0, 0) + loadingBar.BorderColor3 = Color3.new(79 / 255, 79 / 255, 79 / 255) + loadingBar.Position = UDim2.new(0, 0, 0, 41) + loadingBar.Size = UDim2.new(1, 0, 0, 30) + loadingBar.Parent = loadingFrame + + local loadingGreenBar = Instance.new "ImageLabel" + loadingGreenBar.Name = "LoadingGreenBar" + loadingGreenBar.Image = "http://www.roblox.com/asset/?id=35238053" + loadingGreenBar.Position = UDim2.new(0, 0, 0, 0) + loadingGreenBar.Size = UDim2.new(0, 0, 1, 0) + loadingGreenBar.Visible = false + loadingGreenBar.Parent = loadingBar + + local loadingPercent = Instance.new "TextLabel" + loadingPercent.Name = "LoadingPercent" + loadingPercent.BackgroundTransparency = 1 + loadingPercent.Position = UDim2.new(0, 0, 1, 0) + loadingPercent.Size = UDim2.new(1, 0, 0, 14) + loadingPercent.Font = Enum.Font.Arial + loadingPercent.Text = "0%" + loadingPercent.FontSize = Enum.FontSize.Size14 + loadingPercent.TextColor3 = Color3.new(1, 1, 1) + loadingPercent.Parent = loadingBar + + local cancelButton = Instance.new "TextButton" + cancelButton.Name = "CancelButton" + cancelButton.Position = UDim2.new(0.5, -60, 1, -40) + cancelButton.Size = UDim2.new(0, 120, 0, 40) + cancelButton.Font = Enum.Font.Arial + cancelButton.FontSize = Enum.FontSize.Size18 + cancelButton.TextColor3 = Color3.new(1, 1, 1) + cancelButton.Text = "Cancel" + cancelButton.Style = Enum.ButtonStyle.RobloxButton + cancelButton.Parent = loadingFrame + + local loadingName = Instance.new "TextLabel" + loadingName.Name = "loadingName" + loadingName.BackgroundTransparency = 1 + loadingName.Size = UDim2.new(1, 0, 0, 18) + loadingName.Position = UDim2.new(0, 0, 0, 2) + loadingName.Font = Enum.Font.Arial + loadingName.Text = name + loadingName.TextColor3 = Color3.new(1, 1, 1) + loadingName.TextStrokeTransparency = 1 + loadingName.FontSize = Enum.FontSize.Size18 + loadingName.Parent = loadingFrame + + local cancelButtonClicked = Instance.new "BindableEvent" + cancelButtonClicked.Name = "CancelButtonClicked" + cancelButtonClicked.Parent = cancelButton + cancelButton.MouseButton1Click:connect(function() + cancelButtonClicked:Fire() + end) + + local updateLoadingGuiPercent = function(percent, tweenAction, tweenLength) + if percent and type(percent) ~= "number" then + error("updateLoadingGuiPercent expects number as argument, got", type(percent), "instead") + end + + local newSize = nil + if percent < 0 then + newSize = UDim2.new(0, 0, 1, 0) + elseif percent > 1 then + newSize = UDim2.new(1, 0, 1, 0) + else + newSize = UDim2.new(percent, 0, 1, 0) + end + + if tweenAction then + if not tweenLength then + error "updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument" + end + + if newSize.X.Scale > 0 then + loadingGreenBar.Visible = true + loadingGreenBar:TweenSize(newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, true) + else + loadingGreenBar:TweenSize( + newSize, + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + tweenLength, + true, + function() + if newSize.X.Scale < 0 then + loadingGreenBar.Visible = false + end + end + ) + end + else + loadingGreenBar.Size = newSize + loadingGreenBar.Visible = (newSize.X.Scale > 0) + end + end + + loadingGreenBar.Changed:connect(function(prop) + if prop == "Size" then + loadingPercent.Text = tostring(math.ceil(loadingGreenBar.Size.X.Scale * 100)) .. "%" + end + end) + + return loadingFrame, updateLoadingGuiPercent, cancelButtonClicked +end + +t.CreatePluginFrame = function(name, size, position, scrollable, parent) + function createMenuButton(size, position, text, fontsize, name, parent) + local button = Instance.new "TextButton" + button.AutoButtonColor = false + button.Name = name + button.BackgroundTransparency = 1 + button.Position = position + button.Size = size + button.Font = Enum.Font.ArialBold + button.FontSize = fontsize + button.Text = text + button.TextColor3 = Color3.new(1, 1, 1) + button.BorderSizePixel = 0 + button.BackgroundColor3 = Color3.new(20 / 255, 20 / 255, 20 / 255) + + button.MouseEnter:connect(function() + if button.Selected then + return + end + button.BackgroundTransparency = 0 + end) + button.MouseLeave:connect(function() + if button.Selected then + return + end + button.BackgroundTransparency = 1 + end) + + button.Parent = parent + + return button + end + + local dragBar = Instance.new "Frame" + dragBar.Name = tostring(name) .. "DragBar" + dragBar.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255) + dragBar.BorderColor3 = Color3.new(0, 0, 0) + if size then + dragBar.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + UDim2.new(0, 20, 0, 0) + else + dragBar.Size = UDim2.new(0, 183, 0, 20) + end + if position then + dragBar.Position = position + end + dragBar.Active = true + dragBar.Draggable = true + --dragBar.Visible = false + dragBar.MouseEnter:connect(function() + dragBar.BackgroundColor3 = Color3.new(49 / 255, 49 / 255, 49 / 255) + end) + dragBar.MouseLeave:connect(function() + dragBar.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255) + end) + dragBar.Parent = parent + + -- plugin name label + local pluginNameLabel = Instance.new "TextLabel" + pluginNameLabel.Name = "BarNameLabel" + pluginNameLabel.Text = " " .. tostring(name) + pluginNameLabel.TextColor3 = Color3.new(1, 1, 1) + pluginNameLabel.TextStrokeTransparency = 0 + pluginNameLabel.Size = UDim2.new(1, 0, 1, 0) + pluginNameLabel.Font = Enum.Font.ArialBold + pluginNameLabel.FontSize = Enum.FontSize.Size18 + pluginNameLabel.TextXAlignment = Enum.TextXAlignment.Left + pluginNameLabel.BackgroundTransparency = 1 + pluginNameLabel.Parent = dragBar + + -- close button + local closeButton = createMenuButton( + UDim2.new(0, 15, 0, 17), + UDim2.new(1, -16, 0.5, -8), + "X", + Enum.FontSize.Size14, + "CloseButton", + dragBar + ) + local closeEvent = Instance.new "BindableEvent" + closeEvent.Name = "CloseEvent" + closeEvent.Parent = closeButton + closeButton.MouseButton1Click:connect(function() + closeEvent:Fire() + closeButton.BackgroundTransparency = 1 + end) + + -- help button + local helpButton = createMenuButton( + UDim2.new(0, 15, 0, 17), + UDim2.new(1, -51, 0.5, -8), + "?", + Enum.FontSize.Size14, + "HelpButton", + dragBar + ) + local helpFrame = Instance.new "Frame" + helpFrame.Name = "HelpFrame" + helpFrame.BackgroundColor3 = Color3.new(0, 0, 0) + helpFrame.Size = UDim2.new(0, 300, 0, 552) + helpFrame.Position = UDim2.new(1, 5, 0, 0) + helpFrame.Active = true + helpFrame.BorderSizePixel = 0 + helpFrame.Visible = false + helpFrame.Parent = dragBar + + helpButton.MouseButton1Click:connect(function() + helpFrame.Visible = not helpFrame.Visible + if helpFrame.Visible then + helpButton.Selected = true + helpButton.BackgroundTransparency = 0 + local screenGui = getScreenGuiAncestor(helpFrame) + if screenGui then + if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X then --position on left hand side + helpFrame.Position = UDim2.new(0, -5 - helpFrame.AbsoluteSize.X, 0, 0) + else -- position on right hand side + helpFrame.Position = UDim2.new(1, 5, 0, 0) + end + else + helpFrame.Position = UDim2.new(1, 5, 0, 0) + end + else + helpButton.Selected = false + helpButton.BackgroundTransparency = 1 + end + end) + + local minimizeButton = createMenuButton( + UDim2.new(0, 16, 0, 17), + UDim2.new(1, -34, 0.5, -8), + "-", + Enum.FontSize.Size14, + "MinimizeButton", + dragBar + ) + minimizeButton.TextYAlignment = Enum.TextYAlignment.Top + + local minimizeFrame = Instance.new "Frame" + minimizeFrame.Name = "MinimizeFrame" + minimizeFrame.BackgroundColor3 = Color3.new(73 / 255, 73 / 255, 73 / 255) + minimizeFrame.BorderColor3 = Color3.new(0, 0, 0) + minimizeFrame.Position = UDim2.new(0, 0, 1, 0) + if size then + minimizeFrame.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + UDim2.new(0, 20, 0, 0) + else + minimizeFrame.Size = UDim2.new(0, 183, 0, 50) + end + minimizeFrame.Visible = false + minimizeFrame.Parent = dragBar + + local minimizeBigButton = Instance.new "TextButton" + minimizeBigButton.Position = UDim2.new(0.5, -50, 0.5, -20) + minimizeBigButton.Name = "MinimizeButton" + minimizeBigButton.Size = UDim2.new(0, 100, 0, 40) + minimizeBigButton.Style = Enum.ButtonStyle.RobloxButton + minimizeBigButton.Font = Enum.Font.ArialBold + minimizeBigButton.FontSize = Enum.FontSize.Size18 + minimizeBigButton.TextColor3 = Color3.new(1, 1, 1) + minimizeBigButton.Text = "Show" + minimizeBigButton.Parent = minimizeFrame + + local separatingLine = Instance.new "Frame" + separatingLine.Name = "SeparatingLine" + separatingLine.BackgroundColor3 = Color3.new(115 / 255, 115 / 255, 115 / 255) + separatingLine.BorderSizePixel = 0 + separatingLine.Position = UDim2.new(1, -18, 0.5, -7) + separatingLine.Size = UDim2.new(0, 1, 0, 14) + separatingLine.Parent = dragBar + + local otherSeparatingLine = separatingLine:clone() + otherSeparatingLine.Position = UDim2.new(1, -35, 0.5, -7) + otherSeparatingLine.Parent = dragBar + + local widgetContainer = Instance.new "Frame" + widgetContainer.Name = "WidgetContainer" + widgetContainer.BackgroundTransparency = 1 + widgetContainer.Position = UDim2.new(0, 0, 1, 0) + widgetContainer.BorderColor3 = Color3.new(0, 0, 0) + if not scrollable then + widgetContainer.BackgroundTransparency = 0 + widgetContainer.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) + end + widgetContainer.Parent = dragBar + + if size then + if scrollable then + widgetContainer.Size = size + else + widgetContainer.Size = UDim2.new(0, dragBar.AbsoluteSize.X, size.Y.Scale, size.Y.Offset) + end + else + if scrollable then + widgetContainer.Size = UDim2.new(0, 163, 0, 400) + else + widgetContainer.Size = UDim2.new(0, dragBar.AbsoluteSize.X, 0, 400) + end + end + if position then + widgetContainer.Position = position + UDim2.new(0, 0, 0, 20) + end + + local frame, control, verticalDragger = nil + if scrollable then + --frame for widgets + frame, control = t.CreateTrueScrollingFrame() + frame.Size = UDim2.new(1, 0, 1, 0) + frame.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) + frame.BorderColor3 = Color3.new(0, 0, 0) + frame.Active = true + frame.Parent = widgetContainer + control.Parent = dragBar + control.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) + control.BorderSizePixel = 0 + control.BackgroundTransparency = 0 + control.Position = UDim2.new(1, -21, 1, 1) + if size then + control.Size = UDim2.new(0, 21, size.Y.Scale, size.Y.Offset) + else + control.Size = UDim2.new(0, 21, 0, 400) + end + control:FindFirstChild("ScrollDownButton").Position = UDim2.new(0, 0, 1, -20) + + local fakeLine = Instance.new "Frame" + fakeLine.Name = "FakeLine" + fakeLine.BorderSizePixel = 0 + fakeLine.BackgroundColor3 = Color3.new(0, 0, 0) + fakeLine.Size = UDim2.new(0, 1, 1, 1) + fakeLine.Position = UDim2.new(1, 0, 0, 0) + fakeLine.Parent = control + + verticalDragger = Instance.new "TextButton" + verticalDragger.ZIndex = 2 + verticalDragger.AutoButtonColor = false + verticalDragger.Name = "VerticalDragger" + verticalDragger.BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255) + verticalDragger.BorderColor3 = Color3.new(0, 0, 0) + verticalDragger.Size = UDim2.new(1, 20, 0, 20) + verticalDragger.Position = UDim2.new(0, 0, 1, 0) + verticalDragger.Active = true + verticalDragger.Text = "" + verticalDragger.Parent = widgetContainer + + local scrubFrame = Instance.new "Frame" + scrubFrame.Name = "ScrubFrame" + scrubFrame.BackgroundColor3 = Color3.new(1, 1, 1) + scrubFrame.BorderSizePixel = 0 + scrubFrame.Position = UDim2.new(0.5, -5, 0.5, 0) + scrubFrame.Size = UDim2.new(0, 10, 0, 1) + scrubFrame.ZIndex = 5 + scrubFrame.Parent = verticalDragger + local scrubTwo = scrubFrame:clone() + scrubTwo.Position = UDim2.new(0.5, -5, 0.5, -2) + scrubTwo.Parent = verticalDragger + local scrubThree = scrubFrame:clone() + scrubThree.Position = UDim2.new(0.5, -5, 0.5, 2) + scrubThree.Parent = verticalDragger + + local areaSoak = Instance.new "TextButton" + areaSoak.Name = "AreaSoak" + areaSoak.Size = UDim2.new(1, 0, 1, 0) + areaSoak.BackgroundTransparency = 1 + areaSoak.BorderSizePixel = 0 + areaSoak.Text = "" + areaSoak.ZIndex = 10 + areaSoak.Visible = false + areaSoak.Active = true + areaSoak.Parent = getScreenGuiAncestor(parent) + + local draggingVertical = false + local startYPos = nil + verticalDragger.MouseEnter:connect(function() + verticalDragger.BackgroundColor3 = Color3.new(60 / 255, 60 / 255, 60 / 255) + end) + verticalDragger.MouseLeave:connect(function() + verticalDragger.BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255) + end) + verticalDragger.MouseButton1Down:connect(function(_, y) + draggingVertical = true + areaSoak.Visible = true + startYPos = y + end) + areaSoak.MouseButton1Up:connect(function() + draggingVertical = false + areaSoak.Visible = false + end) + areaSoak.MouseMoved:connect(function(_, y) + if not draggingVertical then + return + end + + local yDelta = y - startYPos + if not control.ScrollDownButton.Visible and yDelta > 0 then + return + end + + if (widgetContainer.Size.Y.Offset + yDelta) < 150 then + widgetContainer.Size = UDim2.new( + widgetContainer.Size.X.Scale, + widgetContainer.Size.X.Offset, + widgetContainer.Size.Y.Scale, + 150 + ) + control.Size = UDim2.new(0, 21, 0, 150) + return + end + + startYPos = y + + if widgetContainer.Size.Y.Offset + yDelta >= 0 then + widgetContainer.Size = UDim2.new( + widgetContainer.Size.X.Scale, + widgetContainer.Size.X.Offset, + widgetContainer.Size.Y.Scale, + widgetContainer.Size.Y.Offset + yDelta + ) + control.Size = UDim2.new(0, 21, 0, control.Size.Y.Offset + yDelta) + end + end) + end + + local function switchMinimize() + minimizeFrame.Visible = not minimizeFrame.Visible + if scrollable then + frame.Visible = not frame.Visible + verticalDragger.Visible = not verticalDragger.Visible + control.Visible = not control.Visible + else + widgetContainer.Visible = not widgetContainer.Visible + end + + if minimizeFrame.Visible then + minimizeButton.Text = "+" + else + minimizeButton.Text = "-" + end + end + + minimizeBigButton.MouseButton1Click:connect(function() + switchMinimize() + end) + + minimizeButton.MouseButton1Click:connect(function() + switchMinimize() + end) + + if scrollable then + return dragBar, frame, helpFrame, closeEvent + else + return dragBar, widgetContainer, helpFrame, closeEvent + end +end + +t.Help = function(funcNameOrFunc) + --input argument can be a string or a function. Should return a description (of arguments and expected side effects) + if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu then + return "Function CreatePropertyDropDownMenu. " + .. "Arguments: (instance, propertyName, enumType). " + .. "Side effect: returns a container with a drop-down-box that is linked to the 'property' field of 'instance' which is of type 'enumType'" + end + if funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu then + return "Function CreateDropDownMenu. " + .. "Arguments: (items, onItemSelected). " + .. "Side effect: Returns 2 results, a container to the gui object and a 'updateSelection' function for external updating. The container is a drop-down-box created around a list of items" + end + if funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog then + return "Function CreateMessageDialog. " + .. "Arguments: (title, message, buttons). " + .. "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button" + end + if funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog then + return "Function CreateStyledMessageDialog. " + .. "Arguments: (title, message, style, buttons). " + .. "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button, 'style' is a string, either Error, Notify or Confirm" + end + if funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight then + return "Function GetFontHeight. " + .. "Arguments: (font, fontSize). " + .. "Side effect: returns the size in pixels of the given font + fontSize" + end + if funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame then + return "Function CreateScrollingFrame. " + .. "Arguments: (orderList, style) " + .. "Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). 'scrollFrame' can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a 'grid' styling if style is passed 'grid' as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)" + end + if funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame then + return "Function CreateTrueScrollingFrame. " + .. "Arguments: (nil) " + .. "Side effect: returns 2 objects, (scrollFrame, controlFrame). 'scrollFrame' can be filled with GuiObjects, and they will be clipped if not inside the frame's bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit." + end + if funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject then + return "Function AutoTruncateTextObject. " + .. "Arguments: (textLabel) " + .. "Side effect: returns 2 objects, (textLabel, changeText). The 'textLabel' input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. 'changeText' is a function that can be used to change the text, it takes 1 string as an argument" + end + if funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider then + return "Function CreateSlider. " + .. "Arguments: (steps, width, position) " + .. "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." + end + if funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame then + return "Function CreateLoadingFrame. " + .. "Arguments: (name, size, position) " + .. "Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that when fired means that someone clicked the cancel button on the dialog." + end + if funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector then + return "Function CreateTerrainMaterialSelector. " + .. "Arguments: (size, position) " + .. "Side effect: Size and position are UDim2 values that specifies the selector's size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected." + end +end + +return t diff --git a/lua/45374389.lua b/lua/45374389.lua new file mode 100644 index 0000000..a197f9f --- /dev/null +++ b/lua/45374389.lua @@ -0,0 +1,20 @@ +local t = {} + +t.Foo = function() + print "foo" +end + +t.Bar = function() + print "bar" +end + +t.Help = function(funcNameOrFunc) + --input argument can be a string or a function. Should return a description (of arguments and expected side effects) + if funcNameOrFunc == "Foo" or funcNameOrFunc == t.Foo then + return "Function Foo. Arguments: None. Side effect: prints foo" + elseif funcNameOrFunc == "Bar" or funcNameOrFunc == t.Bar then + return "Function Bar. Arguments: None. Side effect: prints bar" + end +end + +return t diff --git a/lua/46295863.lua b/lua/46295863.lua new file mode 100644 index 0000000..a13a343 --- /dev/null +++ b/lua/46295863.lua @@ -0,0 +1,2417 @@ +local function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end +end + +local function waitForProperty(instance, property) + while not instance[property] do + instance.Changed:wait() + end +end + +-- A Few Script Globals +local gui +if script.Parent:FindFirstChild "ControlFrame" then + gui = script.Parent:FindFirstChild "ControlFrame" +else + gui = script.Parent +end + +local helpButton = nil +local updateCameraDropDownSelection = nil +local updateVideoCaptureDropDownSelection = nil +local tweenTime = 0.2 + +local mouseLockLookScreenUrl = "http://www.roblox.com/asset?id=54071825" +local classicLookScreenUrl = "http://www.roblox.com/Asset?id=45915798" + +local hasGraphicsSlider = (game:GetService("CoreGui").Version >= 5) +local GraphicsQualityLevels = 10 -- how many levels we allow on graphics slider +local recordingVideo = false + +local currentMenuSelection = nil +local lastMenuSelection = {} + +-- local defaultPosition = UDim2.new(0, 0, 0, 0) +-- local newGuiPlaces = { 0, 41324860 } + +local centerDialogs = {} +local mainShield = nil + +local inStudioMode = UserSettings().GameSettings:InStudioMode() + +local macClient = false +local success, isMac = pcall(function() + return not game.GuiService.IsWindows +end) +macClient = success and isMac + +local function Color3I(r, g, b) + return Color3.new(r / 255, g / 255, b / 255) +end + +local function robloxLock(instance) + instance.RobloxLocked = true + local children = instance:GetChildren() + if children then + for _, child in ipairs(children) do + robloxLock(child) + end + end +end + +function resumeGameFunction(shield) + shield.Settings:TweenPosition( + UDim2.new(0.5, -262, -0.5, -200), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + delay(tweenTime, function() + shield.Visible = false + for i = 1, #centerDialogs do + centerDialogs[i].Visible = false + game.GuiService:RemoveCenterDialog(centerDialogs[i]) + end + game.GuiService:RemoveCenterDialog(shield) + settingsButton.Active = true + currentMenuSelection = nil + lastMenuSelection = {} + end) +end + +function goToMenu(container, menuName, moveDirection, size, position) + if type(menuName) ~= "string" then + return + end + + table.insert(lastMenuSelection, currentMenuSelection) + if menuName == "GameMainMenu" then + lastMenuSelection = {} + end + + local containerChildren = container:GetChildren() + for i = 1, #containerChildren do + if containerChildren[i].Name == menuName then + containerChildren[i].Visible = true + currentMenuSelection = + { container = container, name = menuName, direction = moveDirection, lastSize = size } + -- selectedMenu = true + if size and position then + containerChildren[i]:TweenSizeAndPosition( + size, + position, + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + elseif size then + containerChildren[i]:TweenSizeAndPosition( + size, + UDim2.new(0.5, -size.X.Offset / 2, 0.5, -size.Y.Offset / 2), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + else + containerChildren[i]:TweenPosition( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + end + else + if moveDirection == "left" then + containerChildren[i]:TweenPosition( + UDim2.new(-1, -525, 0, 0), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + elseif moveDirection == "right" then + containerChildren[i]:TweenPosition( + UDim2.new(1, 525, 0, 0), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + elseif moveDirection == "up" then + containerChildren[i]:TweenPosition( + UDim2.new(0, 0, -1, -400), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + elseif moveDirection == "down" then + containerChildren[i]:TweenPosition( + UDim2.new(0, 0, 1, 400), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + end + delay(tweenTime, function() + containerChildren[i].Visible = false + end) + end + end +end + +function resetLocalCharacter() + local player = game.Players.LocalPlayer + if player then + if player.Character and player.Character:FindFirstChild "Humanoid" then + player.Character.Humanoid.Health = 0 + end + end +end + +local function createTextButton(text, style, fontSize, buttonSize, buttonPosition) + local newTextButton = Instance.new "TextButton" + newTextButton.Font = Enum.Font.Arial + newTextButton.FontSize = fontSize + newTextButton.Size = buttonSize + newTextButton.Position = buttonPosition + newTextButton.Style = style + newTextButton.TextColor3 = Color3.new(1, 1, 1) + newTextButton.Text = text + return newTextButton +end + +local function CreateTextButtons(frame, buttons, yPos, ySize) + if #buttons < 1 then + error "Must have more than one button" + end + + local buttonNum = 1 + local buttonObjs = {} + + local function toggleSelection(button) + for _, obj in ipairs(buttonObjs) do + if obj == button then + obj.Style = Enum.ButtonStyle.RobloxButtonDefault + else + obj.Style = Enum.ButtonStyle.RobloxButton + end + end + end + + for _, obj in ipairs(buttons) do + local button = Instance.new "TextButton" + button.Name = "Button" .. buttonNum + button.Font = Enum.Font.Arial + button.FontSize = Enum.FontSize.Size18 + button.AutoButtonColor = true + button.Style = Enum.ButtonStyle.RobloxButton + button.Text = obj.Text + button.TextColor3 = Color3.new(1, 1, 1) + button.MouseButton1Click:connect(function() + toggleSelection(button) + obj.Function() + end) + button.Parent = frame + buttonObjs[buttonNum] = button + + buttonNum = buttonNum + 1 + end + + toggleSelection(buttonObjs[1]) + + local numButtons = buttonNum - 1 + + if numButtons == 1 then + frame.Button1.Position = UDim2.new(0.35, 0, yPos.Scale, yPos.Offset) + frame.Button1.Size = UDim2.new(0.4, 0, ySize.Scale, ySize.Offset) + elseif numButtons == 2 then + frame.Button1.Position = UDim2.new(0.1, 0, yPos.Scale, yPos.Offset) + frame.Button1.Size = UDim2.new(0.35, 0, ySize.Scale, ySize.Offset) + + frame.Button2.Position = UDim2.new(0.55, 0, yPos.Scale, yPos.Offset) + frame.Button2.Size = UDim2.new(0.35, 0, ySize.Scale, ySize.Offset) + elseif numButtons >= 3 then + local spacing = 0.1 / numButtons + local buttonSize = 0.9 / numButtons + + buttonNum = 1 + while buttonNum <= numButtons do + buttonObjs[buttonNum].Position = + UDim2.new(spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, yPos.Scale, yPos.Offset) + buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) + buttonNum = buttonNum + 1 + end + end +end + +function setRecordGui(recording, stopRecordButton, recordVideoButton) + if recording then + stopRecordButton.Visible = true + recordVideoButton.Text = "Stop Recording" + else + stopRecordButton.Visible = false + recordVideoButton.Text = "Record Video" + end +end + +function recordVideoClick(recordVideoButton, stopRecordButton) + recordingVideo = not recordingVideo + setRecordGui(recordingVideo, stopRecordButton, recordVideoButton) +end + +function backToGame(buttonClicked, shield, settingsButton) + buttonClicked.Parent.Parent.Parent.Parent.Visible = false + shield.Visible = false + for i = 1, #centerDialogs do + game.GuiService:RemoveCenterDialog(centerDialogs[i]) + centerDialogs[i].Visible = false + end + centerDialogs = {} + game.GuiService:RemoveCenterDialog(shield) + settingsButton.Active = true +end + +function setDisabledState(guiObject) + if not guiObject then + return + end + + if guiObject:IsA "TextLabel" then + guiObject.TextTransparency = 0.9 + elseif guiObject:IsA "TextButton" then + guiObject.TextTransparency = 0.9 + guiObject.Active = false + else + if guiObject["ClassName"] then + print("setDisabledState() got object of unsupported type. object type is ", guiObject.ClassName) + end + end +end + +local function createHelpDialog(baseZIndex) + if helpButton == nil then + if gui:FindFirstChild "TopLeftControl" and gui.TopLeftControl:FindFirstChild "Help" then + helpButton = gui.TopLeftControl.Help + elseif gui:FindFirstChild "BottomRightControl" and gui.BottomRightControl:FindFirstChild "Help" then + helpButton = gui.BottomRightControl.Help + end + end + + local shield = Instance.new "Frame" + shield.Name = "HelpDialogShield" + shield.Active = true + shield.Visible = false + shield.Size = UDim2.new(1, 0, 1, 0) + shield.BackgroundColor3 = Color3I(51, 51, 51) + shield.BorderColor3 = Color3I(27, 42, 53) + shield.BackgroundTransparency = 0.4 + shield.ZIndex = baseZIndex + 1 + + local helpDialog = Instance.new "Frame" + helpDialog.Name = "HelpDialog" + helpDialog.Style = Enum.FrameStyle.RobloxRound + helpDialog.Position = UDim2.new(0.2, 0, 0.2, 0) + helpDialog.Size = UDim2.new(0.6, 0, 0.6, 0) + helpDialog.Active = true + helpDialog.Parent = shield + + local titleLabel = Instance.new "TextLabel" + titleLabel.Name = "Title" + titleLabel.Text = "Keyboard & Mouse Controls" + titleLabel.Font = Enum.Font.ArialBold + titleLabel.FontSize = Enum.FontSize.Size36 + titleLabel.Position = UDim2.new(0, 0, 0.025, 0) + titleLabel.Size = UDim2.new(1, 0, 0, 40) + titleLabel.TextColor3 = Color3.new(1, 1, 1) + titleLabel.BackgroundTransparency = 1 + titleLabel.Parent = helpDialog + + local buttonRow = Instance.new "Frame" + buttonRow.Name = "Buttons" + buttonRow.Position = UDim2.new(0.1, 0, 0.07, 40) + buttonRow.Size = UDim2.new(0.8, 0, 0, 45) + buttonRow.BackgroundTransparency = 1 + buttonRow.Parent = helpDialog + + local imageFrame = Instance.new "Frame" + imageFrame.Name = "ImageFrame" + imageFrame.Position = UDim2.new(0.05, 0, 0.075, 80) + imageFrame.Size = UDim2.new(0.9, 0, 0.9, -120) + imageFrame.BackgroundTransparency = 1 + imageFrame.Parent = helpDialog + + local layoutFrame = Instance.new "Frame" + layoutFrame.Name = "LayoutFrame" + layoutFrame.Position = UDim2.new(0.5, 0, 0, 0) + layoutFrame.Size = UDim2.new(1.5, 0, 1, 0) + layoutFrame.BackgroundTransparency = 1 + layoutFrame.SizeConstraint = Enum.SizeConstraint.RelativeYY + layoutFrame.Parent = imageFrame + + local image = Instance.new "ImageLabel" + image.Name = "Image" + if UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then + image.Image = mouseLockLookScreenUrl + else + image.Image = classicLookScreenUrl + end + image.Position = UDim2.new(-0.5, 0, 0, 0) + image.Size = UDim2.new(1, 0, 1, 0) + image.BackgroundTransparency = 1 + image.Parent = layoutFrame + + local buttons = {} + buttons[1] = {} + buttons[1].Text = "Look" + buttons[1].Function = function() + if UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then + image.Image = mouseLockLookScreenUrl + else + image.Image = classicLookScreenUrl + end + end + buttons[2] = {} + buttons[2].Text = "Move" + buttons[2].Function = function() + image.Image = "http://www.roblox.com/Asset?id=45915811" + end + buttons[3] = {} + buttons[3].Text = "Gear" + buttons[3].Function = function() + image.Image = "http://www.roblox.com/Asset?id=45917596" + end + buttons[4] = {} + buttons[4].Text = "Zoom" + buttons[4].Function = function() + image.Image = "http://www.roblox.com/Asset?id=45915825" + end + + CreateTextButtons(buttonRow, buttons, UDim.new(0, 0), UDim.new(1, 0)) + + -- set up listeners for type of mouse mode, but keep constructing gui at same time + delay(0, function() + waitForChild(gui, "UserSettingsShield") + waitForChild(gui.UserSettingsShield, "Settings") + waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle") + waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameSettingsMenu") + waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu, "CameraField") + waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField, "DropDownMenuButton") + gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Changed:connect( + function(prop) + if prop ~= "Text" then + return + end + if buttonRow.Button1.Style == Enum.ButtonStyle.RobloxButtonDefault then -- only change if this is the currently selected panel + if + gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Text + == "Classic" + then + image.Image = classicLookScreenUrl + else + image.Image = mouseLockLookScreenUrl + end + end + end + ) + end) + + local okBtn = Instance.new "TextButton" + okBtn.Name = "OkBtn" + okBtn.Text = "OK" + okBtn.Modal = true + okBtn.Size = UDim2.new(0.3, 0, 0, 45) + okBtn.Position = UDim2.new(0.35, 0, 0.975, -50) + okBtn.Font = Enum.Font.Arial + okBtn.FontSize = Enum.FontSize.Size18 + okBtn.BackgroundTransparency = 1 + okBtn.TextColor3 = Color3.new(1, 1, 1) + okBtn.Style = Enum.ButtonStyle.RobloxButtonDefault + okBtn.MouseButton1Click:connect(function() + shield.Visible = false + game.GuiService:RemoveCenterDialog(shield) + end) + okBtn.Parent = helpDialog + + robloxLock(shield) + return shield +end + +local function createLeaveConfirmationMenu(baseZIndex, shield) + local frame = Instance.new "Frame" + frame.Name = "LeaveConfirmationMenu" + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(1, 0, 1, 0) + frame.Position = UDim2.new(0, 0, 2, 400) + frame.ZIndex = baseZIndex + 4 + + local yesButton = createTextButton( + "Leave", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size24, + UDim2.new(0, 128, 0, 50), + UDim2.new(0, 313, 0.8, 0) + ) + yesButton.Name = "YesButton" + yesButton.ZIndex = baseZIndex + 4 + yesButton.Parent = frame + yesButton.Modal = true + yesButton:SetVerb "Exit" + + local noButton = createTextButton( + "Stay", + Enum.ButtonStyle.RobloxButtonDefault, + Enum.FontSize.Size24, + UDim2.new(0, 128, 0, 50), + UDim2.new(0, 90, 0.8, 0) + ) + noButton.Name = "NoButton" + noButton.Parent = frame + noButton.ZIndex = baseZIndex + 4 + noButton.MouseButton1Click:connect(function() + goToMenu(shield.Settings.SettingsStyle, "GameMainMenu", "down", UDim2.new(0, 525, 0, 430)) + shield.Settings:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + end) + + local leaveText = Instance.new "TextLabel" + leaveText.Name = "LeaveText" + leaveText.Text = "Leave this game?" + leaveText.Size = UDim2.new(1, 0, 0.8, 0) + leaveText.TextWrap = true + leaveText.TextColor3 = Color3.new(1, 1, 1) + leaveText.Font = Enum.Font.ArialBold + leaveText.FontSize = Enum.FontSize.Size36 + leaveText.BackgroundTransparency = 1 + leaveText.ZIndex = baseZIndex + 4 + leaveText.Parent = frame + + return frame +end + +local function createResetConfirmationMenu(baseZIndex, shield) + local frame = Instance.new "Frame" + frame.Name = "ResetConfirmationMenu" + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(1, 0, 1, 0) + frame.Position = UDim2.new(0, 0, 2, 400) + frame.ZIndex = baseZIndex + 4 + + local yesButton = createTextButton( + "Reset", + Enum.ButtonStyle.RobloxButtonDefault, + Enum.FontSize.Size24, + UDim2.new(0, 128, 0, 50), + UDim2.new(0, 313, 0, 299) + ) + yesButton.Name = "YesButton" + yesButton.ZIndex = baseZIndex + 4 + yesButton.Parent = frame + yesButton.Modal = true + yesButton.MouseButton1Click:connect(function() + resumeGameFunction(shield) + resetLocalCharacter() + end) + + local noButton = createTextButton( + "Cancel", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size24, + UDim2.new(0, 128, 0, 50), + UDim2.new(0, 90, 0, 299) + ) + noButton.Name = "NoButton" + noButton.Parent = frame + noButton.ZIndex = baseZIndex + 4 + noButton.MouseButton1Click:connect(function() + goToMenu(shield.Settings.SettingsStyle, "GameMainMenu", "down", UDim2.new(0, 525, 0, 430)) + shield.Settings:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + end) + + local resetCharacterText = Instance.new "TextLabel" + resetCharacterText.Name = "ResetCharacterText" + resetCharacterText.Text = "Are you sure you want to reset your character?" + resetCharacterText.Size = UDim2.new(1, 0, 0.8, 0) + resetCharacterText.TextWrap = true + resetCharacterText.TextColor3 = Color3.new(1, 1, 1) + resetCharacterText.Font = Enum.Font.ArialBold + resetCharacterText.FontSize = Enum.FontSize.Size36 + resetCharacterText.BackgroundTransparency = 1 + resetCharacterText.ZIndex = baseZIndex + 4 + resetCharacterText.Parent = frame + + local fineResetCharacterText = resetCharacterText:Clone() + fineResetCharacterText.Name = "FineResetCharacterText" + fineResetCharacterText.Text = "You will be put back on a spawn point" + fineResetCharacterText.Size = UDim2.new(0, 303, 0, 18) + fineResetCharacterText.Position = UDim2.new(0, 109, 0, 215) + fineResetCharacterText.FontSize = Enum.FontSize.Size18 + fineResetCharacterText.Parent = frame + + return frame +end + +local function createGameMainMenu(baseZIndex, shield) + local gameMainMenuFrame = Instance.new "Frame" + gameMainMenuFrame.Name = "GameMainMenu" + gameMainMenuFrame.BackgroundTransparency = 1 + gameMainMenuFrame.Size = UDim2.new(1, 0, 1, 0) + gameMainMenuFrame.ZIndex = baseZIndex + 4 + gameMainMenuFrame.Parent = settingsFrame + + -- GameMainMenu Children + + local gameMainMenuTitle = Instance.new "TextLabel" + gameMainMenuTitle.Name = "Title" + gameMainMenuTitle.Text = "Game Menu" + gameMainMenuTitle.BackgroundTransparency = 1 + gameMainMenuTitle.TextStrokeTransparency = 0 + gameMainMenuTitle.Font = Enum.Font.ArialBold + gameMainMenuTitle.FontSize = Enum.FontSize.Size36 + gameMainMenuTitle.Size = UDim2.new(1, 0, 0, 36) + gameMainMenuTitle.Position = UDim2.new(0, 0, 0, 4) + gameMainMenuTitle.TextColor3 = Color3.new(1, 1, 1) + gameMainMenuTitle.ZIndex = baseZIndex + 4 + gameMainMenuTitle.Parent = gameMainMenuFrame + + local robloxHelpButton = createTextButton( + "Help", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size18, + UDim2.new(0, 164, 0, 50), + UDim2.new(0, 82, 0, 256) + ) + robloxHelpButton.Name = "HelpButton" + robloxHelpButton.ZIndex = baseZIndex + 4 + robloxHelpButton.Parent = gameMainMenuFrame + helpButton = robloxHelpButton + + local helpDialog = createHelpDialog(baseZIndex) + helpDialog.Parent = gui + + helpButton.MouseButton1Click:connect(function() + table.insert(centerDialogs, helpDialog) + game.GuiService:AddCenterDialog( + helpDialog, + Enum.CenterDialogType.ModalDialog, + --ShowFunction + function() + helpDialog.Visible = true + mainShield.Visible = false + end, + --HideFunction + function() + helpDialog.Visible = false + end + ) + end) + helpButton.Active = true + + local helpShortcut = Instance.new "TextLabel" + helpShortcut.Name = "HelpShortcutText" + helpShortcut.Text = "F1" + helpShortcut.Visible = false + helpShortcut.BackgroundTransparency = 1 + helpShortcut.Font = Enum.Font.Arial + helpShortcut.FontSize = Enum.FontSize.Size12 + helpShortcut.Position = UDim2.new(0, 85, 0, 0) + helpShortcut.Size = UDim2.new(0, 30, 0, 30) + helpShortcut.TextColor3 = Color3.new(0, 1, 0) + helpShortcut.ZIndex = baseZIndex + 4 + helpShortcut.Parent = robloxHelpButton + + local screenshotButton = createTextButton( + "Screenshot", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size18, + UDim2.new(0, 168, 0, 50), + UDim2.new(0, 254, 0, 256) + ) + screenshotButton.Name = "ScreenshotButton" + screenshotButton.ZIndex = baseZIndex + 4 + screenshotButton.Parent = gameMainMenuFrame + screenshotButton.Visible = not macClient + screenshotButton:SetVerb "Screenshot" + + local screenshotShortcut = helpShortcut:clone() + screenshotShortcut.Name = "ScreenshotShortcutText" + screenshotShortcut.Text = "PrintSc" + screenshotShortcut.Position = UDim2.new(0, 118, 0, 0) + screenshotShortcut.Visible = true + screenshotShortcut.Parent = screenshotButton + + local recordVideoButton = createTextButton( + "Record Video", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size18, + UDim2.new(0, 168, 0, 50), + UDim2.new(0, 254, 0, 306) + ) + recordVideoButton.Name = "RecordVideoButton" + recordVideoButton.ZIndex = baseZIndex + 4 + recordVideoButton.Parent = gameMainMenuFrame + recordVideoButton.Visible = not macClient + recordVideoButton:SetVerb "RecordToggle" + + local recordVideoShortcut = helpShortcut:clone() + recordVideoShortcut.Visible = hasGraphicsSlider + recordVideoShortcut.Name = "RecordVideoShortcutText" + recordVideoShortcut.Text = "F12" + recordVideoShortcut.Position = UDim2.new(0, 120, 0, 0) + recordVideoShortcut.Parent = recordVideoButton + + local stopRecordButton = Instance.new "ImageButton" + stopRecordButton.Name = "StopRecordButton" + stopRecordButton.BackgroundTransparency = 1 + stopRecordButton.Image = "rbxasset://textures/ui/RecordStop.png" + stopRecordButton.Size = UDim2.new(0, 59, 0, 27) + stopRecordButton:SetVerb "RecordToggle" + + stopRecordButton.MouseButton1Click:connect(function() + recordVideoClick(recordVideoButton, stopRecordButton) + end) + stopRecordButton.Visible = false + stopRecordButton.Parent = gui + + local reportAbuseButton = createTextButton( + "Report Abuse", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size18, + UDim2.new(0, 164, 0, 50), + UDim2.new(0, 82, 0, 306) + ) + reportAbuseButton.Name = "ReportAbuseButton" + reportAbuseButton.ZIndex = baseZIndex + 4 + reportAbuseButton.Parent = gameMainMenuFrame + + local leaveGameButton = createTextButton( + "Leave Game", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size24, + UDim2.new(0, 340, 0, 50), + UDim2.new(0, 82, 0, 358) + ) + leaveGameButton.Name = "LeaveGameButton" + leaveGameButton.ZIndex = baseZIndex + 4 + leaveGameButton.Parent = gameMainMenuFrame + + local resumeGameButton = createTextButton( + "Resume Game", + Enum.ButtonStyle.RobloxButtonDefault, + Enum.FontSize.Size24, + UDim2.new(0, 340, 0, 50), + UDim2.new(0, 82, 0, 54) + ) + resumeGameButton.Name = "resumeGameButton" + resumeGameButton.ZIndex = baseZIndex + 4 + resumeGameButton.Parent = gameMainMenuFrame + resumeGameButton.Modal = true + resumeGameButton.MouseButton1Click:connect(function() + resumeGameFunction(shield) + end) + + local gameSettingsButton = createTextButton( + "Game Settings", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size24, + UDim2.new(0, 340, 0, 50), + UDim2.new(0, 82, 0, 156) + ) + gameSettingsButton.Name = "SettingsButton" + gameSettingsButton.ZIndex = baseZIndex + 4 + gameSettingsButton.Parent = gameMainMenuFrame + + if game:FindFirstChild "LoadingGuiService" and #game.LoadingGuiService:GetChildren() > 0 then + local gameSettingsButton = createTextButton( + "Game Instructions", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size24, + UDim2.new(0, 340, 0, 50), + UDim2.new(0, 82, 0, 207) + ) + gameSettingsButton.Name = "GameInstructions" + gameSettingsButton.ZIndex = baseZIndex + 4 + gameSettingsButton.Parent = gameMainMenuFrame + gameSettingsButton.MouseButton1Click:connect(function() + if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + local loadingGui = game.Players.LocalPlayer:FindFirstChild "PlayerLoadingGui" + if loadingGui then + loadingGui.Visible = true + end + end + end) + end + + local resetButton = createTextButton( + "Reset Character", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size24, + UDim2.new(0, 340, 0, 50), + UDim2.new(0, 82, 0, 105) + ) + resetButton.Name = "ResetButton" + resetButton.ZIndex = baseZIndex + 4 + resetButton.Parent = gameMainMenuFrame + + return gameMainMenuFrame +end + +local function createGameSettingsMenu(baseZIndex, _) + local gameSettingsMenuFrame = Instance.new "Frame" + gameSettingsMenuFrame.Name = "GameSettingsMenu" + gameSettingsMenuFrame.BackgroundTransparency = 1 + gameSettingsMenuFrame.Size = UDim2.new(1, 0, 1, 0) + gameSettingsMenuFrame.ZIndex = baseZIndex + 4 + + local title = Instance.new "TextLabel" + title.Name = "Title" + title.Text = "Settings" + title.Size = UDim2.new(1, 0, 0, 48) + title.Position = UDim2.new(0, 9, 0, -9) + title.Font = Enum.Font.ArialBold + title.FontSize = Enum.FontSize.Size36 + title.TextColor3 = Color3.new(1, 1, 1) + title.ZIndex = baseZIndex + 4 + title.BackgroundTransparency = 1 + title.Parent = gameSettingsMenuFrame + + local fullscreenText = Instance.new "TextLabel" + fullscreenText.Name = "FullscreenText" + fullscreenText.Text = "Fullscreen Mode" + fullscreenText.Size = UDim2.new(0, 124, 0, 18) + fullscreenText.Position = UDim2.new(0, 62, 0, 145) + fullscreenText.Font = Enum.Font.Arial + fullscreenText.FontSize = Enum.FontSize.Size18 + fullscreenText.TextColor3 = Color3.new(1, 1, 1) + fullscreenText.ZIndex = baseZIndex + 4 + fullscreenText.BackgroundTransparency = 1 + fullscreenText.Parent = gameSettingsMenuFrame + + local fullscreenShortcut = Instance.new "TextLabel" + fullscreenShortcut.Visible = hasGraphicsSlider + fullscreenShortcut.Name = "FullscreenShortcutText" + fullscreenShortcut.Text = "F11" + fullscreenShortcut.BackgroundTransparency = 1 + fullscreenShortcut.Font = Enum.Font.Arial + fullscreenShortcut.FontSize = Enum.FontSize.Size12 + fullscreenShortcut.Position = UDim2.new(0, 186, 0, 141) + fullscreenShortcut.Size = UDim2.new(0, 30, 0, 30) + fullscreenShortcut.TextColor3 = Color3.new(0, 1, 0) + fullscreenShortcut.ZIndex = baseZIndex + 4 + fullscreenShortcut.Parent = gameSettingsMenuFrame + + local studioText = Instance.new "TextLabel" + studioText.Visible = false + studioText.Name = "StudioText" + studioText.Text = "Studio Mode" + studioText.Size = UDim2.new(0, 95, 0, 18) + studioText.Position = UDim2.new(0, 62, 0, 179) + studioText.Font = Enum.Font.Arial + studioText.FontSize = Enum.FontSize.Size18 + studioText.TextColor3 = Color3.new(1, 1, 1) + studioText.ZIndex = baseZIndex + 4 + studioText.BackgroundTransparency = 1 + studioText.Parent = gameSettingsMenuFrame + + local studioShortcut = fullscreenShortcut:clone() + studioShortcut.Name = "StudioShortcutText" + studioShortcut.Visible = false -- TODO: turn back on when f2 hack is fixed + studioShortcut.Text = "F2" + studioShortcut.Position = UDim2.new(0, 154, 0, 175) + studioShortcut.Parent = gameSettingsMenuFrame + + local studioCheckbox = nil + + if hasGraphicsSlider then + local qualityText = Instance.new "TextLabel" + qualityText.Name = "QualityText" + qualityText.Text = "Graphics Quality" + qualityText.Size = UDim2.new(0, 128, 0, 18) + qualityText.Position = UDim2.new(0, 30, 0, 239) + qualityText.Font = Enum.Font.Arial + qualityText.FontSize = Enum.FontSize.Size18 + qualityText.TextColor3 = Color3.new(1, 1, 1) + qualityText.ZIndex = baseZIndex + 4 + qualityText.BackgroundTransparency = 1 + qualityText.Parent = gameSettingsMenuFrame + qualityText.Visible = not inStudioMode + + local autoText = qualityText:clone() + autoText.Name = "AutoText" + autoText.Text = "Auto" + autoText.Position = UDim2.new(0, 183, 0, 214) + autoText.TextColor3 = Color3.new(128 / 255, 128 / 255, 128 / 255) + autoText.Size = UDim2.new(0, 34, 0, 18) + autoText.Parent = gameSettingsMenuFrame + autoText.Visible = not inStudioMode + + local fasterText = autoText:clone() + fasterText.Name = "FasterText" + fasterText.Text = "Faster" + fasterText.Position = UDim2.new(0, 185, 0, 274) + fasterText.TextColor3 = Color3.new(95, 95, 95) + fasterText.FontSize = Enum.FontSize.Size14 + fasterText.Parent = gameSettingsMenuFrame + fasterText.Visible = not inStudioMode + + local fasterShortcut = fullscreenShortcut:clone() + fasterShortcut.Name = "FasterShortcutText" + fasterShortcut.Text = "F10 + Shift" + fasterShortcut.Position = UDim2.new(0, 185, 0, 283) + fasterShortcut.Parent = gameSettingsMenuFrame + fasterShortcut.Visible = not inStudioMode + + local betterQualityText = autoText:clone() + betterQualityText.Name = "BetterQualityText" + betterQualityText.Text = "Better Quality" + betterQualityText.TextWrap = true + betterQualityText.Size = UDim2.new(0, 41, 0, 28) + betterQualityText.Position = UDim2.new(0, 390, 0, 269) + betterQualityText.TextColor3 = Color3.new(95, 95, 95) + betterQualityText.FontSize = Enum.FontSize.Size14 + betterQualityText.Parent = gameSettingsMenuFrame + betterQualityText.Visible = not inStudioMode + + local betterQualityShortcut = fullscreenShortcut:clone() + betterQualityShortcut.Name = "BetterQualityShortcut" + betterQualityShortcut.Text = "F10" + betterQualityShortcut.Position = UDim2.new(0, 394, 0, 288) + betterQualityShortcut.Parent = gameSettingsMenuFrame + betterQualityShortcut.Visible = not inStudioMode + + local autoGraphicsButton = createTextButton( + "X", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size18, + UDim2.new(0, 25, 0, 25), + UDim2.new(0, 187, 0, 239) + ) + autoGraphicsButton.Name = "AutoGraphicsButton" + autoGraphicsButton.ZIndex = baseZIndex + 4 + autoGraphicsButton.Parent = gameSettingsMenuFrame + autoGraphicsButton.Visible = not inStudioMode + + local graphicsSlider, graphicsLevel = RbxGui.CreateSlider(GraphicsQualityLevels, 150, UDim2.new(0, 230, 0, 280)) -- graphics - 1 because slider starts at 1 instead of 0 + graphicsSlider.Parent = gameSettingsMenuFrame + graphicsSlider.Bar.ZIndex = baseZIndex + 4 + graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5 + graphicsSlider.Visible = not inStudioMode + graphicsLevel.Value = math.floor((settings().Rendering:GetMaxQualityLevel() - 1) / 2) + + local graphicsSetter = Instance.new "TextBox" + graphicsSetter.Name = "GraphicsSetter" + graphicsSetter.BackgroundColor3 = Color3.new(0, 0, 0) + graphicsSetter.BorderColor3 = Color3.new(128 / 255, 128 / 255, 128 / 255) + graphicsSetter.Size = UDim2.new(0, 50, 0, 25) + graphicsSetter.Position = UDim2.new(0, 450, 0, 269) + graphicsSetter.TextColor3 = Color3.new(1, 1, 1) + graphicsSetter.Font = Enum.Font.Arial + graphicsSetter.FontSize = Enum.FontSize.Size18 + graphicsSetter.Text = "Auto" + graphicsSetter.ZIndex = 1 + graphicsSetter.TextWrap = true + graphicsSetter.Parent = gameSettingsMenuFrame + graphicsSetter.Visible = not inStudioMode + + local isAutoGraphics = true + if not inStudioMode then + isAutoGraphics = (UserSettings().GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic) + else + settings().Rendering.EnableFRM = false + end + + local listenToGraphicsLevelChange = true + + local function setAutoGraphicsGui(active) + isAutoGraphics = active + if active then + autoGraphicsButton.Text = "X" + betterQualityText.ZIndex = 1 + betterQualityShortcut.ZIndex = 1 + fasterShortcut.ZIndex = 1 + fasterText.ZIndex = 1 + graphicsSlider.Bar.ZIndex = 1 + graphicsSlider.Bar.Slider.ZIndex = 1 + graphicsSetter.ZIndex = 1 + graphicsSetter.Text = "Auto" + else + autoGraphicsButton.Text = "" + graphicsSlider.Bar.ZIndex = baseZIndex + 4 + graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5 + betterQualityShortcut.ZIndex = baseZIndex + 4 + fasterShortcut.ZIndex = baseZIndex + 4 + betterQualityText.ZIndex = baseZIndex + 4 + fasterText.ZIndex = baseZIndex + 4 + graphicsSetter.ZIndex = baseZIndex + 4 + end + end + + local function goToAutoGraphics() + setAutoGraphicsGui(true) + + UserSettings().GameSettings.SavedQualityLevel = Enum.SavedQualitySetting.Automatic + + settings().Rendering.QualityLevel = Enum.QualityLevel.Automatic + end + + local function setGraphicsQualityLevel(newLevel) + local percentage = newLevel / GraphicsQualityLevels + local newSetting = math.floor((settings().Rendering:GetMaxQualityLevel() - 1) * percentage) + if newSetting == 20 then -- Level 20 is the same as level 21, except it doesn't render ambient occlusion + newSetting = 21 + elseif newLevel == 1 then -- make sure we can go to lowest settings (for terrible computers) + newSetting = 1 + elseif newSetting > settings().Rendering:GetMaxQualityLevel() then + newSetting = settings().Rendering:GetMaxQualityLevel() - 1 + end + + UserSettings().GameSettings.SavedQualityLevel = newLevel + settings().Rendering.QualityLevel = newSetting + end + + local function goToManualGraphics(explicitLevel) + setAutoGraphicsGui(false) + + if explicitLevel then + graphicsLevel.Value = explicitLevel + else + graphicsLevel.Value = math.floor( + (settings().Rendering.AutoFRMLevel / (settings().Rendering:GetMaxQualityLevel() - 1)) + * GraphicsQualityLevels + ) + end + + if explicitLevel == graphicsLevel.Value then -- make sure we are actually in right graphics mode + setGraphicsQualityLevel(graphicsLevel.Value) + end + + if not explicitLevel then + UserSettings().GameSettings.SavedQualityLevel = graphicsLevel.Value + end + graphicsSetter.Text = tostring(graphicsLevel.Value) + end + + local function showAutoGraphics() + autoText.ZIndex = baseZIndex + 4 + autoGraphicsButton.ZIndex = baseZIndex + 4 + end + + local function hideAutoGraphics() + autoText.ZIndex = 1 + autoGraphicsButton.ZIndex = 1 + end + + local function showManualGraphics() + graphicsSlider.Bar.ZIndex = baseZIndex + 4 + graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5 + betterQualityShortcut.ZIndex = baseZIndex + 4 + fasterShortcut.ZIndex = baseZIndex + 4 + betterQualityText.ZIndex = baseZIndex + 4 + fasterText.ZIndex = baseZIndex + 4 + graphicsSetter.ZIndex = baseZIndex + 4 + end + + local function hideManualGraphics() + betterQualityText.ZIndex = 1 + betterQualityShortcut.ZIndex = 1 + fasterShortcut.ZIndex = 1 + fasterText.ZIndex = 1 + graphicsSlider.Bar.ZIndex = 1 + graphicsSlider.Bar.Slider.ZIndex = 1 + graphicsSetter.ZIndex = 1 + end + + local function translateSavedQualityLevelToInt(savedQualityLevel) + if savedQualityLevel == Enum.SavedQualitySetting.Automatic then + return 0 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel1 then + return 1 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel2 then + return 2 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel3 then + return 3 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel4 then + return 4 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel5 then + return 5 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel6 then + return 6 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel7 then + return 7 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel8 then + return 8 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel9 then + return 9 + elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel10 then + return 10 + end + end + + local function enableGraphicsWidget() + settings().Rendering.EnableFRM = true + + isAutoGraphics = (UserSettings().GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic) + if isAutoGraphics then + showAutoGraphics() + goToAutoGraphics() + else + showAutoGraphics() + showManualGraphics() + goToManualGraphics(translateSavedQualityLevelToInt(UserSettings().GameSettings.SavedQualityLevel)) + end + end + + local function disableGraphicsWidget() + hideManualGraphics() + hideAutoGraphics() + settings().Rendering.EnableFRM = false + end + + graphicsSetter.FocusLost:connect(function() + if isAutoGraphics then + graphicsSetter.Text = tostring(graphicsLevel.Value) + return + end + + local newGraphicsValue = tonumber(graphicsSetter.Text) + if newGraphicsValue == nil then + graphicsSetter.Text = tostring(graphicsLevel.Value) + return + end + + if newGraphicsValue < 1 then + newGraphicsValue = 1 + elseif newGraphicsValue >= settings().Rendering:GetMaxQualityLevel() then + newGraphicsValue = settings().Rendering:GetMaxQualityLevel() - 1 + end + + graphicsLevel.Value = newGraphicsValue + setGraphicsQualityLevel(graphicsLevel.Value) + graphicsSetter.Text = tostring(graphicsLevel.Value) + end) + + graphicsLevel.Changed:connect(function(_) + if isAutoGraphics then + return + end + if not listenToGraphicsLevelChange then + return + end + + graphicsSetter.Text = tostring(graphicsLevel.Value) + setGraphicsQualityLevel(graphicsLevel.Value) + end) + + -- setup our graphic mode on load + if inStudioMode or UserSettings().GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic then + if inStudioMode then + settings().Rendering.EnableFRM = false + disableGraphicsWidget() + else + settings().Rendering.EnableFRM = true + goToAutoGraphics() + end + else + settings().Rendering.EnableFRM = true + goToManualGraphics(translateSavedQualityLevelToInt(UserSettings().GameSettings.SavedQualityLevel)) + end + + autoGraphicsButton.MouseButton1Click:connect(function() + if inStudioMode and not game.Players.LocalPlayer then + return + end + + if not isAutoGraphics then + goToAutoGraphics() + else + goToManualGraphics(graphicsLevel.Value) + end + end) + + game.GraphicsQualityChangeRequest:connect(function(graphicsIncrease) + if isAutoGraphics then + return + end -- only can set graphics in manual mode + + if graphicsIncrease then + if (graphicsLevel.Value + 1) > GraphicsQualityLevels then + return + end + graphicsLevel.Value = graphicsLevel.Value + 1 + graphicsSetter.Text = tostring(graphicsLevel.Value) + setGraphicsQualityLevel(graphicsLevel.Value) + + game:GetService("GuiService"):SendNotification( + "Graphics Quality", + "Increased to (" .. graphicsSetter.Text .. ")", + "", + 2, + function() end + ) + else + if (graphicsLevel.Value - 1) <= 0 then + return + end + graphicsLevel.Value = graphicsLevel.Value - 1 + graphicsSetter.Text = tostring(graphicsLevel.Value) + setGraphicsQualityLevel(graphicsLevel.Value) + + game:GetService("GuiService"):SendNotification( + "Graphics Quality", + "Decreased to (" .. graphicsSetter.Text .. ")", + "", + 2, + function() end + ) + end + end) + + game.Players.PlayerAdded:connect(function(player) + if player == game.Players.LocalPlayer and inStudioMode then + enableGraphicsWidget() + end + end) + game.Players.PlayerRemoving:connect(function(player) + if player == game.Players.LocalPlayer and inStudioMode then + disableGraphicsWidget() + end + end) + + studioCheckbox = createTextButton( + "", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size18, + UDim2.new(0, 25, 0, 25), + UDim2.new(0, 30, 0, 176) + ) + studioCheckbox.Name = "StudioCheckbox" + studioCheckbox.ZIndex = baseZIndex + 4 + --studioCheckbox.Parent = gameSettingsMenuFrame -- todo: enable when studio h4x aren't an issue anymore + studioCheckbox:SetVerb "TogglePlayMode" + studioCheckbox.Visible = false -- todo: enabled when studio h4x aren't an issue anymore + + local wasManualGraphics = (settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic) + if inStudioMode and not game.Players.LocalPlayer then + studioCheckbox.Text = "X" + disableGraphicsWidget() + elseif inStudioMode then + studioCheckbox.Text = "X" + enableGraphicsWidget() + end + if hasGraphicsSlider then + UserSettings().GameSettings.StudioModeChanged:connect(function(isStudioMode) + inStudioMode = isStudioMode + if isStudioMode then + wasManualGraphics = (settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic) + goToAutoGraphics() + studioCheckbox.Text = "X" + autoGraphicsButton.ZIndex = 1 + autoText.ZIndex = 1 + else + if wasManualGraphics then + goToManualGraphics() + end + studioCheckbox.Text = "" + autoGraphicsButton.ZIndex = baseZIndex + 4 + autoText.ZIndex = baseZIndex + 4 + end + end) + else + studioCheckbox.MouseButton1Click:connect(function() + if not studioCheckbox.Active then + return + end + + if studioCheckbox.Text == "" then + studioCheckbox.Text = "X" + else + studioCheckbox.Text = "" + end + end) + end + end + + local fullscreenCheckbox = createTextButton( + "", + Enum.ButtonStyle.RobloxButton, + Enum.FontSize.Size18, + UDim2.new(0, 25, 0, 25), + UDim2.new(0, 30, 0, 144) + ) + fullscreenCheckbox.Name = "FullscreenCheckbox" + fullscreenCheckbox.ZIndex = baseZIndex + 4 + fullscreenCheckbox.Parent = gameSettingsMenuFrame + fullscreenCheckbox:SetVerb "ToggleFullScreen" + if UserSettings().GameSettings:InFullScreen() then + fullscreenCheckbox.Text = "X" + end + if hasGraphicsSlider then + UserSettings().GameSettings.FullscreenChanged:connect(function(isFullscreen) + if isFullscreen then + fullscreenCheckbox.Text = "X" + else + fullscreenCheckbox.Text = "" + end + end) + else + fullscreenCheckbox.MouseButton1Click:connect(function() + if fullscreenCheckbox.Text == "" then + fullscreenCheckbox.Text = "X" + else + fullscreenCheckbox.Text = "" + end + end) + end + + if game:FindFirstChild "NetworkClient" then -- we are playing online + setDisabledState(studioText) + setDisabledState(studioShortcut) + setDisabledState(studioCheckbox) + end + + local backButton + if hasGraphicsSlider then + backButton = createTextButton( + "OK", + Enum.ButtonStyle.RobloxButtonDefault, + Enum.FontSize.Size24, + UDim2.new(0, 180, 0, 50), + UDim2.new(0, 170, 0, 330) + ) + backButton.Modal = true + else + backButton = createTextButton( + "OK", + Enum.ButtonStyle.RobloxButtonDefault, + Enum.FontSize.Size24, + UDim2.new(0, 180, 0, 50), + UDim2.new(0, 170, 0, 270) + ) + backButton.Modal = true + end + + backButton.Name = "BackButton" + backButton.ZIndex = baseZIndex + 4 + backButton.Parent = gameSettingsMenuFrame + + syncVideoCaptureSetting = nil + + if not macClient then + local videoCaptureLabel = Instance.new "TextLabel" + videoCaptureLabel.Name = "VideoCaptureLabel" + videoCaptureLabel.Text = "After Capturing Video" + videoCaptureLabel.Font = Enum.Font.Arial + videoCaptureLabel.FontSize = Enum.FontSize.Size18 + videoCaptureLabel.Position = UDim2.new(0, 32, 0, 100) + videoCaptureLabel.Size = UDim2.new(0, 164, 0, 18) + videoCaptureLabel.BackgroundTransparency = 1 + videoCaptureLabel.TextColor3 = Color3I(255, 255, 255) + videoCaptureLabel.TextXAlignment = Enum.TextXAlignment.Left + videoCaptureLabel.ZIndex = baseZIndex + 4 + videoCaptureLabel.Parent = gameSettingsMenuFrame + + local videoNames = {} + local videoNameToItem = {} + videoNames[1] = "Just Save to Disk" + videoNameToItem[videoNames[1]] = Enum.UploadSetting["Never"] + videoNames[2] = "Upload to YouTube" + videoNameToItem[videoNames[2]] = Enum.UploadSetting["Ask me first"] + + local videoCaptureDropDown = nil + videoCaptureDropDown, updateVideoCaptureDropDownSelection = RbxGui.CreateDropDownMenu(videoNames, function(text) + UserSettings().GameSettings.VideoUploadPromptBehavior = videoNameToItem[text] + end) + videoCaptureDropDown.Name = "VideoCaptureField" + videoCaptureDropDown.ZIndex = baseZIndex + 4 + videoCaptureDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4 + videoCaptureDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4 + videoCaptureDropDown.Position = UDim2.new(0, 270, 0, 94) + videoCaptureDropDown.Size = UDim2.new(0, 200, 0, 32) + videoCaptureDropDown.Parent = gameSettingsMenuFrame + + syncVideoCaptureSetting = function() + if UserSettings().GameSettings.VideoUploadPromptBehavior == Enum.UploadSetting["Never"] then + updateVideoCaptureDropDownSelection(videoNames[1]) + elseif UserSettings().GameSettings.VideoUploadPromptBehavior == Enum.UploadSetting["Ask me first"] then + updateVideoCaptureDropDownSelection(videoNames[2]) + else + UserSettings().GameSettings.VideoUploadPromptBehavior = Enum.UploadSetting["Ask me first"] + updateVideoCaptureDropDownSelection(videoNames[2]) + end + end + end + + local cameraLabel = Instance.new "TextLabel" + cameraLabel.Name = "CameraLabel" + cameraLabel.Text = "Character & Camera Controls" + cameraLabel.Font = Enum.Font.Arial + cameraLabel.FontSize = Enum.FontSize.Size18 + cameraLabel.Position = UDim2.new(0, 31, 0, 58) + cameraLabel.Size = UDim2.new(0, 224, 0, 18) + cameraLabel.TextColor3 = Color3I(255, 255, 255) + cameraLabel.TextXAlignment = Enum.TextXAlignment.Left + cameraLabel.BackgroundTransparency = 1 + cameraLabel.ZIndex = baseZIndex + 4 + cameraLabel.Parent = gameSettingsMenuFrame + + local mouseLockLabel = game.CoreGui.RobloxGui:FindFirstChild("MouseLockLabel", true) + + local enumItems = Enum.ControlMode:GetEnumItems() + local enumNames = {} + local enumNameToItem = {} + for i, obj in ipairs(enumItems) do + enumNames[i] = obj.Name + enumNameToItem[obj.Name] = obj + end + + local cameraDropDown + cameraDropDown, updateCameraDropDownSelection = RbxGui.CreateDropDownMenu(enumNames, function(text) + UserSettings().GameSettings.ControlMode = enumNameToItem[text] + + pcall(function() + if mouseLockLabel and UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then + mouseLockLabel.Visible = true + elseif mouseLockLabel then + mouseLockLabel.Visible = false + end + end) + end) + cameraDropDown.Name = "CameraField" + cameraDropDown.ZIndex = baseZIndex + 4 + cameraDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4 + cameraDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4 + cameraDropDown.Position = UDim2.new(0, 270, 0, 52) + cameraDropDown.Size = UDim2.new(0, 200, 0, 32) + cameraDropDown.Parent = gameSettingsMenuFrame + + return gameSettingsMenuFrame +end + +if LoadLibrary then + RbxGui = LoadLibrary "RbxGui" + local baseZIndex = 0 + if UserSettings then + local createSettingsDialog = function() + waitForChild(gui, "BottomLeftControl") + settingsButton = gui.BottomLeftControl:FindFirstChild "SettingsButton" + + if settingsButton == nil then + settingsButton = Instance.new "ImageButton" + settingsButton.Name = "SettingsButton" + settingsButton.Image = "rbxasset://textures/ui/SettingsButton.png" + settingsButton.BackgroundTransparency = 1 + settingsButton.Active = false + settingsButton.Size = UDim2.new(0, 54, 0, 46) + settingsButton.Position = UDim2.new(0, 2, 0, 50) + settingsButton.Parent = gui.BottomLeftControl + end + + local shield = Instance.new "TextButton" + shield.Text = "" + shield.Name = "UserSettingsShield" + shield.Active = true + shield.AutoButtonColor = false + shield.Visible = false + shield.Size = UDim2.new(1, 0, 1, 0) + shield.BackgroundColor3 = Color3I(51, 51, 51) + shield.BorderColor3 = Color3I(27, 42, 53) + shield.BackgroundTransparency = 0.4 + shield.ZIndex = baseZIndex + 2 + mainShield = shield + + local frame = Instance.new "Frame" + frame.Name = "Settings" + frame.Position = UDim2.new(0.5, -262, -0.5, -200) + frame.Size = UDim2.new(0, 525, 0, 430) + frame.BackgroundTransparency = 1 + frame.Active = true + frame.Parent = shield + + local settingsFrame = Instance.new "Frame" + settingsFrame.Name = "SettingsStyle" + settingsFrame.Size = UDim2.new(1, 0, 1, 0) + settingsFrame.Style = Enum.FrameStyle.RobloxRound + settingsFrame.Active = true + settingsFrame.ZIndex = baseZIndex + 3 + settingsFrame.Parent = frame + + local gameMainMenu = createGameMainMenu(baseZIndex, shield) + gameMainMenu.Parent = settingsFrame + + gameMainMenu.ScreenshotButton.MouseButton1Click:connect(function() + backToGame(gameMainMenu.ScreenshotButton, shield, settingsButton) + end) + + gameMainMenu.RecordVideoButton.MouseButton1Click:connect(function() + recordVideoClick(gameMainMenu.RecordVideoButton, gui.StopRecordButton) + backToGame(gameMainMenu.RecordVideoButton, shield, settingsButton) + end) + + if settings():FindFirstChild "Game Options" then + pcall(function() + settings():FindFirstChild("Game Options").VideoRecordingChangeRequest:connect(function(recording) + recordingVideo = recording + setRecordGui(recording, gui.StopRecordButton, gameMainMenu.RecordVideoButton) + end) + end) + end + + game.CoreGui.RobloxGui.Changed:connect(function(prop) -- We have stopped recording when we resize + if prop == "AbsoluteSize" and recordingVideo then + recordVideoClick(gameMainMenu.RecordVideoButton, gui.StopRecordButton) + end + end) + + function localPlayerChange() + gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer + if game.Players.LocalPlayer then + settings().Rendering.EnableFRM = true + elseif inStudioMode then + settings().Rendering.EnableFRM = false + end + end + + gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer + if game.Players.LocalPlayer ~= nil then + game.Players.LocalPlayer.Changed:connect(function() + localPlayerChange() + end) + else + delay(0, function() + waitForProperty(game.Players, "LocalPlayer") + gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer + game.Players.LocalPlayer.Changed:connect(function() + localPlayerChange() + end) + end) + end + + gameMainMenu.ReportAbuseButton.Visible = game:FindFirstChild "NetworkClient" + if not gameMainMenu.ReportAbuseButton.Visible then + game.ChildAdded:connect(function(child) + if child:IsA "NetworkClient" then + gameMainMenu.ReportAbuseButton.Visible = game:FindFirstChild "NetworkClient" + end + end) + end + + gameMainMenu.ResetButton.MouseButton1Click:connect(function() + goToMenu(settingsFrame, "ResetConfirmationMenu", "up", UDim2.new(0, 525, 0, 370)) + end) + + gameMainMenu.LeaveGameButton.MouseButton1Click:connect(function() + goToMenu(settingsFrame, "LeaveConfirmationMenu", "down", UDim2.new(0, 525, 0, 300)) + end) + + if game.CoreGui.Version >= 4 then -- we can use escape! + game:GetService("GuiService").EscapeKeyPressed:connect(function() + if currentMenuSelection == nil then + game.GuiService:AddCenterDialog( + shield, + Enum.CenterDialogType.ModalDialog, + --showFunction + function() + settingsButton.Active = false + updateCameraDropDownSelection(UserSettings().GameSettings.ControlMode.Name) + + if syncVideoCaptureSetting then + syncVideoCaptureSetting() + end + + goToMenu(settingsFrame, "GameMainMenu", "right", UDim2.new(0, 525, 0, 430)) + shield.Visible = true + shield.Active = true + settingsFrame.Parent:TweenPosition( + UDim2.new(0.5, -262, 0.5, -200), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + settingsFrame.Parent:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + end, + --hideFunction + function() + settingsFrame.Parent:TweenPosition( + UDim2.new(0.5, -262, -0.5, -200), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + settingsFrame.Parent:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + shield.Visible = false + settingsButton.Active = true + end + ) + elseif #lastMenuSelection > 0 then + if #centerDialogs > 0 then + for i = 1, #centerDialogs do + game.GuiService:RemoveCenterDialog(centerDialogs[i]) + centerDialogs[i].Visible = false + end + centerDialogs = {} + end + + goToMenu( + lastMenuSelection[#lastMenuSelection]["container"], + lastMenuSelection[#lastMenuSelection]["name"], + lastMenuSelection[#lastMenuSelection]["direction"], + lastMenuSelection[#lastMenuSelection]["lastSize"] + ) + + table.remove(lastMenuSelection, #lastMenuSelection) + if #lastMenuSelection == 1 then -- apparently lua can't reduce count to 0... T_T + lastMenuSelection = {} + end + else + resumeGameFunction(shield) + end + end) + end + + local gameSettingsMenu = createGameSettingsMenu(baseZIndex, shield) + gameSettingsMenu.Visible = false + gameSettingsMenu.Parent = settingsFrame + + gameMainMenu.SettingsButton.MouseButton1Click:connect(function() + goToMenu(settingsFrame, "GameSettingsMenu", "left", UDim2.new(0, 525, 0, 350)) + end) + + gameSettingsMenu.BackButton.MouseButton1Click:connect(function() + goToMenu(settingsFrame, "GameMainMenu", "right", UDim2.new(0, 525, 0, 430)) + end) + + local resetConfirmationWindow = createResetConfirmationMenu(baseZIndex, shield) + resetConfirmationWindow.Visible = false + resetConfirmationWindow.Parent = settingsFrame + + local leaveConfirmationWindow = createLeaveConfirmationMenu(baseZIndex, shield) + leaveConfirmationWindow.Visible = false + leaveConfirmationWindow.Parent = settingsFrame + + robloxLock(shield) + + settingsButton.MouseButton1Click:connect(function() + game.GuiService:AddCenterDialog( + shield, + Enum.CenterDialogType.ModalDialog, + --showFunction + function() + settingsButton.Active = false + updateCameraDropDownSelection(UserSettings().GameSettings.ControlMode.Name) + + if syncVideoCaptureSetting then + syncVideoCaptureSetting() + end + + goToMenu(settingsFrame, "GameMainMenu", "right", UDim2.new(0, 525, 0, 430)) + shield.Visible = true + settingsFrame.Parent:TweenPosition( + UDim2.new(0.5, -262, 0.5, -200), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + settingsFrame.Parent:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + end, + --hideFunction + function() + settingsFrame.Parent:TweenPosition( + UDim2.new(0.5, -262, -0.5, -200), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + settingsFrame.Parent:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + shield.Visible = false + settingsButton.Active = true + end + ) + end) + + return shield + end + + delay(0, function() + createSettingsDialog().Parent = gui + + gui.BottomLeftControl.SettingsButton.Active = true + gui.BottomLeftControl.SettingsButton.Position = UDim2.new(0, 2, 0, -2) + + if mouseLockLabel and UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then + mouseLockLabel.Visible = true + elseif mouseLockLabel then + mouseLockLabel.Visible = false + end + + -- our script has loaded, get rid of older buttons now + local leaveGameButton = gui.BottomLeftControl:FindFirstChild "Exit" + if leaveGameButton then + leaveGameButton:Remove() + end + + local topLeft = gui:FindFirstChild "TopLeftControl" + if topLeft then + leaveGameButton = topLeft:FindFirstChild "Exit" + if leaveGameButton then + leaveGameButton:Remove() + end + + topLeft:Remove() + end + end) + end --UserSettings call + + local createSaveDialogs = function() + local shield = Instance.new "TextButton" + shield.Text = "" + shield.AutoButtonColor = false + shield.Name = "SaveDialogShield" + shield.Active = true + shield.Visible = false + shield.Size = UDim2.new(1, 0, 1, 0) + shield.BackgroundColor3 = Color3I(51, 51, 51) + shield.BorderColor3 = Color3I(27, 42, 53) + shield.BackgroundTransparency = 0.4 + shield.ZIndex = baseZIndex + 1 + + local clearAndResetDialog + local save + local saveLocal + local dontSave + local cancel + + local messageBoxButtons = {} + messageBoxButtons[1] = {} + messageBoxButtons[1].Text = "Save" + messageBoxButtons[1].Style = Enum.ButtonStyle.RobloxButtonDefault + messageBoxButtons[1].Function = function() + save() + end + messageBoxButtons[2] = {} + messageBoxButtons[2].Text = "Cancel" + messageBoxButtons[2].Function = function() + cancel() + end + messageBoxButtons[3] = {} + messageBoxButtons[3].Text = "Don't Save" + messageBoxButtons[3].Function = function() + dontSave() + end + + local saveDialogMessageBox = RbxGui.CreateStyledMessageDialog( + "Unsaved Changes", + "Save your changes to Mercury before leaving?", + "Confirm", + messageBoxButtons + ) + saveDialogMessageBox.Visible = true + saveDialogMessageBox.Parent = shield + + local errorBoxButtons = {} + + local buttonOffset = 1 + if game.LocalSaveEnabled then + errorBoxButtons[buttonOffset] = {} + errorBoxButtons[buttonOffset].Text = "Save to Disk" + errorBoxButtons[buttonOffset].Function = function() + saveLocal() + end + buttonOffset = buttonOffset + 1 + end + errorBoxButtons[buttonOffset] = {} + errorBoxButtons[buttonOffset].Text = "Keep Playing" + errorBoxButtons[buttonOffset].Function = function() + cancel() + end + errorBoxButtons[buttonOffset + 1] = {} + errorBoxButtons[buttonOffset + 1].Text = "Don't Save" + errorBoxButtons[buttonOffset + 1].Function = function() + dontSave() + end + + local errorDialogMessageBox = RbxGui.CreateStyledMessageDialog( + "Upload Failed", + "Sorry, we could not save your changes to Mercury.", + "Error", + errorBoxButtons + ) + errorDialogMessageBox.Visible = false + errorDialogMessageBox.Parent = shield + + local spinnerDialog = Instance.new "Frame" + spinnerDialog.Name = "SpinnerDialog" + spinnerDialog.Style = Enum.FrameStyle.RobloxRound + spinnerDialog.Size = UDim2.new(0, 350, 0, 150) + spinnerDialog.Position = UDim2.new(0.5, -175, 0.5, -75) + spinnerDialog.Visible = false + spinnerDialog.Active = true + spinnerDialog.Parent = shield + + local waitingLabel = Instance.new "TextLabel" + waitingLabel.Name = "WaitingLabel" + waitingLabel.Text = "Saving to Mercury..." + waitingLabel.Font = Enum.Font.ArialBold + waitingLabel.FontSize = Enum.FontSize.Size18 + waitingLabel.Position = UDim2.new(0.5, 25, 0.5, 0) + waitingLabel.TextColor3 = Color3.new(1, 1, 1) + waitingLabel.Parent = spinnerDialog + + local spinnerFrame = Instance.new "Frame" + spinnerFrame.Name = "Spinner" + spinnerFrame.Size = UDim2.new(0, 80, 0, 80) + spinnerFrame.Position = UDim2.new(0.5, -150, 0.5, -40) + spinnerFrame.BackgroundTransparency = 1 + spinnerFrame.Parent = spinnerDialog + + local spinnerIcons = {} + local spinnerNum = 1 + while spinnerNum <= 8 do + local spinnerImage = Instance.new "ImageLabel" + spinnerImage.Name = "Spinner" .. spinnerNum + spinnerImage.Size = UDim2.new(0, 16, 0, 16) + spinnerImage.Position = UDim2.new( + 0.5 + 0.3 * math.cos(math.rad(45 * spinnerNum)), + -8, + 0.5 + 0.3 * math.sin(math.rad(45 * spinnerNum)), + -8 + ) + spinnerImage.BackgroundTransparency = 1 + spinnerImage.Image = "http://www.roblox.com/Asset?id=45880710" + spinnerImage.Parent = spinnerFrame + + spinnerIcons[spinnerNum] = spinnerImage + spinnerNum = spinnerNum + 1 + end + + save = function() + saveDialogMessageBox.Visible = false + + --Show the spinner dialog + spinnerDialog.Visible = true + local spin = true + --Make it spin + delay(0, function() + local spinPos = 0 + while spin do + local pos = 0 + + while pos < 8 do + if pos == spinPos or pos == ((spinPos + 1) % 8) then + spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset?id=45880668" + else + spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset?id=45880710" + end + + pos = pos + 1 + end + spinPos = (spinPos + 1) % 8 + wait(0.2) + end + end) + + --Do the save while the spinner is going, function will wait + local result = game:SaveToRoblox() + if not result then + --Try once more + result = game:SaveToRoblox() + end + + --Hide the spinner dialog + spinnerDialog.Visible = false + --And cause the delay thread to stop + spin = false + + --Now process the result + if result then + --Success, close + game:FinishShutdown(false) + clearAndResetDialog() + else + --Failure, show the second dialog prompt + errorDialogMessageBox.Visible = true + end + end + + saveLocal = function() + errorDialogMessageBox.Visible = false + game:FinishShutdown(true) + clearAndResetDialog() + end + + dontSave = function() + saveDialogMessageBox.Visible = false + errorDialogMessageBox.Visible = false + game:FinishShutdown(false) + clearAndResetDialog() + end + cancel = function() + saveDialogMessageBox.Visible = false + errorDialogMessageBox.Visible = false + clearAndResetDialog() + end + + clearAndResetDialog = function() + saveDialogMessageBox.Visible = true + errorDialogMessageBox.Visible = false + spinnerDialog.Visible = false + shield.Visible = false + game.GuiService:RemoveCenterDialog(shield) + end + + robloxLock(shield) + shield.Visible = false + return shield + end + + local createReportAbuseDialog = function() + --Only show things if we are a NetworkClient + waitForChild(game, "NetworkClient") + + waitForChild(game, "Players") + waitForProperty(game.Players, "LocalPlayer") + local localPlayer = game.Players.LocalPlayer + + local reportAbuseButton + waitForChild(gui, "UserSettingsShield") + waitForChild(gui.UserSettingsShield, "Settings") + waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle") + waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu") + waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, "ReportAbuseButton") + reportAbuseButton = gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton + + local shield = Instance.new "TextButton" + shield.Name = "ReportAbuseShield" + shield.Text = "" + shield.AutoButtonColor = false + shield.Active = true + shield.Visible = false + shield.Size = UDim2.new(1, 0, 1, 0) + shield.BackgroundColor3 = Color3I(51, 51, 51) + shield.BorderColor3 = Color3I(27, 42, 53) + shield.BackgroundTransparency = 0.4 + shield.ZIndex = baseZIndex + 1 + + local closeAndResetDialog + + local messageBoxButtons = {} + messageBoxButtons[1] = {} + messageBoxButtons[1].Text = "Ok" + messageBoxButtons[1].Modal = true + messageBoxButtons[1].Function = function() + closeAndResetDialog() + end + local calmingMessageBox = RbxGui.CreateMessageDialog( + "Thanks for your report!", + "Our moderators will review the chat logs and determine what happened. The other user is probably just trying to make you mad.\n\nIf anyone used swear words, inappropriate language, or threatened you in real life, please report them for Bad Words or Threats", + messageBoxButtons + ) + calmingMessageBox.Visible = false + calmingMessageBox.Parent = shield + + local recordedMessageBox = RbxGui.CreateMessageDialog( + "Thanks for your report!", + "We've recorded your report for evaluation.", + messageBoxButtons + ) + recordedMessageBox.Visible = false + recordedMessageBox.Parent = shield + + local normalMessageBox = RbxGui.CreateMessageDialog( + "Thanks for your report!", + "Our moderators will review the chat logs and determine what happened.", + messageBoxButtons + ) + normalMessageBox.Visible = false + normalMessageBox.Parent = shield + + local frame = Instance.new "Frame" + frame.Name = "Settings" + frame.Position = UDim2.new(0.5, -250, 0.5, -200) + frame.Size = UDim2.new(0, 500, 0, 400) + frame.BackgroundTransparency = 1 + frame.Active = true + frame.Parent = shield + + local settingsFrame = Instance.new "Frame" + settingsFrame.Name = "ReportAbuseStyle" + settingsFrame.Size = UDim2.new(1, 0, 1, 0) + settingsFrame.Style = Enum.FrameStyle.RobloxRound + settingsFrame.Active = true + settingsFrame.ZIndex = baseZIndex + 1 + settingsFrame.Parent = frame + + local title = Instance.new "TextLabel" + title.Name = "Title" + title.Text = "Report Abuse" + title.TextColor3 = Color3I(221, 221, 221) + title.Position = UDim2.new(0.5, 0, 0, 30) + title.Font = Enum.Font.ArialBold + title.FontSize = Enum.FontSize.Size36 + title.ZIndex = baseZIndex + 2 + title.Parent = settingsFrame + + local description = Instance.new "TextLabel" + description.Name = "Description" + description.Text = + "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action." + description.TextColor3 = Color3I(221, 221, 221) + description.Position = UDim2.new(0, 0, 0, 55) + description.Size = UDim2.new(1, 0, 0, 40) + description.BackgroundTransparency = 1 + description.Font = Enum.Font.Arial + description.FontSize = Enum.FontSize.Size18 + description.TextWrap = true + description.ZIndex = baseZIndex + 2 + description.TextXAlignment = Enum.TextXAlignment.Left + description.TextYAlignment = Enum.TextYAlignment.Top + description.Parent = settingsFrame + + local playerLabel = Instance.new "TextLabel" + playerLabel.Name = "PlayerLabel" + playerLabel.Text = "Which player?" + playerLabel.BackgroundTransparency = 1 + playerLabel.Font = Enum.Font.Arial + playerLabel.FontSize = Enum.FontSize.Size18 + playerLabel.Position = UDim2.new(0.025, 0, 0, 100) + playerLabel.Size = UDim2.new(0.4, 0, 0, 36) + playerLabel.TextColor3 = Color3I(255, 255, 255) + playerLabel.TextXAlignment = Enum.TextXAlignment.Left + playerLabel.ZIndex = baseZIndex + 2 + playerLabel.Parent = settingsFrame + + local abusingPlayer = nil + local abuse = nil + local submitReportButton = nil + + local updatePlayerSelection = nil + local createPlayersDropDown = function() + local players = game:GetService "Players" + local playerNames = {} + local nameToPlayer = {} + local children = players:GetChildren() + local pos = 1 + if children then + for _, player in ipairs(children) do + if player:IsA "Player" and player ~= localPlayer then + playerNames[pos] = player.Name + nameToPlayer[player.Name] = player + pos = pos + 1 + end + end + end + local playerDropDown = nil + playerDropDown, updatePlayerSelection = RbxGui.CreateDropDownMenu(playerNames, function(playerName) + abusingPlayer = nameToPlayer[playerName] + if abuse and abusingPlayer then + submitReportButton.Active = true + end + end) + playerDropDown.Name = "PlayersComboBox" + playerDropDown.ZIndex = baseZIndex + 2 + playerDropDown.Position = UDim2.new(0.425, 0, 0, 102) + playerDropDown.Size = UDim2.new(0.55, 0, 0, 32) + + return playerDropDown + end + + local abuseLabel = Instance.new "TextLabel" + abuseLabel.Name = "AbuseLabel" + abuseLabel.Text = "Type of Abuse:" + abuseLabel.Font = Enum.Font.Arial + abuseLabel.BackgroundTransparency = 1 + abuseLabel.FontSize = Enum.FontSize.Size18 + abuseLabel.Position = UDim2.new(0.025, 0, 0, 140) + abuseLabel.Size = UDim2.new(0.4, 0, 0, 36) + abuseLabel.TextColor3 = Color3I(255, 255, 255) + abuseLabel.TextXAlignment = Enum.TextXAlignment.Left + abuseLabel.ZIndex = baseZIndex + 2 + abuseLabel.Parent = settingsFrame + + local abuses = { + "Swearing", + "Bullying", + "Scamming", + "Dating", + "Cheating/Exploiting", + "Personal Questions", + "Offsite Links", + "Bad Model or Script", + "Bad Username", + } + local abuseDropDown, updateAbuseSelection = RbxGui.CreateDropDownMenu(abuses, function(abuseText) + abuse = abuseText + if abuse and abusingPlayer then + submitReportButton.Active = true + end + end, true) + abuseDropDown.Name = "AbuseComboBox" + abuseDropDown.ZIndex = baseZIndex + 2 + abuseDropDown.Position = UDim2.new(0.425, 0, 0, 142) + abuseDropDown.Size = UDim2.new(0.55, 0, 0, 32) + abuseDropDown.Parent = settingsFrame + + local shortDescriptionLabel = Instance.new "TextLabel" + shortDescriptionLabel.Name = "ShortDescriptionLabel" + shortDescriptionLabel.Text = "Short Description: (optional)" + shortDescriptionLabel.Font = Enum.Font.Arial + shortDescriptionLabel.FontSize = Enum.FontSize.Size18 + shortDescriptionLabel.Position = UDim2.new(0.025, 0, 0, 180) + shortDescriptionLabel.Size = UDim2.new(0.95, 0, 0, 36) + shortDescriptionLabel.TextColor3 = Color3I(255, 255, 255) + shortDescriptionLabel.TextXAlignment = Enum.TextXAlignment.Left + shortDescriptionLabel.BackgroundTransparency = 1 + shortDescriptionLabel.ZIndex = baseZIndex + 2 + shortDescriptionLabel.Parent = settingsFrame + + local shortDescriptionWrapper = Instance.new "Frame" + shortDescriptionWrapper.Name = "ShortDescriptionWrapper" + shortDescriptionWrapper.Position = UDim2.new(0.025, 0, 0, 220) + shortDescriptionWrapper.Size = UDim2.new(0.95, 0, 1, -310) + shortDescriptionWrapper.BackgroundColor3 = Color3I(0, 0, 0) + shortDescriptionWrapper.BorderSizePixel = 0 + shortDescriptionWrapper.ZIndex = baseZIndex + 2 + shortDescriptionWrapper.Parent = settingsFrame + + local shortDescriptionBox = Instance.new "TextBox" + shortDescriptionBox.Name = "TextBox" + shortDescriptionBox.Text = "" + shortDescriptionBox.ClearTextOnFocus = false + shortDescriptionBox.Font = Enum.Font.Arial + shortDescriptionBox.FontSize = Enum.FontSize.Size18 + shortDescriptionBox.Position = UDim2.new(0, 3, 0, 3) + shortDescriptionBox.Size = UDim2.new(1, -6, 1, -6) + shortDescriptionBox.TextColor3 = Color3I(255, 255, 255) + shortDescriptionBox.TextXAlignment = Enum.TextXAlignment.Left + shortDescriptionBox.TextYAlignment = Enum.TextYAlignment.Top + shortDescriptionBox.TextWrap = true + shortDescriptionBox.BackgroundColor3 = Color3I(0, 0, 0) + shortDescriptionBox.BorderSizePixel = 0 + shortDescriptionBox.ZIndex = baseZIndex + 2 + shortDescriptionBox.Parent = shortDescriptionWrapper + + submitReportButton = Instance.new "TextButton" + submitReportButton.Name = "SubmitReportBtn" + submitReportButton.Active = false + submitReportButton.Modal = true + submitReportButton.Font = Enum.Font.Arial + submitReportButton.FontSize = Enum.FontSize.Size18 + submitReportButton.Position = UDim2.new(0.1, 0, 1, -80) + submitReportButton.Size = UDim2.new(0.35, 0, 0, 50) + submitReportButton.AutoButtonColor = true + submitReportButton.Style = Enum.ButtonStyle.RobloxButtonDefault + submitReportButton.Text = "Submit Report" + submitReportButton.TextColor3 = Color3I(255, 255, 255) + submitReportButton.ZIndex = baseZIndex + 2 + submitReportButton.Parent = settingsFrame + + submitReportButton.MouseButton1Click:connect(function() + if submitReportButton.Active then + if abuse and abusingPlayer then + frame.Visible = false + game.Players:ReportAbuse(abusingPlayer, abuse, shortDescriptionBox.Text) + if abuse == "Cheating/Exploiting" then + recordedMessageBox.Visible = true + elseif abuse == "Bullying" or abuse == "Swearing" then + calmingMessageBox.Visible = true + else + normalMessageBox.Visible = true + end + else + closeAndResetDialog() + end + end + end) + + local cancelButton = Instance.new "TextButton" + cancelButton.Name = "CancelBtn" + cancelButton.Font = Enum.Font.Arial + cancelButton.FontSize = Enum.FontSize.Size18 + cancelButton.Position = UDim2.new(0.55, 0, 1, -80) + cancelButton.Size = UDim2.new(0.35, 0, 0, 50) + cancelButton.AutoButtonColor = true + cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault + cancelButton.Text = "Cancel" + cancelButton.TextColor3 = Color3I(255, 255, 255) + cancelButton.ZIndex = baseZIndex + 2 + cancelButton.Parent = settingsFrame + + closeAndResetDialog = function() + --Delete old player combo box + local oldComboBox = settingsFrame:FindFirstChild "PlayersComboBox" + if oldComboBox then + oldComboBox.Parent = nil + end + + abusingPlayer = nil + updatePlayerSelection(nil) + abuse = nil + updateAbuseSelection(nil) + submitReportButton.Active = false + shortDescriptionBox.Text = "" + frame.Visible = true + calmingMessageBox.Visible = false + recordedMessageBox.Visible = false + normalMessageBox.Visible = false + shield.Visible = false + reportAbuseButton.Active = true + game.GuiService:RemoveCenterDialog(shield) + end + + cancelButton.MouseButton1Click:connect(closeAndResetDialog) + + reportAbuseButton.MouseButton1Click:connect(function() + createPlayersDropDown().Parent = settingsFrame + table.insert(centerDialogs, shield) + game.GuiService:AddCenterDialog( + shield, + Enum.CenterDialogType.ModalDialog, + --ShowFunction + function() + reportAbuseButton.Active = false + shield.Visible = true + mainShield.Visible = false + end, + --HideFunction + function() + reportAbuseButton.Active = true + shield.Visible = false + end + ) + end) + + robloxLock(shield) + return shield + end + + -- local createChatBar = function() + -- --Only show a chat bar if we are a NetworkClient + -- waitForChild(game, "NetworkClient") + + -- waitForChild(game, "Players") + -- waitForProperty(game.Players, "LocalPlayer") + + -- local chatBar = Instance.new "Frame" + -- chatBar.Name = "ChatBar" + -- chatBar.Size = UDim2.new(1, 0, 0, 22) + -- chatBar.Position = UDim2.new(0, 0, 1, 0) + -- chatBar.BackgroundColor3 = Color3.new(0, 0, 0) + -- chatBar.BorderSizePixel = 0 + + -- local chatBox = Instance.new "TextBox" + -- chatBox.Text = "" + -- chatBox.Visible = false + -- chatBox.Size = UDim2.new(1, -4, 1, 0) + -- chatBox.Position = UDim2.new(0, 2, 0, 0) + -- chatBox.TextXAlignment = Enum.TextXAlignment.Left + -- chatBox.Font = Enum.Font.Arial + -- chatBox.ClearTextOnFocus = false + -- chatBox.FontSize = Enum.FontSize.Size14 + -- chatBox.TextColor3 = Color3.new(1, 1, 1) + -- chatBox.BackgroundTransparency = 1 + -- --chatBox.Parent = chatBar + + -- local chatButton = Instance.new "TextButton" + -- chatButton.Size = UDim2.new(1, -4, 1, 0) + -- chatButton.Position = UDim2.new(0, 2, 0, 0) + -- chatButton.AutoButtonColor = false + -- chatButton.Text = 'To chat click here or press "/" key' + -- chatButton.TextXAlignment = Enum.TextXAlignment.Left + -- chatButton.Font = Enum.Font.Arial + -- chatButton.FontSize = Enum.FontSize.Size14 + -- chatButton.TextColor3 = Color3.new(1, 1, 1) + -- chatButton.BackgroundTransparency = 1 + -- --chatButton.Parent = chatBar + + -- local activateChat = function() + -- if chatBox.Visible then + -- return + -- end + -- chatButton.Visible = false + -- chatBox.Text = "" + -- chatBox.Visible = true + -- chatBox:CaptureFocus() + -- end + + -- chatButton.MouseButton1Click:connect(activateChat) + + -- -- local hotKeyEnabled = true + -- local toggleHotKey = function(_) + -- -- hotKeyEnabled = value + -- end + + -- -- local guiService = game:GetService "GuiService" + -- --[[local newChatMode = ]]pcall(function() + -- --guiService:AddSpecialKey(Enum.SpecialKey.ChatHotkey) + -- --guiService.SpecialKeyPressed:connect(function(key) if key == Enum.SpecialKey.ChatHotkey and hotKeyEnabled then activateChat() end end) + -- end) + -- -- if not newChatMode then + -- --guiService:AddKey("/") + -- --guiService.KeyPressed:connect(function(key) if key == "/" and hotKeyEnabled then activateChat() end end) + -- -- end + + -- chatBox.FocusLost:connect(function(enterPressed) + -- if enterPressed then + -- if chatBox.Text ~= "" then + -- local str = chatBox.Text + -- if string.sub(str, 1, 1) == "%" then + -- game.Players:TeamChat(string.sub(str, 2)) + -- else + -- game.Players:Chat(str) + -- end + -- end + -- end + -- chatBox.Text = "" + -- chatBox.Visible = false + -- chatButton.Visible = true + -- end) + -- robloxLock(chatBar) + -- return chatBar, toggleHotKey + -- end + + --Spawn a thread for the Save dialogs + local isSaveDialogSupported = pcall(function() + -- local var = game.LocalSaveEnabled + end) + if isSaveDialogSupported then + delay(0, function() + local saveDialogs = createSaveDialogs() + saveDialogs.Parent = gui + + game.RequestShutdown = function() + table.insert(centerDialogs, saveDialogs) + game.GuiService:AddCenterDialog( + saveDialogs, + Enum.CenterDialogType.QuitDialog, + --ShowFunction + function() + saveDialogs.Visible = true + end, + --HideFunction + function() + saveDialogs.Visible = false + end + ) + + return true + end + end) + end + + --Spawn a thread for the Report Abuse dialogs + delay(0, function() + createReportAbuseDialog().Parent = gui + waitForChild(gui, "UserSettingsShield") + waitForChild(gui.UserSettingsShield, "Settings") + waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle") + waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu") + waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, "ReportAbuseButton") + gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton.Active = true + end) + + --Spawn a thread for Chat Bar + --[[local success, luaChat = ]] + pcall(function() + return game.GuiService.UseLuaChat + end) + -- if success and luaChat then + + --[[delay(0, + function() + waitForChild(game, "Players") + waitForProperty(game.Players, "LocalPlayer") + + local advancedChatBarSupported = game.Players.LocalPlayer.ChatMode + local chatBar, toggleHotKey = createChatBar() + + [if advancedChatBarSupported then + local function toggleChatBar(chatMode) + if chatMode == Enum.ChatMode.Menu then + chatBar.Parent = nil + game.GuiService:SetGlobalSizeOffsetPixel(0,0) + toggleHotKey(false) + elseif chatMode == Enum.ChatMode.TextAndMenu then + --chatBar.Parent = gui + --game.GuiService:SetGlobalSizeOffsetPixel(0,-22) + toggleHotKey(true) + end + end + game.Players.LocalPlayer.Changed:connect( + function(prop) + if prop == "ChatMode" then + toggleChatBar(game.Players.LocalPlayer.ChatMode) + end + end) + toggleChatBar(game.Players.LocalPlayer.ChatMode) + else + --chatBar.Parent = gui + --game.GuiService:SetGlobalSizeOffsetPixel(0,-22) + end + end)]] + -- end + + local BurningManPlaceID = 41324860 + -- TODO: remove click to walk completely if testing shows we don't need it + -- Removes click to walk option from Burning Man + delay(0, function() + waitForChild(game, "NetworkClient") + waitForChild(game, "Players") + waitForProperty(game.Players, "LocalPlayer") + waitForProperty(game.Players.LocalPlayer, "Character") + waitForChild(game.Players.LocalPlayer.Character, "Humanoid") + waitForProperty(game, "PlaceId") + + if game.PlaceId == BurningManPlaceID then + game.Players.LocalPlayer.Character.Humanoid:SetClickToWalkEnabled(false) + game.Players.LocalPlayer.CharacterAdded:connect(function(character) + waitForChild(character, "Humanoid") + character.Humanoid:SetClickToWalkEnabled(false) + end) + end + end) +end --LoadLibrary if diff --git a/lua/48488235.lua b/lua/48488235.lua new file mode 100644 index 0000000..d798482 --- /dev/null +++ b/lua/48488235.lua @@ -0,0 +1,3229 @@ +--new playerlist by Zach Lindblad (fusroblox) +--contact him for any revisions/issues +-------------------- +-- Super Util +-------------------- + +--[[ local ADMINS = +{ + aceswayuphigh = 1, + adamintygum = 1, + afackler11 = 1, + aleverns = 1, + aquabot8 = 1, + arbolito = 1, + argforpirates = 1, + argonpirate = 1, + asmohdian = 1, + bellavour = 1, + blockhaak = 1, + brighteyes = 1, + briguy9876 = 1, + builderman = 1, + cdakkar = 1, + chiefjustus = 1, + chro = 1, + cmed = 1, + coatp0cketninja = 1, + codewriter = 1, + commandercrow = 1, + corgiparade = 1, + dapperbuffalo = 1, + dbapostle = 1, + deeana00 = 1, + doughtless = 1, + dunbar1138 = 1, + echodown = 1, + ffjosh = 1, + foyle = 1, + gemlocker = 1, + goddessnoob = 1, + gongfutiger = 1, + gordonrox24 = 1, + gorroth = 1, + grossinger = 1, + groundcontroll2 = 1, + hawkeyebandit = 1, + hawkington = 1, + ibanez2189 = 1, + iltalumi = 1, + inventx = 1, + jackssmirkingrevenge = 1, + jeditkacheff = 'http://www.roblox.com/asset/?id=134032333', + kbux = 1, + keith = 1, + limon = 1, + loopylens = 1, + lordrugdumph = 1, + majortom4321 = 1, + malcomso = 1, + maxvee = 1, + midwinterfires = 1, + mistersquirrel = 1, + morganic = 1, + motornerve = 1, + mrdoombringer = 1, + mse6 = 1, + newtrat = 1, + niquemonster = 1, + nobledragon = 1, + noob007 = 1, + nrawat1 = 1, + olive71 = 1, + onlytwentycharacters = 1, + orcasparkles = 1, + ostrichsized = 1, + phaedre = 1, + phil = 1, + pulmoesflor = 1, + raeglyn = 1, + rbadam = 1, + reesemcblox = 1, + robliu = 1, + roblowilson = 1, + robloxsai = 1, + roboyz = 1, + saurauss = 1, + screenme = 1, + scubasomething = 1, + seanthornton = 1, + shedletsky = 'http://www.roblox.com/asset/?id=105897927', + sickenedmonkey = 1, + slingshotjunkie = 1, + smeaferblox = 1, + soggoth = 1, + solarcrane = 1, + sooraya = 1, + sorcus = 'http://www.roblox.com/asset/?id=113059239', + squidcod = 1, + stickmasterluke = 1, + stuball = 1, + tabemono = 1, + tarabyte = 1, + thelorekt = 1, + thorasaur = 1, + timobius = 1, + tobotrobot = 1, + tone = 1, + totallynothere = 1, + totbl = 1, + twberg = 1, + vaiobot = 1, + varia = 1, + vladthefirst = 1, + wonderboy76 = 1, + xerolayne = 1, + yesth = 1, + yumyumcheerios = 1, + zeuxcg = 1, + zodiaczak = 1, + ['erik.cassel'] = 1, + ['david.baszucki'] = 1, + ['matt dusek'] = 1, +} --]] + +local ADMINS = { + taskmanager = 1, + Heliodex = 1, + multako = "http://www.roblox.com/asset/?id=6923328292", + mercury = 1, + pizzaboxer = "http://www.roblox.com/asset/?id=6917566633", +} + +local Images = { + bottomDark = "94691904", + bottomLight = "94691940", + midDark = "94691980", + midLight = "94692025", + LargeDark = "96098866", + LargeLight = "96098920", + LargeHeader = "96097470", + NormalHeader = "94692054", + LargeBottom = "96397271", + NormalBottom = "94754966", + DarkBluePopupMid = "97114905", + LightBluePopupMid = "97114905", + DarkPopupMid = "97112126", + LightPopupMid = "97109338", + DarkBluePopupTop = "97114838", + DarkBluePopupBottom = "97114758", + DarkPopupBottom = "100869219", + LightPopupBottom = "97109175", +} + +local BASE_TWEEN = 0.25 + +local MOUSE_DRAG_DISTANCE = 15 + +--[[ + Generic object Create function, which I am using to create Gui's + Thanks to Stravant! +--]] +local Obj = {} +function Obj.Create(guiType) + return function(data) + local obj = Instance.new(guiType) + for k, v in pairs(data) do + if type(k) == "number" then + v.Parent = obj + else + obj[k] = v + end + end + return obj + end +end + +--[[ + makes a full sized background for a guiobject + @Args: + imgName asset name of image to fill background + @Return: background gui object +--]] +function MakeBackgroundGuiObj(imgName) + return Obj.Create "ImageLabel" { + Name = "Background", + BackgroundTransparency = 1, + Image = imgName, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 1, 0), + } +end +--[[ turns 255 integer color value to a color3 --]] +function Color3I(r, g, b) + return Color3.new(r / 255, g / 255, b / 255) +end + +--[[ + Gets correct icon for builder's club status to display by name + @Args: + membershipType Enum of membership status + @Return: string of image asset +--]] +function getMembershipTypeIcon(membershipType, playerName) + if ADMINS[string.lower(playerName)] ~= nil then + if ADMINS[string.lower(playerName)] == 1 then + return "http://www.roblox.com/asset/?id=6923330951" + else + return ADMINS[string.lower(playerName)] + end + elseif membershipType == Enum.MembershipType.None then + return "" + elseif membershipType == Enum.MembershipType.BuildersClub then + return "rbxasset://textures/ui/TinyBcIcon.png" + elseif membershipType == Enum.MembershipType.TurboBuildersClub then + return "rbxasset://textures/ui/TinyTbcIcon.png" + elseif membershipType == Enum.MembershipType.OutrageousBuildersClub then + return "rbxasset://textures/ui/TinyObcIcon.png" + else + error("Unknown membershipType" .. membershipType) + end +end + +local function getFriendStatusIcon(friendStatus) + if friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend then + return "" + elseif friendStatus == Enum.FriendStatus.Friend then + return "http://www.roblox.com/asset/?id=99749771" + elseif friendStatus == Enum.FriendStatus.FriendRequestSent then + return "http://www.roblox.com/asset/?id=99776888" + elseif friendStatus == Enum.FriendStatus.FriendRequestReceived then + return "http://www.roblox.com/asset/?id=99776838" + else + error("Unknown FriendStatus: " .. friendStatus) + end +end + +--[[ + Utility function to create buttons for the popup menus + @Args: + nparent what to parent this button to + ntext text to put on this button + index number index of this entry in menu + last is this the last element of the popup menu + @Return: a popup menu button +--]] +function MakePopupButton(nparent, ntext, index, last) + local tobj = Obj.Create "ImageButton" { + Name = "ReportButton", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 1 * index, 0), + Size = UDim2.new(1, 0, 1, 0), + ZIndex = 7, + Obj.Create "TextLabel" { + Name = "ButtonText", + BackgroundTransparency = 1, + Position = UDim2.new(0.07, 0, 0.07, 0), + Size = UDim2.new(0.86, 0, 0.86, 0), + Parent = HeaderFrame, + Font = "ArialBold", + Text = ntext, + FontSize = "Size14", + TextScaled = true, + TextColor3 = Color3.new(1, 1, 1), + TextStrokeTransparency = 1, + ZIndex = 7, + }, + Parent = nparent, + } + if index == 0 then + tobj.Image = "http://www.roblox.com/asset/?id=97108784" + elseif last then + if index % 2 == 1 then + tobj.Image = "http://www.roblox.com/asset/?id=" .. Images["LightPopupBottom"] + else + tobj.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkPopupBottom"] + end + else + if index % 2 == 1 then + tobj.Image = "http://www.roblox.com/asset/?id=97112126" + else + tobj.Image = "http://www.roblox.com/asset/?id=97109338" + end + end + return tobj +end + +--[[ + obligatory wait for child function + @Args: + parent Parent object to look for child in + child name of child object to look for + @Return: object waited for +--]] +function WaitForChild(parent, child) + while not parent:FindFirstChild(child) do + wait() + debugprint(" child " .. parent.Name .. " waiting for " .. child) + end + return parent[child] +end + +--------------------------- +-- Workspace Objects +--------------------------- + +-- might want to move all this to an init function, wait for localplayer elsewhere +local Players = game:GetService "Players" +-- make sure this doesn't run on the server(it will if you dont do this) +while not Players.LocalPlayer do + Players.Changed:wait() +end + +local LocalPlayer = Players.LocalPlayer +local Mouse = LocalPlayer:GetMouse() + +local ScreenGui = Obj.Create "Frame" { + Name = "PlayerListScreen", + Size = UDim2.new(1, 0, 1, 0), + BackgroundTransparency = 1, + Parent = script.Parent, +} +local MainFrame = Obj.Create "Frame" { + Name = "LeaderBoardFrame", + Position = UDim2.new(1, -150, 0.005, 0), + Size = UDim2.new(0, 150, 0, 800), + BackgroundTransparency = 1, + Parent = ScreenGui, +} + +--frame used for expanding leaderstats when frame is 'focused' +local FocusFrame = Obj.Create "Frame" { + Name = "FocusFrame", + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 0, 100), + BackgroundTransparency = 1, + Active = true, + Parent = MainFrame, +} + +-- HEADER +local HeaderFrame = Obj.Create "Frame" { + Name = "Header", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 0.07, 0), + Parent = MainFrame, + MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=94692054", +} +local HeaderFrameHeight = HeaderFrame.Size.Y.Scale +local MaximizeButton = Obj.Create "ImageButton" { + Name = "MaximizeButton", + Active = true, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 1, 0), + Parent = HeaderFrame, +} +local HeaderName = Obj.Create "TextLabel" { + Name = "PlayerName", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0.01, 0), + Size = UDim2.new(0.98, 0, 0.38, 0), + Parent = HeaderFrame, + Font = "ArialBold", + Text = LocalPlayer.Name, + FontSize = "Size24", + --TextScaled = true, + TextColor3 = Color3.new(1, 1, 1), + TextStrokeColor3 = Color3.new(0, 0, 0), + TextStrokeTransparency = 0, + TextXAlignment = "Right", + TextYAlignment = "Center", +} +local HeaderScore = Obj.Create "TextLabel" { + Name = "PlayerScore", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0.4, 0), + Size = UDim2.new(0.98, 0, 0, 30), + Parent = HeaderFrame, + Font = "ArialBold", + Text = "", + FontSize = "Size24", + TextYAlignment = "Top", + --TextScaled = true, + TextColor3 = Color3.new(1, 1, 1), + TextStrokeTransparency = 1, + TextXAlignment = "Right", +} +-- BOTTOM +--used for shifting bottom frame for mouse over effects +local BottomShiftFrame = Obj.Create "Frame" { + Name = "BottomShiftFrame", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, HeaderFrameHeight, 0), + Size = UDim2.new(1, 0, 1, 0), + Parent = MainFrame, +} +local BottomFrame = Obj.Create "Frame" { + Name = "Bottom", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0.07, 0), + Size = UDim2.new(1, 0, 0.03, 0), + Parent = BottomShiftFrame, + MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=94754966", +} +local ExtendButton = Obj.Create "ImageButton" { + Name = "bigbutton", + Active = true, + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 1.5, 0), + ZIndex = 3, + Parent = BottomFrame, +} +local ExtendTab = Obj.Create "ImageButton" { + Name = "extendTab", + Active = true, + BackgroundTransparency = 1, + Image = "http://www.roblox.com/asset/?id=94692731", + Position = UDim2.new(0.608, 0, 0.3, 0), + Size = UDim2.new(0.3, 0, 0.7, 0), + Parent = BottomFrame, +} +local TopClipFrame = Obj.Create "Frame" { + Name = "ListFrame", + BackgroundTransparency = 1, + Position = UDim2.new(-1, 0, 0.07, 0), + Size = UDim2.new(2, 0, 1, 0), + Parent = MainFrame, + ClipsDescendants = true, +} +local BottomClipFrame = Obj.Create "Frame" { + Name = "BottomFrame", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, -0.8, 0), + Size = UDim2.new(1, 0, 1, 0), + Parent = TopClipFrame, + ClipsDescendants = true, +} +local ScrollBarFrame = Obj.Create "Frame" { + Name = "ScrollBarFrame", + BackgroundTransparency = 1, + Position = UDim2.new(0.987, 0, 0.8, 0), + Size = UDim2.new(0.01, 0, 0.2, 0), + Parent = BottomClipFrame, +} +local ScrollBar = Obj.Create "Frame" { + Name = "ScrollBar", + BackgroundTransparency = 0, + BackgroundColor3 = Color3.new(0.2, 0.2, 0.2), + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 0.5, 0), + ZIndex = 5, + Parent = ScrollBarFrame, +} +local ListFrame = Obj.Create "Frame" { + Name = "SubFrame", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0.8, 0), + Size = UDim2.new(1, 0, 1, 0), + Parent = BottomClipFrame, +} +local PopUpClipFrame = Obj.Create "Frame" { + Name = "PopUpFrame", + BackgroundTransparency = 1, + SizeConstraint = "RelativeXX", + Position = MainFrame.Position + UDim2.new(0, -150, 0, 0), + Size = UDim2.new(0, 150, 0, 800), + Parent = MainFrame, + ClipsDescendants = true, + ZIndex = 7, +} +local PopUpPanel = nil +local PopUpPanelTemplate = Obj.Create "Frame" { + Name = "Panel", + BackgroundTransparency = 1, + Position = UDim2.new(1, 0, 0, 0), + Size = UDim2.new(1, 0, 0.032, 0), + Parent = PopUpClipFrame, +} + +local StatTitles = Obj.Create "Frame" { + Name = "StatTitles", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 1, -10), + Size = UDim2.new(1, 0, 0, 0), + Parent = HeaderFrame, +} + +local IsMinimized = Instance.new "BoolValue" +local IsMaximized = Instance.new "BoolValue" +local IsTabified = Instance.new "BoolValue" +local AreNamesExpanded = Instance.new "BoolValue" + +local MiddleTemplate = Obj.Create "Frame" { + Name = "MidTemplate", + BackgroundTransparency = 1, + Position = UDim2.new(100, 0, 0.07, 0), + Size = UDim2.new(0.5, 0, 0.025, 0), --UDim2.new(1, 0, .03, 0), + Obj.Create "ImageLabel" { + Name = "BCLabel", + Active = true, + BackgroundTransparency = 1, + Position = UDim2.new(0.005, 5, 0.20, 0), + Size = UDim2.new(0, 16, 0, 16), + SizeConstraint = "RelativeYY", + Image = "", + ZIndex = 3, + }, + Obj.Create "ImageLabel" { + Name = "FriendLabel", + Active = true, + BackgroundTransparency = 1, + Position = UDim2.new(0.005, 5, 0.15, 0), + Size = UDim2.new(0, 16, 0, 16), + SizeConstraint = "RelativeYY", + Image = "", + ZIndex = 3, + }, + Obj.Create "ImageButton" { + Name = "ClickListener", + Active = true, + BackgroundTransparency = 1, + Position = UDim2.new(0.005, 1, 0, 0), + Size = UDim2.new(0.96, 0, 1, 0), + ZIndex = 3, + }, + Obj.Create "Frame" { + Name = "TitleFrame", + BackgroundTransparency = 1, + Position = UDim2.new(0.01, 0, 0, 0), + Size = UDim2.new(0, 140, 1, 0), + ClipsDescendants = true, + Obj.Create "TextLabel" { + Name = "Title", + BackgroundTransparency = 1, + Position = UDim2.new(0, 5, 0, 0), + Size = UDim2.new(100, 0, 1, 0), + Font = "Arial", + FontSize = "Size14", + TextColor3 = Color3.new(1, 1, 1), + TextXAlignment = "Left", + TextYAlignment = "Center", + ZIndex = 3, + }, + }, + + Obj.Create "TextLabel" { + Name = "PlayerScore", + BackgroundTransparency = 1, + Position = UDim2.new(0, 0, 0, 0), + Size = UDim2.new(1, 0, 1, 0), + Font = "ArialBold", + Text = "", + FontSize = "Size14", + TextColor3 = Color3.new(1, 1, 1), + TextXAlignment = "Right", + TextYAlignment = "Center", + ZIndex = 3, + }, + --Obj.Create'IntValue'{Name = 'ID'}, + --Obj.Create'ObjectValue'{Name = 'Player'}, + --Obj.Create'IntValue'{Name = 'Score'}, + ZIndex = 3, +} +local MiddleBGTemplate = Obj.Create "Frame" { + Name = "MidBGTemplate", + BackgroundTransparency = 1, + Position = UDim2.new(100, 0, 0.07, 0), + Size = UDim2.new(0.5, 0, 0.025, 0), --UDim2.new(1, 0, .03, 0), + MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=94692025", +} + +-- REPORT ABUSE OBJECTS + +local ReportAbuseShield = Obj.Create "TextButton" { + Name = "ReportAbuseShield", + Text = "", + AutoButtonColor = false, + Active = true, + Visible = true, + Size = UDim2.new(1, 0, 1, 0), + BackgroundColor3 = Color3I(51, 51, 51), + BorderColor3 = Color3I(27, 42, 53), + BackgroundTransparency = 1, +} + +local ReportAbuseFrame = Obj.Create "Frame" { + Name = "Settings", + Position = UDim2.new(0.5, -250, 0.5, -200), + Size = UDim2.new(0, 500, 0, 400), + BackgroundTransparency = 1, + Active = true, + Parent = ReportAbuseShield, +} + +local AbuseSettingsFrame = Obj.Create "Frame" { + Name = "ReportAbuseStyle", + Size = UDim2.new(1, 0, 1, 0), + Active = true, + BackgroundTransparency = 1, + MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96488767", -- 96480351'), + Obj.Create "TextLabel" { + Name = "Title", + Text = "Report Abuse", + TextColor3 = Color3I(221, 221, 221), + Position = UDim2.new(0.5, 0, 0, 30), + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size36, + }, + Obj.Create "TextLabel" { + Name = "Description", + Text = "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action.", + TextColor3 = Color3I(221, 221, 221), + Position = UDim2.new(0.01, 0, 0, 55), + Size = UDim2.new(0.99, 0, 0, 40), + BackgroundTransparency = 1, + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + TextWrap = true, + TextXAlignment = Enum.TextXAlignment.Left, + TextYAlignment = Enum.TextYAlignment.Top, + }, + Obj.Create "TextLabel" { + Name = "AbuseLabel", + Text = "What did they do?", + Font = Enum.Font.Arial, + BackgroundTransparency = 1, + FontSize = Enum.FontSize.Size18, + Position = UDim2.new(0.025, 0, 0, 140), + Size = UDim2.new(0.4, 0, 0, 36), + TextColor3 = Color3I(255, 255, 255), + TextXAlignment = Enum.TextXAlignment.Left, + }, + Obj.Create "TextLabel" { + Name = "ShortDescriptionLabel", + Text = "Short Description: (optional)", + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + Position = UDim2.new(0.025, 0, 0, 180), + Size = UDim2.new(0.95, 0, 0, 36), + TextColor3 = Color3I(255, 255, 255), + TextXAlignment = Enum.TextXAlignment.Left, + BackgroundTransparency = 1, + }, + Obj.Create "TextLabel" { + Name = "ReportingPlayerLabel", + Text = "Reporting Player", + BackgroundTransparency = 1, + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + Position = UDim2.new(0.025, 0, 0, 100), + Size = UDim2.new(0.95, 0, 0, 36), + TextColor3 = Color3I(255, 255, 255), + TextXAlignment = Enum.TextXAlignment.Left, + Parent = AbuseSettingsFrame, + }, + + Parent = ReportAbuseFrame, +} + +local AbusePlayerLabel = Obj.Create "TextLabel" { + Name = "PlayerLabel", + Text = "", + BackgroundTransparency = 1, + Font = Enum.Font.ArialBold, + FontSize = Enum.FontSize.Size18, + Position = UDim2.new(0.025, 0, 0, 100), + Size = UDim2.new(0.95, 0, 0, 36), + TextColor3 = Color3I(255, 255, 255), + TextXAlignment = Enum.TextXAlignment.Right, + Parent = AbuseSettingsFrame, +} + +local SubmitReportButton = Obj.Create "ImageButton" { + Name = "SubmitReportBtn", + Active = false, + BackgroundTransparency = 1, + Position = UDim2.new(0.5, -200, 1, -80), + Size = UDim2.new(0, 150, 0, 50), + AutoButtonColor = false, + Image = "http://www.roblox.com/asset/?id=96502438", -- 96501119', + Parent = AbuseSettingsFrame, +} + +local CancelReportButton = Obj.Create "ImageButton" { + Name = "CancelBtn", + BackgroundTransparency = 1, + Position = UDim2.new(0.5, 50, 1, -80), + Size = UDim2.new(0, 150, 0, 50), + AutoButtonColor = true, + Image = "http://www.roblox.com/asset/?id=96500683", + Parent = AbuseSettingsFrame, +} + +local AbuseDescriptionWrapper = Obj.Create "Frame" { + Name = "AbuseDescriptionWrapper", + Position = UDim2.new(0.025, 0, 0, 220), + Size = UDim2.new(0.95, 0, 1, -310), + BackgroundColor3 = Color3I(0, 0, 0), + BorderSizePixel = 0, + Parent = AbuseSettingsFrame, +} + +local AbuseDescriptionBox + +local OriginalAbuseDescriptionBox = Obj.Create "TextBox" { + Name = "TextBox", + Text = "", + ClearTextOnFocus = false, + Font = Enum.Font.Arial, + FontSize = Enum.FontSize.Size18, + Position = UDim2.new(0, 3, 0, 3), + Size = UDim2.new(1, -6, 1, -6), + TextColor3 = Color3I(255, 255, 255), + TextXAlignment = Enum.TextXAlignment.Left, + TextYAlignment = Enum.TextYAlignment.Top, + TextWrap = true, + BackgroundColor3 = Color3I(0, 0, 0), + BorderSizePixel = 0, +} + +local CalmingAbuseBox = Obj.Create "Frame" { + Name = "AbuseFeedbackBox", + BackgroundTransparency = 1, + Position = UDim2.new(0.25, 0, 0.300000012, 0), + Size = UDim2.new(0.5, 0, 0.370000005, 0), + MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96506233", + Obj.Create "TextLabel" { + Name = "Header", + Position = UDim2.new(0, 10, 0.05, 0), + Size = UDim2.new(1, -30, 0.15, 0), + TextScaled = true, + BackgroundTransparency = 1, + TextXAlignment = Enum.TextXAlignment.Center, + TextYAlignment = Enum.TextYAlignment.Top, + Text = "Thanks for your report!", + TextColor3 = Color3.new(1, 1, 1), + FontSize = Enum.FontSize.Size48, + Font = "ArialBold", + }, + Obj.Create "TextLabel" { + Name = "content", + Position = UDim2.new(0, 10, 0.20, 0), + Size = UDim2.new(1, -30, 0.40, 0), + TextScaled = true, + BackgroundTransparency = 1, + TextColor3 = Color3.new(1, 1, 1), + Text = "Our moderators will review the chat logs and determine what happened. The other user is probably just trying to make you mad.\n\nIf anyone used swear words, inappropriate language, or threatened you in real life, please report them for Bad Words or Threats", + TextWrapped = true, + TextYAlignment = Enum.TextYAlignment.Top, + FontSize = Enum.FontSize.Size24, + Font = "Arial", + }, + Obj.Create "ImageButton" { + Name = "OkButton", + BackgroundTransparency = 1, + Position = UDim2.new(0.5, -75, 1, -80), + Size = UDim2.new(0, 150, 0, 50), + AutoButtonColor = true, + Image = "http://www.roblox.com/asset/?id=96507959", + }, +} +local NormalAbuseBox = Obj.Create "Frame" { + Name = "AbuseFeedbackBox", + BackgroundTransparency = 1, + Position = UDim2.new(0.25, 0, 0.300000012, 0), + Size = UDim2.new(0.5, 0, 0.370000005, 0), + MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96506233", + Obj.Create "TextLabel" { + Name = "Header", + Position = UDim2.new(0, 10, 0.05, 0), + Size = UDim2.new(1, -30, 0.15, 0), + TextScaled = true, + BackgroundTransparency = 1, + TextColor3 = Color3.new(1, 1, 1), + TextXAlignment = Enum.TextXAlignment.Center, + TextYAlignment = Enum.TextYAlignment.Top, + Text = "Thanks for your report!", + FontSize = Enum.FontSize.Size48, + Font = "ArialBold", + }, + Obj.Create "TextLabel" { + Name = "content", + Position = UDim2.new(0, 10, 0.20, 0), + Size = UDim2.new(1, -30, 0.15, 0), + TextScaled = true, + BackgroundTransparency = 1, + TextColor3 = Color3.new(1, 1, 1), + Text = "Our moderators will review the chat logs and determine what happened.", + TextWrapped = true, + TextYAlignment = Enum.TextYAlignment.Top, + FontSize = Enum.FontSize.Size24, + Font = "Arial", + }, + Obj.Create "ImageButton" { + Name = "OkButton", + BackgroundTransparency = 1, + Position = UDim2.new(0.5, -75, 1, -80), + Size = UDim2.new(0, 150, 0, 50), + AutoButtonColor = true, + Image = "http://www.roblox.com/asset/?id=96507959", + }, +} + +local BigButton = Instance.new "ImageButton" +BigButton.Size = UDim2.new(1, 0, 1, 0) +BigButton.BackgroundTransparency = 1 +BigButton.ZIndex = 8 +BigButton.Visible = false +--BigButton.Active=false +BigButton.Parent = ScreenGui + +local debugFrame = Obj.Create "Frame" { + Name = "debugframe", + --Position = UDim2.new(0, 0, 0, 0), + --Size = UDim2.new(0, 150, 0, 800),--0.99000001 + --BackgroundTransparency = 1, + BackgroundTransparency = 1, + Position = UDim2.new(0.25, 0, 0.300000012, 0), + Size = UDim2.new(0.5, 0, 0.370000005, 0), + MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96506233", +} +local debugplayers = Obj.Create "TextLabel" { + BackgroundTransparency = 0.8, + Position = UDim2.new(0, 0, 0.01, 0), + Size = UDim2.new(1, 0, 0.5, 0), + Parent = debugFrame, + Font = "ArialBold", + Text = "--", + FontSize = "Size14", + TextWrapped = true, + TextColor3 = Color3.new(1, 1, 1), + TextStrokeColor3 = Color3.new(0, 0, 0), + TextStrokeTransparency = 0, + TextXAlignment = "Right", + TextYAlignment = "Center", +} +local debugOutput = Obj.Create "TextLabel" { + BackgroundTransparency = 0.8, + Position = UDim2.new(0, 0, 0.5, 0), + Size = UDim2.new(1, 0, 0.5, 0), + Parent = debugFrame, + Font = "ArialBold", + Text = "--", + FontSize = "Size14", + TextWrapped = true, + TextColor3 = Color3.new(1, 1, 1), + TextStrokeColor3 = Color3.new(0, 0, 0), + TextStrokeTransparency = 0, + TextXAlignment = "Right", + TextYAlignment = "Center", +} + +--[[ + simple function to toggle the display of debug output +--]] +local DebugPrintEnabled = true +function debugprint(str) + --print(str) + if DebugPrintEnabled then + debugOutput.Text = str + end +end + +------------------------- +-- Script objects +------------------------- +local RbxGui = assert(LoadLibrary "RbxGui") + +-- number of entries to show if you click minimize +local DefaultEntriesOnScreen = 8 + +for _, i in pairs(Images) do + Game:GetService("ContentProvider"):Preload("http://www.roblox.com/asset/?id=" .. i) +end + +-- ordered array of 'score data', each entry has: +-- Name(String) +-- Priority(number) +-- IsPrimary (bool, should it be shown in upper right) +-- MaxLength (integer, of the length of the longest element for this column) +local ScoreNames = {} +-- prevents flipping in playerlist panels +local AddId = 0 +-- intermediate table form of all player entries in format of: +-- Frame +-- Player +-- Score +-- ID +-- MyTeam (team ENRTY(not actual team) I am currently on) +local PlayerFrames = {} +-- intermediate ordered frame array, composed of Entrys of +-- Frame +-- MyTeam (my team object) +-- MyPlayers ( an ordered array of all player frames in team ) +-- AutoHide (bool saying whether it should be hidden) +-- IsHidden (bool) +-- ID (int to prevent flipping out of leaderboard, fun times) +local TeamFrames = {} +-- one special entry from teamFrames, for unaffiliated players, only shown if players non - empty +local NeutralTeam = nil + +-- final 'to be displayed' list of frames +local MiddleFrames = {} +local MiddleFrameBackgrounds = {} +-- time of last click +local LastClick = 0 +local ButtonCooldown = 0.25 + +local OnIos = false +pcall(function() + OnIos = Game:GetService("UserInputService").TouchEnabled +end) + +-- you get 200 of x screen space per stat added, start width 16% +local BaseScreenXSize = 150 +local SpacingPerStat = 10 --spacing between stats + +local MaximizedBounds = UDim2.new(0.5, 0, 1, 0) +local MaximizedPosition = UDim2.new(0.25, 0, 0.1, 0) +local NormalBounds = UDim2.new(0, BaseScreenXSize, 0, 800) +local NormalPosition = UDim2.new(1, -BaseScreenXSize, 0.005, 0) + +--free space to give last stat on the right +local RightEdgeSpace = -0.04 + +-- where the scroll par currently is positioned + +local DefaultBottomClipPos = BottomClipFrame.Position.Y.Scale + +local SelectedPlayerEntry = nil +local SelectedPlayer = nil + +-- locks(semaphores) for stopping race conditions +local AddingFrameLock = false +local AddingStatLock = false +local BaseUpdateLock = false +local WaitForClickLock = false +local InPopupWaitForClick = false +local PlayerChangedLock = false +local NeutralTeamLock = false + +local ScrollWheelConnections = {} + +local DefaultListSize = 8 +if not OnIos then + DefaultListSize = 12 +end +local DidMinimizeDrag = false + +--local PlaceCreatorId=game.CreatorId + +-- report abuse objects +local AbuseName +local Abuses = { + "Bad Words or Threats", + "Bad Username", + "Talking about Dating", + "Account Trading or Sharing", + "Asking Personal Questions", + "Rude or Mean Behavior", + "False Reporting Me", +} +local UpdateAbuseFunction +local AbuseDropDown + +local PrivilegeLevel = { + Owner = 255, + Admin = 240, + Member = 128, + Visitor = 10, + Banned = 0, +} + +local IsPersonalServer = not not game.Workspace:FindFirstChild "PSVariable" + +game.Workspace.ChildAdded:connect(function(nchild) + if nchild.Name == "PSVariable" and nchild:IsA "BoolValue" then + IsPersonalServer = true + end +end) +------------------------------- +-- Static Functions +------------------------------- +-- function GetTotalEntries() +-- return math.min(#MiddleFrameBackgrounds, DefaultEntriesOnScreen) +-- end + +-- function GetEntryListLength() +-- local numEnts = #PlayerFrames + #TeamFrames +-- if NeutralTeam then +-- numEnts = numEnts + 1 +-- end +-- return numEnts +-- end + +function AreAllEntriesOnScreen() + return #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale <= 1 + DefaultBottomClipPos +end + +-- function GetLengthOfVisbleScroll() +-- return 1 + DefaultBottomClipPos +-- end + +function GetMaxScroll() + return DefaultBottomClipPos * -1 +end +-- can be optimized by caching when this varible changes +function GetMinScroll() + if AreAllEntriesOnScreen() then + return GetMaxScroll() + else + return (GetMaxScroll() - (#MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale)) + (1 + DefaultBottomClipPos) + end +end + +function AbsoluteToPercent(x, y) + return Vector2.new(x, y) / ScreenGui.AbsoluteSize +end +--[[ + tweens property of element from starta to enda over length of time + Warning: should be put in a Spawn call + @Args: + element textobject to tween transparency on + propName + starta alpha to start tweening + enda alpha to end tweening on + length how many seconds to spend tweening +--]] +function TweenProperty(obj, propName, inita, enda, length) + local startTime = tick() + while tick() - startTime < length do + obj[propName] = ((enda - inita) * ((tick() - startTime) / length)) + inita + wait(1 / 30) + end + obj[propName] = enda +end +--[[ + UGLY UGLY HACK FUNCTION + replace with some sort of global input catching A.S.A. FREAKING P. + creates a fullsize gui element to catch next mouse up event(completeing a click) + @Args: + frameParent Object to parent fullscreen gui to + polledFunction function to call on mouse moved events in this gui + exitFunction function to call when click event is fired +--]] + +function WaitForClick(frameParent, polledFunction, exitFunction) + if WaitForClickLock then + return + end + WaitForClickLock = true + local connection, connection2 + connection = BigButton.MouseButton1Up:connect(function(nx, ny) + exitFunction(nx, ny) + BigButton.Visible = false + connection:disconnect() + if connection2 then + connection2:disconnect() + end + --debugprint('mouse up!') + end) + connection2 = BigButton.MouseMoved:connect(function(nx, ny) + polledFunction(nx, ny) + end) + + --debugprint('waiting for click!') + BigButton.Visible = true + BigButton.Active = true + BigButton.Parent = frameParent + frameParent.AncestryChanged:connect(function(child, nparent) + if child == frameParent and nparent == nil then + exitFunction(nx, ny) + BigButton.Visible = false + connection:disconnect() + connection2:disconnect() + debugprint "forced out of wait for click" + end + end) + WaitForClickLock = false +end + +--------------------------- +--Personal Server Handling +--------------------------- +--[[ + returns privlage level based on integer rank + Note: these privilege levels seem completely arbitrary, but no documentation exists + this is all from the old player list, really weird + @Args: + rank Integer rank value for player + @Return Normalized integer value for rank? +--]] +-- function GetPrivilegeType(rank) +-- if rank <= PrivilegeLevel["Banned"] then +-- return PrivilegeLevel["Banned"] +-- elseif rank <= PrivilegeLevel["Visitor"] then +-- return PrivilegeLevel["Visitor"] +-- elseif rank <= PrivilegeLevel["Member"] then +-- return PrivilegeLevel["Member"] +-- elseif rank <= PrivilegeLevel["Admin"] then +-- return PrivilegeLevel["Admin"] +-- else +-- return PrivilegeLevel["Owner"] +-- end +-- end + +--[[ + gives a player a new privilage rank + Note: Very odd that I have to use loops with this instead of directly setting the rank + but no documentation for personal server service exists + @Args: + player player to change rank of + nrank new integer rank to give player +--]] +function SetPrivilegeRank(player, nrank) + while player.PersonalServerRank < nrank do + game:GetService("PersonalServerService"):Promote(player) + end + while player.PersonalServerRank > nrank do + game:GetService("PersonalServerService"):Demote(player) + end +end +--[[ + called when player selects new privilege level from popup menu + @Args: + player player to set privileges on + nlevel new privilege level for this player +--]] +function OnPrivilegeLevelSelect(player, nlevel, BanPlayerButton, VisitorButton, MemberButton, AdminButton) + debugprint "setting privilege level" + SetPrivilegeRank(player, nlevel) + HighlightMyRank(player, BanPlayerButton, VisitorButton, MemberButton, AdminButton) +end + +--[[ + Highlights current rank of this player in the popup menu + @Args: + player Player to check for rank on +--]] +function HighlightMyRank(player, BanPlayerButton, VisitorButton, MemberButton, AdminButton) + BanPlayerButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightPopupMid"] + VisitorButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkPopupMid"] + MemberButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightPopupMid"] + AdminButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkPopupBottom"] + + local rank = player.PersonalServerRank + if rank <= PrivilegeLevel["Banned"] then + BanPlayerButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightBluePopupMid"] + elseif rank <= PrivilegeLevel["Visitor"] then + VisitorButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkBluePopupMid"] + elseif rank <= PrivilegeLevel["Member"] then + MemberButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightBluePopupMid"] + elseif rank <= PrivilegeLevel["Admin"] then + AdminButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkBluePopupBottom"] + end +end + +-------------------------- +-- Report abuse handling +-------------------------- +--[[ + does final reporting of abuse on selected player, calls closeAbuseDialog +--]] +function OnSubmitAbuse() + if SubmitReportButton.Active then + if AbuseName and SelectedPlayer then + AbuseSettingsFrame.Visible = false + game.Players:ReportAbuse(SelectedPlayer, AbuseName, AbuseDescriptionBox.Text) + if AbuseName == "Rude or Mean Behavior" or AbuseName == "False Reporting Me" then + CalmingAbuseBox.Parent = ReportAbuseShield + else + debugprint "opening abuse box" + NormalAbuseBox.Parent = ReportAbuseShield + end + else + CloseAbuseDialog() + end + end +end + +--[[ + opens the abuse dialog, initialises text to display selectedplayer +--]] +function OpenAbuseDialog() + debugprint "adding report dialog" + AbusePlayerLabel.Text = SelectedPlayer.Name + --AbuseDescriptionBox.Text = "" + PopUpPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) + AbuseDescriptionBox = OriginalAbuseDescriptionBox:Clone() + AbuseDescriptionBox.Parent = AbuseDescriptionWrapper + ReportAbuseShield.Parent = ScreenGui + ClosePopUpPanel() +end +--[[ + resets and closes abuse dialog +--]] +function CloseAbuseDialog() + AbuseName = nil + SubmitReportButton.Active = false + SubmitReportButton.Image = "http://www.roblox.com/asset/?id=96502438" -- 96501119', + AbuseDescriptionBox:Destroy() + CalmingAbuseBox.Parent = nil + NormalAbuseBox.Parent = nil + ReportAbuseShield.Parent = nil + AbuseSettingsFrame.Visible = true +end + +--[[ + creates dropdownbox, registers all listeners for abuse dialog +--]] +function InitReportAbuse() + UpdateAbuseFunction = function(abuseText) + AbuseName = abuseText + if AbuseName and SelectedPlayer then + SubmitReportButton.Active = true + SubmitReportButton.Image = "http://www.roblox.com/asset/?id=96501119" + end + end + + AbuseDropDown, _ = RbxGui.CreateDropDownMenu(Abuses, UpdateAbuseFunction, true) + AbuseDropDown.Name = "AbuseComboBox" + AbuseDropDown.Position = UDim2.new(0.425, 0, 0, 142) + AbuseDropDown.Size = UDim2.new(0.55, 0, 0, 32) + AbuseDropDown.Parent = AbuseSettingsFrame + + CancelReportButton.MouseButton1Click:connect(CloseAbuseDialog) + SubmitReportButton.MouseButton1Click:connect(OnSubmitAbuse) + + CalmingAbuseBox:FindFirstChild("OkButton").MouseButton1Down:connect(CloseAbuseDialog) + NormalAbuseBox:FindFirstChild("OkButton").MouseButton1Down:connect(CloseAbuseDialog) +end + +------------------------------------- +-- Friend/unfriending +------------------------------------- +--[[ + gets enum val of friend status, uses pcall for some reason?(from old playerlist) + @Args: + player player object to check if friends with + @Return: enum of friend status +--]] +local function GetFriendStatus(player) + if player == game.Players.LocalPlayer then + return Enum.FriendStatus.NotFriend + else + local success, result = pcall(function() + return game.Players.LocalPlayer:GetFriendStatus(player) + end) + if success then + return result + else + return Enum.FriendStatus.NotFriend + end + end +end + +--[[ + when friend button is clicked, tries to take appropriate action, + based on current friend status with SelectedPlayer +--]] +function OnFriendButtonSelect() + local friendStatus = GetFriendStatus(SelectedPlayer) + if friendStatus == Enum.FriendStatus.Friend then + LocalPlayer:RevokeFriendship(SelectedPlayer) + elseif + friendStatus == Enum.FriendStatus.Unknown + or friendStatus == Enum.FriendStatus.NotFriend + or friendStatus == Enum.FriendStatus.FriendRequestSent + or friendStatus == Enum.FriendStatus.FriendRequestReceived + then + LocalPlayer:RequestFriendship(SelectedPlayer) + end + --PersonalServerPanel:TweenPosition(UDim2.new(1,0,0,0), "Out", "Quad", .5,true) + ClosePopUpPanel() + --PopUpPanel:TweenPosition(UDim2.new(1,0,0,0), "Out", "Linear", BASE_TWEEN,true) +end + +function OnFriendRefuseButtonSelect() + LocalPlayer:RevokeFriendship(SelectedPlayer) + ClosePopUpPanel() + PopUpPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) +end +------------------------------------ +-- Player Entry Handling +------------------------------------ +--[[ + used by lua's table.sort to sort player entries +--]] +function PlayerSortFunction(a, b) + -- prevents flipping out leaderboard + if a["Score"] == b["Score"] then + return a["Player"].Name:upper() < b["Player"].Name:upper() + end + if not a["Score"] then + return false + end + if not b["Score"] then + return true + end + return a["Score"] < b["Score"] +end + +--------------------------------- +-- Stat Handling +--------------------------------- +-- removes and closes all leaderboard stuffs +function BlowThisPopsicleStand() + --ScreenGui:Destroy() + --script:Destroy() + --time to make the fanboys rage... + Tabify() +end +--[[ + used by lua's table.sort to prioritize score entries +--]] +function StatSort(a, b) + -- primary stats should be shown before all others + if a.IsPrimary ~= b.IsPrimary then + return a.IsPrimary + end + -- if priorities are equal, then return the first added one + if a.Priority == b.Priority then + return a.AddId < b.AddId + end + return a.Priority < b.Priority +end +--[[ + doing WAAY too much here, for optimization update only your team + @Args: + playerEntry Entry of player who had a stat change + property Name of stat changed +--]] +function StatChanged(_, _) --playerEntry, property) + -- if(playerEntry['MyTeam']) then + -- UpdateSingleTeam(playerEntry['MyTeam']) + -- else + BaseUpdate() + -- end +end +--[[ + Called when stat is added + if playerEntry is localplayer, will add to score names and re-sort the stats, and resize the width of the leaderboard + for all players, will add a listener for if this stat changes + if stat is a string value, crashes the leaderboard + Note:change crash to a 'tabify' leaderboard later + @Args: + nchild new child value to leaderstats + playerEntry entry this stat was added to +--]] +function StatAdded(nchild, playerEntry) + -- dont re - add a leaderstat I alreday have + while AddingStatLock do + debugprint "in stat added function lock" + wait(1 / 30) + end + AddingStatLock = true + if + not ( + nchild:IsA "StringValue" + or nchild:IsA "IntValue" + or nchild:IsA "BoolValue" + or nchild:IsA "NumberValue" + or nchild:IsA "DoubleConstrainedValue" + or nchild:IsA "IntConstrainedValue" + ) + then + BlowThisPopsicleStand() + else + local haveScore = false + for _, i in pairs(ScoreNames) do + if i["Name"] == nchild.Name then + haveScore = true + end + end + if not haveScore then + local nstat = {} + nstat["Name"] = nchild.Name + nstat["Priority"] = 0 + if nchild:FindFirstChild "Priority" then + nstat["Priority"] = nchild.Priority + end + nstat["IsPrimary"] = false + if nchild:FindFirstChild "IsPrimary" then + nstat["IsPrimary"] = true + end + nstat.AddId = AddId + AddId = AddId + 1 + table.insert(ScoreNames, nstat) + table.sort(ScoreNames, StatSort) + if not StatTitles:FindFirstChild(nstat["Name"]) then + CreateStatTitle(nstat["Name"]) + end + UpdateMaximize() + end + end + AddingStatLock = false + StatChanged(playerEntry) + nchild.Changed:connect(function(property) + StatChanged(playerEntry, property) + end) +end +--returns whether any of the existing players has this stat +function DoesStatExist(statName, exception) + for _, playerf in pairs(PlayerFrames) do + if + playerf["Player"] ~= exception + and playerf["Player"]:FindFirstChild "leaderstats" + and playerf["Player"].leaderstats:FindFirstChild(statName) + then + --print('player:' .. playerf['Player'].Name ..' has stat') + return true + end + end + return false +end + +--[[ + Called when stat is removed from player + for all players, destroys the stat frame associated with this value, + then calls statchanged(to resize frame) + if playerEntry==localplayer, will remove from scorenames + @Args: + nchild ___value to be removed + playerEntry entry of player value is being removed from +--]] +function StatRemoved(nchild, playerEntry) + while AddingStatLock do + debugprint "In Adding Stat Lock1" + wait(1 / 30) + end + AddingStatLock = true + if playerEntry["Frame"]:FindFirstChild(nchild.Name) then + debugprint "Destroyed frame!" + playerEntry["Frame"][nchild.Name].Parent = nil + end + if not DoesStatExist(nchild.Name, playerEntry["Player"]) then + for i, val in ipairs(ScoreNames) do + if val["Name"] == nchild.Name then + table.remove(ScoreNames, i) + if StatTitles:FindFirstChild(nchild.Name) then + StatTitles[nchild.Name]:Destroy() + end + for _, teamf in pairs(TeamFrames) do + if teamf["Frame"]:FindFirstChild(nchild.Name) then + teamf["Frame"][nchild.Name]:Destroy() + end + end + end + end + end + AddingStatLock = false + StatChanged(playerEntry) +end +--[[ + clears all stats from a given playerEntry + used when leaderstats are removed, or when new leaderstats are added(for weird edge case)+ +--]] +function RemoveAllStats(playerEntry) + for _, val in ipairs(ScoreNames) do + StatRemoved(val, playerEntry) + end +end + +function GetScoreValue(score) + if score:IsA "DoubleConstrainedValue" or score:IsA "IntConstrainedValue" then + return score.ConstrainedValue + elseif score:IsA "BoolValue" then + if score.Value then + return 1 + else + return 0 + end + else + return score.Value + end +end +--[[ + +--]] +function MakeScoreEntry(entry, scoreval, panel) + if not panel:FindFirstChild "PlayerScore" then + return + end + local nscoretxt = panel:FindFirstChild("PlayerScore"):Clone() + local thisScore = nil + --here lies the resting place of a once great and terrible bug + --may its treachery never be forgoten, lest its survivors fall for it again + --RIP the leaderstat bug, oct 2012-nov 2012 + wait() + if + entry["Player"]:FindFirstChild "leaderstats" and entry["Player"].leaderstats:FindFirstChild(scoreval["Name"]) + then + thisScore = entry["Player"]:FindFirstChild("leaderstats"):FindFirstChild(scoreval["Name"]) + else + return + end + + if not entry["Player"].Parent then + return + end + + nscoretxt.Name = scoreval["Name"] + nscoretxt.Text = tostring(GetScoreValue(thisScore)) + if scoreval["Name"] == ScoreNames[1]["Name"] then + debugprint "changing score" + entry["Score"] = GetScoreValue(thisScore) + if entry["Player"] == LocalPlayer then + HeaderScore.Text = tostring(GetScoreValue(thisScore)) + end + end + + thisScore.Changed:connect(function() + if not thisScore.Parent then + return + end + if scoreval["Name"] == ScoreNames[1]["Name"] then + entry["Score"] = GetScoreValue(thisScore) + if entry["Player"] == LocalPlayer then + HeaderScore.Text = tostring(GetScoreValue(thisScore)) + end + end + nscoretxt.Text = tostring(GetScoreValue(thisScore)) + BaseUpdate() + end) + return nscoretxt +end + +function CreateStatTitle(statName) + local ntitle = MiddleTemplate:FindFirstChild("PlayerScore"):Clone() + ntitle.Name = statName + ntitle.Text = statName + -- ntitle + if IsMaximized.Value then + ntitle.TextTransparency = 0 + else + ntitle.TextTransparency = 1 + end + ntitle.Parent = StatTitles +end + +function RecreateScoreColumns(ptable) + while AddingStatLock do + debugprint "In Adding Stat Lock2" + wait(1 / 30) + end + AddingStatLock = true + local Xoffset = 5 --15 --current offset from Right + local maxXOffset = Xoffset + local MaxSizeColumn = 0 --max size for this column + + -- foreach known leaderstat + for j = #ScoreNames, 1, -1 do + local scoreval = ScoreNames[j] + + MaxSizeColumn = 0 + -- for each entry in this player table + for _, entry in ipairs(ptable) do + local panel = entry["Frame"] + local tplayer = entry["Player"] + -- if this panel does not have an element named after this stat + if not panel:FindFirstChild(scoreval["Name"]) then + -- make an entry for this object + local nentry = MakeScoreEntry(entry, scoreval, panel) + if nentry then + debugprint("adding " .. nentry.Name .. " to " .. entry["Player"].Name) + nentry.Parent = panel + -- add score to team + if + entry["MyTeam"] + and entry["MyTeam"] ~= NeutralTeam + and not entry["MyTeam"]["Frame"]:FindFirstChild(scoreval["Name"]) + then + local ntitle = nentry:Clone() + --ntitle.TextXAlignment = 'Right' + ntitle.Parent = entry["MyTeam"]["Frame"] + end + end + end + scoreval["XOffset"] = Xoffset + + if panel:FindFirstChild(scoreval["Name"]) then + MaxSizeColumn = math.max(MaxSizeColumn, panel[scoreval["Name"]].TextBounds.X) + end + end + + if AreNamesExpanded.Value then + MaxSizeColumn = math.max(MaxSizeColumn, StatTitles[scoreval["Name"]].TextBounds.X) + StatTitles[scoreval["Name"]]:TweenPosition( + UDim2.new(RightEdgeSpace, -Xoffset, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + else + StatTitles[scoreval["Name"]]:TweenPosition( + UDim2.new((0.4 + ((0.6 / #ScoreNames) * (j - 1))) - 1, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + end + scoreval["ColumnSize"] = MaxSizeColumn + Xoffset = Xoffset + SpacingPerStat + MaxSizeColumn + maxXOffset = math.max(Xoffset, maxXOffset) + end + NormalBounds = UDim2.new(0, BaseScreenXSize + maxXOffset - SpacingPerStat, 0, 800) + NormalPosition = UDim2.new(1, -NormalBounds.X.Offset, NormalPosition.Y.Scale, 0) + UpdateHeaderNameSize() + UpdateMaximize() + + AddingStatLock = false +end +--------------------------- +-- Minimizing and maximizing +--------------------------- + +function ToggleMinimize() + IsMinimized.Value = not IsMinimized.Value + UpdateStatNames() +end + +function ToggleMaximize() + IsMaximized.Value = not IsMaximized.Value + RecreateScoreColumns(PlayerFrames) --done to re-position stat names NOTE: optimize-able +end + +function Tabify() + IsTabified.Value = true + IsMaximized.Value = false + IsMinimized.Value = true + UpdateMinimize() + IsTabified.Value = true + ScreenGui:TweenPosition( + UDim2.new(NormalBounds.X.Scale, NormalBounds.X.Offset - 10, 0, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) +end + +function UnTabify() + if IsTabified.Value then + IsTabified.Value = false + ScreenGui:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + end +end + +--[[ + Does more than it looks like + monitors positions of the clipping frames and bottom frames + called from EVERYWHERE, too much probably +--]] +function UpdateMinimize() + if IsMinimized.Value then + if IsMaximized.Value then + ToggleMaximize() + end + if not IsTabified.Value then + MainFrame:TweenSizeAndPosition( + UDim2.new(0.010, HeaderName.TextBounds.X, NormalBounds.Y.Scale, NormalBounds.Y.Offset), + UDim2.new(0.990, -HeaderName.TextBounds.X, NormalPosition.Y.Scale, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + else + MainFrame:TweenSizeAndPosition(NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + end + --(#MiddleFrameBackgrounds*MiddleBGTemplate.Size.Y.Scale) + BottomClipFrame:TweenPosition(UDim2.new(0, 0, -1, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + BottomFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + FocusFrame.Size = UDim2.new(1, 0, HeaderFrameHeight, 0) + ExtendTab.Image = "http://www.roblox.com/asset/?id=94692731" + else + if not IsMaximized.Value then + MainFrame:TweenSizeAndPosition(NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + end + --do limiting + DefaultBottomClipPos = + math.min(math.max(DefaultBottomClipPos, -1), -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale)) + UpdateScrollPosition() + + BottomClipFrame.Position = UDim2.new(0, 0, DefaultBottomClipPos, 0) + local bottomPositon = (DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale) + BottomFrame.Position = UDim2.new(0, 0, bottomPositon, 0) + FocusFrame.Size = UDim2.new(1, 0, bottomPositon + HeaderFrameHeight, 0) + ExtendTab.Image = "http://www.roblox.com/asset/?id=94825585" + end +end + +--[[ + Manages the position/size of the mainFrame, swaps out different resolution images for the frame + fades in and out the stat names, moves position of headername and header score +--]] +function UpdateMaximize() + if IsMaximized.Value then + for j = 1, #ScoreNames, 1 do + local scoreval = ScoreNames[j] + StatTitles[scoreval["Name"]]:TweenPosition( + UDim2.new(0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + end + + if IsMinimized.Value then + ToggleMinimize() + else + UpdateMinimize() + end + + MainFrame:TweenSizeAndPosition(MaximizedBounds, MaximizedPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + HeaderScore:TweenPosition( + UDim2.new(0, 0, HeaderName.Position.Y.Scale, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + HeaderName:TweenPosition( + UDim2.new(-0.1, -HeaderScore.TextBounds.x, HeaderName.Position.Y.Scale, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + HeaderFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeHeader"] + BottomFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeBottom"] + for index, i in ipairs(MiddleFrameBackgrounds) do + if (index % 2) ~= 1 then + i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeDark"] + else + i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeLight"] + end + end + for _, i in ipairs(MiddleFrames) do + if i:FindFirstChild "ClickListener" then + i.ClickListener.Size = UDim2.new(0.974, 0, i.ClickListener.Size.Y.Scale, 0) + end + for j = 1, #ScoreNames, 1 do + local scoreval = ScoreNames[j] + if i:FindFirstChild(scoreval["Name"]) then + i[scoreval["Name"]]:TweenPosition( + UDim2.new(0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + end + end + end + for _, entry in ipairs(PlayerFrames) do + WaitForChild(entry["Frame"], "TitleFrame").Size = + UDim2.new(0.38, 0, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + end + + for _, entry in ipairs(TeamFrames) do + WaitForChild(entry["Frame"], "TitleFrame").Size = + UDim2.new(0.38, 0, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + end + else + if not IsMinimized.Value then + MainFrame:TweenSizeAndPosition(NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + end + HeaderScore:TweenPosition(UDim2.new(0, 0, 0.4, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + HeaderName:TweenPosition( + UDim2.new(0, 0, HeaderName.Position.Y.Scale, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + HeaderFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["NormalHeader"] + BottomFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["NormalBottom"] + for index, i in ipairs(MiddleFrameBackgrounds) do + if index % 2 ~= 1 then + i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midDark"] + else + i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midLight"] + end + end + for _, i in ipairs(MiddleFrames) do + if i:FindFirstChild "ClickListener" then + i.ClickListener.Size = UDim2.new(0.96, 0, i.ClickListener.Size.Y.Scale, 0) + for j = 1, #ScoreNames, 1 do + local scoreval = ScoreNames[j] + if i:FindFirstChild(scoreval["Name"]) and scoreval["XOffset"] then + --print('updateing stat position: ' .. scoreval['Name']) + i[scoreval["Name"]]:TweenPosition( + UDim2.new(RightEdgeSpace, -scoreval["XOffset"], 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + end + end + end + end + + for _, entry in ipairs(TeamFrames) do + WaitForChild(entry["Frame"], "TitleFrame").Size = + UDim2.new(0, BaseScreenXSize * 0.9, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + end + for _, entry in ipairs(PlayerFrames) do + WaitForChild(entry["Frame"], "TitleFrame").Size = + UDim2.new(0, BaseScreenXSize * 0.9, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + end + end +end + +function ExpandNames() + if #ScoreNames ~= 0 then + for _, i in pairs(StatTitles:GetChildren()) do + Spawn(function() + TweenProperty(i, "TextTransparency", i.TextTransparency, 0, BASE_TWEEN) + end) + end + HeaderFrameHeight = 0.09 + --as of writing, this and 'CloseNames' are the only places headerframe is resized + HeaderFrame:TweenSizeAndPosition( + UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), + HeaderFrame.Position, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + TopClipFrame:TweenPosition( + UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + BottomShiftFrame:TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + end +end + +function CloseNames() + if #ScoreNames ~= 0 then + HeaderFrameHeight = 0.07 + if not IsMaximized.Value then + for _, i in pairs(StatTitles:GetChildren()) do + Spawn(function() + TweenProperty(i, "TextTransparency", i.TextTransparency, 1, BASE_TWEEN) + end) + end + end + BottomShiftFrame:TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + HeaderFrame:TweenSizeAndPosition( + UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), + HeaderFrame.Position, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + TopClipFrame:TweenPosition( + UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + end +end + +function UpdateStatNames() + if not AreNamesExpanded.Value or IsMinimized.Value then + CloseNames() + else + ExpandNames() + end +end + +function OnScrollWheelMove(direction) + if not (IsTabified.Value or IsMinimized.Value or InPopupWaitForClick) then + local StartFrame = ListFrame.Position + local newFrameY = math.max(math.min(StartFrame.Y.Scale + direction, GetMaxScroll()), GetMinScroll()) + + ListFrame.Position = UDim2.new(StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset) + UpdateScrollPosition() + end +end + +function AttachScrollWheel() + if ScrollWheelConnections then + return + end + ScrollWheelConnections = {} + table.insert( + ScrollWheelConnections, + Mouse.WheelForward:connect(function() + OnScrollWheelMove(0.05) + end) + ) + table.insert( + ScrollWheelConnections, + Mouse.WheelBackward:connect(function() + OnScrollWheelMove(-0.05) + end) + ) +end + +function DetachScrollWheel() + if ScrollWheelConnections then + for _, i in pairs(ScrollWheelConnections) do + i:disconnect() + end + end + ScrollWheelConnections = nil +end + +FocusFrame.MouseEnter:connect(function() + if not (IsMinimized.Value or IsTabified.Value) then + AttachScrollWheel() + end +end) +FocusFrame.MouseLeave:connect(function() + --if not (IsMaximized.Value or IsMinimized.Value) then + DetachScrollWheel() + --end +end) + +------------------------ +-- Scroll Bar functions +------------------------ +--[[ + updates whether the scroll bar should be showing, if it is showing, updates + the size of it +--]] +function UpdateScrollBarVisibility() + if AreAllEntriesOnScreen() then + ScrollBar.BackgroundTransparency = 1 + else + ScrollBar.BackgroundTransparency = 0 + UpdateScrollBarSize() + end +end +--[[ + updates size of scrollbar depending on how many entries exist +--]] +function UpdateScrollBarSize() + local entryListSize = #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale + local shownAreaSize = (BottomClipFrame.Position.Y.Scale + 1) + ScrollBar.Size = UDim2.new(1, 0, shownAreaSize / entryListSize, 0) +end +--[[ + updates position of listframe so that no gaps at the bottom or top of the list are visible + updates position of scrollbar to match what parts of the list are visible +--]] +function UpdateScrollPosition() + local minPos = GetMinScroll() + local maxPos = GetMaxScroll() + local scrollLength = maxPos - minPos + + local yscrollpos = math.max(math.min(ListFrame.Position.Y.Scale, maxPos), minPos) + ListFrame.Position = + UDim2.new(ListFrame.Position.X.Scale, ListFrame.Position.X.Offset, yscrollpos, ListFrame.Position.Y.Offset) + + local adjustedLength = 1 - ScrollBar.Size.Y.Scale + ScrollBar.Position = + UDim2.new(0, 0, adjustedLength - (adjustedLength * ((ListFrame.Position.Y.Scale - minPos) / scrollLength)), 0) +end + +--[[ + WARNING:this is in a working state, but uses massive hacks + revize when global input is available + Manages scrolling of the playerlist on mouse drag +--]] +function StartDrag(entry, startx, starty) + local openPanel = true + --[[local draggedFrame = ]] + WaitForChild(entry["Frame"], "ClickListener") + local function dragExit() + -- stopDrag = true + + if + entry["Player"] + and SelectedPlayer + and openPanel + and entry["Player"] ~= LocalPlayer + and SelectedPlayer.userId > 1 + and LocalPlayer.userId > 1 + then + ActivatePlayerEntryPanel(entry) + end + end + local startY = nil + local StartFrame = ListFrame.Position + local function dragpoll(nx, ny) + if not startY then + startY = AbsoluteToPercent(nx, ny).Y + end + local nowY = AbsoluteToPercent(nx, ny).Y + debugprint("drag dist:" .. Vector2.new(startx - nx, starty - ny).magnitude) + if Vector2.new(startx - nx, starty - ny).magnitude > MOUSE_DRAG_DISTANCE then + openPanel = false + end + + local newFrameY = math.max(math.min(StartFrame.Y.Scale + (nowY - startY), GetMaxScroll()), GetMinScroll()) + ListFrame.Position = UDim2.new(StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset) + UpdateScrollPosition() + end + WaitForClick(ScreenGui, dragpoll, dragExit) +end + +function StartMinimizeDrag() + Delay(0, function() + local startTime = tick() + debugprint "Got Click2" + local function dragExit() + --debugprint('undone click2') + if tick() - startTime < 0.25 then --was click + ToggleMinimize() + else --was drag + DidMinimizeDrag = true + if IsMinimized.Value then + ToggleMinimize() + end + end + -- stopDrag = true + end + local startY = nil + local StartFrame = DefaultBottomClipPos + local function dragpoll(nx, ny) + if not IsMinimized.Value then + if not startY then + startY = AbsoluteToPercent(nx, ny).Y + end + local nowY = AbsoluteToPercent(nx, ny).Y + local newFrameY + newFrameY = math.min( + math.max(StartFrame + (nowY - startY), -1), + -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) + ) + DefaultBottomClipPos = newFrameY + UpdateMinimize() + ScrollBarFrame.Size = + UDim2.new(ScrollBarFrame.Size.X.Scale, 0, (DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale), 0) + ScrollBarFrame.Position = + UDim2.new(ScrollBarFrame.Position.X.Scale, 0, 1 - ScrollBarFrame.Size.Y.Scale, 0) + UpdateScrollBarSize() + UpdateScrollPosition() + UpdateScrollBarVisibility() + end + end + Spawn(function() + WaitForClick(ScreenGui, dragpoll, dragExit) + end) + end) +end + +------------------------------- +-- Input Callback functions +------------------------------- +IsMaximized.Value = false +IsMinimized.Value = false +IsMaximized.Changed:connect(UpdateMaximize) +IsMinimized.Changed:connect(UpdateMinimize) + +ExtendButton.MouseButton1Down:connect(function() + if (time() - LastClick < ButtonCooldown) or InPopupWaitForClick then + return + end + LastClick = time() + if IsTabified.Value then + UnTabify() + else + StartMinimizeDrag() + end +end) + +MaximizeButton.MouseButton1Click:connect(function() + if (time() - LastClick < ButtonCooldown) or InPopupWaitForClick then + return + end + LastClick = time() + if IsTabified.Value then + UnTabify() + elseif not AreNamesExpanded.Value then + AreNamesExpanded.Value = true + BaseUpdate() + else + ToggleMaximize() + end +end) + +MaximizeButton.MouseButton2Click:connect(function() + if (time() - LastClick < ButtonCooldown) or InPopupWaitForClick then + return + end + LastClick = time() + if IsTabified.Value then + UnTabify() + elseif IsMaximized.Value then + ToggleMaximize() + elseif AreNamesExpanded.Value then + AreNamesExpanded.Value = false + BaseUpdate() + else + Tabify() + end +end) + +------------------------------- +-- MiddleFrames management +------------------------------- +--[[ + adds a background frame to the listframe +--]] +function AddMiddleBGFrame() + local nBGFrame = MiddleBGTemplate:Clone() + nBGFrame.Position = UDim2.new(0.5, 0, (#MiddleFrameBackgrounds * nBGFrame.Size.Y.Scale), 0) + if (#MiddleFrameBackgrounds + 1) % 2 ~= 1 then + if IsMaximized.Value then + nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeDark"] + else + nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midDark"] + end + else + if IsMaximized.Value then + nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeLight"] + else + nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midLight"] + end + end + nBGFrame.Parent = ListFrame + table.insert(MiddleFrameBackgrounds, nBGFrame) + + if #MiddleFrameBackgrounds < DefaultListSize and not DidMinimizeDrag then + --print('readjusting bottom clip') + DefaultBottomClipPos = -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) + end + + if not IsMinimized.Value then + UpdateMinimize() + end +end +--[[ + removes a background from from the listframe +--]] +function RemoveMiddleBGFrame() + MiddleFrameBackgrounds[#MiddleFrameBackgrounds]:Destroy() + table.remove(MiddleFrameBackgrounds, #MiddleFrameBackgrounds) + if not IsMinimized.Value then + UpdateMinimize() + end +end +------------------------------- +-- Player Callback functions +------------------------------- +local FONT_SIZES = { "Size8", "Size9", "Size10", "Size11", "Size12", "Size14", "Size24", "Size36", "Size48" } +--[[ + note:should probably set to something other than mainFrame.AbsoluteSize, should work for now + if textbounds ever works on textscaled, switch to that :( +--]] +function ChangeHeaderName(nname) + HeaderName.Text = nname + UpdateHeaderNameSize() +end + +--[[ + Will fit the player's name to the bounds of the header + called on resize of the window and playedr name change events + HACK: cannot use 'Textscaled' due to unable to find text bounds when scaled +--]] +function UpdateHeaderNameSize() + local tHeader = HeaderName:Clone() + tHeader.Position = UDim2.new(2, 0, 2, 0) + tHeader.Parent = ScreenGui + local fSize = 7 --Size24 in table + tHeader.FontSize = FONT_SIZES[fSize] + Delay(0.2, function() + while tHeader.TextBounds.x == 0 do + wait(1 / 30) + end + while tHeader.TextBounds.x - NormalBounds.X.Offset > 1 do + fSize = fSize - 1 + tHeader.FontSize = FONT_SIZES[fSize] + wait(0.2) + end + HeaderName.FontSize = tHeader.FontSize + tHeader:Destroy() + end) +end +ScreenGui.Changed:connect(UpdateHeaderNameSize) + +--[[ + called only when the leaderstats object is added to a given player entry + removes old stats, adds any existing stats, and sets up listeners for new stats + @Args: + playerEntry A reference to the ENTRY(table) of the player who had leaderstats added +--]] +function LeaderstatsAdded(playerEntry) + --RemoveAllStats(playerEntry) + local nplayer = playerEntry["Player"] + for _, i in pairs(nplayer.leaderstats:GetChildren()) do + StatAdded(i, playerEntry) + end + nplayer.leaderstats.ChildAdded:connect(function(nchild) + StatAdded(nchild, playerEntry) + end) + nplayer.leaderstats.ChildRemoved:connect(function(nchild) + StatRemoved(nchild, playerEntry) + end) +end +--[[ + called when leaderstats object is removed from play in player entry + Note: may not be needed, might be able to just rely on leaderstats added + @Args: + oldLeaderstats leaderstats object to be removed + playerEntry A reference to the ENTRY(table) of the player +--]] +function LeaderstatsRemoved(_, playerEntry) + while AddingFrameLock do + debugprint("waiting to insert " .. playerEntry["Player"].Name) + wait(1 / 30) + end + AddingFrameLock = true + RemoveAllStats(playerEntry) + AddingFrameLock = false +end + +function ClosePopUpPanel() + if SelectedPlayerEntry then + local tframe = SelectedPlayerEntry["Frame"] + Spawn(function() + TweenProperty(tframe, "BackgroundTransparency", 0.5, 1, BASE_TWEEN) + end) + end + PopUpPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) + wait(0.1) + InPopupWaitForClick = false + SelectedPlayerEntry = nil +end + +--[[ + prepares the needed popup to be tweened on screen, and updates the position of the popup clip + frame to match the selected player frame's position +--]] +function InitMovingPanel(entry, player) + PopUpClipFrame.Parent = ScreenGui + + if PopUpPanel then + PopUpPanel:Destroy() + end + PopUpPanel = PopUpPanelTemplate:Clone() + PopUpPanel.Parent = PopUpClipFrame + + local nextIndex = 2 + local friendStatus = GetFriendStatus(player) + debugprint(tostring(friendStatus)) + local showRankMenu = IsPersonalServer + and LocalPlayer.PersonalServerRank >= PrivilegeLevel["Admin"] + and LocalPlayer.PersonalServerRank > SelectedPlayer.PersonalServerRank + + local ReportPlayerButton = MakePopupButton(PopUpPanel, "Report Player", 0) + ReportPlayerButton.MouseButton1Click:connect(function() + OpenAbuseDialog() + end) + local FriendPlayerButton = MakePopupButton( + PopUpPanel, + "Friend", + 1, + not showRankMenu and friendStatus ~= Enum.FriendStatus.FriendRequestReceived + ) + FriendPlayerButton.MouseButton1Click:connect(OnFriendButtonSelect) + + if friendStatus == Enum.FriendStatus.Friend then + FriendPlayerButton:FindFirstChild("ButtonText").Text = "UnFriend Player" + elseif friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend then + FriendPlayerButton:FindFirstChild("ButtonText").Text = "Send Request" + elseif friendStatus == Enum.FriendStatus.FriendRequestSent then + FriendPlayerButton:FindFirstChild("ButtonText").Text = "Revoke Request" + elseif friendStatus == Enum.FriendStatus.FriendRequestReceived then + FriendPlayerButton:FindFirstChild("ButtonText").Text = "Accept Friend" + local FriendRefuseButton = MakePopupButton(PopUpPanel, "Decline Friend", 2, not showRankMenu) + FriendRefuseButton.MouseButton1Click:connect(OnFriendRefuseButtonSelect) + nextIndex = nextIndex + 1 + end + + if showRankMenu then + local BanPlayerButton = MakePopupButton(PopUpPanel, "Ban", nextIndex) + local VisitorButton = MakePopupButton(PopUpPanel, "Visitor", nextIndex + 1) + local MemberButton = MakePopupButton(PopUpPanel, "Member", nextIndex + 2) + local AdminButton = MakePopupButton(PopUpPanel, "Admin", nextIndex + 3, true) + + BanPlayerButton.MouseButton1Click:connect(function() + OnPrivilegeLevelSelect( + player, + PrivilegeLevel["Banned"], + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton + ) + end) + VisitorButton.MouseButton1Click:connect(function() + OnPrivilegeLevelSelect( + player, + PrivilegeLevel["Visitor"], + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton + ) + end) + MemberButton.MouseButton1Click:connect(function() + OnPrivilegeLevelSelect( + player, + PrivilegeLevel["Member"], + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton + ) + end) + AdminButton.MouseButton1Click:connect(function() + OnPrivilegeLevelSelect( + player, + PrivilegeLevel["Admin"], + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton + ) + end) + + HighlightMyRank(SelectedPlayer, BanPlayerButton, VisitorButton, MemberButton, AdminButton) + end + + PopUpPanel:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) + Delay(0, function() + local tconnection + tconnection = Mouse.Button1Down:connect(function() + tconnection:disconnect() + ClosePopUpPanel() + end) + end) + + local myFrame = entry["Frame"] + -- THIS IS GARBAGE. + -- if I parent to frame to auto update position, it gets clipped + -- sometimes garbage is the only option. + Spawn(function() + while InPopupWaitForClick do + PopUpClipFrame.Position = + UDim2.new(0, myFrame.AbsolutePosition.X - PopUpClipFrame.Size.X.Offset, 0, myFrame.AbsolutePosition.Y) + wait() + end + end) +end + +--[[ + Called when a player entry in the leaderboard is clicked + either will highlight entry and start the drag event, or open a popup menu + @Args: + entry the player entry clicked +--]] +function OnPlayerEntrySelect(entry, startx, starty) + if not InPopupWaitForClick then + SelectedPlayerEntry = entry + SelectedPlayer = entry["Player"] + + StartDrag(entry, startx, starty) + end +end + +function ActivatePlayerEntryPanel(entry) + entry["Frame"].BackgroundColor3 = Color3.new(0, 1, 1) + Spawn(function() + TweenProperty(entry["Frame"], "BackgroundTransparency", 1, 0.5, 0.5) + end) + InPopupWaitForClick = true + InitMovingPanel(entry, entry["Player"]) +end + +--[[ + the basic update for the playerlist mode's state, + assures the order and length of the player frames +--]] +function PlayerListModeUpdate() + RecreateScoreColumns(PlayerFrames) + table.sort(PlayerFrames, PlayerSortFunction) + for i, val in ipairs(PlayerFrames) do + MiddleFrames[i] = val["Frame"] + end + for i = #PlayerFrames + 1, #MiddleFrames, 1 do + MiddleFrames[i] = nil + end + UpdateMinimize() +end +--[[ + this one's a doozie, happens when a player is added to the game + inits their player frame and player entry, assigns them to a team if possible, + and hooks up their leaderstats + @Args: + nplayer new player object to insert +--]] +function InsertPlayerFrame(nplayer) + while AddingFrameLock do + debugprint("waiting to insert " .. nplayer.Name) + wait(1 / 30) + end + AddingFrameLock = true + + local nFrame = MiddleTemplate:Clone() + WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = nplayer.Name + + nFrame.Position = UDim2.new(1, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0) + + local nfriendstatus = GetFriendStatus(nplayer) + + nFrame:FindFirstChild("BCLabel").Image = getMembershipTypeIcon(nplayer.MembershipType, nplayer.Name) + nFrame:FindFirstChild("FriendLabel").Image = getFriendStatusIcon(nfriendstatus) + nFrame.Name = nplayer.Name + WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = nplayer.Name + + --move for bc label + nFrame.FriendLabel.Position = nFrame.FriendLabel.Position + UDim2.new(0, 17, 0, 0) + nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + UDim2.new(0, 17, 0, 0) + + if nFrame:FindFirstChild("FriendLabel").Image ~= "" then + nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + UDim2.new(0, 17, 0, 0) + end + + if nplayer.Name == LocalPlayer.Name then + nFrame.TitleFrame.Title.Font = "ArialBold" + nFrame.PlayerScore.Font = "ArialBold" + ChangeHeaderName(nplayer.Name) + local dropShadow = nFrame.TitleFrame.Title:Clone() + dropShadow.TextColor3 = Color3.new(0, 0, 0) + dropShadow.TextTransparency = 0 + dropShadow.ZIndex = 2 + dropShadow.Position = nFrame.TitleFrame.Title.Position + UDim2.new(0, 1, 0, 1) + dropShadow.Name = "DropShadow" + dropShadow.Parent = nFrame.TitleFrame + -- else + -- --Delay(2, function () OnFriendshipChanged(nplayer,LocalPlayer:GetFriendStatus(nplayer)) end) + end + nFrame.TitleFrame.Title.Font = "ArialBold" + + nFrame.Parent = ListFrame + nFrame:TweenPosition(UDim2.new(0.5, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0), "Out", "Linear", BASE_TWEEN, true) + UpdateMinimize() + local nentry = {} + nentry["Frame"] = nFrame + nentry["Player"] = nplayer + nentry["ID"] = AddId + AddId = AddId + 1 + table.insert(PlayerFrames, nentry) + if #TeamFrames ~= 0 then + if nplayer.Neutral then + nentry["MyTeam"] = nil + if not NeutralTeam then + AddNeutralTeam() + else + AddPlayerToTeam(NeutralTeam, nentry) + end + else + local addedToTeam = false + for _, tval in ipairs(TeamFrames) do + if tval["MyTeam"].TeamColor == nplayer.TeamColor then + AddPlayerToTeam(tval, nentry) + nentry["MyTeam"] = tval + addedToTeam = true + end + end + if not addedToTeam then + nentry["MyTeam"] = nil + if not NeutralTeam then + AddNeutralTeam() + else + AddPlayerToTeam(NeutralTeam, nentry) + end + nentry["MyTeam"] = NeutralTeam + end + end + end + + if nplayer:FindFirstChild "leaderstats" then + LeaderstatsAdded(nentry) + end + + nplayer.ChildAdded:connect(function(nchild) + if nchild.Name == "leaderstats" then + while AddingFrameLock do + debugprint "in adding leaderstats lock" + wait(1 / 30) + end + AddingFrameLock = true + LeaderstatsAdded(nentry) + AddingFrameLock = false + end + end) + + nplayer.ChildRemoved:connect(function(nchild) + if nplayer == LocalPlayer and nchild.Name == "leaderstats" then + LeaderstatsRemoved(nchild, nentry) + end + end) + nplayer.Changed:connect(function(prop) + PlayerChanged(nentry, prop) + end) + + local listener = WaitForChild(nFrame, "ClickListener") + listener.Active = true + listener.MouseButton1Down:connect(function(nx, ny) + OnPlayerEntrySelect(nentry, nx, ny) + end) + + AddMiddleBGFrame() + BaseUpdate() + AddingFrameLock = false +end + +--[[ + Note:major optimization can be done here + removes this player's frame if it exists, calls base update +--]] +function RemovePlayerFrame(tplayer) + while AddingFrameLock do + debugprint "in removing player frame lock" + wait(1 / 30) + end + AddingFrameLock = true + + local tteam + for i, key in ipairs(PlayerFrames) do + if tplayer == key["Player"] then + if PopUpClipFrame.Parent == key["Frame"] then + PopUpClipFrame.Parent = nil + end + key["Frame"]:Destroy() + tteam = key["MyTeam"] + table.remove(PlayerFrames, i) + end + end + if tteam then + for j, tentry in ipairs(tteam["MyPlayers"]) do + if tentry["Player"] == tplayer then + RemovePlayerFromTeam(tteam, j) + end + end + end + + RemoveMiddleBGFrame() + UpdateMinimize() + BaseUpdate() + AddingFrameLock = false +end + +Players.ChildRemoved:connect(RemovePlayerFrame) + +---------------------------- +-- Team Callback Functions +---------------------------- +--[[ + turns a list of team entries with sub lists of players into a single ordered + list, in the correct order,and of the correct length + @Args: + tframes the team entries to unroll + outframes the list to unroll these entries into +--]] +function UnrollTeams(tframes, outframes) + local numEntries = 0 + if NeutralTeam and not NeutralTeam["IsHidden"] then + for _, val in ipairs(NeutralTeam["MyPlayers"]) do + numEntries = numEntries + 1 + outframes[numEntries] = val["Frame"] + end + numEntries = numEntries + 1 + outframes[numEntries] = NeutralTeam["Frame"] + end + for _, val in ipairs(tframes) do + if not val["IsHidden"] then + for _, pval in ipairs(val.MyPlayers) do + numEntries = numEntries + 1 + outframes[numEntries] = pval["Frame"] + end + numEntries = numEntries + 1 + outframes[numEntries] = val["Frame"] + end + end + -- clear any additional entries from outframes + for i = numEntries + 1, #outframes, 1 do + outframes[i] = nil + end +end +--[[ + uses lua's table.sort to sort the teams +--]] +function TeamSortFunc(a, b) + if a["TeamScore"] == b["TeamScore"] then + return a["ID"] < b["ID"] + end + if not a["TeamScore"] then + return false + end + if not b["TeamScore"] then + return true + end + return a["TeamScore"] < b["TeamScore"] +end +--[[ + consider adding lock with wait for performance + sorts each of the team's player lists induvidually, adds up the team scores. + @Args: + tentries table of team entries +--]] +function SortTeams(tentries) + for _, val in ipairs(tentries) do + table.sort(val["MyPlayers"], PlayerSortFunction) + AddTeamScores(val) + end + table.sort(tentries, TeamSortFunc) +end +--[[ + base update for team mode, adds up the scores of all teams, sorts them, + then unrolls them into middleframes +--]] +function TeamListModeUpdate() + RecreateScoreColumns(PlayerFrames) + SortTeams(TeamFrames) + if NeutralTeam then + AddTeamScores(NeutralTeam) + --RecreateScoreColumns(NeutralTeam['MyPlayers']) + end + UnrollTeams(TeamFrames, MiddleFrames) +end +--[[ + adds up all the score of this team's players to form the team score + @Args: + team team entry to sum the scores of +--]] +function AddTeamScores(team) + for j = 1, #ScoreNames, 1 do + local i = ScoreNames[j] + local tscore = 0 + for _, j in ipairs(team["MyPlayers"]) do + local tval = j["Player"]:FindFirstChild "leaderstats" and j["Player"].leaderstats:FindFirstChild(i["Name"]) + if tval and not tval:IsA "StringValue" then + tscore = tscore + GetScoreValue((j["Player"].leaderstats)[i["Name"]]) + end + end + if team["Frame"]:FindFirstChild(i["Name"]) then + --team['Frame'][i['Name'] ].Size = UDim2.new(1 - (ScrollBarFrame.Size.X.Scale * 2),- ((j-1) * SpacingPerStat),1,0) + team["Frame"][i["Name"]].Text = tostring(tscore) + end + end + UpdateMinimize() +end + +--[[ + finds previous team this player was on, and if it exists calls removeplayerfromteam + @Args + entry Player entry +--]] +function FindRemovePlayerFromTeam(entry) + if entry["MyTeam"] then + for j, oldEntry in ipairs(entry["MyTeam"]["MyPlayers"]) do + if oldEntry["Player"] == entry["Player"] then + RemovePlayerFromTeam(entry["MyTeam"], j) + return + end + end + elseif NeutralTeam then + for j, oldEntry in ipairs(NeutralTeam["MyPlayers"]) do + if oldEntry["Player"] == entry["Player"] then + RemovePlayerFromTeam(NeutralTeam, j) + return + end + end + end +end +--[[ + removes a single player from a given team (not usually called directly) + @Args: + teamEntry team entry to remove player from + index index of player in 'MyPlayers' list to remove +--]] +function RemovePlayerFromTeam(teamEntry, index) + table.remove(teamEntry["MyPlayers"], index) + --if teamEntry['AutoHide'] and #teamEntry['MyPlayers'] == 0 then + if teamEntry == NeutralTeam and #teamEntry["MyPlayers"] == 0 then + RemoveNeutralTeam() + end +end +--[[ + adds player entry entry to teamentry + removes them from any previous team + @Args: + teamEntry entry of team to add player to + entry player entry to add to this team +--]] +function AddPlayerToTeam(teamEntry, entry) + FindRemovePlayerFromTeam(entry) + table.insert(teamEntry["MyPlayers"], entry) + entry["MyTeam"] = teamEntry + if teamEntry["IsHidden"] then + teamEntry["Frame"].Parent = ListFrame + AddMiddleBGFrame() + end + teamEntry["IsHidden"] = false +end + +function SetPlayerToTeam(entry) + FindRemovePlayerFromTeam(entry) + -- check to see if team exists, if it does add to that team + local setToTeam = false + for _, tframe in ipairs(TeamFrames) do + -- add my entry on the new team + if tframe["MyTeam"].TeamColor == entry["Player"].TeamColor then + AddPlayerToTeam(tframe, entry) + setToTeam = true + end + end + -- if player was set to an invalid team, then set it back to neutral + if not setToTeam and #(game.Teams:GetTeams()) > 0 then + debugprint(entry["Player"].Name .. "could not find team") + entry["MyTeam"] = nil + if not NeutralTeam then + AddNeutralTeam() + else + AddPlayerToTeam(NeutralTeam, entry) + end + end +end + +--[[ + Note:another big one, consiter breaking up + called when any children of player changes + handles 'Neutral', teamColor, Name and MembershipType changes + @Args + entry Player entry changed + property name of property changed +--]] +function PlayerChanged(entry, property) + while PlayerChangedLock do + debugprint "in playerchanged lock" + wait(1 / 30) + end + PlayerChangedLock = true + if property == "Neutral" then + -- if player changing to neutral + if entry["Player"].Neutral and #(game.Teams:GetTeams()) > 0 then + debugprint(entry["Player"].Name .. "setting to neutral") + FindRemovePlayerFromTeam(entry) + entry["MyTeam"] = nil + if not NeutralTeam then + debugprint(entry["Player"].Name .. "creating neutral team") + AddNeutralTeam() + else + debugprint(entry["Player"].Name .. "adding to neutral team") + AddPlayerToTeam(NeutralTeam, entry) + end + elseif #(game.Teams:GetTeams()) > 0 then -- else player switching to a team, or a weird edgecase + debugprint(entry["Player"].Name .. "has been set non-neutral") + SetPlayerToTeam(entry) + end + BaseUpdate() + elseif property == "TeamColor" and not entry["Player"].Neutral and entry["Player"] ~= entry["MyTeam"] then + debugprint(entry["Player"].Name .. "setting to new team") + SetPlayerToTeam(entry) + BaseUpdate() + elseif property == "Name" or property == "MembershipType" then + entry["Frame"]:FindFirstChild("BCLabel").Image = + getMembershipTypeIcon(entry["Player"].MembershipType, entry["Player"].Name) + entry["Frame"].Name = entry["Player"].Name + entry["Frame"].TitleFrame.Title.Text = entry["Player"].Name + if entry["Frame"].BCLabel.Image ~= "" then + entry["Frame"].TitleFrame.Title.Position = UDim2.new(0.01, 30, 0.1, 0) + end + if entry["Player"] == LocalPlayer then + entry["Frame"].TitleFrame.DropShadow.Text = entry["Player"].Name + ChangeHeaderName(entry["Player"].Name) + end + BaseUpdate() + end + PlayerChangedLock = false +end + +function OnFriendshipChanged(player, friendStatus) + Delay(0.5, function() + debugprint( + "friend status changed for:" + .. player.Name + .. " " + .. tostring(friendStatus) + .. " vs " + .. tostring(GetFriendStatus(player)) + ) + for _, entry in ipairs(PlayerFrames) do + if entry["Player"] == player then + local nicon = getFriendStatusIcon(friendStatus) + if nicon == "" and entry["Frame"].FriendLabel.Image ~= "" then + entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + - UDim2.new(0, 17, 0, 0) + elseif nicon ~= "" and entry["Frame"].FriendLabel.Image == "" then + entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + + UDim2.new(0, 17, 0, 0) + debugprint("confirmed status:" .. player.Name) + end + entry["Frame"].FriendLabel.Image = nicon + return + end + end + end) +end + +LocalPlayer.FriendStatusChanged:connect(OnFriendshipChanged) + +--[[ + adds a neutral team if nessisary + Note: a lot of redundant code here, might want to refactor to share a function with insertteamframe +--]] +function AddNeutralTeam() + while NeutralTeamLock do + debugprint "in neutral team 2 lock" + wait() + end + NeutralTeamLock = true + + local defaultTeam = Instance.new "Team" + defaultTeam.TeamColor = BrickColor.new "White" + defaultTeam.Name = "Neutral" + local nentry = {} + nentry["MyTeam"] = defaultTeam + nentry["MyPlayers"] = {} + nentry["Frame"] = MiddleTemplate:Clone() + WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = defaultTeam.Name + nentry["Frame"].TitleFrame.Position = + UDim2.new(nentry["Frame"].TitleFrame.Position.X.Scale, nentry["Frame"].TitleFrame.Position.X.Offset, 0.1, 0) + nentry["Frame"].TitleFrame.Size = + UDim2.new(nentry["Frame"].TitleFrame.Size.X.Scale, nentry["Frame"].TitleFrame.Size.X.Offset, 0.8, 0) + nentry["Frame"].TitleFrame.Title.Font = "ArialBold" + nentry["Frame"].Position = UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) + WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect(function(nx, ny) + StartDrag(nentry, nx, ny) + end) + nentry["Frame"].ClickListener.BackgroundColor3 = Color3.new(1, 1, 1) + nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 + nentry["Frame"].ClickListener.AutoButtonColor = false + nentry["AutoHide"] = true + nentry["IsHidden"] = true + for _, i in pairs(PlayerFrames) do + if i["Player"].Neutral or not i["MyTeam"] then + AddPlayerToTeam(nentry, i) + end + end + if #nentry["MyPlayers"] > 0 then + NeutralTeam = nentry + UpdateMinimize() + BaseUpdate() + end + NeutralTeamLock = false +end + +function RemoveNeutralTeam() + while NeutralTeamLock do + debugprint "in neutral team lock" + wait() + end + NeutralTeamLock = true + NeutralTeam["Frame"]:Destroy() + NeutralTeam = nil + RemoveMiddleBGFrame() + NeutralTeamLock = false +end + +--[[ + +--]] +function TeamScoreChanged(entry, nscore) + WaitForChild(entry["Frame"], "PlayerScore").Text = tostring(nscore) + entry["TeamScore"] = nscore +end +--[[ + called when child added to a team, used for autohide functionality + Note: still has teamscore, consiter removing +--]] +function TeamChildAdded(entry, nchild) + if nchild.Name == "AutoHide" then + entry["AutoHide"] = true + elseif nchild.Name == "TeamScore" then + WaitForChild(entry["Frame"], "PlayerScore").Text = tostring(nchild.Value) + entry["TeamScore"] = nchild.Value + nchild.Changed:connect(function() + TeamScoreChanged(entry, nchild.Value) + end) + end +end +--[[ + called when child added to a team, used for autohide functionality + Note: still has teamscore, consiter removing +--]] +function TeamChildRemoved(entry, nchild) + if nchild.Name == "AutoHide" then + entry["AutoHide"] = false + elseif nchild.Name == "TeamScore" then + WaitForChild(entry["Frame"], "PlayerScore").Text = "" + entry["TeamScore"] = nil + end +end + +function TeamChanged(entry, property) + if property == "Name" then + WaitForChild(WaitForChild(entry["Frame"], "TitleFrame"), "Title").Text = entry["MyTeam"].Name + elseif property == "TeamColor" then + entry["Frame"].ClickListener.BackgroundColor3 = entry["MyTeam"].TeamColor.Color + + for _, i in pairs(TeamFrames) do + if i["MyTeam"].TeamColor == entry["MyTeam"] then + RemoveTeamFrame(entry["MyTeam"]) --NO DUPLICATE TEAMS! + end + end + + entry["MyPlayers"] = {} + + for _, i in pairs(PlayerFrames) do + SetPlayerToTeam(i) + end + BaseUpdate() + end +end + +--[[ + creates team entry and frame for this team, sets up listeners for this team + adds any players intended for this team,Creates neutral team if this is the first team added + Note:might be best to break this into multiple functions to simplify + @Args: + nteam new team object added +--]] +function InsertTeamFrame(nteam) + while AddingFrameLock do + debugprint "in adding team frame lock" + wait(1 / 30) + end + AddingFrameLock = true + --for _,i in pairs(TeamFrames) do + local nentry = {} + nentry["MyTeam"] = nteam + nentry["MyPlayers"] = {} + nentry["Frame"] = MiddleTemplate:Clone() + WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = nteam.Name + nentry["Frame"].TitleFrame.Title.Font = "ArialBold" + nentry["Frame"].TitleFrame.Title.FontSize = "Size18" + nentry["Frame"].TitleFrame.Position = + UDim2.new(nentry["Frame"].TitleFrame.Position.X.Scale, nentry["Frame"].TitleFrame.Position.X.Offset, 0.1, 0) + nentry["Frame"].TitleFrame.Size = + UDim2.new(nentry["Frame"].TitleFrame.Size.X.Scale, nentry["Frame"].TitleFrame.Size.X.Offset, 0.8, 0) + nentry["Frame"].Position = UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) + WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect(function(nx, ny) + StartDrag(nentry, nx, ny) + end) + nentry["Frame"].ClickListener.BackgroundColor3 = nteam.TeamColor.Color + nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 + nentry["Frame"].ClickListener.AutoButtonColor = false + AddId = AddId + 1 + nentry["ID"] = AddId + nentry["AutoHide"] = false + if nteam:FindFirstChild "AutoHide" then + nentry["AutoHide"] = true + end + if nteam:FindFirstChild "TeamScore" then + TeamChildAdded(nentry, nteam.TeamScore) + end + + nteam.ChildAdded:connect(function(nchild) + TeamChildAdded(nentry, nchild) + end) + nteam.ChildRemoved:connect(function(nchild) + TeamChildRemoved(nentry, nchild) + end) + nteam.Changed:connect(function(prop) + TeamChanged(nentry, prop) + end) + + for _, i in pairs(PlayerFrames) do + if not i["Player"].Neutral and i["Player"].TeamColor == nteam.TeamColor then + AddPlayerToTeam(nentry, i) + end + end + nentry["IsHidden"] = false + if not nentry["AutoHide"] or #nentry["MyPlayers"] > 0 then + nentry["Frame"].Parent = ListFrame + nentry["Frame"]:TweenPosition( + UDim2.new(0.5, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + AddMiddleBGFrame() + else + nentry["IsHidden"] = true + nentry["Frame"].Parent = nil + end + + table.insert(TeamFrames, nentry) + UpdateMinimize() + BaseUpdate() + if #TeamFrames == 1 and not NeutralTeam then + AddNeutralTeam() + end + AddingFrameLock = false +end +--[[ + removes team from team list + @Args: + nteam Teamobject to remove +--]] +function RemoveTeamFrame(nteam) + while AddingFrameLock do + debugprint "in removing team frame lock" + wait(1 / 30) + end + AddingFrameLock = true + -- if IsMinimized.Value then + -- end + local myEntry + for i, key in ipairs(TeamFrames) do + if nteam == key["MyTeam"] then + myEntry = key + key["Frame"]:Destroy() + table.remove(TeamFrames, i) + end + end + if #TeamFrames == 0 then + debugprint "removeteamframe, remove neutral" + if NeutralTeam then + RemoveNeutralTeam() + end + end + for i, key in ipairs(myEntry["MyPlayers"]) do + RemovePlayerFromTeam(myEntry, i) + PlayerChanged(key, "TeamColor") + end + RemoveMiddleBGFrame() + BaseUpdate() + AddingFrameLock = false +end + +function TeamAdded(nteam) + InsertTeamFrame(nteam) +end + +function TeamRemoved(nteam) + RemoveTeamFrame(nteam) +end +--------------------------------- +--[[ + called when ANYTHING changes the state of the playerlist + re-sorts everything,assures correct positions of all elements +--]] +function BaseUpdate() + while BaseUpdateLock do + debugprint "in baseupdate lock" + wait(1 / 30) + end + BaseUpdateLock = true + --print ('baseupdate') + UpdateStatNames() + + if #TeamFrames == 0 and not NeutralTeam then + PlayerListModeUpdate() + else + TeamListModeUpdate() + end + for i, key in ipairs(MiddleFrames) do + if key.Parent ~= nil then + key:TweenPosition( + UDim2.new(0.5, 0, ((#MiddleFrames - i) * key.Size.Y.Scale), 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) + end + end + if not IsMinimized.Value and #MiddleFrames > DefaultEntriesOnScreen then + UpdateScrollPosition() + end + + UpdateMinimize() + + UpdateScrollBarSize() + UpdateScrollPosition() + + UpdateScrollBarVisibility() + --debugprint('EndBaseUpdate') + BaseUpdateLock = false +end + +--[[ + code for attaching tab key to maximizing player list +--]] +game.GuiService:AddKey "\t" +local LastTabTime = time() +game.GuiService.KeyPressed:connect(function(key) + if key == "\t" then + debugprint "caught tab key" + local modalCheck, isModal = pcall(function() + return game.GuiService.IsModalDialog + end) + if modalCheck == false or (modalCheck and isModal == false) then + if time() - LastTabTime > 0.4 then + LastTabTime = time() + if IsTabified.Value then + if not IsMaximized.Value then + ScreenGui:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + IsMaximized.Value = true + else + ScreenGui:TweenPosition( + UDim2.new(NormalBounds.X.Scale, NormalBounds.X.Offset - 10, 0, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + IsMaximized.Value = false + IsMinimized.Value = true + end + else + ToggleMaximize() + end + end + end + end +end) + +function PlayersChildAdded(tplayer) + if tplayer:IsA "Player" then + Spawn(function() + debugPlayerAdd(tplayer) + end) + else + BlowThisPopsicleStand() + end +end + +function coreGuiChanged(coreGuiType, enabled) + if coreGuiType == Enum.CoreGuiType.All or coreGuiType == Enum.CoreGuiType.PlayerList then + MainFrame.Visible = enabled + end +end + +function TeamsChildAdded(nteam) + if nteam:IsA "Team" then + TeamAdded(nteam) + else + BlowThisPopsicleStand() + end +end + +function TeamsChildRemoved(nteam) + if nteam:IsA "Team" then + TeamRemoved(nteam) + else + BlowThisPopsicleStand() + end +end + +---------------------------- +-- Hookups and initialization +---------------------------- +function debugPlayerAdd(p) + InsertPlayerFrame(p) +end + +pcall(function() + coreGuiChanged(Enum.CoreGuiType.PlayerList, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.PlayerList)) + Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) +end) + +while not game:GetService "Teams" do + wait(1 / 30) + debugprint "Waiting For Teams" +end +for _, i in pairs(game.Teams:GetTeams()) do + TeamAdded(i) +end +for _, i in pairs(Players:GetPlayers()) do + Spawn(function() + debugPlayerAdd(i) + end) +end + +game.Teams.ChildAdded:connect(TeamsChildAdded) +game.Teams.ChildRemoved:connect(TeamsChildRemoved) +Players.ChildAdded:connect(PlayersChildAdded) + +InitReportAbuse() +AreNamesExpanded.Value = true +BaseUpdate() + +--UGGGLY,find a better way later +wait(2) +IsPersonalServer = not not game.Workspace:FindFirstChild "PSVariable" + +---------------------------- +-- Running Logic +---------------------------- + +--debug stuffs, will only run for 'newplayerlistisbad' +if LocalPlayer.Name == "newplayerlistisbad" or LocalPlayer.Name == "imtotallyadmin" then + debugFrame.Parent = ScreenGui + Spawn(function() + while true do + local str_players = "" + for _, i in pairs(game.Players:GetPlayers()) do + str_players = str_players .. " " .. i.Name + end + debugplayers.Text = str_players + wait(0.5) + end + end) +end diff --git a/lua/48488398.lua b/lua/48488398.lua new file mode 100644 index 0000000..bb9e594 --- /dev/null +++ b/lua/48488398.lua @@ -0,0 +1,354 @@ +function waitForProperty(instance, property) + while not instance[property] do + instance.Changed:wait() + end +end +function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end +end + +waitForProperty(game.Players, "LocalPlayer") +waitForChild(script.Parent, "Popup") +waitForChild(script.Parent.Popup, "AcceptButton") +script.Parent.Popup.AcceptButton.Modal = true + +local localPlayer = game.Players.LocalPlayer +local teleportUI = nil + +local friendRequestBlacklist = {} + +local teleportEnabled = true + +local makePopupInvisible = function() + if script.Parent.Popup then + script.Parent.Popup.Visible = false + end +end + +function makeFriend(fromPlayer, toPlayer) + local popup = script.Parent:FindFirstChild "Popup" + if popup == nil then + return + end -- there is no popup! + if popup.Visible then + return + end -- currently popping something, abort! + if friendRequestBlacklist[fromPlayer] then + return + end -- previously cancelled friend request, we don't want it! + + popup.PopupText.Text = "Accept Friend Request from " .. tostring(fromPlayer.Name) .. "?" + popup.PopupImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?userId=" + .. tostring(fromPlayer.userId) + .. "&x=352&y=352" + + showTwoButtons() + popup.Visible = true + popup.AcceptButton.Text = "Accept" + popup.DeclineButton.Text = "Decline" + popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + + local yesCon, noCon + + yesCon = popup.AcceptButton.MouseButton1Click:connect(function() + popup.Visible = false + toPlayer:RequestFriendship(fromPlayer) + if yesCon then + yesCon:disconnect() + end + if noCon then + noCon:disconnect() + end + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end) + + noCon = popup.DeclineButton.MouseButton1Click:connect(function() + popup.Visible = false + toPlayer:RevokeFriendship(fromPlayer) + friendRequestBlacklist[fromPlayer] = true + print "pop up blacklist" + if yesCon then + yesCon:disconnect() + end + if noCon then + noCon:disconnect() + end + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end) +end + +game.Players.FriendRequestEvent:connect(function(fromPlayer, toPlayer, event) + -- if this doesn't involve me, then do nothing + if fromPlayer ~= localPlayer and toPlayer ~= localPlayer then + return + end + + if fromPlayer == localPlayer then + if event == Enum.FriendRequestEvent.Accept then + game:GetService("GuiService"):SendNotification( + "You are Friends", + "With " .. toPlayer.Name .. "!", + "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(toPlayer.userId) .. "&x=48&y=48", + 5, + function() end + ) + end + elseif toPlayer == localPlayer then + if event == Enum.FriendRequestEvent.Issue then + if friendRequestBlacklist[fromPlayer] then + return + end -- previously cancelled friend request, we don't want it! + game:GetService("GuiService"):SendNotification( + "Friend Request", + "From " .. fromPlayer.Name, + "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48", + 8, + function() + makeFriend(fromPlayer, toPlayer) + end + ) + elseif event == Enum.FriendRequestEvent.Accept then + game:GetService("GuiService"):SendNotification( + "You are Friends", + "With " .. fromPlayer.Name .. "!", + "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48", + 5, + function() end + ) + end + end +end) + +function showOneButton() + local popup = script.Parent:FindFirstChild "Popup" + if popup then + popup.OKButton.Visible = true + popup.DeclineButton.Visible = false + popup.AcceptButton.Visible = false + end +end + +function showTwoButtons() + local popup = script.Parent:FindFirstChild "Popup" + if popup then + popup.OKButton.Visible = false + popup.DeclineButton.Visible = true + popup.AcceptButton.Visible = true + end +end + +function showTeleportUI(message, timer) + if teleportUI ~= nil then + teleportUI:Remove() + end + waitForChild(localPlayer, "PlayerGui") + teleportUI = Instance.new "Message" + teleportUI.Text = message + teleportUI.Parent = localPlayer.PlayerGui + if timer > 0 then + wait(timer) + teleportUI:Remove() + end +end + +function onTeleport(teleportState, _, _) + if game:GetService("TeleportService").CustomizedTeleportUI == false then + if teleportState == Enum.TeleportState.Started then + showTeleportUI("Teleport started...", 0) + elseif teleportState == Enum.TeleportState.WaitingForServer then + showTeleportUI("Requesting server...", 0) + elseif teleportState == Enum.TeleportState.InProgress then + showTeleportUI("Teleporting...", 0) + elseif teleportState == Enum.TeleportState.Failed then + showTeleportUI("Teleport failed. Insufficient privileges or target place does not exist.", 3) + end + end +end + +if teleportEnabled then + localPlayer.OnTeleport:connect(onTeleport) + + game:GetService("TeleportService").ErrorCallback = function(message) + local popup = script.Parent:FindFirstChild "Popup" + showOneButton() + popup.PopupText.Text = message + local clickCon + clickCon = popup.OKButton.MouseButton1Click:connect(function() + game:GetService("TeleportService"):TeleportCancel() + if clickCon then + clickCon:disconnect() + end + game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup") + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end) + game.GuiService:AddCenterDialog( + script.Parent:FindFirstChild "Popup", + Enum.CenterDialogType.QuitDialog, + --ShowFunction + function() + showOneButton() + script.Parent:FindFirstChild("Popup").Visible = true + popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + end, + --HideFunction + function() + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end + ) + end + game:GetService("TeleportService").ConfirmationCallback = function(message, placeId, spawnName) + local popup = script.Parent:FindFirstChild "Popup" + popup.PopupText.Text = message + popup.PopupImage.Image = "" + + local yesCon, noCon + + local function killCons() + if yesCon then + yesCon:disconnect() + end + if noCon then + noCon:disconnect() + end + game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup") + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end + + yesCon = popup.AcceptButton.MouseButton1Click:connect(function() + killCons() + local success, err = pcall(function() + game:GetService("TeleportService"):TeleportImpl(placeId, spawnName) + end) + if not success then + showOneButton() + popup.PopupText.Text = err + local clickCon + clickCon = popup.OKButton.MouseButton1Click:connect(function() + if clickCon then + clickCon:disconnect() + end + game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup") + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end) + game.GuiService:AddCenterDialog( + script.Parent:FindFirstChild "Popup", + Enum.CenterDialogType.QuitDialog, + --ShowFunction + function() + showOneButton() + script.Parent:FindFirstChild("Popup").Visible = true + popup:TweenSize( + UDim2.new(0, 330, 0, 350), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true + ) + end, + --HideFunction + function() + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end + ) + end + end) + + noCon = popup.DeclineButton.MouseButton1Click:connect(function() + killCons() + pcall(function() + game:GetService("TeleportService"):TeleportCancel() + end) + end) + + local centerDialogSuccess = pcall(function() + game.GuiService:AddCenterDialog( + script.Parent:FindFirstChild "Popup", + Enum.CenterDialogType.QuitDialog, + --ShowFunction + function() + showTwoButtons() + popup.AcceptButton.Text = "Leave" + popup.DeclineButton.Text = "Stay" + script.Parent:FindFirstChild("Popup").Visible = true + popup:TweenSize( + UDim2.new(0, 330, 0, 350), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true + ) + end, + --HideFunction + function() + popup:TweenSize( + UDim2.new(0, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true, + makePopupInvisible() + ) + end + ) + end) + + if centerDialogSuccess == false then + script.Parent:FindFirstChild("Popup").Visible = true + popup.AcceptButton.Text = "Leave" + popup.DeclineButton.Text = "Stay" + popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + end + return true + end +end diff --git a/lua/48488451.lua b/lua/48488451.lua new file mode 100644 index 0000000..f93b7c3 --- /dev/null +++ b/lua/48488451.lua @@ -0,0 +1,72 @@ +--build our gui + +local popupFrame = Instance.new "Frame" +popupFrame.Position = UDim2.new(0.5, -165, 0.5, -175) +popupFrame.Size = UDim2.new(0, 330, 0, 350) +popupFrame.Style = Enum.FrameStyle.RobloxRound +popupFrame.ZIndex = 4 +popupFrame.Name = "Popup" +popupFrame.Visible = false +popupFrame.Parent = script.Parent + +local darken = popupFrame:clone() +darken.Size = UDim2.new(1, 16, 1, 16) +darken.Position = UDim2.new(0, -8, 0, -8) +darken.Name = "Darken" +darken.ZIndex = 1 +darken.Parent = popupFrame + +local acceptButton = Instance.new "TextButton" +acceptButton.Position = UDim2.new(0, 20, 0, 270) +acceptButton.Size = UDim2.new(0, 100, 0, 50) +acceptButton.Font = Enum.Font.ArialBold +acceptButton.FontSize = Enum.FontSize.Size24 +acceptButton.Style = Enum.ButtonStyle.RobloxButton +acceptButton.TextColor3 = Color3.new(248 / 255, 248 / 255, 248 / 255) +acceptButton.Text = "Yes" +acceptButton.ZIndex = 5 +acceptButton.Name = "AcceptButton" +acceptButton.Parent = popupFrame + +local declineButton = acceptButton:clone() +declineButton.Position = UDim2.new(1, -120, 0, 270) +declineButton.Text = "No" +declineButton.Name = "DeclineButton" +declineButton.Parent = popupFrame + +local okButton = acceptButton:clone() +okButton.Name = "OKButton" +okButton.Text = "OK" +okButton.Position = UDim2.new(0.5, -50, 0, 270) +okButton.Visible = false +okButton.Parent = popupFrame + +local popupImage = Instance.new "ImageLabel" +popupImage.BackgroundTransparency = 1 +popupImage.Position = UDim2.new(0.5, -140, 0, 0) +popupImage.Size = UDim2.new(0, 280, 0, 280) +popupImage.ZIndex = 3 +popupImage.Name = "PopupImage" +popupImage.Parent = popupFrame + +local backing = Instance.new "ImageLabel" +backing.BackgroundTransparency = 1 +backing.Size = UDim2.new(1, 0, 1, 0) +backing.Image = "http://www.roblox.com/asset/?id=47574181" +backing.Name = "Backing" +backing.ZIndex = 2 +backing.Parent = popupImage + +local popupText = Instance.new "TextLabel" +popupText.Name = "PopupText" +popupText.Size = UDim2.new(1, 0, 0.8, 0) +popupText.Font = Enum.Font.ArialBold +popupText.FontSize = Enum.FontSize.Size36 +popupText.BackgroundTransparency = 1 +popupText.Text = "Hello I'm a popup" +popupText.TextColor3 = Color3.new(248 / 255, 248 / 255, 248 / 255) +popupText.TextWrap = true +popupText.ZIndex = 5 +popupText.Parent = popupFrame + +script:remove() diff --git a/lua/53878047.lua b/lua/53878047.lua new file mode 100644 index 0000000..eb5b87d --- /dev/null +++ b/lua/53878047.lua @@ -0,0 +1,959 @@ +-- This script creates almost all gui elements found in the backpack (warning: there are a lot!) +-- TODO: automate this process + +if game.CoreGui.Version < 3 then + return +end -- peace out if we aren't using the right client + +local gui = script.Parent + +-- A couple of necessary functions +local function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end +end +local function waitForProperty(instance, property) + while not instance[property] do + instance.Changed:wait() + end +end + +local function IsTouchDevice() + local touchEnabled = false + pcall(function() + touchEnabled = Game:GetService("UserInputService").TouchEnabled + end) + return touchEnabled +end + +local function IsPhone() + if gui.AbsoluteSize.Y <= 320 then + return true + end + return false +end + +waitForChild(game, "Players") +waitForProperty(game.Players, "LocalPlayer") + +-- First up is the current loadout +local CurrentLoadout = Instance.new "Frame" +CurrentLoadout.Name = "CurrentLoadout" +CurrentLoadout.Position = UDim2.new(0.5, -300, 1, -85) +CurrentLoadout.Size = UDim2.new(0, 600, 0, 54) +CurrentLoadout.BackgroundTransparency = 1 +CurrentLoadout.RobloxLocked = true +CurrentLoadout.Parent = gui + +local CLBackground = Instance.new "ImageLabel" +CLBackground.Name = "Background" +CLBackground.Size = UDim2.new(1.2, 0, 1.2, 0) +CLBackground.Image = "http://www.roblox.com/asset/?id=96536002" +CLBackground.BackgroundTransparency = 1 +CLBackground.Position = UDim2.new(-0.1, 0, -0.1, 0) +CLBackground.ZIndex = 0.0 +CLBackground.Parent = CurrentLoadout +CLBackground.Visible = false + +local BackgroundUp = Instance.new "ImageLabel" +BackgroundUp.Size = UDim2.new(1, 0, 0.025, 1) +BackgroundUp.Position = UDim2.new(0, 0, 0, 0) +BackgroundUp.Image = "http://www.roblox.com/asset/?id=97662207" +BackgroundUp.BackgroundTransparency = 1 +BackgroundUp.Parent = CLBackground + +local Debounce = Instance.new "BoolValue" +Debounce.Name = "Debounce" +Debounce.RobloxLocked = true +Debounce.Parent = CurrentLoadout + +local BackpackButton = Instance.new "ImageButton" +BackpackButton.RobloxLocked = true +BackpackButton.Visible = false +BackpackButton.Name = "BackpackButton" +BackpackButton.BackgroundTransparency = 1 +BackpackButton.Image = "http://www.roblox.com/asset/?id=97617958" +BackpackButton.Position = UDim2.new(0.5, -60, 1, -108) +BackpackButton.Size = UDim2.new(0, 120, 0, 18) +waitForChild(gui, "ControlFrame") +BackpackButton.Parent = gui.ControlFrame + +local NumSlots = 9 + +if IsPhone() then + NumSlots = 3 + CurrentLoadout.Size = UDim2.new(0, 180, 0, 54) + CurrentLoadout.Position = UDim2.new(0.5, -90, 1, -85) +end + +for i = 0, NumSlots do + local slotFrame = Instance.new "Frame" + slotFrame.RobloxLocked = true + slotFrame.BackgroundColor3 = Color3.new(0, 0, 0) + slotFrame.BackgroundTransparency = 1 + slotFrame.BorderColor3 = Color3.new(1, 1, 1) + slotFrame.Name = "Slot" .. tostring(i) + slotFrame.ZIndex = 4.0 + if i == 0 then + slotFrame.Position = UDim2.new(0.9, 0, 0, 0) + else + slotFrame.Position = UDim2.new((i - 1) * 0.1, (i - 1) * 6, 0, 0) + end + + slotFrame.Size = UDim2.new(0, 54, 1, 0) + slotFrame.Parent = CurrentLoadout + + if gui.AbsoluteSize.Y <= 320 then + slotFrame.Position = UDim2.new(0, (i - 1) * 60, 0, -50) + print("Well got here", slotFrame, slotFrame.Position.X.Scale, slotFrame.Position.X.Offset) + end + if gui.AbsoluteSize.Y <= 320 and i == 0 then + slotFrame:Destroy() + end +end + +local TempSlot = Instance.new "ImageButton" +TempSlot.Name = "TempSlot" +TempSlot.Active = true +TempSlot.Size = UDim2.new(1, 0, 1, 0) +TempSlot.BackgroundTransparency = 1 +TempSlot.Style = "Custom" +TempSlot.Visible = false +TempSlot.RobloxLocked = true +TempSlot.Parent = CurrentLoadout +TempSlot.ZIndex = 3.0 + +local slotBackground = Instance.new "ImageLabel" +slotBackground.Name = "Background" +slotBackground.BackgroundTransparency = 1 +slotBackground.Image = "http://www.roblox.com/asset/?id=97613075" +slotBackground.Size = UDim2.new(1, 0, 1, 0) +slotBackground.Parent = TempSlot + +local HighLight = Instance.new "ImageLabel" +HighLight.Name = "Highlight" +HighLight.BackgroundTransparency = 1 +HighLight.Image = "http://www.roblox.com/asset/?id=97643886" +HighLight.Size = UDim2.new(1, 0, 1, 0) +--HighLight.Parent = TempSlot +HighLight.Visible = false + +-- TempSlot Children +local GearReference = Instance.new "ObjectValue" +GearReference.Name = "GearReference" +GearReference.RobloxLocked = true +GearReference.Parent = TempSlot + +local ToolTipLabel = Instance.new "TextLabel" +ToolTipLabel.Name = "ToolTipLabel" +ToolTipLabel.RobloxLocked = true +ToolTipLabel.Text = "" +ToolTipLabel.BackgroundTransparency = 0.5 +ToolTipLabel.BorderSizePixel = 0 +ToolTipLabel.Visible = false +ToolTipLabel.TextColor3 = Color3.new(1, 1, 1) +ToolTipLabel.BackgroundColor3 = Color3.new(0, 0, 0) +ToolTipLabel.TextStrokeTransparency = 0 +ToolTipLabel.Font = Enum.Font.ArialBold +ToolTipLabel.FontSize = Enum.FontSize.Size14 +--ToolTipLabel.TextWrap = true +ToolTipLabel.Size = UDim2.new(1, 60, 0, 20) +ToolTipLabel.Position = UDim2.new(0, -30, 0, -30) +ToolTipLabel.Parent = TempSlot + +local Kill = Instance.new "BoolValue" +Kill.Name = "Kill" +Kill.RobloxLocked = true +Kill.Parent = TempSlot + +local GearImage = Instance.new "ImageLabel" +GearImage.Name = "GearImage" +GearImage.BackgroundTransparency = 1 +GearImage.Position = UDim2.new(0, 0, 0, 0) +GearImage.Size = UDim2.new(1, 0, 1, 0) +GearImage.ZIndex = 5.0 +GearImage.RobloxLocked = true +GearImage.Parent = TempSlot + +local SlotNumber = Instance.new "TextLabel" +SlotNumber.Name = "SlotNumber" +SlotNumber.BackgroundTransparency = 1 +SlotNumber.BorderSizePixel = 0 +SlotNumber.Font = Enum.Font.ArialBold +SlotNumber.FontSize = Enum.FontSize.Size18 +SlotNumber.Position = UDim2.new(0, 0, 0, 0) +SlotNumber.Size = UDim2.new(0, 10, 0, 15) +SlotNumber.TextColor3 = Color3.new(1, 1, 1) +SlotNumber.TextTransparency = 0 +SlotNumber.TextXAlignment = Enum.TextXAlignment.Left +SlotNumber.TextYAlignment = Enum.TextYAlignment.Bottom +SlotNumber.RobloxLocked = true +SlotNumber.Parent = TempSlot +SlotNumber.ZIndex = 5 + +if IsTouchDevice() then + SlotNumber.Visible = false +end + +local SlotNumberDownShadow = SlotNumber:Clone() +SlotNumberDownShadow.Name = "SlotNumberDownShadow" +SlotNumberDownShadow.TextColor3 = Color3.new(0, 0, 0) +SlotNumberDownShadow.Position = UDim2.new(0, 1, 0, -1) +SlotNumberDownShadow.Parent = TempSlot +SlotNumberDownShadow.ZIndex = 2 + +local SlotNumberUpShadow = SlotNumberDownShadow:Clone() +SlotNumberUpShadow.Name = "SlotNumberUpShadow" +SlotNumberUpShadow.Position = UDim2.new(0, -1, 0, -1) +SlotNumberUpShadow.Parent = TempSlot + +local GearText = Instance.new "TextLabel" +GearText.RobloxLocked = true +GearText.Name = "GearText" +GearText.BackgroundTransparency = 1 +GearText.Font = Enum.Font.Arial +GearText.FontSize = Enum.FontSize.Size14 +GearText.Position = UDim2.new(0, -8, 0, -8) +GearText.Size = UDim2.new(1, 16, 1, 16) +GearText.Text = "" +GearText.TextColor3 = Color3.new(1, 1, 1) +GearText.TextWrap = true +GearText.Parent = TempSlot +GearText.ZIndex = 5.0 + +--- Great, now lets make the inventory! + +local Backpack = Instance.new "Frame" +Backpack.RobloxLocked = true +Backpack.Visible = false +Backpack.Name = "Backpack" +Backpack.Position = UDim2.new(0.5, 0, 0.5, 0) +Backpack.BackgroundColor3 = Color3.new(32 / 255, 32 / 255, 32 / 255) +Backpack.BackgroundTransparency = 0.0 +Backpack.BorderSizePixel = 0 +Backpack.Parent = gui +Backpack.Active = true + +-- Backpack Children +local SwapSlot = Instance.new "BoolValue" +SwapSlot.RobloxLocked = true +SwapSlot.Name = "SwapSlot" +SwapSlot.Parent = Backpack + +-- SwapSlot Children +local Slot = Instance.new "IntValue" +Slot.RobloxLocked = true +Slot.Name = "Slot" +Slot.Parent = SwapSlot + +local GearButton = Instance.new "ObjectValue" +GearButton.RobloxLocked = true +GearButton.Name = "GearButton" +GearButton.Parent = SwapSlot + +local Tabs = Instance.new "Frame" +Tabs.Name = "Tabs" +Tabs.Visible = false +Tabs.Active = false +Tabs.RobloxLocked = true +Tabs.BackgroundColor3 = Color3.new(0, 0, 0) +Tabs.BackgroundTransparency = 0.08 +Tabs.BorderSizePixel = 0 +Tabs.Position = UDim2.new(0, 0, -0.1, -4) +Tabs.Size = UDim2.new(1, 0, 0.1, 4) +Tabs.Parent = Backpack + +-- Tabs Children + +local tabLine = Instance.new "Frame" +tabLine.RobloxLocked = true +tabLine.Name = "TabLine" +tabLine.BackgroundColor3 = Color3.new(53 / 255, 53 / 255, 53 / 255) +tabLine.BorderSizePixel = 0 +tabLine.Position = UDim2.new(0, 5, 1, -4) +tabLine.Size = UDim2.new(1, -10, 0, 4) +tabLine.ZIndex = 2 +tabLine.Parent = Tabs + +local InventoryButton = Instance.new "TextButton" +InventoryButton.RobloxLocked = true +InventoryButton.Name = "InventoryButton" +InventoryButton.Size = UDim2.new(0, 60, 0, 30) +InventoryButton.Position = UDim2.new(0, 7, 1, -31) +InventoryButton.BackgroundColor3 = Color3.new(1, 1, 1) +InventoryButton.BorderColor3 = Color3.new(1, 1, 1) +InventoryButton.Font = Enum.Font.ArialBold +InventoryButton.FontSize = Enum.FontSize.Size18 +InventoryButton.Text = "Gear" +InventoryButton.AutoButtonColor = false +InventoryButton.TextColor3 = Color3.new(0, 0, 0) +InventoryButton.Selected = true +InventoryButton.Active = true +InventoryButton.ZIndex = 3 +InventoryButton.Parent = Tabs + +if game.CoreGui.Version >= 8 then + local WardrobeButton = Instance.new "TextButton" + WardrobeButton.RobloxLocked = true + WardrobeButton.Name = "WardrobeButton" + WardrobeButton.Size = UDim2.new(0, 90, 0, 30) + WardrobeButton.Position = UDim2.new(0, 77, 1, -31) + WardrobeButton.BackgroundColor3 = Color3.new(0, 0, 0) + WardrobeButton.BorderColor3 = Color3.new(1, 1, 1) + WardrobeButton.Font = Enum.Font.ArialBold + WardrobeButton.FontSize = Enum.FontSize.Size18 + WardrobeButton.Text = "Wardrobe" + WardrobeButton.AutoButtonColor = false + WardrobeButton.TextColor3 = Color3.new(1, 1, 1) + WardrobeButton.Selected = false + WardrobeButton.Active = true + WardrobeButton.Parent = Tabs +end + +local closeButton = Instance.new "TextButton" +closeButton.RobloxLocked = true +closeButton.Name = "CloseButton" +closeButton.Font = Enum.Font.ArialBold +closeButton.FontSize = Enum.FontSize.Size24 +closeButton.Position = UDim2.new(1, -33, 0, 4) +closeButton.Size = UDim2.new(0, 30, 0, 30) +closeButton.Style = Enum.ButtonStyle.RobloxButton +closeButton.Text = "" +closeButton.TextColor3 = Color3.new(1, 1, 1) +closeButton.Parent = Tabs +closeButton.Modal = true + +--closeButton child +local XImage = Instance.new "ImageLabel" +XImage.RobloxLocked = true +XImage.Name = "XImage" +game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75547445" +XImage.Image = "http://www.roblox.com/asset/?id=75547445" --TODO: move to rbxasset +XImage.BackgroundTransparency = 1 +XImage.Position = UDim2.new(-0.25, -1, -0.25, -1) +XImage.Size = UDim2.new(1.5, 2, 1.5, 2) +XImage.ZIndex = 2 +XImage.Parent = closeButton + +-- Generic Search gui used across backpack +local SearchFrame = Instance.new "Frame" +SearchFrame.RobloxLocked = true +SearchFrame.Name = "SearchFrame" +SearchFrame.BackgroundTransparency = 1 +SearchFrame.Position = UDim2.new(1, -220, 0, 2) +SearchFrame.Size = UDim2.new(0, 220, 0, 24) +SearchFrame.Parent = Backpack + +-- SearchFrame Children +local SearchButton = Instance.new "ImageButton" +SearchButton.RobloxLocked = true +SearchButton.Name = "SearchButton" +SearchButton.Size = UDim2.new(0, 25, 0, 25) +SearchButton.BackgroundTransparency = 1 +SearchButton.Image = "rbxasset://textures/ui/SearchIcon.png" +SearchButton.Parent = SearchFrame + +local SearchBoxFrame = Instance.new "TextButton" +SearchBoxFrame.RobloxLocked = true +SearchBoxFrame.Position = UDim2.new(0, 25, 0, 0) +SearchBoxFrame.Size = UDim2.new(1, -28, 0, 26) +SearchBoxFrame.Name = "SearchBoxFrame" +SearchBoxFrame.Text = "" +SearchBoxFrame.Style = Enum.ButtonStyle.RobloxButton +SearchBoxFrame.Parent = SearchFrame + +-- SearchBoxFrame Children +local SearchBox = Instance.new "TextBox" +SearchBox.RobloxLocked = true +SearchBox.Name = "SearchBox" +SearchBox.BackgroundTransparency = 1 +SearchBox.Font = Enum.Font.ArialBold +SearchBox.FontSize = Enum.FontSize.Size12 +SearchBox.Position = UDim2.new(0, -5, 0, -5) +SearchBox.Size = UDim2.new(1, 10, 1, 10) +SearchBox.TextColor3 = Color3.new(1, 1, 1) +SearchBox.TextXAlignment = Enum.TextXAlignment.Left +SearchBox.ZIndex = 2 +SearchBox.TextWrap = true +SearchBox.Text = "Search..." +SearchBox.Parent = SearchBoxFrame + +local ResetButton = Instance.new "TextButton" +ResetButton.RobloxLocked = true +ResetButton.Visible = false +ResetButton.Name = "ResetButton" +ResetButton.Position = UDim2.new(1, -26, 0, 3) +ResetButton.Size = UDim2.new(0, 20, 0, 20) +ResetButton.Style = Enum.ButtonStyle.RobloxButtonDefault +ResetButton.Text = "X" +ResetButton.TextColor3 = Color3.new(1, 1, 1) +ResetButton.Font = Enum.Font.ArialBold +ResetButton.FontSize = Enum.FontSize.Size18 +ResetButton.ZIndex = 3 +ResetButton.Parent = SearchFrame + +------------------------------- GEAR ------------------------------------------------------- +local Gear = Instance.new "Frame" +Gear.Name = "Gear" +Gear.RobloxLocked = true +Gear.BackgroundTransparency = 1 +Gear.Size = UDim2.new(1, 0, 1, 0) +Gear.ClipsDescendants = true +Gear.Parent = Backpack + +-- Gear Children +local AssetsList = Instance.new "Frame" +AssetsList.RobloxLocked = true +AssetsList.Name = "AssetsList" +AssetsList.BackgroundTransparency = 1 +AssetsList.Size = UDim2.new(0.2, 0, 1, 0) +AssetsList.Style = Enum.FrameStyle.RobloxSquare +AssetsList.Visible = false +AssetsList.Parent = Gear + +local GearGrid = Instance.new "Frame" +GearGrid.RobloxLocked = true +GearGrid.Name = "GearGrid" +GearGrid.Size = UDim2.new(0.95, 0, 1, 0) +GearGrid.BackgroundTransparency = 1 +GearGrid.Parent = Gear + +local GearButton = Instance.new "ImageButton" +GearButton.RobloxLocked = true +GearButton.Visible = false +GearButton.Name = "GearButton" +GearButton.Size = UDim2.new(0, 54, 0, 54) +GearButton.Style = "Custom" +GearButton.BackgroundTransparency = 1 +GearButton.Parent = GearGrid + +local slotBackground = Instance.new "ImageLabel" +slotBackground.Name = "Background" +slotBackground.BackgroundTransparency = 1 +slotBackground.Image = "http://www.roblox.com/asset/?id=97613075" +slotBackground.Size = UDim2.new(1, 0, 1, 0) +slotBackground.Parent = GearButton + +-- GearButton Children +local GearReference = Instance.new "ObjectValue" +GearReference.RobloxLocked = true +GearReference.Name = "GearReference" +GearReference.Parent = GearButton + +local GreyOutButton = Instance.new "Frame" +GreyOutButton.RobloxLocked = true +GreyOutButton.Name = "GreyOutButton" +GreyOutButton.BackgroundTransparency = 0.5 +GreyOutButton.Size = UDim2.new(1, 0, 1, 0) +GreyOutButton.Active = true +GreyOutButton.Visible = false +GreyOutButton.ZIndex = 3 +GreyOutButton.Parent = GearButton + +local GearText = Instance.new "TextLabel" +GearText.RobloxLocked = true +GearText.Name = "GearText" +GearText.BackgroundTransparency = 1 +GearText.Font = Enum.Font.Arial +GearText.FontSize = Enum.FontSize.Size14 +GearText.Position = UDim2.new(0, -8, 0, -8) +GearText.Size = UDim2.new(1, 16, 1, 16) +GearText.Text = "" +GearText.ZIndex = 2 +GearText.TextColor3 = Color3.new(1, 1, 1) +GearText.TextWrap = true +GearText.Parent = GearButton + +local GearGridScrollingArea = Instance.new "Frame" +GearGridScrollingArea.RobloxLocked = true +GearGridScrollingArea.Name = "GearGridScrollingArea" +GearGridScrollingArea.Position = UDim2.new(1, -19, 0, 35) +GearGridScrollingArea.Size = UDim2.new(0, 17, 1, -45) +GearGridScrollingArea.BackgroundTransparency = 1 +GearGridScrollingArea.Parent = Gear + +local GearLoadouts = Instance.new "Frame" +GearLoadouts.RobloxLocked = true +GearLoadouts.Name = "GearLoadouts" +GearLoadouts.BackgroundTransparency = 1 +GearLoadouts.Position = UDim2.new(0.7, 23, 0.5, 1) +GearLoadouts.Size = UDim2.new(0.3, -23, 0.5, -1) +GearLoadouts.Parent = Gear +GearLoadouts.Visible = false + +-- GearLoadouts Children +local GearLoadoutsHeader = Instance.new "Frame" +GearLoadoutsHeader.RobloxLocked = true +GearLoadoutsHeader.Name = "GearLoadoutsHeader" +GearLoadoutsHeader.BackgroundColor3 = Color3.new(0, 0, 0) +GearLoadoutsHeader.BackgroundTransparency = 0.2 +GearLoadoutsHeader.BorderColor3 = Color3.new(1, 0, 0) +GearLoadoutsHeader.Size = UDim2.new(1, 2, 0.15, -1) +GearLoadoutsHeader.Parent = GearLoadouts + +-- GearLoadoutsHeader Children +local LoadoutsHeaderText = Instance.new "TextLabel" +LoadoutsHeaderText.RobloxLocked = true +LoadoutsHeaderText.Name = "LoadoutsHeaderText" +LoadoutsHeaderText.BackgroundTransparency = 1 +LoadoutsHeaderText.Font = Enum.Font.ArialBold +LoadoutsHeaderText.FontSize = Enum.FontSize.Size18 +LoadoutsHeaderText.Size = UDim2.new(1, 0, 1, 0) +LoadoutsHeaderText.Text = "Loadouts" +LoadoutsHeaderText.TextColor3 = Color3.new(1, 1, 1) +LoadoutsHeaderText.Parent = GearLoadoutsHeader + +local GearLoadoutsScrollingArea = GearGridScrollingArea:clone() +GearLoadoutsScrollingArea.RobloxLocked = true +GearLoadoutsScrollingArea.Name = "GearLoadoutsScrollingArea" +GearLoadoutsScrollingArea.Position = UDim2.new(1, -15, 0.15, 2) +GearLoadoutsScrollingArea.Size = UDim2.new(0, 17, 0.85, -2) +GearLoadoutsScrollingArea.Parent = GearLoadouts + +local LoadoutsList = Instance.new "Frame" +LoadoutsList.RobloxLocked = true +LoadoutsList.Name = "LoadoutsList" +LoadoutsList.Position = UDim2.new(0, 0, 0.15, 2) +LoadoutsList.Size = UDim2.new(1, -17, 0.85, -2) +LoadoutsList.Style = Enum.FrameStyle.RobloxSquare +LoadoutsList.Parent = GearLoadouts + +local GearPreview = Instance.new "Frame" +GearPreview.RobloxLocked = true +GearPreview.Name = "GearPreview" +GearPreview.Position = UDim2.new(0.7, 23, 0, 0) +GearPreview.Size = UDim2.new(0.3, -28, 0.5, -1) +GearPreview.BackgroundTransparency = 1 +GearPreview.ZIndex = 7 +GearPreview.Parent = Gear + +-- GearPreview Children +local GearStats = Instance.new "Frame" +GearStats.RobloxLocked = true +GearStats.Name = "GearStats" +GearStats.BackgroundTransparency = 1 +GearStats.Position = UDim2.new(0, 0, 0.75, 0) +GearStats.Size = UDim2.new(1, 0, 0.25, 0) +GearStats.ZIndex = 8 +GearStats.Parent = GearPreview + +-- GearStats Children +local GearName = Instance.new "TextLabel" +GearName.RobloxLocked = true +GearName.Name = "GearName" +GearName.BackgroundTransparency = 1 +GearName.Font = Enum.Font.ArialBold +GearName.FontSize = Enum.FontSize.Size18 +GearName.Position = UDim2.new(0, -3, 0, 0) +GearName.Size = UDim2.new(1, 6, 1, 5) +GearName.Text = "" +GearName.TextColor3 = Color3.new(1, 1, 1) +GearName.TextWrap = true +GearName.ZIndex = 9 +GearName.Parent = GearStats + +local GearImage = Instance.new "ImageLabel" +GearImage.RobloxLocked = true +GearImage.Name = "GearImage" +GearImage.Image = "" +GearImage.BackgroundTransparency = 1 +GearImage.Position = UDim2.new(0.125, 0, 0, 0) +GearImage.Size = UDim2.new(0.75, 0, 0.75, 0) +GearImage.ZIndex = 8 +GearImage.Parent = GearPreview + +--GearImage Children +local GearIcons = Instance.new "Frame" +GearIcons.BackgroundColor3 = Color3.new(0, 0, 0) +GearIcons.BackgroundTransparency = 0.5 +GearIcons.BorderSizePixel = 0 +GearIcons.RobloxLocked = true +GearIcons.Name = "GearIcons" +GearIcons.Position = UDim2.new(0.4, 2, 0.85, -2) +GearIcons.Size = UDim2.new(0.6, 0, 0.15, 0) +GearIcons.Visible = false +GearIcons.ZIndex = 9 +GearIcons.Parent = GearImage + +-- GearIcons Children +local GenreImage = Instance.new "ImageLabel" +GenreImage.RobloxLocked = true +GenreImage.Name = "GenreImage" +GenreImage.BackgroundColor3 = Color3.new(102 / 255, 153 / 255, 1) +GenreImage.BackgroundTransparency = 0.5 +GenreImage.BorderSizePixel = 0 +GenreImage.Size = UDim2.new(0.25, 0, 1, 0) +GenreImage.Parent = GearIcons + +local AttributeOneImage = GenreImage:clone() +AttributeOneImage.RobloxLocked = true +AttributeOneImage.Name = "AttributeOneImage" +AttributeOneImage.BackgroundColor3 = Color3.new(1, 51 / 255, 0) +AttributeOneImage.Position = UDim2.new(0.25, 0, 0, 0) +AttributeOneImage.Parent = GearIcons + +local AttributeTwoImage = GenreImage:clone() +AttributeTwoImage.RobloxLocked = true +AttributeTwoImage.Name = "AttributeTwoImage" +AttributeTwoImage.BackgroundColor3 = Color3.new(153 / 255, 1, 153 / 255) +AttributeTwoImage.Position = UDim2.new(0.5, 0, 0, 0) +AttributeTwoImage.Parent = GearIcons + +local AttributeThreeImage = GenreImage:clone() +AttributeThreeImage.RobloxLocked = true +AttributeThreeImage.Name = "AttributeThreeImage" +AttributeThreeImage.BackgroundColor3 = Color3.new(0, 0.5, 0.5) +AttributeThreeImage.Position = UDim2.new(0.75, 0, 0, 0) +AttributeThreeImage.Parent = GearIcons + +------------------------------- WARDROBE ------------------------------------------------------- +if game.CoreGui.Version < 8 then + -- no need for this to stick around, we aren't ready for wardrobe + script:remove() + return +end + +local function makeCharFrame(frameName, parent) + local frame = Instance.new "Frame" + frame.RobloxLocked = true + frame.Size = UDim2.new(1, 0, 1, -70) + frame.Position = UDim2.new(0, 0, 0, 20) + frame.Name = frameName + frame.BackgroundTransparency = 1 + frame.Parent = parent + frame.Visible = false + return frame +end +local function makeZone(zoneName, image, size, position, parent) + local zone = Instance.new "ImageLabel" + zone.RobloxLocked = true + zone.Name = zoneName + zone.Image = image + zone.Size = size + zone.BackgroundTransparency = 1 + zone.Position = position + zone.Parent = parent + return zone +end +local function makeStyledButton(buttonName, size, position, parent, buttonStyle) + local button = Instance.new "ImageButton" + button.RobloxLocked = true + button.Name = buttonName + button.Size = size + button.Position = position + if buttonStyle then + button.Style = buttonStyle + else + button.BackgroundColor3 = Color3.new(0, 0, 0) + button.BorderColor3 = Color3.new(1, 1, 1) + end + button.Parent = parent + return button +end +local function makeTextLabel(TextLabelName, text, position, parent) + local label = Instance.new "TextLabel" + label.RobloxLocked = true + label.BackgroundTransparency = 1 + label.Size = UDim2.new(0, 32, 0, 14) + label.Name = TextLabelName + label.Font = Enum.Font.Arial + label.TextColor3 = Color3.new(1, 1, 1) + label.FontSize = Enum.FontSize.Size14 + label.Text = text + label.Position = position + label.Parent = parent +end + +local Wardrobe = Instance.new "Frame" +Wardrobe.Name = "Wardrobe" +Wardrobe.RobloxLocked = true +Wardrobe.BackgroundTransparency = 1 +Wardrobe.Visible = false +Wardrobe.Size = UDim2.new(1, 0, 1, 0) +Wardrobe.Parent = Backpack + +local AssetList = Instance.new "Frame" +AssetList.RobloxLocked = true +AssetList.Name = "AssetList" +AssetList.Position = UDim2.new(0, 4, 0, 5) +AssetList.Size = UDim2.new(0, 85, 1, -5) +AssetList.BackgroundTransparency = 1 +AssetList.Visible = true +AssetList.Parent = Wardrobe + +local PreviewAssetFrame = Instance.new "Frame" +PreviewAssetFrame.RobloxLocked = true +PreviewAssetFrame.Name = "PreviewAssetFrame" +PreviewAssetFrame.BackgroundTransparency = 1 +PreviewAssetFrame.Position = UDim2.new(1, -240, 0, 30) +PreviewAssetFrame.Size = UDim2.new(0, 250, 0, 250) +PreviewAssetFrame.Parent = Wardrobe + +local PreviewAssetBacking = Instance.new "TextButton" +PreviewAssetBacking.RobloxLocked = true +PreviewAssetBacking.Name = "PreviewAssetBacking" +PreviewAssetBacking.Active = false +PreviewAssetBacking.Text = "" +PreviewAssetBacking.AutoButtonColor = false +PreviewAssetBacking.Size = UDim2.new(1, 0, 1, 0) +PreviewAssetBacking.Style = Enum.ButtonStyle.RobloxButton +PreviewAssetBacking.Visible = false +PreviewAssetBacking.ZIndex = 9 +PreviewAssetBacking.Parent = PreviewAssetFrame + +local PreviewAssetImage = Instance.new "ImageLabel" +PreviewAssetImage.RobloxLocked = true +PreviewAssetImage.Name = "PreviewAssetImage" +PreviewAssetImage.BackgroundTransparency = 0.8 +PreviewAssetImage.Position = UDim2.new(0.5, -100, 0, 0) +PreviewAssetImage.Size = UDim2.new(0, 200, 0, 200) +PreviewAssetImage.BorderSizePixel = 0 +PreviewAssetImage.ZIndex = 10 +PreviewAssetImage.Parent = PreviewAssetBacking + +local AssetNameLabel = Instance.new "TextLabel" +AssetNameLabel.Name = "AssetNameLabel" +AssetNameLabel.RobloxLocked = true +AssetNameLabel.BackgroundTransparency = 1 +AssetNameLabel.Position = UDim2.new(0, 0, 1, -20) +AssetNameLabel.Size = UDim2.new(0.5, 0, 0, 24) +AssetNameLabel.ZIndex = 10 +AssetNameLabel.Font = Enum.Font.Arial +AssetNameLabel.Text = "" +AssetNameLabel.TextColor3 = Color3.new(1, 1, 1) +AssetNameLabel.TextScaled = true +AssetNameLabel.Parent = PreviewAssetBacking + +local AssetTypeLabel = AssetNameLabel:clone() +AssetTypeLabel.RobloxLocked = true +AssetTypeLabel.Name = "AssetTypeLabel" +AssetTypeLabel.TextScaled = false +AssetTypeLabel.FontSize = Enum.FontSize.Size18 +AssetTypeLabel.Position = UDim2.new(0.5, 3, 1, -20) +AssetTypeLabel.Parent = PreviewAssetBacking + +local PreviewButton = Instance.new "TextButton" +PreviewButton.RobloxLocked = true +PreviewButton.Name = "PreviewButton" +PreviewButton.Text = "Rotate" +PreviewButton.BackgroundColor3 = Color3.new(0, 0, 0) +PreviewButton.BackgroundTransparency = 0.5 +PreviewButton.BorderColor3 = Color3.new(1, 1, 1) +PreviewButton.Position = UDim2.new(1.2, -62, 1, -50) +PreviewButton.Size = UDim2.new(0, 125, 0, 50) +PreviewButton.Font = Enum.Font.ArialBold +PreviewButton.FontSize = Enum.FontSize.Size24 +PreviewButton.TextColor3 = Color3.new(1, 1, 1) +PreviewButton.TextWrapped = true +PreviewButton.TextStrokeTransparency = 0 +PreviewButton.Parent = Wardrobe + +local CharacterPane = Instance.new "Frame" +CharacterPane.RobloxLocked = true +CharacterPane.Name = "CharacterPane" +CharacterPane.Position = UDim2.new(1, -220, 0, 32) +CharacterPane.Size = UDim2.new(0, 220, 1, -40) +CharacterPane.BackgroundTransparency = 1 +CharacterPane.Visible = true +CharacterPane.Parent = Wardrobe + +--CharacterPane Children +local FaceFrame = makeCharFrame("FacesFrame", CharacterPane) +game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75460621" +makeZone( + "FaceZone", + "http://www.roblox.com/asset/?id=75460621", + UDim2.new(0, 157, 0, 137), + UDim2.new(0.5, -78, 0.5, -68), + FaceFrame +) +makeStyledButton("Face", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -135), FaceFrame) + +local HeadFrame = makeCharFrame("HeadsFrame", CharacterPane) +makeZone( + "FaceZone", + "http://www.roblox.com/asset/?id=75460621", + UDim2.new(0, 157, 0, 137), + UDim2.new(0.5, -78, 0.5, -68), + HeadFrame +) +makeStyledButton("Head", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -135), HeadFrame) + +local HatsFrame = makeCharFrame("HatsFrame", CharacterPane) +game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75457888" +local HatsZone = makeZone( + "HatsZone", + "http://www.roblox.com/asset/?id=75457888", + UDim2.new(0, 186, 0, 184), + UDim2.new(0.5, -93, 0.5, -100), + HatsFrame +) +makeStyledButton( + "Hat1Button", + UDim2.new(0, 64, 0, 64), + UDim2.new(0, -1, 0, -1), + HatsZone, + Enum.ButtonStyle.RobloxButton +) +makeStyledButton( + "Hat2Button", + UDim2.new(0, 64, 0, 64), + UDim2.new(0, 63, 0, -1), + HatsZone, + Enum.ButtonStyle.RobloxButton +) +makeStyledButton( + "Hat3Button", + UDim2.new(0, 64, 0, 64), + UDim2.new(0, 127, 0, -1), + HatsZone, + Enum.ButtonStyle.RobloxButton +) + +local PantsFrame = makeCharFrame("PantsFrame", CharacterPane) +game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75457920" +makeZone( + "PantsZone", + "http://www.roblox.com/asset/?id=75457920", + UDim2.new(0, 121, 0, 99), + UDim2.new(0.5, -60, 0.5, -100), + PantsFrame +) + +local pantFrame = Instance.new "Frame" +pantFrame.RobloxLocked = true +pantFrame.Size = UDim2.new(0, 25, 0, 56) +pantFrame.Position = UDim2.new(0.5, -26, 0.5, 0) +pantFrame.BackgroundColor3 = Color3.new(0, 0, 0) +pantFrame.BorderColor3 = Color3.new(1, 1, 1) +pantFrame.Name = "PantFrame" +pantFrame.Parent = PantsFrame + +local otherPantFrame = pantFrame:clone() +otherPantFrame.Position = UDim2.new(0.5, 3, 0.5, 0) +otherPantFrame.RobloxLocked = true +otherPantFrame.Parent = PantsFrame + +local CurrentPants = Instance.new "ImageButton" +CurrentPants.RobloxLocked = true +CurrentPants.BackgroundTransparency = 1 +CurrentPants.ZIndex = 2 +CurrentPants.Name = "CurrentPants" +CurrentPants.Position = UDim2.new(0.5, -31, 0.5, -4) +CurrentPants.Size = UDim2.new(0, 54, 0, 59) +CurrentPants.Parent = PantsFrame + +local MeshFrame = makeCharFrame("PackagesFrame", CharacterPane) +local torsoButton = makeStyledButton( + "TorsoMeshButton", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, -32, 0.5, -110), + MeshFrame, + Enum.ButtonStyle.RobloxButton +) +makeTextLabel("TorsoLabel", "Torso", UDim2.new(0.5, -16, 0, -25), torsoButton) +local leftLegButton = makeStyledButton( + "LeftLegMeshButton", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, 0, 0.5, -25), + MeshFrame, + Enum.ButtonStyle.RobloxButton +) +makeTextLabel("LeftLegLabel", "Left Leg", UDim2.new(0.5, -16, 0, -25), leftLegButton) +local rightLegButton = makeStyledButton( + "RightLegMeshButton", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, -64, 0.5, -25), + MeshFrame, + Enum.ButtonStyle.RobloxButton +) +makeTextLabel("RightLegLabel", "Right Leg", UDim2.new(0.5, -16, 0, -25), rightLegButton) +local rightArmButton = makeStyledButton( + "RightArmMeshButton", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, -96, 0.5, -110), + MeshFrame, + Enum.ButtonStyle.RobloxButton +) +makeTextLabel("RightArmLabel", "Right Arm", UDim2.new(0.5, -16, 0, -25), rightArmButton) +local leftArmButton = makeStyledButton( + "LeftArmMeshButton", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, 32, 0.5, -110), + MeshFrame, + Enum.ButtonStyle.RobloxButton +) +makeTextLabel("LeftArmLabel", "Left Arm", UDim2.new(0.5, -16, 0, -25), leftArmButton) + +local TShirtFrame = makeCharFrame("T-ShirtsFrame", CharacterPane) +game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75460642" +makeZone( + "TShirtZone", + "http://www.roblox.com/asset/?id=75460642", + UDim2.new(0, 121, 0, 154), + UDim2.new(0.5, -60, 0.5, -100), + TShirtFrame +) +makeStyledButton("TShirtButton", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -64), TShirtFrame) + +local ShirtFrame = makeCharFrame("ShirtsFrame", CharacterPane) +makeZone( + "ShirtZone", + "http://www.roblox.com/asset/?id=75460642", + UDim2.new(0, 121, 0, 154), + UDim2.new(0.5, -60, 0.5, -100), + ShirtFrame +) +makeStyledButton("ShirtButton", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -64), ShirtFrame) + +local ColorFrame = makeCharFrame("ColorFrame", CharacterPane) +game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=76049888" +local ColorZone = makeZone( + "ColorZone", + "http://www.roblox.com/asset/?id=76049888", + UDim2.new(0, 120, 0, 150), + UDim2.new(0.5, -60, 0.5, -100), + ColorFrame +) +makeStyledButton("Head", UDim2.new(0.26, 0, 0.19, 0), UDim2.new(0.37, 0, 0.02, 0), ColorZone).AutoButtonColor = false +makeStyledButton("LeftArm", UDim2.new(0.19, 0, 0.36, 0), UDim2.new(0.78, 0, 0.26, 0), ColorZone).AutoButtonColor = false +makeStyledButton("RightArm", UDim2.new(0.19, 0, 0.36, 0), UDim2.new(0.025, 0, 0.26, 0), ColorZone).AutoButtonColor = + false +makeStyledButton("Torso", UDim2.new(0.43, 0, 0.36, 0), UDim2.new(0.28, 0, 0.26, 0), ColorZone).AutoButtonColor = false +makeStyledButton("RightLeg", UDim2.new(0.19, 0, 0.31, 0), UDim2.new(0.275, 0, 0.67, 0), ColorZone).AutoButtonColor = + false +makeStyledButton("LeftLeg", UDim2.new(0.19, 0, 0.31, 0), UDim2.new(0.525, 0, 0.67, 0), ColorZone).AutoButtonColor = + false + +-- Character Panel label (shows what category we are currently browsing) +local CategoryLabel = Instance.new "TextLabel" +CategoryLabel.RobloxLocked = true +CategoryLabel.Name = "CategoryLabel" +CategoryLabel.BackgroundTransparency = 1 +CategoryLabel.Font = Enum.Font.ArialBold +CategoryLabel.FontSize = Enum.FontSize.Size18 +CategoryLabel.Position = UDim2.new(0, 0, 0, -7) +CategoryLabel.Size = UDim2.new(1, 0, 0, 20) +CategoryLabel.TextXAlignment = Enum.TextXAlignment.Center +CategoryLabel.Text = "All" +CategoryLabel.TextColor3 = Color3.new(1, 1, 1) +CategoryLabel.Parent = CharacterPane + +--Save Button +local SaveButton = Instance.new "TextButton" +SaveButton.RobloxLocked = true +SaveButton.Name = "SaveButton" +SaveButton.Size = UDim2.new(0.6, 0, 0, 50) +SaveButton.Position = UDim2.new(0.2, 0, 1, -50) +SaveButton.Style = Enum.ButtonStyle.RobloxButton +SaveButton.Selected = false +SaveButton.Font = Enum.Font.ArialBold +SaveButton.FontSize = Enum.FontSize.Size18 +SaveButton.Text = "Save" +SaveButton.TextColor3 = Color3.new(1, 1, 1) +SaveButton.Parent = CharacterPane + +-- no need for this to stick around + +script:Destroy() diff --git a/lua/53878057.lua b/lua/53878057.lua new file mode 100644 index 0000000..2b3168a --- /dev/null +++ b/lua/53878057.lua @@ -0,0 +1,1257 @@ +if game.CoreGui.Version < 3 then + return +end -- peace out if we aren't using the right client + +-- A couple of necessary functions +local function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end + return instance:FindFirstChild(name) +end +local function waitForProperty(instance, property) + while not instance[property] do + instance.Changed:wait() + end +end + +local currentLoadout = script.Parent +local StaticTabName = "gear" +local backpackEnabled = true + +local robloxGui = game:GetService("CoreGui"):FindFirstChild "RobloxGui" +assert(robloxGui) +local controlFrame = waitForChild(robloxGui, "ControlFrame") +local backpackButton = waitForChild(controlFrame, "BackpackButton") +local backpack = waitForChild(robloxGui, "Backpack") +waitForChild(robloxGui, "CurrentLoadout") +waitForChild(robloxGui.CurrentLoadout, "TempSlot") +waitForChild(robloxGui.CurrentLoadout.TempSlot, "SlotNumber") + +waitForChild(currentLoadout, "Background") +local clBackground = currentLoadout.Background + +local function IsTouchDevice() + local touchEnabled = false + pcall(function() + touchEnabled = Game:GetService("UserInputService").TouchEnabled + end) + return touchEnabled +end + +local function moveHealthBar(pGui) + waitForChild(pGui, "HealthGUI") + waitForChild(pGui["HealthGUI"], "tray") + local tray = pGui["HealthGUI"]["tray"] + tray.Position = UDim2.new(0.5, -85, 1, -26) +end + +local function setHealthBarVisible(pGui, visible) + waitForChild(pGui, "HealthGUI") + waitForChild(pGui["HealthGUI"], "tray") + local tray = pGui["HealthGUI"]["tray"] + tray.Visible = visible +end + +--- Begin Locals +waitForChild(game, "Players") +waitForProperty(game.Players, "LocalPlayer") +local player = game.Players.LocalPlayer + +waitForChild(player, "PlayerGui") +Spawn(function() + moveHealthBar(player.PlayerGui) +end) + +while player.Character == nil do + wait(0.03) +end +local humanoid = waitForChild(player.Character, "Humanoid") +humanoid.Died:connect(function() + backpackButton.Visible = false +end) + +waitForChild(game, "LocalBackpack") +game.LocalBackpack:SetOldSchoolBackpack(false) + +waitForChild(currentLoadout.Parent, "Backpack") +local guiBackpack = currentLoadout.Parent.Backpack + +local backpackManager = waitForChild(guiBackpack, "CoreScripts/BackpackScripts/BackpackManager") +local backpackOpenEvent = waitForChild(backpackManager, "BackpackOpenEvent") +local backpackCloseEvent = waitForChild(backpackManager, "BackpackCloseEvent") +local tabClickedEvent = waitForChild(backpackManager, "TabClickedEvent") +-- local resizeEvent = waitForChild(backpackManager, "ResizeEvent") + +local inGearTab = true + +local maxNumLoadoutItems = 10 +if robloxGui.AbsoluteSize.Y <= 320 then + maxNumLoadoutItems = 4 +end + +local characterChildAddedCon = nil +local backpackChildCon = nil + +local debounce = false + +local enlargeFactor = 1.18 +local buttonSizeEnlarge = UDim2.new(1 * enlargeFactor, 0, 1 * enlargeFactor, 0) +local buttonSizeNormal = UDim2.new(1, 0, 1, 0) +local enlargeOverride = true +local guiTweenSpeed = 0.5 + +local firstInstanceOfLoadout = false + +local inventory = {} + +local gearSlots = {} +for i = 1, maxNumLoadoutItems do + gearSlots[i] = "empty" +end + +local backpackWasOpened = false +--- End Locals + +-- Begin Functions +local function backpackIsOpen() + if guiBackpack then + return guiBackpack.Visible + end + return false +end + +local function kill(prop, con, gear) + if con then + con:disconnect() + end + if prop == true and gear then + reorganizeLoadout(gear, false) + end +end + +function registerNumberKeys() + for i = 0, 9 do + game:GetService("GuiService"):AddKey(tostring(i)) + end +end + +function unregisterNumberKeys() + pcall(function() + for i = 0, 9 do + game:GetService("GuiService"):RemoveKey(tostring(i)) + end + end) +end + +function characterInWorkspace() + if game.Players["LocalPlayer"] then + if game.Players.LocalPlayer["Character"] then + if game.Players.LocalPlayer.Character ~= nil then + if game.Players.LocalPlayer.Character.Parent ~= nil then + return true + end + end + end + end + + return false +end + +function removeGear(gear) + local emptySlot = nil + for i = 1, #gearSlots do + if gearSlots[i] == gear and gear.Parent ~= nil then + emptySlot = i + break + end + end + if emptySlot then + if gearSlots[emptySlot].GearReference.Value then + if gearSlots[emptySlot].GearReference.Value.Parent == game.Players.LocalPlayer.Character then -- if we currently have this equipped, unequip it + gearSlots[emptySlot].GearReference.Value.Parent = game.Players.LocalPlayer.Backpack + end + + if + gearSlots[emptySlot].GearReference.Value:IsA "HopperBin" + and gearSlots[emptySlot].GearReference.Value.Active + then -- this is an active hopperbin + gearSlots[emptySlot].GearReference.Value:Disable() + gearSlots[emptySlot].GearReference.Value.Active = false + end + end + + gearSlots[emptySlot] = "empty" + + -- local centerizeX = gear.Size.X.Scale / 2 + -- local centerizeY = gear.Size.Y.Scale / 2 + --[[gear:TweenSizeAndPosition(UDim2.new(0,0,0,0), + UDim2.new(gear.Position.X.Scale + centerizeX,gear.Position.X.Offset,gear.Position.Y.Scale + centerizeY,gear.Position.Y.Offset), + Enum.EasingDirection.Out, Enum.EasingStyle.Quad,guiTweenSpeed/4,true)]] + delay(0, function() + gear:remove() + end) + + Spawn(function() + while backpackIsOpen() do + wait(0.03) + end + waitForChild(player, "Backpack") + local allEmpty = true + for i = 1, #gearSlots do + if gearSlots[i] ~= "empty" then + allEmpty = false + end + end + + if allEmpty then + if #player.Backpack:GetChildren() < 1 then + backpackButton.Visible = false + else + backpackButton.Position = UDim2.new(0.5, -60, 1, -44) + end + clBackground.Visible = false + end + end) + end +end + +function insertGear(gear, addToSlot) + local pos = nil + if not addToSlot then + for i = 1, #gearSlots do + if gearSlots[i] == "empty" then + pos = i + break + end + end + + if pos == 1 and gearSlots[1] ~= "empty" then + gear:remove() + return + end -- we are currently full, can't add in + else + pos = addToSlot + -- push all gear down one slot + local start = 1 + for i = 1, #gearSlots do + if gearSlots[i] == "empty" then + start = i + break + end + end + for i = start, pos + 1, -1 do + gearSlots[i] = gearSlots[i - 1] + if i == 10 then + gearSlots[i].SlotNumber.Text = "0" + gearSlots[i].SlotNumberDownShadow.Text = "0" + gearSlots[i].SlotNumberUpShadow.Text = "0" + else + gearSlots[i].SlotNumber.Text = i + gearSlots[i].SlotNumberDownShadow.Text = i + gearSlots[i].SlotNumberUpShadow.Text = i + end + end + end + + gearSlots[pos] = gear + if pos ~= maxNumLoadoutItems then + if type(tostring(pos)) == "string" then + local posString = tostring(pos) + gear.SlotNumber.Text = posString + gear.SlotNumberDownShadow.Text = posString + gear.SlotNumberUpShadow.Text = posString + end + else -- tenth gear doesn't follow mathematical pattern :( + gear.SlotNumber.Text = "0" + gear.SlotNumberDownShadow.Text = "0" + gear.SlotNumberUpShadow.Text = "0" + end + gear.Visible = true + + local con = nil + con = gear.Kill.Changed:connect(function(prop) + kill(prop, con, gear) + end) +end + +function reorganizeLoadout(gear, inserting, _, addToSlot) + if inserting then -- add in gear + insertGear(gear, addToSlot) + else + removeGear(gear) + end + if gear ~= "empty" then + gear.ZIndex = 1 + end +end + +function checkToolAncestry(child, parent) + if child:FindFirstChild "RobloxBuildTool" then + return + end -- don't show roblox build tools + if child:IsA "Tool" or child:IsA "HopperBin" then + for i = 1, #gearSlots do + if gearSlots[i] ~= "empty" and gearSlots[i].GearReference.Value == child then + if parent == nil then + gearSlots[i].Kill.Value = true + return false + elseif child.Parent == player.Character then + gearSlots[i].Selected = true + return true + elseif child.Parent == player.Backpack then + if child:IsA "Tool" or child:IsA "HopperBin" then + gearSlots[i].Selected = false + end + return true + end + + gearSlots[i].Kill.Value = true + return false + end + end + end +end + +function removeAllEquippedGear(physGear) + local stuff = player.Character:GetChildren() + for i = 1, #stuff do + if (stuff[i]:IsA "Tool" or stuff[i]:IsA "HopperBin") and stuff[i] ~= physGear then + if stuff[i]:IsA "Tool" then + stuff[i].Parent = player.Backpack + end + if stuff[i]:IsA "HopperBin" then + stuff[i]:Disable() + end + end + end +end + +function hopperBinSwitcher(numKey, physGear) + if not physGear then + return + end + + physGear:ToggleSelect() + + if gearSlots[numKey] == "empty" then + return + end + + if not physGear.Active then + gearSlots[numKey].Selected = false + normalizeButton(gearSlots[numKey]) + else + gearSlots[numKey].Selected = true + enlargeButton(gearSlots[numKey]) + end +end + +function toolSwitcher(numKey) + if not gearSlots[numKey] then + return + end + local physGear = gearSlots[numKey].GearReference.Value + if physGear == nil then + return + end + + removeAllEquippedGear(physGear) -- we don't remove this gear, as then we get a double switcheroo + + local key = numKey + if numKey == 0 then + key = 10 + end + + for i = 1, #gearSlots do + if gearSlots[i] and gearSlots[i] ~= "empty" and i ~= key then + normalizeButton(gearSlots[i]) + gearSlots[i].Selected = false + if + gearSlots[i].GearReference + and gearSlots[i].GearReference.Value + and gearSlots[i].GearReference.Value:IsA "HopperBin" + and gearSlots[i].GearReference.Value.Active + then + gearSlots[i].GearReference.Value:ToggleSelect() + end + end + end + + if physGear:IsA "HopperBin" then + hopperBinSwitcher(numKey, physGear) + else + if physGear.Parent == player.Character then + physGear.Parent = player.Backpack + + if gearSlots[numKey] ~= "empty" then + gearSlots[numKey].Selected = false + normalizeButton(gearSlots[numKey]) + end + else + --player.Character.Humanoid:EquipTool(physGear) + + physGear.Parent = player.Character + gearSlots[numKey].Selected = true + + enlargeButton(gearSlots[numKey]) + end + end +end + +function activateGear(num) + local numKey = nil + if num == "0" then + numKey = 10 -- why do lua indexes have to start at 1? :( + else + numKey = tonumber(num) + end + + if numKey == nil then + return + end + + if gearSlots[numKey] ~= "empty" then + toolSwitcher(numKey) + end +end + +enlargeButton = function(button) + if button.Size.Y.Scale > 1 then + return + end + if not button.Parent then + return + end + if not button.Selected then + return + end + + for i = 1, #gearSlots do + if gearSlots[i] == "empty" then + break + end + if gearSlots[i] ~= button then + normalizeButton(gearSlots[i]) + end + end + + if not enlargeOverride then + return + end + + if button:FindFirstChild "Highlight" then + button.Highlight.Visible = true + end + + if button:IsA "ImageButton" or button:IsA "TextButton" then + button.ZIndex = 5 + local centerizeX = -(buttonSizeEnlarge.X.Scale - button.Size.X.Scale) / 2 + local centerizeY = -(buttonSizeEnlarge.Y.Scale - button.Size.Y.Scale) / 2 + button:TweenSizeAndPosition( + buttonSizeEnlarge, + UDim2.new( + button.Position.X.Scale + centerizeX, + button.Position.X.Offset, + button.Position.Y.Scale + centerizeY, + button.Position.Y.Offset + ), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + guiTweenSpeed / 5, + enlargeOverride + ) + end +end + +normalizeAllButtons = function() + for i = 1, #gearSlots do + if gearSlots[i] == "empty" then + break + end + if gearSlots[i] ~= button then + normalizeButton(gearSlots[i], 0.1) + end + end +end + +normalizeButton = function(button, speed) + if not button then + return + end + if button.Size.Y.Scale <= 1 then + return + end + if button.Selected then + return + end + if not button.Parent then + return + end + + local moveSpeed = speed + if moveSpeed == nil or type(moveSpeed) ~= "number" then + moveSpeed = guiTweenSpeed / 5 + end + + if button:FindFirstChild "Highlight" then + button.Highlight.Visible = false + end + + if button:IsA "ImageButton" or button:IsA "TextButton" then + button.ZIndex = 1 + local centerizeX = -(buttonSizeNormal.X.Scale - button.Size.X.Scale) / 2 + local centerizeY = -(buttonSizeNormal.Y.Scale - button.Size.Y.Scale) / 2 + button:TweenSizeAndPosition( + buttonSizeNormal, + UDim2.new( + button.Position.X.Scale + centerizeX, + button.Position.X.Offset, + button.Position.Y.Scale + centerizeY, + button.Position.Y.Offset + ), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + moveSpeed, + enlargeOverride + ) + end +end + +local waitForDebounce = function() + while debounce do + wait() + end +end + +function pointInRectangle(point, rectTopLeft, rectSize) + if point.x > rectTopLeft.x and point.x < (rectTopLeft.x + rectSize.x) then + if point.y > rectTopLeft.y and point.y < (rectTopLeft.y + rectSize.y) then + return true + end + end + return false +end + +function swapGear(gearClone, toFrame) + local toFrameChildren = toFrame:GetChildren() + if #toFrameChildren == 1 then + if toFrameChildren[1]:FindFirstChild "SlotNumber" then + local toSlot = tonumber(toFrameChildren[1].SlotNumber.Text) + local gearCloneSlot = tonumber(gearClone.SlotNumber.Text) + if toSlot == 0 then + toSlot = 10 + end + if gearCloneSlot == 0 then + gearCloneSlot = 10 + end + + gearSlots[toSlot] = gearClone + gearSlots[gearCloneSlot] = toFrameChildren[1] + + toFrameChildren[1].SlotNumber.Text = gearClone.SlotNumber.Text + toFrameChildren[1].SlotNumberDownShadow.Text = gearClone.SlotNumber.Text + toFrameChildren[1].SlotNumberUpShadow.Text = gearClone.SlotNumber.Text + + local subString = string.sub(toFrame.Name, 5) + gearClone.SlotNumber.Text = subString + gearClone.SlotNumberDownShadow.Text = subString + gearClone.SlotNumberUpShadow.Text = subString + + gearClone.Position = UDim2.new(gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0) + toFrameChildren[1].Position = + UDim2.new(toFrameChildren[1].Position.X.Scale, 0, toFrameChildren[1].Position.Y.Scale, 0) + + toFrameChildren[1].Parent = gearClone.Parent + gearClone.Parent = toFrame + end + else + local slotNum = tonumber(gearClone.SlotNumber.Text) + if slotNum == 0 then + slotNum = 10 + end + gearSlots[slotNum] = "empty" -- reset this gear slot + + local subString = string.sub(toFrame.Name, 5) + gearClone.SlotNumber.Text = subString + gearClone.SlotNumberDownShadow.Text = subString + gearClone.SlotNumberUpShadow.Text = subString + + local toSlotNum = tonumber(gearClone.SlotNumber.Text) + if toSlotNum == 0 then + toSlotNum = 10 + end + gearSlots[toSlotNum] = gearClone + gearClone.Position = UDim2.new(gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0) + gearClone.Parent = toFrame + end +end + +function resolveDrag(gearClone, x, y) + local mousePoint = Vector2.new(x, y) + + local frame = gearClone.Parent + local frames = frame.Parent:GetChildren() + + for i = 1, #frames do + if frames[i]:IsA "Frame" then + if pointInRectangle(mousePoint, frames[i].AbsolutePosition, frames[i].AbsoluteSize) then + swapGear(gearClone, frames[i]) + return true + end + end + end + + if + (x < frame.AbsolutePosition.x or x > (frame.AbsolutePosition.x + frame.AbsoluteSize.x)) + or (y < frame.AbsolutePosition.y or y > (frame.AbsolutePosition.y + frame.AbsoluteSize.y)) + then + reorganizeLoadout(gearClone, false) + return false + else + if dragBeginPos then + gearClone.Position = dragBeginPos + end + return -1 + end +end + +function unequipAllItems(dontEquipThis) + for i = 1, #gearSlots do + if gearSlots[i] == "empty" then + break + end + if gearSlots[i].GearReference.Value and gearSlots[i].GearReference.Value ~= dontEquipThis then + if gearSlots[i].GearReference.Value:IsA "HopperBin" then + gearSlots[i].GearReference.Value:Disable() + elseif gearSlots[i].GearReference.Value:IsA "Tool" then + gearSlots[i].GearReference.Value.Parent = game.Players.LocalPlayer.Backpack + end + gearSlots[i].Selected = false + end + end +end + +function showToolTip(button, tip) + if + button + and button:FindFirstChild "ToolTipLabel" + and button.ToolTipLabel:IsA "TextLabel" + and not IsTouchDevice() + then + button.ToolTipLabel.Text = tostring(tip) + local xSize = button.ToolTipLabel.TextBounds.X + 6 + button.ToolTipLabel.Size = UDim2.new(0, xSize, 0, 20) + button.ToolTipLabel.Position = UDim2.new(0.5, -xSize / 2, 0, -30) + button.ToolTipLabel.Visible = true + end +end + +function hideToolTip(button, _) + if button and button:FindFirstChild "ToolTipLabel" and button.ToolTipLabel:IsA "TextLabel" then + button.ToolTipLabel.Visible = false + end +end + +local addingPlayerChild = function(child, equipped, addToSlot, inventoryGearButton) + waitForDebounce() + debounce = true + + if child:FindFirstChild "RobloxBuildTool" then + debounce = false + return + end -- don't show roblox build tools + if not child:IsA "Tool" then + if not child:IsA "HopperBin" then + debounce = false + return -- we don't care about anything besides tools (sigh...) + end + end + + if not addToSlot then + for i = 1, #gearSlots do + if gearSlots[i] ~= "empty" and gearSlots[i].GearReference.Value == child then -- we already have gear, do nothing + debounce = false + return + end + end + end + + local gearClone = currentLoadout.TempSlot:clone() + gearClone.Name = child.Name + gearClone.GearImage.Image = child.TextureId + if gearClone.GearImage.Image == "" then + gearClone.GearText.Text = child.Name + end + gearClone.GearReference.Value = child + + gearClone.MouseEnter:connect(function() + if + gearClone.GearReference + and gearClone.GearReference.Value["ToolTip"] + and gearClone.GearReference.Value.ToolTip ~= "" + then + showToolTip(gearClone, gearClone.GearReference.Value.ToolTip) + end + end) + + gearClone.MouseLeave:connect(function() + if + gearClone.GearReference + and gearClone.GearReference.Value["ToolTip"] + and gearClone.GearReference.Value.ToolTip ~= "" + then + hideToolTip(gearClone, gearClone.GearReference.Value.ToolTip) + end + end) + + gearClone.RobloxLocked = true + + local slotToMod = -1 + + if not addToSlot then + for i = 1, #gearSlots do + if gearSlots[i] == "empty" then + slotToMod = i + break + end + end + else + slotToMod = addToSlot + end + + if slotToMod == -1 then -- No available slot to add in! + debounce = false + return + end + + local slotNum = slotToMod % 10 + local parent = currentLoadout:FindFirstChild("Slot" .. tostring(slotNum)) + gearClone.Parent = parent + + if inventoryGearButton then + local absolutePositionFinal = inventoryGearButton.AbsolutePosition + local currentAbsolutePosition = gearClone.AbsolutePosition + local diff = absolutePositionFinal - currentAbsolutePosition + gearClone.Position = UDim2.new(gearClone.Position.X.Scale, diff.x, gearClone.Position.Y.Scale, diff.y) + gearClone.ZIndex = 4 + end + + if addToSlot then + reorganizeLoadout(gearClone, true, equipped, addToSlot) + else + reorganizeLoadout(gearClone, true) + end + + if gearClone.Parent == nil then + debounce = false + return + end -- couldn't fit in (hopper is full!) + + if equipped then + gearClone.Selected = true + unequipAllItems(child) + delay(guiTweenSpeed + 0.01, function() -- if our gear is equipped, we will want to enlarge it when done moving + if + gearClone:FindFirstChild "GearReference" + and ( + ( + gearClone.GearReference.Value:IsA "Tool" + and gearClone.GearReference.Value.Parent == player.Character + ) + or (gearClone.GearReference.Value:IsA "HopperBin" and gearClone.GearReference.Value.Active == true) + ) + then + enlargeButton(gearClone) + end + end) + end + + local dragBeginPos + local clickCon, buttonDeleteCon, mouseEnterCon, mouseLeaveCon, dragStop, dragBegin + clickCon = gearClone.MouseButton1Click:connect(function() + if characterInWorkspace() then + if not gearClone.Draggable then + activateGear(gearClone.SlotNumber.Text) + end + end + end) + mouseEnterCon = gearClone.MouseEnter:connect(function() + if guiBackpack.Visible then + gearClone.Draggable = true + end + end) + dragBegin = gearClone.DragBegin:connect(function(pos) + dragBeginPos = pos + gearClone.ZIndex = 7 + local children = gearClone:GetChildren() + for i = 1, #children do + if children[i]:IsA "TextLabel" then + if string.find(children[i].Name, "Shadow") then + children[i].ZIndex = 8 + else + children[i].ZIndex = 9 + end + elseif children[i]:IsA "Frame" or children[i]:IsA "ImageLabel" then + children[i].ZIndex = 7 + end + end + end) + dragStop = gearClone.DragStopped:connect(function(x, y) + if gearClone.Selected then + gearClone.ZIndex = 4 + else + gearClone.ZIndex = 3 + end + local children = gearClone:GetChildren() + for i = 1, #children do + if children[i]:IsA "TextLabel" then + if string.find(children[i].Name, "Shadow") then + children[i].ZIndex = 3 + else + children[i].ZIndex = 4 + end + elseif children[i]:IsA "Frame" or children[i]:IsA "ImageLabel" then + children[i].ZIndex = 2 + end + end + resolveDrag(gearClone, x, y) + end) + mouseLeaveCon = gearClone.MouseLeave:connect(function() + gearClone.Draggable = false + end) + buttonDeleteCon = gearClone.AncestryChanged:connect(function() + if gearClone.Parent and gearClone.Parent.Parent == currentLoadout then + return + end + if clickCon then + clickCon:disconnect() + end + if buttonDeleteCon then + buttonDeleteCon:disconnect() + end + if mouseEnterCon then + mouseEnterCon:disconnect() + end + if mouseLeaveCon then + mouseLeaveCon:disconnect() + end + if dragStop then + dragStop:disconnect() + end + if dragBegin then + dragBegin:disconnect() + end + end) -- this probably isn't necessary since objects are being deleted (probably), but this might still leak just in case + + local childCon = nil + local childChangeCon = nil + childCon = child.AncestryChanged:connect(function(newChild, parent) + if not checkToolAncestry(newChild, parent) then + if childCon then + childCon:disconnect() + end + if childChangeCon then + childChangeCon:disconnect() + end + removeFromInventory(child) + elseif parent == game.Players.LocalPlayer.Backpack then + normalizeButton(gearClone) + end + end) + + childChangeCon = child.Changed:connect(function(prop) + if prop == "Name" then + if gearClone and gearClone.GearImage.Image == "" then + gearClone.GearText.Text = child.Name + end + elseif prop == "Active" then + if child and child:IsA "HopperBin" then + if not child.Active then + gearClone.Selected = false + normalizeButton(gearClone) + end + end + elseif prop == "TextureId" then + gearClone.GearImage.Image = child.TextureId + end + end) + + debounce = false + + Spawn(function() + while backpackIsOpen() do + wait(0.03) + end + for i = 1, #gearSlots do + if gearSlots[i] ~= "empty" then + backpackButton.Position = UDim2.new(0.5, -60, 1, -108) + if backpackEnabled then + backpackButton.Visible = true + clBackground.Visible = true + end + end + end + end) +end + +function addToInventory(child) + if not child:IsA "Tool" or not child:IsA "HopperBin" then + return + end + + local slot = nil + for i = 1, #inventory do + if inventory[i] and inventory[i] == child then + return + end + if not inventory[i] then + slot = i + end + end + if slot then + inventory[slot] = child + elseif #inventory < 1 then + inventory[1] = child + else + inventory[#inventory + 1] = child + end +end + +function removeFromInventory(child) + for i = 1, #inventory do + if inventory[i] == child then + table.remove(inventory, i) + inventory[i] = nil + end + end +end + +local spreadOutGear = function() + loadoutChildren = currentLoadout:GetChildren() + + for i = 1, #loadoutChildren do + if loadoutChildren[i]:IsA "Frame" then + loadoutChildren[i].BackgroundTransparency = 0.5 + local slot = tonumber(string.sub(loadoutChildren[i].Name, 5)) + if slot == 0 then + slot = 10 + end + if robloxGui.AbsoluteSize.Y <= 320 then + loadoutChildren[i]:TweenPosition( + UDim2.new(0, (slot - 1) * 60, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + 0.25, + true + ) + else + loadoutChildren[i]:TweenPosition( + UDim2.new((slot - 1) / 10, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + 0.25, + true + ) + end + end + end +end + +local centerGear = function() + loadoutChildren = currentLoadout:GetChildren() + local gearButtons = {} + local lastSlotAdd = nil + + for i = 1, #loadoutChildren do + if loadoutChildren[i]:IsA "Frame" then + if #loadoutChildren[i]:GetChildren() > 0 then + if loadoutChildren[i].Name == "Slot0" then + lastSlotAdd = loadoutChildren[i] + else + table.insert(gearButtons, loadoutChildren[i]) + end + end + loadoutChildren[i].BackgroundTransparency = 1 + end + end + if lastSlotAdd then + table.insert(gearButtons, lastSlotAdd) + end + + local startPos = (1 - (#gearButtons * 0.1)) / 2 + for i = 1, #gearButtons do + if robloxGui.AbsoluteSize.Y <= 320 then + startPos = (0.5 - (#gearButtons * 0.333) / 2) + gearButtons[i]:TweenPosition( + UDim2.new(startPos + (i - 1) * 0.33, 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + 0.25, + true + ) + else + gearButtons[i]:TweenPosition( + UDim2.new(startPos + ((i - 1) * 0.1), 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + 0.25, + true + ) + end + end +end + +function editLoadout() + backpackWasOpened = true + if inGearTab then + spreadOutGear() + end +end + +function readonlyLoadout() + if not inGearTab then + centerGear() + end +end + +function setupBackpackListener() + if backpackChildCon then + backpackChildCon:disconnect() + backpackChildCon = nil + end + backpackChildCon = player.Backpack.ChildAdded:connect(function(child) + if not firstInstanceOfLoadout then + firstInstanceOfLoadout = true + if backpackEnabled then + backpackButton.Visible = true + clBackground.Visible = true + end + end + addingPlayerChild(child) + addToInventory(child) + end) +end + +function playerCharacterChildAdded(child) + addingPlayerChild(child, true) + addToInventory(child) +end + +function activateLoadout() + currentLoadout.Visible = true +end + +function deactivateLoadout() + currentLoadout.Visible = false +end + +function tabHandler(inFocus) + inGearTab = inFocus + if inFocus then + editLoadout() + else + readonlyLoadout() + end +end + +function coreGuiChanged(coreGuiType, enabled) + if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then + backpackButton.Visible = enabled + clBackground.Visible = enabled + backpackEnabled = enabled + + if enabled then + registerNumberKeys() + else + unregisterNumberKeys() + end + end + + if coreGuiType == Enum.CoreGuiType.Health or coreGuiType == Enum.CoreGuiType.All then + setHealthBarVisible(game.Players.LocalPlayer.PlayerGui, enabled) + end +end +-- End Functions + +-- Begin Script +registerNumberKeys() + +pcall(function() + coreGuiChanged(Enum.CoreGuiType.Backpack, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack)) + coreGuiChanged(Enum.CoreGuiType.Health, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Health)) + Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) +end) + +wait() -- let stuff initialize incase this is first heartbeat... + +waitForChild(player, "Backpack") +waitForProperty(player, "Character") + +-- not sure why this had no delay but the player.CharacterAdded one had one... this type of error would be easier to avoid with function reusage +delay(1, function() + local backpackChildren = player.Backpack:GetChildren() + local size = math.min(10, #backpackChildren) + for i = 1, size do + if backpackEnabled then + backpackButton.Visible = true + clBackground.Visible = true + end + addingPlayerChild(backpackChildren[i], false) + end + setupBackpackListener() +end) + +delay(2, function() + --while true do + if not backpackWasOpened then + if robloxGui.AbsoluteSize.Y <= 320 then + local cChildren = currentLoadout:GetChildren() + for i = 1, #cChildren do + local slotNum = tonumber(string.sub(cChildren[i].Name, 5, string.len(cChildren[i].Name))) + if type(slotNum) == "number" then + cChildren[i].Position = UDim2.new(0, (slotNum - 1) * 60, 0, 0) + end + end + end + end + wait(0.25) + --end +end) + +player.ChildAdded:connect(function(child) + if child:IsA "PlayerGui" then + moveHealthBar(child) + end +end) + +waitForProperty(player, "Character") +for _, v in ipairs(player.Character:GetChildren()) do + playerCharacterChildAdded(v) +end +characterChildAddedCon = player.Character.ChildAdded:connect(function(child) + playerCharacterChildAdded(child) +end) + +waitForChild(player.Character, "Humanoid") +humanoidDiedCon = player.Character.Humanoid.Died:connect(function() + if humanoidDiedCon then + humanoidDiedCon:disconnect() + humanoidDiedCon = nil + end + deactivateLoadout() + if backpackChildCon then + backpackChildCon:disconnect() + backpackChildCon = nil + end + backpackWasOpened = false +end) + +player.CharacterRemoving:connect(function() + for i = 1, #gearSlots do + if gearSlots[i] ~= "empty" then + gearSlots[i].Parent = nil + gearSlots[i] = "empty" + end + end +end) + +player.CharacterAdded:connect(function() + waitForProperty(game.Players, "LocalPlayer") + player = game.Players.LocalPlayer -- make sure we are still looking at the correct character + waitForChild(player, "Backpack") + + delay(1, function() + local backpackChildren = player.Backpack:GetChildren() + local size = math.min(10, #backpackChildren) + for i = 1, size do + if backpackEnabled then + backpackButton.Visible = true + clBackground.Visible = true + end + addingPlayerChild(backpackChildren[i], false) + end + setupBackpackListener() + end) + + activateLoadout() + + if characterChildAddedCon then + characterChildAddedCon:disconnect() + characterChildAddedCon = nil + end + + characterChildAddedCon = player.Character.ChildAdded:connect(function(child) + addingPlayerChild(child, true) + end) + + waitForChild(player.Character, "Humanoid") + if backpack.Visible then + backpackOpenEvent:Fire() + end + humanoidDiedCon = player.Character.Humanoid.Died:connect(function() + if backpackEnabled then + backpackButton.Visible = false + clBackground.Visible = false + end + firstInstanceOfLoadout = false + deactivateLoadout() + + if humanoidDiedCon then + humanoidDiedCon:disconnect() + humanoidDiedCon = nil + end + if backpackChildCon then + backpackChildCon:disconnect() + backpackChildCon = nil + end + end) + waitForChild(player, "PlayerGui") + moveHealthBar(player.PlayerGui) + delay(2, function() + --while true do + if not backpackWasOpened then + if robloxGui.AbsoluteSize.Y <= 320 then + local cChildren = currentLoadout:GetChildren() + for i = 1, #cChildren do + local slotNum = tonumber(string.sub(cChildren[i].Name, 5, string.len(cChildren[i].Name))) + if type(slotNum) == "number" then + cChildren[i].Position = UDim2.new(0, (slotNum - 1) * 60, 0, 0) + end + end + end + end + wait(0.25) + --end + end) +end) + +waitForChild(guiBackpack, "SwapSlot") +guiBackpack.SwapSlot.Changed:connect(function() + if guiBackpack.SwapSlot.Value then + local swapSlot = guiBackpack.SwapSlot + local pos = swapSlot.Slot.Value + if pos == 0 then + pos = 10 + end + if gearSlots[pos] then + reorganizeLoadout(gearSlots[pos], false) + end + if swapSlot.GearButton.Value then + addingPlayerChild(swapSlot.GearButton.Value.GearReference.Value, false, pos) + end + guiBackpack.SwapSlot.Value = false + end +end) + +game:GetService("GuiService").KeyPressed:connect(function(key) + if characterInWorkspace() then + activateGear(key) + end +end) + +backpackOpenEvent.Event:connect(editLoadout) +backpackCloseEvent.Event:connect(centerGear) +tabClickedEvent.Event:connect(function(tabName) + tabHandler(tabName == StaticTabName) +end) diff --git a/lua/59002209.lua b/lua/59002209.lua new file mode 100644 index 0000000..e69de29 diff --git a/lua/60595411.lua b/lua/60595411.lua new file mode 100644 index 0000000..6115b7f --- /dev/null +++ b/lua/60595411.lua @@ -0,0 +1,1067 @@ +local t = {} + +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------JSON Functions Begin---------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ + +--JSON Encoder and Parser for Lua 5.1 +-- +--2007 Shaun Brown (http://www.chipmunkav.com) +--All Rights Reserved. + +--Permission is hereby granted, free of charge, to any person +--obtaining a copy of this 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. +--If you find this software useful please give www.chipmunkav.com a mention. + +--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. + +local assert = assert + +local StringBuilder = { + buffer = {}, +} + +function StringBuilder:New() + local o = {} + setmetatable(o, self) + self.__index = self + o.buffer = {} + return o +end + +function StringBuilder:Append(s) + self.buffer[#self.buffer + 1] = s +end + +function StringBuilder:ToString() + return table.concat(self.buffer) +end + +local JsonWriter = { + backslashes = { + ["\b"] = "\\b", + ["\t"] = "\\t", + ["\n"] = "\\n", + ["\f"] = "\\f", + ["\r"] = "\\r", + ['"'] = '\\"', + ["\\"] = "\\\\", + ["/"] = "\\/", + }, +} + +function JsonWriter:New() + local o = {} + o.writer = StringBuilder:New() + setmetatable(o, self) + self.__index = self + return o +end + +function JsonWriter:Append(s) + self.writer:Append(s) +end + +function JsonWriter:ToString() + return self.writer:ToString() +end + +function JsonWriter:Write(o) + local t = type(o) + if t == "nil" then + self:WriteNil() + elseif t == "boolean" or t == "number" then + self:WriteString(o) + elseif t == "string" then + self:ParseString(o) + elseif t == "table" then + self:WriteTable(o) + elseif t == "function" then + self:WriteFunction(o) + elseif t == "thread" or t == "userdata" then + self:WriteError(o) + end +end + +function JsonWriter:WriteNil() + self:Append "null" +end + +function JsonWriter:WriteString(o) + self:Append(tostring(o)) +end + +function JsonWriter:ParseString(s) + self:Append '"' + self:Append(string.gsub(s, '[%z%c\\"/]', function(n) + local c = self.backslashes[n] + if c then + return c + end + return string.format("\\u%.4X", string.byte(n)) + end)) + self:Append '"' +end + +function JsonWriter:IsArray(t) + local count = 0 + local isindex = function(k) + if type(k) == "number" and k > 0 then + if math.floor(k) == k then + return true + end + end + return false + end + for k, _ in pairs(t) do + if not isindex(k) then + return false, "{", "}" + else + count = math.max(count, k) + end + end + return true, "[", "]", count +end + +function JsonWriter:WriteTable(t) + local ba, st, et, n = self:IsArray(t) + self:Append(st) + if ba then + for i = 1, n do + self:Write(t[i]) + if i < n then + self:Append "," + end + end + else + local first = true + for k, v in pairs(t) do + if not first then + self:Append "," + end + first = false + self:ParseString(k) + self:Append ":" + self:Write(v) + end + end + self:Append(et) +end + +function JsonWriter:WriteError(o) + error(string.format("Encoding of %s unsupported", tostring(o))) +end + +function JsonWriter:WriteFunction(o) + if o == Null then + self:WriteNil() + else + self:WriteError(o) + end +end + +local StringReader = { + s = "", + i = 0, +} + +function StringReader:New(s) + local o = {} + setmetatable(o, self) + self.__index = self + o.s = s or o.s + return o +end + +function StringReader:Peek() + local i = self.i + 1 + if i <= #self.s then + return string.sub(self.s, i, i) + end + return nil +end + +function StringReader:Next() + self.i = self.i + 1 + if self.i <= #self.s then + return string.sub(self.s, self.i, self.i) + end + return nil +end + +function StringReader:All() + return self.s +end + +local JsonReader = { + escapes = { + ["t"] = "\t", + ["n"] = "\n", + ["f"] = "\f", + ["r"] = "\r", + ["b"] = "\b", + }, +} + +function JsonReader:New(s) + local o = {} + o.reader = StringReader:New(s) + setmetatable(o, self) + self.__index = self + return o +end + +function JsonReader:Read() + self:SkipWhiteSpace() + local peek = self:Peek() + if peek == nil then + error(string.format("Nil string: '%s'", self:All())) + elseif peek == "{" then + return self:ReadObject() + elseif peek == "[" then + return self:ReadArray() + elseif peek == '"' then + return self:ReadString() + elseif string.find(peek, "[%+%-%d]") then + return self:ReadNumber() + elseif peek == "t" then + return self:ReadTrue() + elseif peek == "f" then + return self:ReadFalse() + elseif peek == "n" then + return self:ReadNull() + elseif peek == "/" then + self:ReadComment() + return self:Read() + else + return nil + end +end + +function JsonReader:ReadTrue() + self:TestReservedWord { "t", "r", "u", "e" } + return true +end + +function JsonReader:ReadFalse() + self:TestReservedWord { "f", "a", "l", "s", "e" } + return false +end + +function JsonReader:ReadNull() + self:TestReservedWord { "n", "u", "l", "l" } + return nil +end + +function JsonReader:TestReservedWord(t) + for _, v in ipairs(t) do + if self:Next() ~= v then + error(string.format("Error reading '%s': %s", table.concat(t), self:All())) + end + end +end + +function JsonReader:ReadNumber() + local result = self:Next() + local peek = self:Peek() + while peek ~= nil and string.find(peek, "[%+%-%d%.eE]") do + result = result .. self:Next() + peek = self:Peek() + end + result = tonumber(result) + if result == nil then + error(string.format("Invalid number: '%s'", result)) + else + return result + end +end + +function JsonReader:ReadString() + local result = "" + assert(self:Next() == '"') + while self:Peek() ~= '"' do + local ch = self:Next() + if ch == "\\" then + ch = self:Next() + if self.escapes[ch] then + ch = self.escapes[ch] + end + end + result = result .. ch + end + assert(self:Next() == '"') + local fromunicode = function(m) + return string.char(tonumber(m, 16)) + end + return string.gsub(result, "u%x%x(%x%x)", fromunicode) +end + +function JsonReader:ReadComment() + assert(self:Next() == "/") + local second = self:Next() + if second == "/" then + self:ReadSingleLineComment() + elseif second == "*" then + self:ReadBlockComment() + else + error(string.format("Invalid comment: %s", self:All())) + end +end + +function JsonReader:ReadBlockComment() + local done = false + while not done do + local ch = self:Next() + if ch == "*" and self:Peek() == "/" then + done = true + end + if not done and ch == "/" and self:Peek() == "*" then + error(string.format("Invalid comment: %s, '/*' illegal.", self:All())) + end + end + self:Next() +end + +function JsonReader:ReadSingleLineComment() + local ch = self:Next() + while ch ~= "\r" and ch ~= "\n" do + ch = self:Next() + end +end + +function JsonReader:ReadArray() + local result = {} + assert(self:Next() == "[") + local done = false + if self:Peek() == "]" then + done = true + end + while not done do + local item = self:Read() + result[#result + 1] = item + self:SkipWhiteSpace() + if self:Peek() == "]" then + done = true + end + if not done then + local ch = self:Next() + if ch ~= "," then + error(string.format("Invalid array: '%s' due to: '%s'", self:All(), ch)) + end + end + end + assert("]" == self:Next()) + return result +end + +function JsonReader:ReadObject() + local result = {} + assert(self:Next() == "{") + local done = false + if self:Peek() == "}" then + done = true + end + while not done do + local key = self:Read() + if type(key) ~= "string" then + error(string.format("Invalid non-string object key: %s", key)) + end + self:SkipWhiteSpace() + local ch = self:Next() + if ch ~= ":" then + error(string.format("Invalid object: '%s' due to: '%s'", self:All(), ch)) + end + self:SkipWhiteSpace() + local val = self:Read() + result[key] = val + self:SkipWhiteSpace() + if self:Peek() == "}" then + done = true + end + if not done then + ch = self:Next() + if ch ~= "," then + error(string.format("Invalid array: '%s' near: '%s'", self:All(), ch)) + end + end + end + assert(self:Next() == "}") + return result +end + +function JsonReader:SkipWhiteSpace() + local p = self:Peek() + while p ~= nil and string.find(p, "[%s/]") do + if p == "/" then + self:ReadComment() + else + self:Next() + end + p = self:Peek() + end +end + +function JsonReader:Peek() + return self.reader:Peek() +end + +function JsonReader:Next() + return self.reader:Next() +end + +function JsonReader:All() + return self.reader:All() +end + +function Encode(o) + local writer = JsonWriter:New() + writer:Write(o) + return writer:ToString() +end + +function Decode(s) + local reader = JsonReader:New(s) + return reader:Read() +end + +function Null() + return Null +end +-------------------- End JSON Parser ------------------------ + +t.DecodeJSON = function(jsonString) + pcall(function() + warn "RbxUtility.DecodeJSON is deprecated, please use Game:GetService('HttpService'):JSONDecode() instead." + end) + + if type(jsonString) == "string" then + return Decode(jsonString) + end + print "RbxUtil.DecodeJSON expects string argument!" + return nil +end + +t.EncodeJSON = function(jsonTable) + pcall(function() + warn "RbxUtility.EncodeJSON is deprecated, please use Game:GetService('HttpService'):JSONEncode() instead." + end) + return Encode(jsonTable) +end + +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +--------------------------------------------Terrain Utilities Begin----------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +--makes a wedge at location x, y, z +--sets cell x, y, z to default material if parameter is provided, if not sets cell x, y, z to be whatever material it previously w +--returns true if made a wedge, false if the cell remains a block +t.MakeWedge = function(x, y, z, _) + return game:GetService("Terrain"):AutoWedgeCell(x, y, z) +end + +t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, selectionParent) + local terrain = game.Workspace:FindFirstChild "Terrain" + if not terrain then + return + end + + assert(regionToSelect) + assert(color) + + if not type(regionToSelect) == "Region3" then + error("regionToSelect (first arg), should be of type Region3, but is type", type(regionToSelect)) + end + if not type(color) == "BrickColor" then + error("color (second arg), should be of type BrickColor, but is type", type(color)) + end + + -- frequently used terrain calls (speeds up call, no lookup necessary) + local GetCell = terrain.GetCell + local WorldToCellPreferSolid = terrain.WorldToCellPreferSolid + local CellCenterToWorld = terrain.CellCenterToWorld + local emptyMaterial = Enum.CellMaterial.Empty + + -- container for all adornments, passed back to user + local selectionContainer = Instance.new "Model" + selectionContainer.Name = "SelectionContainer" + selectionContainer.Archivable = false + if selectionParent then + selectionContainer.Parent = selectionParent + else + selectionContainer.Parent = game.Workspace + end + + local updateSelection = nil -- function we return to allow user to update selection + local currentKeepAliveTag = nil -- a tag that determines whether adorns should be destroyed + local aliveCounter = 0 -- helper for currentKeepAliveTag + local lastRegion = nil -- used to stop updates that do nothing + local adornments = {} -- contains all adornments + local reusableAdorns = {} + + local selectionPart = Instance.new "Part" + selectionPart.Name = "SelectionPart" + selectionPart.Transparency = 1 + selectionPart.Anchored = true + selectionPart.Locked = true + selectionPart.CanCollide = false + selectionPart.Size = Vector3.new(4.2, 4.2, 4.2) + + local selectionBox = Instance.new "SelectionBox" + + -- srs translation from region3 to region3int16 + -- local function Region3ToRegion3int16(region3) + -- local theLowVec = region3.CFrame.p - (region3.Size / 2) + Vector3.new(2, 2, 2) + -- local lowCell = WorldToCellPreferSolid(terrain, theLowVec) + + -- local theHighVec = region3.CFrame.p + (region3.Size / 2) - Vector3.new(2, 2, 2) + -- local highCell = WorldToCellPreferSolid(terrain, theHighVec) + + -- local highIntVec = Vector3int16.new(highCell.x, highCell.y, highCell.z) + -- local lowIntVec = Vector3int16.new(lowCell.x, lowCell.y, lowCell.z) + + -- return Region3int16.new(lowIntVec, highIntVec) + -- end + + -- helper function that creates the basis for a selection box + function createAdornment(theColor) + local selectionPartClone = nil + local selectionBoxClone = nil + + if #reusableAdorns > 0 then + selectionPartClone = reusableAdorns[1]["part"] + selectionBoxClone = reusableAdorns[1]["box"] + table.remove(reusableAdorns, 1) + + selectionBoxClone.Visible = true + else + selectionPartClone = selectionPart:Clone() + selectionPartClone.Archivable = false + + selectionBoxClone = selectionBox:Clone() + selectionBoxClone.Archivable = false + + selectionBoxClone.Adornee = selectionPartClone + selectionBoxClone.Parent = selectionContainer + + selectionBoxClone.Adornee = selectionPartClone + + selectionBoxClone.Parent = selectionContainer + end + + if theColor then + selectionBoxClone.Color = theColor + end + + return selectionPartClone, selectionBoxClone + end + + -- iterates through all current adornments and deletes any that don't have latest tag + function cleanUpAdornments() + for cellPos, adornTable in pairs(adornments) do + if adornTable.KeepAlive ~= currentKeepAliveTag then -- old news, we should get rid of this + adornTable.SelectionBox.Visible = false + table.insert(reusableAdorns, { part = adornTable.SelectionPart, box = adornTable.SelectionBox }) + adornments[cellPos] = nil + end + end + end + + -- helper function to update tag + function incrementAliveCounter() + aliveCounter = aliveCounter + 1 + if aliveCounter > 1000000 then + aliveCounter = 0 + end + return aliveCounter + end + + -- finds full cells in region and adorns each cell with a box, with the argument color + function adornFullCellsInRegion(region, color) + local regionBegin = region.CFrame.p - (region.Size / 2) + Vector3.new(2, 2, 2) + local regionEnd = region.CFrame.p + (region.Size / 2) - Vector3.new(2, 2, 2) + + local cellPosBegin = WorldToCellPreferSolid(terrain, regionBegin) + local cellPosEnd = WorldToCellPreferSolid(terrain, regionEnd) + + currentKeepAliveTag = incrementAliveCounter() + for y = cellPosBegin.y, cellPosEnd.y do + for z = cellPosBegin.z, cellPosEnd.z do + for x = cellPosBegin.x, cellPosEnd.x do + local cellMaterial = GetCell(terrain, x, y, z) + + if cellMaterial ~= emptyMaterial then + local cframePos = CellCenterToWorld(terrain, x, y, z) + local cellPos = Vector3int16.new(x, y, z) + + local updated = false + for cellPosAdorn, adornTable in pairs(adornments) do + if cellPosAdorn == cellPos then + adornTable.KeepAlive = currentKeepAliveTag + if color then + adornTable.SelectionBox.Color = color + end + updated = true + break + end + end + + if not updated then + local selectionPart, selectionBox = createAdornment(color) + selectionPart.Size = Vector3.new(4, 4, 4) + selectionPart.CFrame = CFrame.new(cframePos) + local adornTable = { + SelectionPart = selectionPart, + SelectionBox = selectionBox, + KeepAlive = currentKeepAliveTag, + } + adornments[cellPos] = adornTable + end + end + end + end + end + cleanUpAdornments() + end + + ------------------------------------- setup code ------------------------------ + lastRegion = regionToSelect + + if selectEmptyCells then -- use one big selection to represent the area selected + local selectionPart, selectionBox = createAdornment(color) + + selectionPart.Size = regionToSelect.Size + selectionPart.CFrame = regionToSelect.CFrame + + adornments.SelectionPart = selectionPart + adornments.SelectionBox = selectionBox + + updateSelection = function(newRegion, color) + if newRegion and newRegion ~= lastRegion then + lastRegion = newRegion + selectionPart.Size = newRegion.Size + selectionPart.CFrame = newRegion.CFrame + end + if color then + selectionBox.Color = color + end + end + else -- use individual cell adorns to represent the area selected + adornFullCellsInRegion(regionToSelect, color) + updateSelection = function(newRegion, color) + if newRegion and newRegion ~= lastRegion then + lastRegion = newRegion + adornFullCellsInRegion(newRegion, color) + end + end + end + + local destroyFunc = function() + updateSelection = nil + if selectionContainer then + selectionContainer:Destroy() + end + adornments = nil + end + + return updateSelection, destroyFunc +end + +-----------------------------Terrain Utilities End----------------------------- + +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------Signal class begin------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +--[[ +A 'Signal' object identical to the internal RBXScriptSignal object in it's public API and semantics. This function +can be used to create "custom events" for user-made code. +API: +Method :connect( function handler ) + Arguments: The function to connect to. + Returns: A new connection object which can be used to disconnect the connection + Description: Connects this signal to the function specified by |handler|. That is, when |fire( ... )| is called for + the signal the |handler| will be called with the arguments given to |fire( ... )|. Note, the functions + connected to a signal are called in NO PARTICULAR ORDER, so connecting one function after another does + NOT mean that the first will be called before the second as a result of a call to |fire|. + +Method :disconnect() + Arguments: None + Returns: None + Description: Disconnects all of the functions connected to this signal. + +Method :fire( ... ) + Arguments: Any arguments are accepted + Returns: None + Description: Calls all of the currently connected functions with the given arguments. + +Method :wait() + Arguments: None + Returns: The arguments given to fire + Description: This call blocks until +]] + +function t.CreateSignal() + local this = {} + + local mBindableEvent = Instance.new "BindableEvent" + local mAllCns = {} --all connection objects returned by mBindableEvent::connect + + --main functions + function this:connect(func) + if self ~= this then + error("connect must be called with `:`, not `.`", 2) + end + if type(func) ~= "function" then + error("Argument #1 of connect must be a function, got a " .. type(func), 2) + end + local cn = mBindableEvent.Event:connect(func) + mAllCns[cn] = true + local pubCn = {} + function pubCn:disconnect() + cn:disconnect() + mAllCns[cn] = nil + end + pubCn.Disconnect = pubCn.disconnect + + return pubCn + end + + function this:disconnect() + if self ~= this then + error("disconnect must be called with `:`, not `.`", 2) + end + for cn, _ in pairs(mAllCns) do + cn:disconnect() + mAllCns[cn] = nil + end + end + + function this:wait() + if self ~= this then + error("wait must be called with `:`, not `.`", 2) + end + return mBindableEvent.Event:wait() + end + + function this:fire(...) + if self ~= this then + error("fire must be called with `:`, not `.`", 2) + end + mBindableEvent:Fire(...) + end + + this.Connect = this.connect + this.Disconnect = this.disconnect + this.Wait = this.wait + this.Fire = this.fire + + return this +end + +------------------------------------------------- Sigal class End ------------------------------------------------------ + +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +-----------------------------------------------Create Function Begins--------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +--[[ +A "Create" function for easy creation of Roblox instances. The function accepts a string which is the classname of +the object to be created. The function then returns another function which either accepts accepts no arguments, in +which case it simply creates an object of the given type, or a table argument that may contain several types of data, +in which case it mutates the object in varying ways depending on the nature of the aggregate data. These are the +type of data and what operation each will perform: +1) A string key mapping to some value: + Key-Value pairs in this form will be treated as properties of the object, and will be assigned in NO PARTICULAR + ORDER. If the order in which properties is assigned matter, then they must be assigned somewhere else than the + |Create| call's body. + +2) An integral key mapping to another Instance: + Normal numeric keys mapping to Instances will be treated as children if the object being created, and will be + parented to it. This allows nice recursive calls to Create to create a whole hierarchy of objects without a + need for temporary variables to store references to those objects. + +3) A key which is a value returned from Create.Event( eventname ), and a value which is a function function + The Create.E( string ) function provides a limited way to connect to signals inside of a Create hierarchy + for those who really want such a functionality. The name of the event whose name is passed to + Create.E( string ) + +4) A key which is the Create function itself, and a value which is a function + The function will be run with the argument of the object itself after all other initialization of the object is + done by create. This provides a way to do arbitrary things involving the object from withing the create + hierarchy. + Note: This function is called SYNCHRONOUSLY, that means that you should only so initialization in + it, not stuff which requires waiting, as the Create call will block until it returns. While waiting in the + constructor callback function is possible, it is probably not a good design choice. + Note: Since the constructor function is called after all other initialization, a Create block cannot have two + constructor functions, as it would not be possible to call both of them last, also, this would be unnecessary. + + +Some example usages: + +A simple example which uses the Create function to create a model object and assign two of it's properties. +local model = Create'Model'{ + Name = 'A New model', + Parent = game.Workspace, +} + + +An example where a larger hierarchy of object is made. After the call the hierarchy will look like this: +Model_Container + |-ObjectValue + | | + | `-BoolValueChild + `-IntValue + +local model = Create'Model'{ + Name = 'Model_Container', + Create'ObjectValue'{ + Create'BoolValue'{ + Name = 'BoolValueChild', + }, + }, + Create'IntValue'{}, +} + + +An example using the event syntax: + +local part = Create'Part'{ + [Create.E'Touched'] = function(part) + print("I was touched by "..part.Name) + end, +} + + +An example using the general constructor syntax: + +local model = Create'Part'{ + [Create] = function(this) + print("Constructor running!") + this.Name = GetGlobalFoosAndBars(this) + end, +} + + +Note: It is also perfectly legal to save a reference to the function returned by a call Create, this will not cause + any unexpected behavior. EG: + local partCreatingFunction = Create'Part' + local part = partCreatingFunction() +]] + +--the Create function need to be created as a functor, not a function, in order to support the Create.E syntax, so it +--will be created in several steps rather than as a single function declaration. +local function Create_PrivImpl(objectType) + if type(objectType) ~= "string" then + error("Argument of Create must be a string", 2) + end + --return the proxy function that gives us the nice Create'string'{data} syntax + --The first function call is a function call using Lua's single-string-argument syntax + --The second function call is using Lua's single-table-argument syntax + --Both can be chained together for the nice effect. + return function(dat) + --default to nothing, to handle the no argument given case + dat = dat or {} + + --make the object to mutate + local obj = Instance.new(objectType) + local parent = nil + + --stored constructor function to be called after other initialization + local ctor = nil + + for k, v in pairs(dat) do + --add property + if type(k) == "string" then + if k == "Parent" then + -- Parent should always be set last, setting the Parent of a new object + -- immediately makes performance worse for all subsequent property updates. + parent = v + else + obj[k] = v + end + + --add child + elseif type(k) == "number" then + if type(v) ~= "userdata" then + error("Bad entry in Create body: Numeric keys must be paired with children, got a: " .. type(v), 2) + end + v.Parent = obj + + --event connect + elseif type(k) == "table" and k.__eventname then + if type(v) ~= "function" then + error( + "Bad entry in Create body: Key `[Create.E'" + .. k.__eventname + .. "']` must have a function value, got: " + .. tostring(v), + 2 + ) + end + obj[k.__eventname]:connect(v) + + --define constructor function + elseif k == t.Create then + if type(v) ~= "function" then + error( + "Bad entry in Create body: Key `[Create]` should be paired with a constructor function, got: " + .. tostring(v), + 2 + ) + elseif ctor then + --ctor already exists, only one allowed + error("Bad entry in Create body: Only one constructor function is allowed", 2) + end + ctor = v + else + error("Bad entry (" .. tostring(k) .. " => " .. tostring(v) .. ") in Create body", 2) + end + end + + --apply constructor function if it exists + if ctor then + ctor(obj) + end + + if parent then + obj.Parent = parent + end + + --return the completed object + return obj + end +end + +--now, create the functor: +t.Create = setmetatable({}, { + __call = function(_, ...) + return Create_PrivImpl(...) + end, +}) + +--and create the "Event.E" syntax stub. Really it's just a stub to construct a table which our Create +--function can recognize as special. +t.Create.E = function(eventName) + return { __eventname = eventName } +end + +-------------------------------------------------Create function End---------------------------------------------------- + +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------Documentation Begin----------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ +------------------------------------------------------------------------------------------------------------------------ + +t.Help = function(funcNameOrFunc) + --input argument can be a string or a function. Should return a description (of arguments and expected side effects) + if funcNameOrFunc == "DecodeJSON" or funcNameOrFunc == t.DecodeJSON then + return "Function DecodeJSON. " + .. "Arguments: (string). " + .. "Side effect: returns a table with all parsed JSON values" + end + if funcNameOrFunc == "EncodeJSON" or funcNameOrFunc == t.EncodeJSON then + return "Function EncodeJSON. " + .. "Arguments: (table). " + .. "Side effect: returns a string composed of argument table in JSON data format" + end + if funcNameOrFunc == "MakeWedge" or funcNameOrFunc == t.MakeWedge then + return "Function MakeWedge. " + .. "Arguments: (x, y, z, [default material]). " + .. "Description: Makes a wedge at location x, y, z. Sets cell x, y, z to default material if " + .. "parameter is provided, if not sets cell x, y, z to be whatever material it previously was. " + .. "Returns true if made a wedge, false if the cell remains a block " + end + if funcNameOrFunc == "SelectTerrainRegion" or funcNameOrFunc == t.SelectTerrainRegion then + return "Function SelectTerrainRegion. " + .. "Arguments: (regionToSelect, color, selectEmptyCells, selectionParent). " + .. "Description: Selects all terrain via a series of selection boxes within the regionToSelect " + .. "(this should be a region3 value). The selection box color is detemined by the color argument " + .. "(should be a brickcolor value). SelectionParent is the parent that the selection model gets placed to (optional)." + .. "SelectEmptyCells is bool, when true will select all cells in the " + .. "region, otherwise we only select non-empty cells. Returns a function that can update the selection," + .. "arguments to said function are a new region3 to select, and the adornment color (color arg is optional). " + .. "Also returns a second function that takes no arguments and destroys the selection" + end + if funcNameOrFunc == "CreateSignal" or funcNameOrFunc == t.CreateSignal then + return "Function CreateSignal. " + .. "Arguments: None. " + .. "Returns: The newly created Signal object. This object is identical to the RBXScriptSignal class " + .. "used for events in Objects, but is a Lua-side object so it can be used to create custom events in" + .. "Lua code. " + .. "Methods of the Signal object: :connect, :wait, :fire, :disconnect. " + .. "For more info you can pass the method name to the Help function, or view the wiki page " + .. "for this library. EG: Help('Signal:connect')." + end + if funcNameOrFunc == "Signal:connect" then + return "Method Signal:connect. " + .. "Arguments: (function handler). " + .. "Return: A connection object which can be used to disconnect the connection to this handler. " + .. "Description: Connectes a handler function to this Signal, so that when |fire| is called the " + .. "handler function will be called with the arguments passed to |fire|." + end + if funcNameOrFunc == "Signal:wait" then + return "Method Signal:wait. " + .. "Arguments: None. " + .. "Returns: The arguments passed to the next call to |fire|. " + .. "Description: This call does not return until the next call to |fire| is made, at which point it " + .. "will return the values which were passed as arguments to that |fire| call." + end + if funcNameOrFunc == "Signal:fire" then + return "Method Signal:fire. " + .. "Arguments: Any number of arguments of any type. " + .. "Returns: None. " + .. "Description: This call will invoke any connected handler functions, and notify any waiting code " + .. "attached to this Signal to continue, with the arguments passed to this function. Note: The calls " + .. "to handlers are made asynchronously, so this call will return immediately regardless of how long " + .. "it takes the connected handler functions to complete." + end + if funcNameOrFunc == "Signal:disconnect" then + return "Method Signal:disconnect. " + .. "Arguments: None. " + .. "Returns: None. " + .. "Description: This call disconnects all handlers attacched to this function, note however, it " + .. "does NOT make waiting code continue, as is the behavior of normal Roblox events. This method " + .. "can also be called on the connection object which is returned from Signal:connect to only " + .. "disconnect a single handler, as opposed to this method, which will disconnect all handlers." + end + if funcNameOrFunc == "Create" then + return "Function Create. " + .. "Arguments: A table containing information about how to construct a collection of objects. " + .. "Returns: The constructed objects. " + .. "Descrition: Create is a very powerfull function, whose description is too long to fit here, and " + .. "is best described via example, please see the wiki page for a description of how to use it." + end +end + +--------------------------------------------Documentation Ends---------------------------------------------------------- + +return t diff --git a/lua/60595695.lua b/lua/60595695.lua new file mode 100644 index 0000000..a151712 --- /dev/null +++ b/lua/60595695.lua @@ -0,0 +1,26 @@ +-- Library Registration Script +-- This script is used to register RbxLua libraries on game servers, so game scripts have +-- access to all of the libraries (otherwise only local scripts do) + +local deepakTestingPlace = 3569749 +local sc = game:GetService "ScriptContext" +local tries = 0 + +while not sc and tries < 3 do + tries = tries + 1 + sc = game:GetService "ScriptContext" + wait(0.2) +end + +if sc then + sc:RegisterLibrary("Libraries/RbxGui", "45284430") + sc:RegisterLibrary("Libraries/RbxGear", "45374389") + if game.PlaceId == deepakTestingPlace then + sc:RegisterLibrary("Libraries/RbxStatus", "52177566") + end + sc:RegisterLibrary("Libraries/RbxUtility", "60595411") + sc:RegisterLibrary("Libraries/RbxStamper", "73157242") + sc:LibraryRegistrationComplete() +else + print "failed to find script context, libraries did not load" +end diff --git a/lua/73157242.lua b/lua/73157242.lua new file mode 100644 index 0000000..6dd5e2a --- /dev/null +++ b/lua/73157242.lua @@ -0,0 +1,2544 @@ +local t = {} + +-- function waitForChild(instance, name) +-- while not instance:FindFirstChild(name) do +-- instance.ChildAdded:wait() +-- end +-- end + +-- Do a line/plane intersection. The line starts at the camera. The plane is at y == 0, normal(0, 1, 0) +-- +-- vectorPos - End point of the line. +-- +-- Return: +-- cellPos - The terrain cell intersection point if there is one, vectorPos if there isn't. +-- hit - Whether there was a plane intersection. Value is true if there was, false if not. +function PlaneIntersection(vectorPos) + local hit = false + local currCamera = game.Workspace.CurrentCamera + local startPos = + Vector3.new(currCamera.CoordinateFrame.p.X, currCamera.CoordinateFrame.p.Y, currCamera.CoordinateFrame.p.Z) + local endPos = Vector3.new(vectorPos.X, vectorPos.Y, vectorPos.Z) + local normal = Vector3.new(0, 1, 0) + local p3 = Vector3.new(0, 0, 0) + local startEndDot = normal:Dot(endPos - startPos) + local cellPos = vectorPos + if startEndDot ~= 0 then + local t = normal:Dot(p3 - startPos) / startEndDot + if t >= 0 and t <= 1 then + local intersection = ((endPos - startPos) * t) + startPos + cellPos = game.Workspace.Terrain:WorldToCell(intersection) + hit = true + end + end + + return cellPos, hit +end + +-- Purpose: +-- Checks for terrain touched by the mouse hit. +-- Will do a plane intersection if no terrain is touched. +-- +-- mouse - Mouse to check the .hit for. +-- +-- Return: +-- cellPos - Cell position hit. Nil if none. +function GetTerrainForMouse(mouse) + -- There was no target, so all it could be is a plane intersection. + -- Check for a plane intersection. If there isn't one then nothing will get hit. + local cell = game.Workspace.Terrain:WorldToCellPreferSolid(Vector3.new(mouse.hit.x, mouse.hit.y, mouse.hit.z)) + local planeLoc = nil + -- If nothing was hit, do the plane intersection. + if 0 == game.Workspace.Terrain:GetCell(cell.X, cell.Y, cell.Z).Value then + cell = nil + planeLoc, hit = PlaneIntersection(Vector3.new(mouse.hit.x, mouse.hit.y, mouse.hit.z)) + if hit then + cell = planeLoc + end + end + return cell +end + +-- setup helper functions +local insertBoundingBoxOverlapVector = Vector3.new(0.3, 0.3, 0.3) -- we can still stamp if our character extrudes into the target stamping space by .3 or fewer units + +-- rotates a model by yAngle radians about the global y-axis +local function rotatePartAndChildren(part, rotCF, offsetFromOrigin) + -- rotate this thing, if it's a part + if part:IsA "BasePart" then + part.CFrame = (rotCF * (part.CFrame - offsetFromOrigin)) + offsetFromOrigin + end + + -- recursively do the same to all children + local partChildren = part:GetChildren() + for c = 1, #partChildren do + rotatePartAndChildren(partChildren[c], rotCF, offsetFromOrigin) + end +end + +local function modelRotate(model, yAngle) + local rotCF = CFrame.Angles(0, yAngle, 0) + local offsetFromOrigin = model:GetModelCFrame().p + + rotatePartAndChildren(model, rotCF, offsetFromOrigin) +end + +local function collectParts(object, baseParts, scripts, decals) + if object:IsA "BasePart" then + baseParts[#baseParts + 1] = object + elseif object:IsA "Script" then + scripts[#scripts + 1] = object + elseif object:IsA "Decal" then + decals[#decals + 1] = object + end + + for _, child in pairs(object:GetChildren()) do + collectParts(child, baseParts, scripts, decals) + end +end + +local function clusterPartsInRegion(startVector, endVector) + local cluster = game.Workspace:FindFirstChild "Terrain" + + local startCell = cluster:WorldToCell(startVector) + local endCell = cluster:WorldToCell(endVector) + + local startX = startCell.X + local startY = startCell.Y + local startZ = startCell.Z + + local endX = endCell.X + local endY = endCell.Y + local endZ = endCell.Z + + if startX < cluster.MaxExtents.Min.X then + startX = cluster.MaxExtents.Min.X + end + if startY < cluster.MaxExtents.Min.Y then + startY = cluster.MaxExtents.Min.Y + end + if startZ < cluster.MaxExtents.Min.Z then + startZ = cluster.MaxExtents.Min.Z + end + + if endX > cluster.MaxExtents.Max.X then + endX = cluster.MaxExtents.Max.X + end + if endY > cluster.MaxExtents.Max.Y then + endY = cluster.MaxExtents.Max.Y + end + if endZ > cluster.MaxExtents.Max.Z then + endZ = cluster.MaxExtents.Max.Z + end + + for x = startX, endX do + for y = startY, endY do + for z = startZ, endZ do + if cluster:GetCell(x, y, z).Value > 0 then + return true + end + end + end + end + + return false +end + +local function findSeatsInModel(parent, seatTable) + if not parent then + return + end + + if parent.className == "Seat" or parent.className == "VehicleSeat" then + table.insert(seatTable, parent) + end + local myChildren = parent:GetChildren() + for j = 1, #myChildren do + findSeatsInModel(myChildren[j], seatTable) + end +end + +local function setSeatEnabledStatus(model, isEnabled) + local seatList = {} + findSeatsInModel(model, seatList) + + if isEnabled then + -- remove any welds called "SeatWeld" in seats + for i = 1, #seatList do + local nextSeat = seatList[i]:FindFirstChild "SeatWeld" + while nextSeat do + nextSeat:Remove() + nextSeat = seatList[i]:FindFirstChild "SeatWeld" + end + end + else + -- put a weld called "SeatWeld" in every seat + -- this tricks it into thinking there's already someone sitting there, and it won't make you sit XD + for i = 1, #seatList do + local fakeWeld = Instance.new "Weld" + fakeWeld.Name = "SeatWeld" + fakeWeld.Parent = seatList[i] + end + end +end + +local function autoAlignToFace(parts) + local aatf = parts:FindFirstChild "AutoAlignToFace" + if aatf then + return aatf.Value + else + return false + end +end + +local function getClosestAlignedWorldDirection(aVector3InWorld) + local xDir = Vector3.new(1, 0, 0) + local yDir = Vector3.new(0, 1, 0) + local zDir = Vector3.new(0, 0, 1) + local xDot = aVector3InWorld.x * xDir.x + aVector3InWorld.y * xDir.y + aVector3InWorld.z * xDir.z + local yDot = aVector3InWorld.x * yDir.x + aVector3InWorld.y * yDir.y + aVector3InWorld.z * yDir.z + local zDot = aVector3InWorld.x * zDir.x + aVector3InWorld.y * zDir.y + aVector3InWorld.z * zDir.z + + if math.abs(xDot) > math.abs(yDot) and math.abs(xDot) > math.abs(zDot) then + if xDot > 0 then + return 0 + else + return 3 + end + elseif math.abs(yDot) > math.abs(xDot) and math.abs(yDot) > math.abs(zDot) then + if yDot > 0 then + return 1 + else + return 4 + end + else + if zDot > 0 then + return 2 + else + return 5 + end + end +end + +local function positionPartsAtCFrame3(aCFrame, currentParts) + local insertCFrame = nil + if not currentParts then + return currentParts + end + if currentParts and (currentParts:IsA "Model" or currentParts:IsA "Tool") then + insertCFrame = currentParts:GetModelCFrame() + currentParts:TranslateBy(aCFrame.p - insertCFrame.p) + else + currentParts.CFrame = aCFrame + end + return currentParts +end + +local function calcRayHitTime(rayStart, raySlope, intersectionPlane) + if math.abs(raySlope) < 0.01 then + return 0 + end -- 0 slope --> we just say intersection time is 0, and sidestep this dimension + return (intersectionPlane - rayStart) / raySlope +end + +local function modelTargetSurface(partOrModel, rayStart, rayEnd) + if not partOrModel then + return 0 + end + + local modelCFrame = nil + local modelSize = nil + if partOrModel:IsA "Model" then + modelCFrame = partOrModel:GetModelCFrame() + modelSize = partOrModel:GetModelSize() + else + modelCFrame = partOrModel.CFrame + modelSize = partOrModel.Size + end + + local mouseRayStart = modelCFrame:pointToObjectSpace(rayStart) + local mouseRayEnd = modelCFrame:pointToObjectSpace(rayEnd) + local mouseSlope = mouseRayEnd - mouseRayStart + + local xPositive = 1 + local yPositive = 1 + local zPositive = 1 + if mouseSlope.X > 0 then + xPositive = -1 + end + if mouseSlope.Y > 0 then + yPositive = -1 + end + if mouseSlope.Z > 0 then + zPositive = -1 + end + + -- find which surface the transformed mouse ray hits (using modelSize): + local xHitTime = calcRayHitTime(mouseRayStart.X, mouseSlope.X, modelSize.X / 2 * xPositive) + local yHitTime = calcRayHitTime(mouseRayStart.Y, mouseSlope.Y, modelSize.Y / 2 * yPositive) + local zHitTime = calcRayHitTime(mouseRayStart.Z, mouseSlope.Z, modelSize.Z / 2 * zPositive) + + local hitFace = 0 + + --if xHitTime >= 0 and yHitTime >= 0 and zHitTime >= 0 then + if xHitTime > yHitTime then + if xHitTime > zHitTime then + -- xFace is hit + hitFace = 1 * xPositive + else + -- zFace is hit + hitFace = 3 * zPositive + end + else + if yHitTime > zHitTime then + -- yFace is hit + hitFace = 2 * yPositive + else + -- zFace is hit + hitFace = 3 * zPositive + end + end + + return hitFace +end + +local function getBoundingBox2(partOrModel) + -- for models, the bounding box is defined as the minimum and maximum individual part bounding boxes + -- relative to the first part's coordinate frame. + local minVec = Vector3.new(math.huge, math.huge, math.huge) + local maxVec = Vector3.new(-math.huge, -math.huge, -math.huge) + + if partOrModel:IsA "Terrain" then + minVec = Vector3.new(-2, -2, -2) + maxVec = Vector3.new(2, 2, 2) + elseif partOrModel:IsA "BasePart" then + minVec = -0.5 * partOrModel.Size + maxVec = -minVec + else + maxVec = partOrModel:GetModelSize() * 0.5 + minVec = -maxVec + end + + -- Adjust bounding box to reflect what the model or part author wants in terms of justification + local justifyValue = partOrModel:FindFirstChild "Justification" + if justifyValue ~= nil then + -- find the multiple of 4 that contains the model + local justify = justifyValue.Value + local two = Vector3.new(2, 2, 2) + local actualBox = maxVec - minVec - Vector3.new(0.01, 0.01, 0.01) + local containingGridBox = + Vector3.new(4 * math.ceil(actualBox.x / 4), 4 * math.ceil(actualBox.y / 4), 4 * math.ceil(actualBox.z / 4)) + local adjustment = containingGridBox - actualBox + minVec = minVec - 0.5 * adjustment * justify + maxVec = maxVec + 0.5 * adjustment * (two - justify) + end + + return minVec, maxVec +end + +local function getBoundingBoxInWorldCoordinates(partOrModel) + local minVec = Vector3.new(math.huge, math.huge, math.huge) + local maxVec = Vector3.new(-math.huge, -math.huge, -math.huge) + + if partOrModel:IsA "BasePart" and not partOrModel:IsA "Terrain" then + local vec1 = partOrModel.CFrame:pointToWorldSpace(-0.5 * partOrModel.Size) + local vec2 = partOrModel.CFrame:pointToWorldSpace(0.5 * partOrModel.Size) + minVec = Vector3.new(math.min(vec1.X, vec2.X), math.min(vec1.Y, vec2.Y), math.min(vec1.Z, vec2.Z)) + maxVec = Vector3.new(math.max(vec1.X, vec2.X), math.max(vec1.Y, vec2.Y), math.max(vec1.Z, vec2.Z)) + elseif not partOrModel:IsA "Terrain" then + -- we shouldn't have to deal with this case + --minVec = Vector3.new(-2, -2, -2) + --maxVec = Vector3.new(2, 2, 2) + -- else + local vec1 = partOrModel:GetModelCFrame():pointToWorldSpace(-0.5 * partOrModel:GetModelSize()) + local vec2 = partOrModel:GetModelCFrame():pointToWorldSpace(0.5 * partOrModel:GetModelSize()) + minVec = Vector3.new(math.min(vec1.X, vec2.X), math.min(vec1.Y, vec2.Y), math.min(vec1.Z, vec2.Z)) + maxVec = Vector3.new(math.max(vec1.X, vec2.X), math.max(vec1.Y, vec2.Y), math.max(vec1.Z, vec2.Z)) + end + + return minVec, maxVec +end + +local function getTargetPartBoundingBox(targetPart) + if targetPart.Parent:FindFirstChild "RobloxModel" ~= nil then + return getBoundingBox2(targetPart.Parent) + else + return getBoundingBox2(targetPart) + end +end + +local function getMouseTargetCFrame(targetPart) + if targetPart.Parent:FindFirstChild "RobloxModel" ~= nil then + if targetPart.Parent:IsA "Tool" then + return targetPart.Parent.Handle.CFrame + else + return targetPart.Parent:GetModelCFrame() + end + else + return targetPart.CFrame + end +end + +local function isBlocker(part) -- returns whether or not we want to cancel the stamp because we're blocked by this part + if not part then + return false + end + if not part.Parent then + return false + end + if part:FindFirstChild "Humanoid" then + return false + end + if part:FindFirstChild "RobloxStamper" or part:FindFirstChild "RobloxModel" then + return true + end + if part:IsA "Part" and not part.CanCollide then + return false + end + if part == game.Lighting then + return false + end + return isBlocker(part.Parent) +end + +-- helper function to determine if a character can be pushed upwards by a certain amount +-- character is 5 studs tall, we'll check a 1.5 x 1.5 x 4.5 box around char, with center .5 studs below torsocenter +local function spaceAboveCharacter(charTorso, newTorsoY, stampData) + local partsAboveChar = game.Workspace:FindPartsInRegion3( + Region3.new( + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) - Vector3.new(0.75, 2.75, 0.75), + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + Vector3.new(0.75, 1.75, 0.75) + ), + charTorso.Parent, + 100 + ) + + for j = 1, #partsAboveChar do + if partsAboveChar[j].CanCollide and not partsAboveChar[j]:IsDescendantOf(stampData.CurrentParts) then + return false + end + end + + if + clusterPartsInRegion( + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) - Vector3.new(0.75, 2.75, 0.75), + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + Vector3.new(0.75, 1.75, 0.75) + ) + then + return false + end + + return true +end + +local function findConfigAtMouseTarget(Mouse, stampData) + -- *Critical Assumption* : + -- This function assumes the target CF axes are orthogonal with the target bounding box faces + -- And, it assumes the insert CF axes are orthongonal with the insert bounding box faces + -- Therefore, insertion will not work with angled faces on wedges or other "non-block" parts, nor + -- will it work for parts in a model that are not orthogonally aligned with the model's CF. + + if not Mouse then + return nil + end -- This can happen sometimes, return if so + if not stampData then + error "findConfigAtMouseTarget: stampData is nil" + return nil + end + if not stampData["CurrentParts"] then + return nil + end + + local grid = 4.0 + local admissibleConfig = false + local targetConfig = CFrame.new(0, 0, 0) + + local minBB, maxBB = getBoundingBox2(stampData.CurrentParts) + local diagBB = maxBB - minBB + + local insertCFrame + if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + insertCFrame = stampData.CurrentParts:GetModelCFrame() + else + insertCFrame = stampData.CurrentParts.CFrame + end + + if Mouse then + if stampData.CurrentParts:IsA "Tool" then + Mouse.TargetFilter = stampData.CurrentParts.Handle + else + Mouse.TargetFilter = stampData.CurrentParts + end + end + + local hitPlane = false + local targetPart = nil + local success = pcall(function() + targetPart = Mouse.Target + end) + + if not success then -- or targetPart == nil then + return admissibleConfig, targetConfig + end + + local mouseHitInWorld = Vector3.new(0, 0, 0) + if Mouse then + mouseHitInWorld = Vector3.new(Mouse.Hit.x, Mouse.Hit.y, Mouse.Hit.z) + end + + local cellPos = nil + + -- Nothing was hit, so check for the default plane. + if nil == targetPart then + cellPos = GetTerrainForMouse(Mouse) + if nil == cellPos then + hitPlane = false + return admissibleConfig, targetConfig + else + targetPart = game.Workspace.Terrain + hitPlane = true + -- Take into account error that will occur. + cellPos = Vector3.new(cellPos.X - 1, cellPos.Y, cellPos.Z) + mouseHitInWorld = game.Workspace.Terrain:CellCenterToWorld(cellPos.x, cellPos.y, cellPos.z) + end + end + + -- test mouse hit location + local minBBTarget, maxBBTarget = getTargetPartBoundingBox(targetPart) + local diagBBTarget = maxBBTarget - minBBTarget + local targetCFrame = getMouseTargetCFrame(targetPart) + + if targetPart:IsA "Terrain" then + if not cluster then + cluster = game.Workspace:FindFirstChild "Terrain" + end + local cellID = cluster:WorldToCellPreferSolid(mouseHitInWorld) + if hitPlane then + cellID = cellPos + end + + targetCFrame = CFrame.new(game.Workspace.Terrain:CellCenterToWorld(cellID.x, cellID.y, cellID.z)) + end + + local mouseHitInTarget = targetCFrame:pointToObjectSpace(mouseHitInWorld) + local targetVectorInWorld = Vector3.new(0, 0, 0) + if Mouse then + -- DON'T WANT THIS IN TERMS OF THE MODEL CFRAME! (.TargetSurface is in terms of the part CFrame, so this would break, right? [HotThoth]) + -- (ideally, we would want to make the Mouse.TargetSurface a model-targetsurface instead, but for testing will be using the converse) + --targetVectorInWorld = targetCFrame:vectorToWorldSpace(Vector3.FromNormalId(Mouse.TargetSurface)) + targetVectorInWorld = targetPart.CFrame:vectorToWorldSpace(Vector3.FromNormalId(Mouse.TargetSurface)) -- better, but model cframe would be best + --[[if targetPart.Parent:IsA("Model") then + local hitFace = modelTargetSurface(targetPart.Parent, Mouse.Hit.p, game.Workspace.CurrentCamera.CoordinateFrame.p) -- best, if you get it right + local WORLD_AXES = {Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1)} + if hitFace > 0 then + targetVectorInWorld = targetCFrame:vectorToWorldSpace(WORLD_AXES[hitFace]) + elseif hitFace < 0 then + targetVectorInWorld = targetCFrame:vectorToWorldSpace(-WORLD_AXES[-hitFace]) + end + end]] + end + + local targetRefPointInTarget, insertRefPointInInsert + local clampToSurface + + if getClosestAlignedWorldDirection(targetVectorInWorld) == 0 then + targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(1, -1, 1)) + insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + clampToSurface = Vector3.new(0, 1, 1) + elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 3 then + targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, -1)) + insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(1, -1, -1)) + clampToSurface = Vector3.new(0, 1, 1) + elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 1 then + targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, 1, 1)) + insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + clampToSurface = Vector3.new(1, 0, 1) + elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 4 then + targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, 1, 1)) + clampToSurface = Vector3.new(1, 0, 1) + elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 2 then + targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, -1)) + clampToSurface = Vector3.new(1, 1, 0) + else + targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(1, -1, -1)) + insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(1, -1, 1)) + clampToSurface = Vector3.new(1, 1, 0) + end + + targetRefPointInTarget = targetRefPointInTarget * (0.5 * diagBBTarget) + 0.5 * (maxBBTarget + minBBTarget) + insertRefPointInInsert = insertRefPointInInsert * (0.5 * diagBB) + 0.5 * (maxBB + minBB) + + -- To Do: For cases that are not aligned to the world grid, account for the minimal rotation + -- needed to bring the Insert part(s) into alignment with the Target Part + -- Apply the rotation here + + local delta = mouseHitInTarget - targetRefPointInTarget + local deltaClamped = Vector3.new( + grid * math.modf(delta.x / grid), + grid * math.modf(delta.y / grid), + grid * math.modf(delta.z / grid) + ) + deltaClamped = deltaClamped * clampToSurface + local targetTouchInTarget = deltaClamped + targetRefPointInTarget + + local TargetTouchRelToWorld = targetCFrame:pointToWorldSpace(targetTouchInTarget) + local InsertTouchInWorld = insertCFrame:vectorToWorldSpace(insertRefPointInInsert) + local posInsertOriginInWorld = TargetTouchRelToWorld - InsertTouchInWorld + + local _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = insertCFrame:components() + targetConfig = CFrame.new( + posInsertOriginInWorld.x, + posInsertOriginInWorld.y, + posInsertOriginInWorld.z, + R00, + R01, + R02, + R10, + R11, + R12, + R20, + R21, + R22 + ) + admissibleConfig = true + + return admissibleConfig, targetConfig, getClosestAlignedWorldDirection(targetVectorInWorld) +end + +local function truncateToCircleEighth(bigValue, littleValue) + local big = math.abs(bigValue) + local little = math.abs(littleValue) + local hypotenuse = math.sqrt(big * big + little * little) + local frac = little / hypotenuse + + local bigSign = 1 + local littleSign = 1 + if bigValue < 0 then + bigSign = -1 + end + if littleValue < 0 then + littleSign = -1 + end + + if frac > 0.382683432 then + -- between 22.5 and 45 degrees, so truncate to 45-degree tilt + return 0.707106781 * hypotenuse * bigSign, 0.707106781 * hypotenuse * littleSign + else + -- between 0 and 22.5 degrees, so truncate to 0-degree tilt + return hypotenuse * bigSign, 0 + end +end + +local function saveTheWelds(object, manualWeldTable, manualWeldParentTable) + if object:IsA "ManualWeld" or object:IsA "Rotate" then + table.insert(manualWeldTable, object) + table.insert(manualWeldParentTable, object.Parent) + else + local children = object:GetChildren() + for i = 1, #children do + saveTheWelds(children[i], manualWeldTable, manualWeldParentTable) + end + end +end + +local function restoreTheWelds(manualWeldTable, manualWeldParentTable) + for i = 1, #manualWeldTable do + manualWeldTable[i].Parent = manualWeldParentTable[i] + end +end + +t.CanEditRegion = function(partOrModel, EditRegion) -- todo: use model and stamper metadata + if not EditRegion then + return true, false + end + + local minBB, maxBB = getBoundingBoxInWorldCoordinates(partOrModel) + + if + minBB.X < EditRegion.CFrame.p.X - EditRegion.Size.X / 2 + or minBB.Y < EditRegion.CFrame.p.Y - EditRegion.Size.Y / 2 + or minBB.Z < EditRegion.CFrame.p.Z - EditRegion.Size.Z / 2 + then + return false, false + end + + if + maxBB.X > EditRegion.CFrame.p.X + EditRegion.Size.X / 2 + or maxBB.Y > EditRegion.CFrame.p.Y + EditRegion.Size.Y / 2 + or maxBB.Z > EditRegion.CFrame.p.Z + EditRegion.Size.Z / 2 + then + return false, false + end + + return true, false +end + +t.GetStampModel = function(assetId, terrainShape, useAssetVersionId) + if assetId == 0 then + return nil, "No Asset" + end + if assetId < 0 then + return nil, "Negative Asset" + end + + local function UnlockInstances(object) + if object:IsA "BasePart" then + object.Locked = false + end + for _, child in pairs(object:GetChildren()) do + UnlockInstances(child) + end + end + + local function getClosestColorToTerrainMaterial(terrainValue) + if terrainValue == 1 then + return BrickColor.new "Bright green" + elseif terrainValue == 2 then + return BrickColor.new "Bright yellow" + elseif terrainValue == 3 then + return BrickColor.new "Bright red" + elseif terrainValue == 4 then + return BrickColor.new "Sand red" + elseif terrainValue == 5 then + return BrickColor.new "Black" + elseif terrainValue == 6 then + return BrickColor.new "Dark stone grey" + elseif terrainValue == 7 then + return BrickColor.new "Sand blue" + elseif terrainValue == 8 then + return BrickColor.new "Deep orange" + elseif terrainValue == 9 then + return BrickColor.new "Dark orange" + elseif terrainValue == 10 then + return BrickColor.new "Reddish brown" + elseif terrainValue == 11 then + return BrickColor.new "Light orange" + elseif terrainValue == 12 then + return BrickColor.new "Light stone grey" + elseif terrainValue == 13 then + return BrickColor.new "Sand green" + elseif terrainValue == 14 then + return BrickColor.new "Medium stone grey" + elseif terrainValue == 15 then + return BrickColor.new "Really red" + elseif terrainValue == 16 then + return BrickColor.new "Really blue" + elseif terrainValue == 17 then + return BrickColor.new "Bright blue" + else + return BrickColor.new "Bright green" + end + end + + local function setupFakeTerrainPart(cellMat, cellType, cellOrient) + local newTerrainPiece = nil + if cellType == 1 or cellType == 4 then + newTerrainPiece = Instance.new "WedgePart" + newTerrainPiece.formFactor = "Custom" + elseif cellType == 2 then + newTerrainPiece = Instance.new "CornerWedgePart" + else + newTerrainPiece = Instance.new "Part" + newTerrainPiece.formFactor = "Custom" + end + newTerrainPiece.Name = "MegaClusterCube" + newTerrainPiece.Size = Vector3.new(4, 4, 4) + newTerrainPiece.BottomSurface = "Smooth" + newTerrainPiece.TopSurface = "Smooth" + + -- can add decals or textures here if feeling particularly adventurous... for now, can make a table of look-up colors + newTerrainPiece.BrickColor = getClosestColorToTerrainMaterial(cellMat) + + local sideways = 0 + local flipped = math.pi + if cellType == 4 then + sideways = -math.pi / 2 + end + if cellType == 2 or cellType == 3 then + flipped = 0 + end + newTerrainPiece.CFrame = CFrame.Angles(0, math.pi / 2 * cellOrient + flipped, sideways) + + if cellType == 3 then + local inverseCornerWedgeMesh = Instance.new "SpecialMesh" + inverseCornerWedgeMesh.MeshType = "FileMesh" + inverseCornerWedgeMesh.MeshId = "http://www.roblox.com/asset?id=66832495" + inverseCornerWedgeMesh.Scale = Vector3.new(2, 2, 2) + inverseCornerWedgeMesh.Parent = newTerrainPiece + end + + local materialTag = Instance.new "Vector3Value" + materialTag.Value = Vector3.new(cellMat, cellType, cellOrient) + materialTag.Name = "ClusterMaterial" + materialTag.Parent = newTerrainPiece + + return newTerrainPiece + end + + -- This call will cause a "wait" until the data comes back + -- below we wait a max of 8 seconds before deciding to bail out on loading + local root + local loader + local loading = true + if useAssetVersionId then + loader = coroutine.create(function() + root = game:GetService("InsertService"):LoadAssetVersion(assetId) + loading = false + end) + coroutine.resume(loader) + else + loader = coroutine.create(function() + root = game:GetService("InsertService"):LoadAsset(assetId) + loading = false + end) + coroutine.resume(loader) + end + + local lastGameTime = 0 + local totalTime = 0 + local maxWait = 8 + while loading and totalTime < maxWait do + lastGameTime = tick() + wait(1) + totalTime = totalTime + tick() - lastGameTime + end + loading = false + + if totalTime >= maxWait then + return nil, "Load Time Fail" + end + + if root == nil then + return nil, "Load Asset Fail" + end + + if not root:IsA "Model" then + return nil, "Load Type Fail" + end + + local instances = root:GetChildren() + if #instances == 0 then + return nil, "Empty Model Fail" + end + + --Unlock all parts that are inserted, to make sure they are editable + UnlockInstances(root) + + --Continue the insert process + root = root:GetChildren()[1] + + --Examine the contents and decide what it looks like + for _, instance in pairs(instances) do + if instance:IsA "Team" then + instance.Parent = game:GetService "Teams" + elseif instance:IsA "Sky" then + local lightingService = game:GetService "Lighting" + for _, child in pairs(lightingService:GetChildren()) do + if child:IsA "Sky" then + child:Remove() + end + end + instance.Parent = lightingService + return + end + end + + -- ...and tag all inserted models for subsequent origin identification + -- if no RobloxModel tag already exists, then add it. + if root:FindFirstChild "RobloxModel" == nil then + local stringTag = Instance.new "BoolValue" + stringTag.Name = "RobloxModel" + stringTag.Parent = root + + if root:FindFirstChild "RobloxStamper" == nil then + local stringTag2 = Instance.new "BoolValue" + stringTag2.Name = "RobloxStamper" + stringTag2.Parent = root + end + end + + if terrainShape then + if root.Name == "MegaClusterCube" then + if terrainShape == 6 then -- insert an autowedging tag + local autowedgeTag = Instance.new "BoolValue" + autowedgeTag.Name = "AutoWedge" + autowedgeTag.Parent = root + else + local clusterTag = root:FindFirstChild "ClusterMaterial" + if clusterTag then + if clusterTag:IsA "Vector3Value" then + root = setupFakeTerrainPart(clusterTag.Value.X, terrainShape, clusterTag.Value.Z) + else + root = setupFakeTerrainPart(clusterTag.Value, terrainShape, 0) + end + else + root = setupFakeTerrainPart(1, terrainShape, 0) + end + end + end + end + + return root +end + +t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStampRegion, StampFailedFunc) + if not modelToStamp then + error "SetupStamperDragger: modelToStamp (first arg) is nil! Should be a stamper model" + return nil + end + if not modelToStamp:IsA "Model" and not modelToStamp:IsA "BasePart" then + error "SetupStamperDragger: modelToStamp (first arg) is neither a Model or Part!" + return nil + end + if not Mouse then + error "SetupStamperDragger: Mouse (second arg) is nil! Should be a mouse object" + return nil + end + if not Mouse:IsA "Mouse" then + error "SetupStamperDragger: Mouse (second arg) is not of type Mouse!" + return nil + end + + local stampInModel = nil + local allowedStampRegion = nil + local stampFailedFunc = nil + if StampInModel then + if not StampInModel:IsA "Model" then + error "SetupStamperDragger: StampInModel (optional third arg) is not of type 'Model'" + return nil + end + if not AllowedStampRegion then + error "SetupStamperDragger: AllowedStampRegion (optional fourth arg) is nil when StampInModel (optional third arg) is defined" + return nil + end + stampFailedFunc = StampFailedFunc + stampInModel = StampInModel + allowedStampRegion = AllowedStampRegion + end + + -- Init all state variables + local gInitial90DegreeRotations = 0 + local stampData = nil + local mouseTarget = nil + + local errorBox = Instance.new "SelectionBox" + errorBox.Color = BrickColor.new "Bright red" + errorBox.Transparency = 0 + errorBox.Archivable = false + + -- for megacluster MEGA STAMPING + local adornPart = Instance.new "Part" + adornPart.Parent = nil + adornPart.formFactor = "Custom" + adornPart.Size = Vector3.new(4, 4, 4) + adornPart.CFrame = CFrame.new() + adornPart.Archivable = false + + local adorn = Instance.new "SelectionBox" + adorn.Color = BrickColor.new "Toothpaste" + adorn.Adornee = adornPart + adorn.Visible = true + adorn.Transparency = 0 + adorn.Name = "HighScalabilityStamperLine" + adorn.Archivable = false + + local HighScalabilityLine = {} + HighScalabilityLine.Start = nil + HighScalabilityLine.End = nil + HighScalabilityLine.Adorn = adorn + HighScalabilityLine.AdornPart = adornPart + HighScalabilityLine.InternalLine = nil + HighScalabilityLine.NewHint = true + + HighScalabilityLine.MorePoints = { nil, nil } + HighScalabilityLine.MoreLines = { nil, nil } + HighScalabilityLine.Dimensions = 1 + + local control = {} + local movingLock = false + local stampUpLock = false + local unstampableSurface = false + local mouseCons = {} + local keyCon = nil + + local stamped = Instance.new "BoolValue" + stamped.Archivable = false + stamped.Value = false + + local lastTarget = {} + lastTarget.TerrainOrientation = 0 + lastTarget.CFrame = 0 + + local cellInfo = {} + cellInfo.Material = 1 + cellInfo.clusterType = 0 + cellInfo.clusterOrientation = 0 + + local function isMegaClusterPart() + if not stampData then + return false + end + if not stampData.CurrentParts then + return false + end + + return ( + stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + or (stampData.CurrentParts.Name == "MegaClusterCube") + ) + end + + local function DoHighScalabilityRegionSelect() + local megaCube = stampData.CurrentParts:FindFirstChild "MegaClusterCube" + if not megaCube then + if not stampData.CurrentParts.Name == "MegaClusterCube" then + return + else + megaCube = stampData.CurrentParts + end + end + + HighScalabilityLine.End = megaCube.CFrame.p + local line = nil + local line2 = Vector3.new(0, 0, 0) + local line3 = Vector3.new(0, 0, 0) + + if HighScalabilityLine.Dimensions == 1 then + -- extract the line from these positions and limit to a 2D plane made from 2 of the world axes + -- then use dominating axis to limit line to be at 45-degree intervals + -- will use this internal representation of the line for the actual stamping + line = (HighScalabilityLine.End - HighScalabilityLine.Start) + + if math.abs(line.X) < math.abs(line.Y) then + if math.abs(line.X) < math.abs(line.Z) then + -- limit to Y/Z plane, domination unknown + local newY, newZ + if math.abs(line.Y) > math.abs(line.Z) then + newY, newZ = truncateToCircleEighth(line.Y, line.Z) + else + newZ, newY = truncateToCircleEighth(line.Z, line.Y) + end + line = Vector3.new(0, newY, newZ) + else + -- limit to X/Y plane, with Y dominating + local newY, newX = truncateToCircleEighth(line.Y, line.X) + line = Vector3.new(newX, newY, 0) + end + else + if math.abs(line.Y) < math.abs(line.Z) then + -- limit to X/Z plane, domination unknown + local newX, newZ + if math.abs(line.X) > math.abs(line.Z) then + newX, newZ = truncateToCircleEighth(line.X, line.Z) + else + newZ, newX = truncateToCircleEighth(line.Z, line.X) + end + line = Vector3.new(newX, 0, newZ) + else + -- limit to X/Y plane, with X dominating + local newX, newY = truncateToCircleEighth(line.X, line.Y) + line = Vector3.new(newX, newY, 0) + end + end + HighScalabilityLine.InternalLine = line + elseif HighScalabilityLine.Dimensions == 2 then + line = HighScalabilityLine.MoreLines[1] + line2 = HighScalabilityLine.End - HighScalabilityLine.MorePoints[1] + + -- take out any component of line2 along line1, so you get perpendicular to line1 component + line2 = line2 - line.unit * line.unit:Dot(line2) + + tempCFrame = CFrame.new(HighScalabilityLine.Start, HighScalabilityLine.Start + line) + + -- then zero out whichever is the smaller component + local yAxis = tempCFrame:vectorToWorldSpace(Vector3.new(0, 1, 0)) + local xAxis = tempCFrame:vectorToWorldSpace(Vector3.new(1, 0, 0)) + + local xComp = xAxis:Dot(line2) + local yComp = yAxis:Dot(line2) + + if math.abs(yComp) > math.abs(xComp) then + line2 = line2 - xAxis * xComp + else + line2 = line2 - yAxis * yComp + end + + HighScalabilityLine.InternalLine = line2 + elseif HighScalabilityLine.Dimensions == 3 then + line = HighScalabilityLine.MoreLines[1] + line2 = HighScalabilityLine.MoreLines[2] + line3 = HighScalabilityLine.End - HighScalabilityLine.MorePoints[2] + + -- zero out all components of previous lines + line3 = line3 - line.unit * line.unit:Dot(line3) + line3 = line3 - line2.unit * line2.unit:Dot(line3) + + HighScalabilityLine.InternalLine = line3 + end + + -- resize the "line" graphic to be the correct size and orientation + tempCFrame = CFrame.new(HighScalabilityLine.Start, HighScalabilityLine.Start + line) + + if HighScalabilityLine.Dimensions == 1 then -- faster calculation for line + HighScalabilityLine.AdornPart.Size = Vector3.new(4, 4, line.magnitude + 4) + HighScalabilityLine.AdornPart.CFrame = tempCFrame + + tempCFrame:vectorToWorldSpace(Vector3.new(2, 2, 2) - HighScalabilityLine.AdornPart.Size / 2) + else + local boxSize = tempCFrame:vectorToObjectSpace(line + line2 + line3) + HighScalabilityLine.AdornPart.Size = Vector3.new(4, 4, 4) + + Vector3.new(math.abs(boxSize.X), math.abs(boxSize.Y), math.abs(boxSize.Z)) + HighScalabilityLine.AdornPart.CFrame = tempCFrame + tempCFrame:vectorToWorldSpace(boxSize / 2) + end + + -- make player able to see this ish + + local gui = nil + if game.Players["LocalPlayer"] then + gui = game.Players.LocalPlayer:FindFirstChild "PlayerGui" + if gui and gui:IsA "PlayerGui" then + if + (HighScalabilityLine.Dimensions == 1 and line.magnitude > 3) + or HighScalabilityLine.Dimensions > 1 + then -- don't show if mouse hasn't moved enough + HighScalabilityLine.Adorn.Parent = gui + end + end + end + + if gui == nil then -- we are in studio + gui = game:GetService "CoreGui" + if (HighScalabilityLine.Dimensions == 1 and line.magnitude > 3) or HighScalabilityLine.Dimensions > 1 then -- don't show if mouse hasn't moved enough + HighScalabilityLine.Adorn.Parent = gui + end + end + end + + local function DoStamperMouseMove(Mouse) + if not Mouse then + error "Error: RbxStamper.DoStamperMouseMove: Mouse is nil" + return + end + if not Mouse:IsA "Mouse" then + error("Error: RbxStamper.DoStamperMouseMove: Mouse is of type", Mouse.className, "should be of type Mouse") + return + end + + -- There wasn't a target (no part or terrain), so check for plane intersection. + if not Mouse.Target then + local cellPos = GetTerrainForMouse(Mouse) + if nil == cellPos then + return + end + end + + if not stampData then + return + end + + -- don't move with dragger - will move in one step on mouse down + -- draw ghost at acceptable positions + configFound, targetCFrame, targetSurface = findConfigAtMouseTarget(Mouse, stampData) + if not configFound then + error "RbxStamper.DoStamperMouseMove No configFound, returning" + return + end + + local numRotations = 0 -- update this according to how many rotations you need to get it to target surface + if autoAlignToFace(stampData.CurrentParts) and targetSurface ~= 1 and targetSurface ~= 4 then -- pre-rotate the flag or portrait so it's aligned correctly + if targetSurface == 3 then + numRotations = 0 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + elseif targetSurface == 0 then + numRotations = 2 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + elseif targetSurface == 5 then + numRotations = 3 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + elseif targetSurface == 2 then + numRotations = 1 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + end + end + + local ry = math.pi / 2 + gInitial90DegreeRotations = gInitial90DegreeRotations + numRotations + if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + --stampData.CurrentParts:Rotate(0, ry*numRotations, 0) + modelRotate(stampData.CurrentParts, ry * numRotations) + else + stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry * numRotations, 0) + * stampData.CurrentParts.CFrame + end + + -- CODE TO CHECK FOR DRAGGING GHOST PART INTO A COLLIDING STATE + local minBB, maxBB = getBoundingBoxInWorldCoordinates(stampData.CurrentParts) + + -- need to offset by distance to be dragged + local currModelCFrame = nil + if stampData.CurrentParts:IsA "Model" then + currModelCFrame = stampData.CurrentParts:GetModelCFrame() + else + currModelCFrame = stampData.CurrentParts.CFrame + end + + minBB = minBB + targetCFrame.p - currModelCFrame.p + maxBB = maxBB + targetCFrame.p - currModelCFrame.p + + -- don't drag into terrain + if clusterPartsInRegion(minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector) then + if lastTarget.CFrame then + if stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) then + local theClusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + if theClusterMaterial:IsA "Vector3Value" then + local stampClusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + if stampClusterMaterial then + stampClusterMaterial = clusterMat + end + end + end + end + return + end + + -- if we are stamping a terrain part, make sure it goes on the grid! Otherwise preview block could be placed off grid, but stamped on grid + if isMegaClusterPart() then + local cellToStamp = game.Workspace.Terrain:WorldToCell(targetCFrame.p) + local newCFramePosition = + game.Workspace.Terrain:CellCenterToWorld(cellToStamp.X, cellToStamp.Y, cellToStamp.Z) + local _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = targetCFrame:components() + targetCFrame = CFrame.new( + newCFramePosition.X, + newCFramePosition.Y, + newCFramePosition.Z, + R00, + R01, + R02, + R10, + R11, + R12, + R20, + R21, + R22 + ) + end + + positionPartsAtCFrame3(targetCFrame, stampData.CurrentParts) + lastTarget.CFrame = targetCFrame -- successful positioning, so update 'dat cframe + if stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) then + local clusterMat = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + if clusterMat:IsA "Vector3Value" then + lastTarget.TerrainOrientation = clusterMat.Value.Z + end + end + + -- auto break joints code + if Mouse and Mouse.Target and Mouse.Target.Parent then + local modelInfo = Mouse.Target:FindFirstChild "RobloxModel" + if not modelInfo then + modelInfo = Mouse.Target.Parent:FindFirstChild "RobloxModel" + end + + local myModelInfo = stampData.CurrentParts:FindFirstChild "UnstampableFaces" + + --if (modelInfo and modelInfo.Parent:FindFirstChild("UnstampableFaces")) or (modelInfo and myModelInfo) then -- need better targetSurface calcs + if true then + local breakingFaces = "" + local myBreakingFaces = "" + if modelInfo and modelInfo.Parent:FindFirstChild "UnstampableFaces" then + breakingFaces = modelInfo.Parent.UnstampableFaces.Value + end + if myModelInfo then + myBreakingFaces = myModelInfo.Value + end + local hitFace = 0 + + if modelInfo then + hitFace = modelTargetSurface( + modelInfo.Parent, + game.Workspace.CurrentCamera.CoordinateFrame.p, + Mouse.Hit.p + ) + end + + -- are we stamping TO an unstampable surface? + for bf in string.gmatch(breakingFaces, "[^,]+") do + if hitFace == tonumber(bf) then + -- return before we hit the JointsService code below! + unstampableSurface = true + game.JointsService:ClearJoinAfterMoveJoints() -- clear the JointsService cache + return + end + end + + -- now we have to cast the ray back in the other direction to find the surface we're stamping FROM + hitFace = modelTargetSurface( + stampData.CurrentParts, + Mouse.Hit.p, + game.Workspace.CurrentCamera.CoordinateFrame.p + ) + + -- are we stamping WITH an unstampable surface? + for bf in string.gmatch(myBreakingFaces, "[^,]+") do + if hitFace == tonumber(bf) then + unstampableSurface = true + game.JointsService:ClearJoinAfterMoveJoints() -- clear the JointsService cache + return + end + end + + -- just need to match breakingFace against targetSurface using rotation supplied by modelCFrame + -- targetSurface: 1 is top, 4 is bottom, + end + end + + -- to show joints during the mouse move + unstampableSurface = false + game.JointsService:SetJoinAfterMoveInstance(stampData.CurrentParts) + + -- most common mouse inactive error occurs here, so check mouse active one more time in a pcall + if + not pcall(function() + if Mouse and Mouse.Target and Mouse.Target.Parent:FindFirstChild "RobloxModel" == nil then + return + else + return + end + end) + then + error "Error: RbxStamper.DoStamperMouseMove Mouse is nil on second check" + game.JointsService:ClearJoinAfterMoveJoints() + Mouse = nil + return + end + + if Mouse and Mouse.Target and Mouse.Target.Parent:FindFirstChild "RobloxModel" == nil then + game.JointsService:SetJoinAfterMoveTarget(Mouse.Target) + else + game.JointsService:SetJoinAfterMoveTarget(nil) + end + game.JointsService:ShowPermissibleJoints() + + -- here we allow for a line of high-scalability parts + if isMegaClusterPart() and HighScalabilityLine and HighScalabilityLine.Start then + DoHighScalabilityRegionSelect() + end + end + + local function setupKeyListener(key, Mouse) + if control and control["Paused"] then + return + end -- don't do this if we have no stamp + + key = string.lower(key) + if key == "r" and not autoAlignToFace(stampData.CurrentParts) then -- rotate the model + gInitial90DegreeRotations = gInitial90DegreeRotations + 1 + + -- Update orientation value if this is a fake terrain part + local clusterValues = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + if clusterValues and clusterValues:IsA "Vector3Value" then + clusterValues.Value = + Vector3.new(clusterValues.Value.X, clusterValues.Value.Y, (clusterValues.Value.Z + 1) % 4) + end + + -- Rotate the parts or all the parts in the model + local ry = math.pi / 2 + if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + --stampData.CurrentParts:Rotate(0, ry, 0) + modelRotate(stampData.CurrentParts, ry) + else + stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry, 0) * stampData.CurrentParts.CFrame + end + + -- After rotating, update the position + configFound, targetCFrame = findConfigAtMouseTarget(Mouse, stampData) + if configFound then + positionPartsAtCFrame3(targetCFrame, stampData.CurrentParts) + + -- update everything else in MouseMove + DoStamperMouseMove(Mouse) + end + elseif key == "c" then -- try to expand our high scalability dragger dimension + if + HighScalabilityLine.InternalLine + and HighScalabilityLine.InternalLine.magnitude > 0 + and HighScalabilityLine.Dimensions < 3 + then + HighScalabilityLine.MorePoints[HighScalabilityLine.Dimensions] = HighScalabilityLine.End + HighScalabilityLine.MoreLines[HighScalabilityLine.Dimensions] = HighScalabilityLine.InternalLine + HighScalabilityLine.Dimensions = HighScalabilityLine.Dimensions + 1 + HighScalabilityLine.NewHint = true + end + end + end + + keyCon = Mouse.KeyDown:connect(function(key) -- init key connection (keeping code close to func) + setupKeyListener(key, Mouse) + end) + + local function resetHighScalabilityLine() + if HighScalabilityLine then + HighScalabilityLine.Start = nil + HighScalabilityLine.End = nil + HighScalabilityLine.InternalLine = nil + HighScalabilityLine.NewHint = true + end + end + + local function flashRedBox() + local gui = game.CoreGui + if game:FindFirstChild "Players" then + if game.Players["LocalPlayer"] then + if game.Players.LocalPlayer:FindFirstChild "PlayerGui" then + gui = game.Players.LocalPlayer.PlayerGui + end + end + end + if not stampData["ErrorBox"] then + return + end + + stampData.ErrorBox.Parent = gui + if stampData.CurrentParts:IsA "Tool" then + stampData.ErrorBox.Adornee = stampData.CurrentParts.Handle + else + stampData.ErrorBox.Adornee = stampData.CurrentParts + end + + delay(0, function() + for _ = 1, 3 do + if stampData["ErrorBox"] then + stampData.ErrorBox.Visible = true + end + wait(0.13) + if stampData["ErrorBox"] then + stampData.ErrorBox.Visible = false + end + wait(0.13) + end + if stampData["ErrorBox"] then + stampData.ErrorBox.Adornee = nil + stampData.ErrorBox.Parent = Tool + end + end) + end + + local function DoStamperMouseDown(Mouse) + if not Mouse then + error "Error: RbxStamper.DoStamperMouseDown: Mouse is nil" + return + end + if not Mouse:IsA "Mouse" then + error("Error: RbxStamper.DoStamperMouseDown: Mouse is of type", Mouse.className, "should be of type Mouse") + return + end + if not stampData then + return + end + + if isMegaClusterPart() then + if Mouse and HighScalabilityLine then + local megaCube = stampData.CurrentParts:FindFirstChild("MegaClusterCube", true) + local terrain = game.Workspace.Terrain + if megaCube then + HighScalabilityLine.Dimensions = 1 + local tempCell = terrain:WorldToCell(megaCube.CFrame.p) + HighScalabilityLine.Start = terrain:CellCenterToWorld(tempCell.X, tempCell.Y, tempCell.Z) + return + else + HighScalabilityLine.Dimensions = 1 + local tempCell = terrain:WorldToCell(stampData.CurrentParts.CFrame.p) + HighScalabilityLine.Start = terrain:CellCenterToWorld(tempCell.X, tempCell.Y, tempCell.Z) + return + end + end + end + end + + local function loadSurfaceTypes(part, surfaces) + part.TopSurface = surfaces[1] + part.BottomSurface = surfaces[2] + part.LeftSurface = surfaces[3] + part.RightSurface = surfaces[4] + part.FrontSurface = surfaces[5] + part.BackSurface = surfaces[6] + end + + local function saveSurfaceTypes(part, myTable) + local tempTable = {} + tempTable[1] = part.TopSurface + tempTable[2] = part.BottomSurface + tempTable[3] = part.LeftSurface + tempTable[4] = part.RightSurface + tempTable[5] = part.FrontSurface + tempTable[6] = part.BackSurface + + myTable[part] = tempTable + end + + -- local function makeSurfaceUnjoinable(part, surface) + -- -- TODO: FILL OUT! + -- end + + local function prepareModel(model) + if not model then + return nil + end + + local gDesiredTrans = 0.7 + local gStaticTrans = 1 + + local clone = model:Clone() + local scripts = {} + local parts = {} + local decals = {} + + stampData = {} + stampData.DisabledScripts = {} + stampData.TransparencyTable = {} + stampData.MaterialTable = {} + stampData.CanCollideTable = {} + stampData.AnchoredTable = {} + stampData.ArchivableTable = {} + stampData.DecalTransparencyTable = {} + stampData.SurfaceTypeTable = {} + + collectParts(clone, parts, scripts, decals) + + if #parts <= 0 then + return nil, "no parts found in modelToStamp" + end + + for _, script in pairs(scripts) do + if not script.Disabled then + script.Disabled = true + stampData.DisabledScripts[#stampData.DisabledScripts + 1] = script + end + end + for _, part in pairs(parts) do + stampData.TransparencyTable[part] = part.Transparency + part.Transparency = gStaticTrans + (1 - gStaticTrans) * part.Transparency + stampData.MaterialTable[part] = part.Material + part.Material = Enum.Material.Plastic + stampData.CanCollideTable[part] = part.CanCollide + part.CanCollide = false + stampData.AnchoredTable[part] = part.Anchored + part.Anchored = true + stampData.ArchivableTable[part] = part.Archivable + part.Archivable = false + + saveSurfaceTypes(part, stampData.SurfaceTypeTable) + + local fadeInDelayTime = 0.5 + local transFadeInTime = 0.5 + delay(0, function() + wait(fadeInDelayTime) -- give it some time to be completely transparent + + local begTime = tick() + local currTime = begTime + while + (currTime - begTime) < transFadeInTime + and part + and part:IsA "BasePart" + and part.Transparency > gDesiredTrans + do + local newTrans = 1 - (((currTime - begTime) / transFadeInTime) * (gStaticTrans - gDesiredTrans)) + if stampData["TransparencyTable"] and stampData.TransparencyTable[part] then + part.Transparency = newTrans + (1 - newTrans) * stampData.TransparencyTable[part] + end + wait(0.03) + currTime = tick() + end + if part and part:IsA "BasePart" then + if stampData["TransparencyTable"] and stampData.TransparencyTable[part] then + part.Transparency = gDesiredTrans + (1 - gDesiredTrans) * stampData.TransparencyTable[part] + end + end + end) + end + + for _, decal in pairs(decals) do + stampData.DecalTransparencyTable[decal] = decal.Transparency + decal.Transparency = gDesiredTrans + (1 - gDesiredTrans) * decal.Transparency + end + + -- disable all seats + setSeatEnabledStatus(clone, true) + setSeatEnabledStatus(clone, false) + + stampData.CurrentParts = clone + + -- if auto-alignable, we enforce a pre-rotation to the canonical "0-frame" + if autoAlignToFace(clone) then + stampData.CurrentParts:ResetOrientationToIdentity() + gInitial90DegreeRotations = 0 + else -- pre-rotate if necessary + local ry = gInitial90DegreeRotations * math.pi / 2 + if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + --stampData.CurrentParts:Rotate(0, ry, 0) + modelRotate(stampData.CurrentParts, ry) + else + stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry, 0) * stampData.CurrentParts.CFrame + end + end + + -- since we're cloning the old model instead of the new one, we will need to update the orientation based on the original value AND how many more + -- rotations we expect since then [either that or we need to store the just-stamped clusterMaterial.Value.Z somewhere]. This should fix the terrain rotation + -- issue (fingers crossed) [HotThoth] + + local clusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + if clusterMaterial and clusterMaterial:IsA "Vector3Value" then + clusterMaterial.Value = Vector3.new( + clusterMaterial.Value.X, + clusterMaterial.Value.Y, + (clusterMaterial.Value.Z + gInitial90DegreeRotations) % 4 + ) + end + + -- After rotating, update the position + local configFound, targetCFrame = findConfigAtMouseTarget(Mouse, stampData) + if configFound then + stampData.CurrentParts = positionPartsAtCFrame3(targetCFrame, stampData.CurrentParts) + end + + -- to show joints during the mouse move + game.JointsService:SetJoinAfterMoveInstance(stampData.CurrentParts) + + return clone, parts + end + + local function checkTerrainBlockCollisions(cellPos, checkHighScalabilityStamp) + local cellCenterToWorld = game.Workspace.Terrain.CellCenterToWorld + local cellCenter = cellCenterToWorld(game.Workspace.Terrain, cellPos.X, cellPos.Y, cellPos.Z) + local cellBlockingParts = game.Workspace:FindPartsInRegion3( + Region3.new( + cellCenter - Vector3.new(2, 2, 2) + insertBoundingBoxOverlapVector, + cellCenter + Vector3.new(2, 2, 2) - insertBoundingBoxOverlapVector + ), + stampData.CurrentParts, + 100 + ) + + local skipThisCell = false + + for b = 1, #cellBlockingParts do + if isBlocker(cellBlockingParts[b]) then + skipThisCell = true + break + end + end + + if not skipThisCell then + -- pop players up above any set cells + local alreadyPushedUp = {} + -- if no blocking model below, then see if stamping on top of a character + for b = 1, #cellBlockingParts do + if + cellBlockingParts[b].Parent + and not alreadyPushedUp[cellBlockingParts[b].Parent] + and cellBlockingParts[b].Parent:FindFirstChild "Humanoid" + and cellBlockingParts[b].Parent:FindFirstChild("Humanoid"):IsA "Humanoid" + then + ----------------------------------------------------------------------------------- + local blockingPersonTorso = cellBlockingParts[b].Parent:FindFirstChild "Torso" + alreadyPushedUp[cellBlockingParts[b].Parent] = true + + if blockingPersonTorso then + -- if so, let's push the person upwards so they pop on top of the stamped model/part (but only if there's space above them) + local newY = cellCenter.Y + 5 + if spaceAboveCharacter(blockingPersonTorso, newY, stampData) then + blockingPersonTorso.CFrame = blockingPersonTorso.CFrame + + Vector3.new(0, newY - blockingPersonTorso.CFrame.p.Y, 0) + else + -- if no space, we just skip this one + skipThisCell = true + break + end + end + ----------------------------------------------------------------------------------- + end + end + end + + if not skipThisCell then -- if we STILL aren't skipping... then we're good to go! + local canSetCell = true + + if checkHighScalabilityStamp then -- check to see if cell is in region, if not we'll skip set + if allowedStampRegion then + local cellPos = cellCenterToWorld(game.Workspace.Terrain, cellPos.X, cellPos.Y, cellPos.Z) + if + (cellPos.X + 2 > allowedStampRegion.CFrame.p.X + allowedStampRegion.Size.X / 2) + or (cellPos.X - 2 < allowedStampRegion.CFrame.p.X - allowedStampRegion.Size.X / 2) + or (cellPos.Y + 2 > allowedStampRegion.CFrame.p.Y + allowedStampRegion.Size.Y / 2) + or (cellPos.Y - 2 < allowedStampRegion.CFrame.p.Y - allowedStampRegion.Size.Y / 2) + or (cellPos.Z + 2 > allowedStampRegion.CFrame.p.Z + allowedStampRegion.Size.Z / 2) + or (cellPos.Z - 2 < allowedStampRegion.CFrame.p.Z - allowedStampRegion.Size.Z / 2) + then + canSetCell = false + end + end + end + + return canSetCell + end + return false + end + + local function ResolveMegaClusterStamp(checkHighScalabilityStamp) + local cellSet = false + + local cluster = game.Workspace.Terrain + + local line = HighScalabilityLine.InternalLine + local cMax = game.Workspace.Terrain.MaxExtents.Max + local cMin = game.Workspace.Terrain.MaxExtents.Min + + local clusterMaterial = 1 -- default is grass + local clusterType = 0 -- default is brick + local clusterOrientation = 0 -- default is 0 rotation + + local autoWedgeClusterParts = false + if stampData.CurrentParts:FindFirstChild "AutoWedge" then + autoWedgeClusterParts = true + end + + if stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) then + clusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + if clusterMaterial:IsA "Vector3Value" then + clusterType = clusterMaterial.Value.Y + clusterOrientation = clusterMaterial.Value.Z + clusterMaterial = clusterMaterial.Value.X + elseif clusterMaterial:IsA "IntValue" then + clusterMaterial = clusterMaterial.Value + end + end + + if + HighScalabilityLine.Adorn.Parent + and HighScalabilityLine.Start + and ((HighScalabilityLine.Dimensions > 1) or (line and line.magnitude > 0)) + then + local startCell = game.Workspace.Terrain:WorldToCell(HighScalabilityLine.Start) + local xInc = { 0, 0, 0 } + local yInc = { 0, 0, 0 } + local zInc = { 0, 0, 0 } + + local incrementVect = { nil, nil, nil } + local stepVect = { Vector3.new(0, 0, 0), Vector3.new(0, 0, 0), Vector3.new(0, 0, 0) } + + local worldAxes = { Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1) } + + local lines = {} + if HighScalabilityLine.Dimensions > 1 then + table.insert(lines, HighScalabilityLine.MoreLines[1]) + end + if line and line.magnitude > 0 then + table.insert(lines, line) + end + if HighScalabilityLine.Dimensions > 2 then + table.insert(lines, HighScalabilityLine.MoreLines[2]) + end + + for i = 1, #lines do + lines[i] = Vector3.new( + math.floor(lines[i].X + 0.5), + math.floor(lines[i].Y + 0.5), + math.floor(lines[i].Z + 0.5) + ) -- round to integers + + if lines[i].X > 0 then + xInc[i] = 1 + elseif lines[i].X < 0 then + xInc[i] = -1 + end + if lines[i].Y > 0 then + yInc[i] = 1 + elseif lines[i].Y < 0 then + yInc[i] = -1 + end + if lines[i].Z > 0 then + zInc[i] = 1 + elseif lines[i].Z < 0 then + zInc[i] = -1 + end + + incrementVect[i] = Vector3.new(xInc[i], yInc[i], zInc[i]) + if incrementVect[i].magnitude < 0.9 then + incrementVect[i] = nil + end + end + + if not lines[2] then + lines[2] = Vector3.new(0, 0, 0) + end + if not lines[3] then + lines[3] = Vector3.new(0, 0, 0) + end + + local waterForceTag = stampData.CurrentParts:FindFirstChild("WaterForceTag", true) + local waterForceDirectionTag = stampData.CurrentParts:FindFirstChild("WaterForceDirectionTag", true) + + while stepVect[3].magnitude * 4 <= lines[3].magnitude do + local outerStepVectIndex = 1 + while outerStepVectIndex < 4 do + stepVect[2] = Vector3.new(0, 0, 0) + while stepVect[2].magnitude * 4 <= lines[2].magnitude do + local innerStepVectIndex = 1 + while innerStepVectIndex < 4 do + stepVect[1] = Vector3.new(0, 0, 0) + while stepVect[1].magnitude * 4 <= lines[1].magnitude do + local stepVectSum = stepVect[1] + stepVect[2] + stepVect[3] + local cellPos = Vector3int16.new( + startCell.X + stepVectSum.X, + startCell.Y + stepVectSum.Y, + startCell.Z + stepVectSum.Z + ) + if + cellPos.X >= cMin.X + and cellPos.Y >= cMin.Y + and cellPos.Z >= cMin.Z + and cellPos.X < cMax.X + and cellPos.Y < cMax.Y + and cellPos.Z < cMax.Z + then + -- check if overlaps player or part + local okToStampTerrainBlock = + checkTerrainBlockCollisions(cellPos, checkHighScalabilityStamp) + + if okToStampTerrainBlock then + if waterForceTag then + cluster:SetWaterCell( + cellPos.X, + cellPos.Y, + cellPos.Z, + Enum.WaterForce[waterForceTag.Value], + Enum.WaterDirection[waterForceDirectionTag.Value] + ) + else + cluster:SetCell( + cellPos.X, + cellPos.Y, + cellPos.Z, + clusterMaterial, + clusterType, + clusterOrientation + ) + end + cellSet = true + + -- auto-wedge it? + if autoWedgeClusterParts then + game.Workspace.Terrain:AutowedgeCells( + Region3int16.new( + Vector3int16.new(cellPos.x - 1, cellPos.y - 1, cellPos.z - 1), + Vector3int16.new(cellPos.x + 1, cellPos.y + 1, cellPos.z + 1) + ) + ) + end + end + end + stepVect[1] = stepVect[1] + incrementVect[1] + end + if incrementVect[2] then + while + innerStepVectIndex < 4 + and worldAxes[innerStepVectIndex]:Dot(incrementVect[2]) == 0 + do + innerStepVectIndex = innerStepVectIndex + 1 + end + if innerStepVectIndex < 4 then + stepVect[2] = stepVect[2] + + worldAxes[innerStepVectIndex] + * worldAxes[innerStepVectIndex]:Dot(incrementVect[2]) + end + innerStepVectIndex = innerStepVectIndex + 1 + else + stepVect[2] = Vector3.new(1, 0, 0) + innerStepVectIndex = 4 -- skip all remaining loops + end + if stepVect[2].magnitude * 4 > lines[2].magnitude then + innerStepVectIndex = 4 + end + end + end + if incrementVect[3] then + while outerStepVectIndex < 4 and worldAxes[outerStepVectIndex]:Dot(incrementVect[3]) == 0 do + outerStepVectIndex = outerStepVectIndex + 1 + end + if outerStepVectIndex < 4 then + stepVect[3] = stepVect[3] + + worldAxes[outerStepVectIndex] + * worldAxes[outerStepVectIndex]:Dot(incrementVect[3]) + end + outerStepVectIndex = outerStepVectIndex + 1 + else -- skip all remaining loops + stepVect[3] = Vector3.new(1, 0, 0) + outerStepVectIndex = 4 + end + if stepVect[3].magnitude * 4 > lines[3].magnitude then + outerStepVectIndex = 4 + end + end + end + end + + -- and also get rid of any HighScalabilityLine stuff if it's there + HighScalabilityLine.Start = nil + HighScalabilityLine.Adorn.Parent = nil + + -- Mark for undo. + if cellSet then + stampData.CurrentParts.Parent = nil + pcall(function() + game:GetService("ChangeHistoryService"):SetWaypoint "StamperMulti" + end) + end + + return cellSet + end + + local function DoStamperMouseUp(Mouse) + if not Mouse then + error "Error: RbxStamper.DoStamperMouseUp: Mouse is nil" + return false + end + if not Mouse:IsA "Mouse" then + error("Error: RbxStamper.DoStamperMouseUp: Mouse is of type", Mouse.className, "should be of type Mouse") + return false + end + + if not stampData.Dragger then + error "Error: RbxStamper.DoStamperMouseUp: stampData.Dragger is nil" + return false + end + + if not HighScalabilityLine then + return false + end + + local checkHighScalabilityStamp = nil + if stampInModel then + local canStamp = nil + local isHSLPart = isMegaClusterPart() + + if + isHSLPart + and HighScalabilityLine + and HighScalabilityLine.Start + and HighScalabilityLine.InternalLine + and HighScalabilityLine.InternalLine.magnitude > 0 + then -- we have an HSL line, test later + canStamp = true + checkHighScalabilityStamp = true + else + canStamp, checkHighScalabilityStamp = t.CanEditRegion(stampData.CurrentParts, allowedStampRegion) + end + + if not canStamp then + if stampFailedFunc then + stampFailedFunc() + end + return false + end + end + + -- if unstampable face, then don't let us stamp there! + if unstampableSurface then + flashRedBox() + return false + end + + -- recheck if we can stamp, as we just moved part + canStamp, checkHighScalabilityStamp = t.CanEditRegion(stampData.CurrentParts, allowedStampRegion) + if not canStamp then + if stampFailedFunc then + stampFailedFunc() + end + return false + end + + -- Prevent part from being stamped on top of a player + + local minBB, maxBB = getBoundingBoxInWorldCoordinates(stampData.CurrentParts) + + -- HotThoth's note: Now that above CurrentParts positioning has been commented out, to be truly correct, we would need to use the + -- value of configFound from the previous onStamperMouseMove call which moved the CurrentParts + -- Shouldn't this be true when lastTargetCFrame has been set and false otherwise? + configFound, targetCFrame = findConfigAtMouseTarget(Mouse, stampData) + + if configFound and not HighScalabilityLine.Adorn.Parent then + if clusterPartsInRegion(minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector) then + flashRedBox() + return false + end + + local blockingParts = game.Workspace:FindPartsInRegion3( + Region3.new(minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector), + stampData.CurrentParts, + 100 + ) + + for b = 1, #blockingParts do + if isBlocker(blockingParts[b]) then + flashRedBox() + return false + end + end + + local alreadyPushedUp = {} + -- if no blocking model below, then see if stamping on top of a character + for b = 1, #blockingParts do + if + blockingParts[b].Parent + and not alreadyPushedUp[blockingParts[b].Parent] + and blockingParts[b].Parent:FindFirstChild "Humanoid" + and blockingParts[b].Parent:FindFirstChild("Humanoid"):IsA "Humanoid" + then + --------------------------------------------------------------------------- + local blockingPersonTorso = blockingParts[b].Parent:FindFirstChild "Torso" + alreadyPushedUp[blockingParts[b].Parent] = true + + if blockingPersonTorso then + -- if so, let's push the person upwards so they pop on top of the stamped model/part (but only if there's space above them) + local newY = maxBB.Y + 3 + if spaceAboveCharacter(blockingPersonTorso, newY, stampData) then + blockingPersonTorso.CFrame = blockingPersonTorso.CFrame + + Vector3.new(0, newY - blockingPersonTorso.CFrame.p.Y, 0) + else + -- if no space, we just error + flashRedBox() + return false + end + end + --------------------------------------------------------------------------- + end + end + elseif (not configFound) and not (HighScalabilityLine.Start and HighScalabilityLine.Adorn.Parent) then -- if no config then only stamp if it's a real HSL! + resetHighScalabilityLine() + return false + end + + -- something will be stamped! so set the "StampedSomething" toggle to true + if game:FindFirstChild "Players" then + if game.Players["LocalPlayer"] then + if game.Players.LocalPlayer["Character"] then + local localChar = game.Players.LocalPlayer.Character + local stampTracker = localChar:FindFirstChild "StampTracker" + if stampTracker and not stampTracker.Value then + stampTracker.Value = true + end + end + end + end + + -- if we drew a line of mega parts, stamp them out + if HighScalabilityLine.Start and HighScalabilityLine.Adorn.Parent and isMegaClusterPart() then + if ResolveMegaClusterStamp(checkHighScalabilityStamp) or checkHighScalabilityStamp then + -- kill the ghost part + stampData.CurrentParts.Parent = nil + return true + end + end + + -- not High-Scalability-Line-Based, so behave normally [and get rid of any HSL stuff] + HighScalabilityLine.Start = nil + HighScalabilityLine.Adorn.Parent = nil + + local cluster = game.Workspace.Terrain + + -- if target point is in cluster, just use cluster:SetCell + if isMegaClusterPart() then + -- if targetCFrame is inside cluster, just set that cell to 1 and return + --local cellPos = cluster:WorldToCell(targetCFrame.p) + + local cellPos + if stampData.CurrentParts:IsA "Model" then + cellPos = cluster:WorldToCell(stampData.CurrentParts:GetModelCFrame().p) + else + cellPos = cluster:WorldToCell(stampData.CurrentParts.CFrame.p) + end + + local cMax = game.Workspace.Terrain.MaxExtents.Max + local cMin = game.Workspace.Terrain.MaxExtents.Min + + if checkTerrainBlockCollisions(cellPos, false) then + local clusterValues = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + local waterForceTag = stampData.CurrentParts:FindFirstChild("WaterForceTag", true) + local waterForceDirectionTag = stampData.CurrentParts:FindFirstChild("WaterForceDirectionTag", true) + + if + cellPos.X >= cMin.X + and cellPos.Y >= cMin.Y + and cellPos.Z >= cMin.Z + and cellPos.X < cMax.X + and cellPos.Y < cMax.Y + and cellPos.Z < cMax.Z + then + if waterForceTag then + cluster:SetWaterCell( + cellPos.X, + cellPos.Y, + cellPos.Z, + Enum.WaterForce[waterForceTag.Value], + Enum.WaterDirection[waterForceDirectionTag.Value] + ) + elseif not clusterValues then + cluster:SetCell( + cellPos.X, + cellPos.Y, + cellPos.Z, + cellInfo.Material, + cellInfo.clusterType, + gInitial90DegreeRotations % 4 + ) + elseif clusterValues:IsA "Vector3Value" then + cluster:SetCell( + cellPos.X, + cellPos.Y, + cellPos.Z, + clusterValues.Value.X, + clusterValues.Value.Y, + clusterValues.Value.Z + ) + else + cluster:SetCell(cellPos.X, cellPos.Y, cellPos.Z, clusterValues.Value, 0, 0) + end + + local autoWedgeClusterParts = false + if stampData.CurrentParts:FindFirstChild "AutoWedge" then + autoWedgeClusterParts = true + end + + -- auto-wedge it + if autoWedgeClusterParts then + game.Workspace.Terrain:AutowedgeCells( + Region3int16.new( + Vector3int16.new(cellPos.x - 1, cellPos.y - 1, cellPos.z - 1), + Vector3int16.new(cellPos.x + 1, cellPos.y + 1, cellPos.z + 1) + ) + ) + end + + -- kill the ghost part + stampData.CurrentParts.Parent = nil + + -- Mark for undo. It has to happen here or the selection display will come back also. + pcall(function() + game:GetService("ChangeHistoryService"):SetWaypoint "StamperSingle" + end) + return true + end + else + -- you tried to stamp a HSL-single part where one does not belong! + flashRedBox() + return false + end + end + + local function getPlayer() + if game:FindFirstChild "Players" then + if game.Players["LocalPlayer"] then + return game.Players.LocalPlayer + end + end + return nil + end + + -- Post process: after positioning the part or model, restore transparency, material, anchored and collide states and create joints + if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + if stampData.CurrentParts:IsA "Model" then + -- Tyler's magical hack-code for allowing/preserving clones of both Surface and Manual Welds... just don't ask X< + local manualWeldTable = {} + local manualWeldParentTable = {} + saveTheWelds(stampData.CurrentParts, manualWeldTable, manualWeldParentTable) + stampData.CurrentParts:BreakJoints() + stampData.CurrentParts:MakeJoints() + restoreTheWelds(manualWeldTable, manualWeldParentTable) + end + + -- if it's a model, we also want to fill in the playerID and playerName tags, if it has those (e.g. for the friend-only door) + playerIdTag = stampData.CurrentParts:FindFirstChild "PlayerIdTag" + playerNameTag = stampData.CurrentParts:FindFirstChild "PlayerNameTag" + if playerIdTag ~= nil then + tempPlayerValue = getPlayer() + if tempPlayerValue ~= nil then + playerIdTag.Value = tempPlayerValue.userId + end + end + if playerNameTag ~= nil then + if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + tempPlayerValue = game.Players.LocalPlayer + if tempPlayerValue ~= nil then + playerNameTag.Value = tempPlayerValue.Name + end + end + end + -- ...and tag all inserted models for subsequent origin identification + -- if no RobloxModel tag already exists, then add it. + if stampData.CurrentParts:FindFirstChild "RobloxModel" == nil then + local stringTag = Instance.new "BoolValue" + stringTag.Name = "RobloxModel" + stringTag.Parent = stampData.CurrentParts + + if stampData.CurrentParts:FindFirstChild "RobloxStamper" == nil then + local stringTag2 = Instance.new "BoolValue" + stringTag2.Name = "RobloxStamper" + stringTag2.Parent = stampData.CurrentParts + end + end + else + stampData.CurrentParts:BreakJoints() + if stampData.CurrentParts:FindFirstChild "RobloxStamper" == nil then + local stringTag2 = Instance.new "BoolValue" + stringTag2.Name = "RobloxStamper" + stringTag2.Parent = stampData.CurrentParts + end + end + + -- make sure all the joints are activated before restoring anchor states + if not createJoints then + game.JointsService:CreateJoinAfterMoveJoints() + end + + -- Restore the original properties for all parts being stamped + for part, transparency in pairs(stampData.TransparencyTable) do + part.Transparency = transparency + end + for part, archivable in pairs(stampData.ArchivableTable) do + part.Archivable = archivable + end + for part, material in pairs(stampData.MaterialTable) do + part.Material = material + end + for part, collide in pairs(stampData.CanCollideTable) do + part.CanCollide = collide + end + for part, anchored in pairs(stampData.AnchoredTable) do + part.Anchored = anchored + end + for decal, transparency in pairs(stampData.DecalTransparencyTable) do + decal.Transparency = transparency + end + + for part, surfaces in pairs(stampData.SurfaceTypeTable) do + loadSurfaceTypes(part, surfaces) + end + + if isMegaClusterPart() then + stampData.CurrentParts.Transparency = 0 + end + + -- re-enable all seats + setSeatEnabledStatus(stampData.CurrentParts, true) + + stampData.TransparencyTable = nil + stampData.ArchivableTable = nil + stampData.MaterialTable = nil + stampData.CanCollideTable = nil + stampData.AnchoredTable = nil + stampData.SurfaceTypeTable = nil + + -- ...and tag all inserted models for subsequent origin identification + -- if no RobloxModel tag already exists, then add it. + if stampData.CurrentParts:FindFirstChild "RobloxModel" == nil then + local stringTag = Instance.new "BoolValue" + stringTag.Name = "RobloxModel" + stringTag.Parent = stampData.CurrentParts + end + + -- and make sure we don't delete it, now that it's not a ghost part + if ghostRemovalScript then + ghostRemovalScript.Parent = nil + end + + --Re-enable the scripts + for _, script in pairs(stampData.DisabledScripts) do + script.Disabled = false + end + + --Now that they are all marked enabled, reinsert them into the world so they start running + for _, script in pairs(stampData.DisabledScripts) do + local oldParent = script.Parent + script.Parent = nil + script:Clone().Parent = oldParent + end + + -- clear out more data + stampData.DisabledScripts = nil + stampData.Dragger = nil + stampData.CurrentParts = nil + + pcall(function() + game:GetService("ChangeHistoryService"):SetWaypoint "StampedObject" + end) + return true + end + + local function pauseStamper() + for i = 1, #mouseCons do -- stop the mouse from doing anything + mouseCons[i]:disconnect() + mouseCons[i] = nil + end + mouseCons = {} + + if stampData and stampData.CurrentParts then -- remove our ghost part + stampData.CurrentParts.Parent = nil + stampData.CurrentParts:Remove() + end + + resetHighScalabilityLine() + + game.JointsService:ClearJoinAfterMoveJoints() + end + + local function prepareUnjoinableSurfaces(modelCFrame, parts, whichSurface) + local AXIS_VECTORS = { Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1) } -- maybe last one is negative? TODO: check this! + local isPositive = 1 + if whichSurface < 0 then + isPositive = isPositive * -1 + whichSurface = whichSurface * -1 + end + local surfaceNormal = isPositive * modelCFrame:vectorToWorldSpace(AXIS_VECTORS[whichSurface]) + + for i = 1, #parts do + local currPart = parts[i] + + -- now just need to find which surface of currPart most closely match surfaceNormal and then set that to Unjoinable + local surfaceNormalInLocalCoords = currPart.CFrame:vectorToObjectSpace(surfaceNormal) + if math.abs(surfaceNormalInLocalCoords.X) > math.abs(surfaceNormalInLocalCoords.Y) then + if math.abs(surfaceNormalInLocalCoords.X) > math.abs(surfaceNormalInLocalCoords.Z) then + if surfaceNormalInLocalCoords.X > 0 then + currPart.RightSurface = "Unjoinable" + else + currPart.LeftSurface = "Unjoinable" + end + else + if surfaceNormalInLocalCoords.Z > 0 then + currPart.BackSurface = "Unjoinable" + else + currPart.FrontSurface = "Unjoinable" + end + end + else + if math.abs(surfaceNormalInLocalCoords.Y) > math.abs(surfaceNormalInLocalCoords.Z) then + if surfaceNormalInLocalCoords.Y > 0 then + currPart.TopSurface = "Unjoinable" + else + currPart.BottomSurface = "Unjoinable" + end + else + if surfaceNormalInLocalCoords.Z > 0 then + currPart.BackSurface = "Unjoinable" + else + currPart.FrontSurface = "Unjoinable" + end + end + end + end + end + + local function resumeStamper() + clone, parts = prepareModel(modelToStamp) + + if not clone or not parts then + return + end + + -- if we have unjoinable faces, then we want to change those surfaces to be Unjoinable + local unjoinableTag = clone:FindFirstChild("UnjoinableFaces", true) + if unjoinableTag then + for unjoinableSurface in string.gmatch(unjoinableTag.Value, "[^,]*") do + if tonumber(unjoinableSurface) then + if clone:IsA "Model" then + prepareUnjoinableSurfaces(clone:GetModelCFrame(), parts, tonumber(unjoinableSurface)) + else + prepareUnjoinableSurfaces(clone.CFrame, parts, tonumber(unjoinableSurface)) + end + end + end + end + + stampData.ErrorBox = errorBox + if stampInModel then + clone.Parent = stampInModel + else + clone.Parent = game.Workspace + end + + if clone:FindFirstChild("ClusterMaterial", true) then -- extract all info from vector + clusterMaterial = clone:FindFirstChild("ClusterMaterial", true) + if clusterMaterial:IsA "Vector3Value" then + cellInfo.Material = clusterMaterial.Value.X + cellInfo.clusterType = clusterMaterial.Value.Y + cellInfo.clusterOrientation = clusterMaterial.Value.Z + elseif clusterMaterial:IsA "IntValue" then + cellInfo.Material = clusterMaterial.Value + end + end + + pcall(function() + mouseTarget = Mouse.Target + end) + + if mouseTarget and mouseTarget.Parent:FindFirstChild "RobloxModel" == nil then + game.JointsService:SetJoinAfterMoveTarget(mouseTarget) + else + game.JointsService:SetJoinAfterMoveTarget(nil) + end + game.JointsService:ShowPermissibleJoints() + + for _, object in pairs(stampData.DisabledScripts) do + if object.Name == "GhostRemovalScript" then + object.Parent = stampData.CurrentParts + end + end + + stampData.Dragger = Instance.new "Dragger" + + --Begin a movement by faking a MouseDown signal + stampData.Dragger:MouseDown(parts[1], Vector3.new(0, 0, 0), parts) + stampData.Dragger:MouseUp() + + DoStamperMouseMove(Mouse) + + table.insert( + mouseCons, + Mouse.Move:connect(function() + if movingLock or stampUpLock then + return + end + movingLock = true + DoStamperMouseMove(Mouse) + movingLock = false + end) + ) + + table.insert( + mouseCons, + Mouse.Button1Down:connect(function() + DoStamperMouseDown(Mouse) + end) + ) + + table.insert( + mouseCons, + Mouse.Button1Up:connect(function() + stampUpLock = true + while movingLock do + wait() + end + stamped.Value = DoStamperMouseUp(Mouse) + resetHighScalabilityLine() + stampUpLock = false + end) + ) + + stamped.Value = false + end + + local function resetStamperState(newModelToStamp) + -- if we have a new model, swap it out + if newModelToStamp then + if not newModelToStamp:IsA "Model" and not newModelToStamp:IsA "BasePart" then + error "resetStamperState: newModelToStamp (first arg) is not nil, but not a model or part!" + end + modelToStamp = newModelToStamp + end + + -- first clear our state + pauseStamper() + -- now lets load in the new model + resumeStamper() + end + + -- load the model initially + resetStamperState() + + -- setup the control table we pass back to the user + control.Stamped = stamped -- BoolValue that fires when user stamps + control.Paused = false + + control.LoadNewModel = + function(newStampModel) -- allows us to specify a new stamper model to be used with this stamper + if newStampModel and not newStampModel:IsA "Model" and not newStampModel:IsA "BasePart" then + error "Control.LoadNewModel: newStampModel (first arg) is not a Model or Part!" + return nil + end + resetStamperState(newStampModel) + end + + control.ReloadModel = + function() -- will automatically set stamper to get a new model of current model and start stamping with new model + resetStamperState() + end + + control.Pause = function() -- temporarily stops stamping, use resume to start up again + if not control.Paused then + pauseStamper() + control.Paused = true + else + print "RbxStamper Warning: Tried to call Control.Pause() when already paused" + end + end + + control.Resume = function() -- resumes stamping, if currently paused + if control.Paused then + resumeStamper() + control.Paused = false + else + print "RbxStamper Warning: Tried to call Control.Resume() without Pausing First" + end + end + + control.ResetRotation = function() -- resets the model rotation so new models are at default orientation + -- gInitial90DegreeRotations = 0 + -- Note: This function will not always work quite the way we want it to; we will have to build this out further so it works with + -- High-Scalability and with the new model orientation setting methods (model:ResetOrientationToIdentity()) [HotThoth] + end + + control.Destroy = function() -- Stops current Stamp operation and destroys control construct + for i = 1, #mouseCons do + mouseCons[i]:disconnect() + mouseCons[i] = nil + end + + if keyCon then + keyCon:disconnect() + end + + game.JointsService:ClearJoinAfterMoveJoints() + + if adorn then + adorn:Destroy() + end + if adornPart then + adornPart:Destroy() + end + if errorBox then + errorBox:Destroy() + end + if stampData then + if stampData["Dragger"] then + stampData.Dragger:Destroy() + end + if stampData.CurrentParts then + stampData.CurrentParts:Destroy() + end + end + if control and control["Stamped"] then + control.Stamped:Destroy() + end + control = nil + end + + return control +end + +t.Help = function(funcNameOrFunc) + --input argument can be a string or a function. Should return a description (of arguments and expected side effects) + if funcNameOrFunc == "GetStampModel" or funcNameOrFunc == t.GetStampModel then + return "Function GetStampModel. Arguments: assetId, useAssetVersionId. assetId is the asset to load in, define useAssetVersionId as true if assetId is a version id instead of a relative assetId. Side effect: returns a model of the assetId, or a string with error message if something fails" + end + if funcNameOrFunc == "SetupStamperDragger" or funcNameOrFunc == t.SetupStamperDragger then + return "Function SetupStamperDragger. Side Effect: Creates 4x4 stamping mechanism for building out parts quickly. Arguments: ModelToStamp, Mouse, LegalStampCheckFunction. ModelToStamp should be a Model or Part, preferrably loaded from RbxStamper.GetStampModel and should have extents that are multiples of 4. Mouse should be a mouse object (obtained from things such as Tool.OnEquipped), used to drag parts around 'stamp' them out. LegalStampCheckFunction is optional, used as a callback with a table argument (table is full of instances about to be stamped). Function should return either true or false, false stopping the stamp action." + end +end + +return t diff --git a/lua/89449008.lua b/lua/89449008.lua new file mode 100644 index 0000000..fc35871 --- /dev/null +++ b/lua/89449008.lua @@ -0,0 +1,952 @@ +-- A couple of necessary functions +local function waitForChild(instance, name) + assert(instance) + assert(name) + while not instance:FindFirstChild(name) do + print("Waiting for ...", instance, name) + instance.ChildAdded:wait() + end + return instance:FindFirstChild(name) +end +local function waitForProperty(instance, property) + assert(instance) + assert(property) + while not instance[property] do + instance.Changed:wait() + end +end + +local function IsTouchDevice() + local touchEnabled = false + pcall(function() + touchEnabled = Game:GetService("UserInputService").TouchEnabled + end) + return touchEnabled +end + +waitForChild(game, "Players") +waitForProperty(game.Players, "LocalPlayer") +local player = game.Players.LocalPlayer + +local RbxGui, _ = LoadLibrary "RbxGui" +if not RbxGui then + print "could not find RbxGui!" + return +end + +--- Begin Locals +local StaticTabName = "gear" + +local backpack = script.Parent + +local backpackItems = {} +local buttons = {} + +local debounce = false +local browsingMenu = false + +local mouseEnterCons = {} +local mouseClickCons = {} + +local characterChildAddedCon = nil +local characterChildRemovedCon = nil +local backpackAddCon = nil + +local playerBackpack = waitForChild(player, "Backpack") + +waitForChild(backpack, "Tabs") + +waitForChild(backpack, "Gear") +local gearPreview = waitForChild(backpack.Gear, "GearPreview") + +local scroller = waitForChild(backpack.Gear, "GearGridScrollingArea") + +local currentLoadout = waitForChild(backpack.Parent, "CurrentLoadout") + +local grid = waitForChild(backpack.Gear, "GearGrid") +local gearButton = waitForChild(grid, "GearButton") + +local swapSlot = waitForChild(script.Parent, "SwapSlot") + +local backpackManager = waitForChild(script.Parent, "CoreScripts/BackpackScripts/BackpackManager") +local backpackOpenEvent = waitForChild(backpackManager, "BackpackOpenEvent") +local backpackCloseEvent = waitForChild(backpackManager, "BackpackCloseEvent") +local tabClickedEvent = waitForChild(backpackManager, "TabClickedEvent") +local resizeEvent = waitForChild(backpackManager, "ResizeEvent") +local searchRequestedEvent = waitForChild(backpackManager, "SearchRequestedEvent") +local tellBackpackReadyFunc = waitForChild(backpackManager, "BackpackReady") + +-- creating scroll bar early as to make sure items get placed correctly +local scrollFrame, scrollUp, scrollDown, recalculateScroll = RbxGui.CreateScrollingFrame(nil, "grid", Vector2.new(6, 6)) + +scrollFrame.Position = UDim2.new(0, 0, 0, 30) +scrollFrame.Size = UDim2.new(1, 0, 1, -30) +scrollFrame.Parent = backpack.Gear.GearGrid + +local scrollBar = Instance.new "Frame" +scrollBar.Name = "ScrollBar" +scrollBar.BackgroundTransparency = 0.9 +scrollBar.BackgroundColor3 = Color3.new(1, 1, 1) +scrollBar.BorderSizePixel = 0 +scrollBar.Size = UDim2.new(0, 17, 1, -36) +scrollBar.Position = UDim2.new(0, 0, 0, 18) +scrollBar.Parent = scroller + +scrollDown.Position = UDim2.new(0, 0, 1, -17) + +scrollUp.Parent = scroller +scrollDown.Parent = scroller + +local scrollFrameLoadout, scrollUpLoadout, scrollDownLoadout, recalculateScrollLoadout = RbxGui.CreateScrollingFrame() + +scrollFrameLoadout.Position = UDim2.new(0, 0, 0, 0) +scrollFrameLoadout.Size = UDim2.new(1, 0, 1, 0) +scrollFrameLoadout.Parent = backpack.Gear.GearLoadouts.LoadoutsList + +local LoadoutButton = Instance.new "TextButton" +LoadoutButton.RobloxLocked = true +LoadoutButton.Name = "LoadoutButton" +LoadoutButton.Font = Enum.Font.ArialBold +LoadoutButton.FontSize = Enum.FontSize.Size14 +LoadoutButton.Position = UDim2.new(0, 0, 0, 0) +LoadoutButton.Size = UDim2.new(1, 0, 0, 32) +LoadoutButton.Style = Enum.ButtonStyle.RobloxButton +LoadoutButton.Text = "Loadout #1" +LoadoutButton.TextColor3 = Color3.new(1, 1, 1) +LoadoutButton.Parent = scrollFrameLoadout + +local LoadoutButtonTwo = LoadoutButton:clone() +LoadoutButtonTwo.Text = "Loadout #2" +LoadoutButtonTwo.Parent = scrollFrameLoadout + +local LoadoutButtonThree = LoadoutButton:clone() +LoadoutButtonThree.Text = "Loadout #3" +LoadoutButtonThree.Parent = scrollFrameLoadout + +local LoadoutButtonFour = LoadoutButton:clone() +LoadoutButtonFour.Text = "Loadout #4" +LoadoutButtonFour.Parent = scrollFrameLoadout + +local scrollBarLoadout = Instance.new "Frame" +scrollBarLoadout.Name = "ScrollBarLoadout" +scrollBarLoadout.BackgroundTransparency = 0.9 +scrollBarLoadout.BackgroundColor3 = Color3.new(1, 1, 1) +scrollBarLoadout.BorderSizePixel = 0 +scrollBarLoadout.Size = UDim2.new(0, 17, 1, -36) +scrollBarLoadout.Position = UDim2.new(0, 0, 0, 18) +scrollBarLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea + +scrollDownLoadout.Position = UDim2.new(0, 0, 1, -17) + +scrollUpLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea +scrollDownLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea + +-- Begin Functions +function removeFromMap(map, object) + for i = 1, #map do + if map[i] == object then + table.remove(map, i) + break + end + end +end + +function robloxLock(instance) + instance.RobloxLocked = true + children = instance:GetChildren() + if children then + for _, child in ipairs(children) do + robloxLock(child) + end + end +end + +function resize() + local size = 0 + if gearPreview.AbsoluteSize.Y > gearPreview.AbsoluteSize.X then + size = gearPreview.AbsoluteSize.X * 0.75 + else + size = gearPreview.AbsoluteSize.Y * 0.75 + end + + waitForChild(gearPreview, "GearImage") + gearPreview.GearImage.Size = UDim2.new(0, size, 0, size) + gearPreview.GearImage.Position = UDim2.new(0, gearPreview.AbsoluteSize.X / 2 - size / 2, 0.75, -size) + + resizeGrid() +end + +function addToGrid(child) + if not child:IsA "Tool" then + if not child:IsA "HopperBin" then + return + end + end + if child:FindFirstChild "RobloxBuildTool" then + return + end + + for _, v in pairs(backpackItems) do -- check to see if we already have this gear registered + if v == child then + return + end + end + + table.insert(backpackItems, child) + + local changeCon = child.Changed:connect(function(prop) + if prop == "Name" then + if buttons[child] then + if buttons[child].Image == "" then + buttons[child].GearText.Text = child.Name + end + end + end + end) + local ancestryCon = nil + ancestryCon = child.AncestryChanged:connect(function(_, _) + local thisObject = nil + for _, v in pairs(backpackItems) do + if v == child then + thisObject = v + break + end + end + + waitForProperty(player, "Character") + waitForChild(player, "Backpack") + if child.Parent ~= player.Backpack and child.Parent ~= player.Character then + if ancestryCon then + ancestryCon:disconnect() + end + if changeCon then + changeCon:disconnect() + end + + for _, v in pairs(backpackItems) do + if v == thisObject then + if mouseEnterCons[buttons[v]] then + mouseEnterCons[buttons[v]]:disconnect() + end + if mouseClickCons[buttons[v]] then + mouseClickCons[buttons[v]]:disconnect() + end + buttons[v].Parent = nil + buttons[v] = nil + break + end + end + + removeFromMap(backpackItems, thisObject) + + resizeGrid() + else + resizeGrid() + end + updateGridActive() + end) + resizeGrid() +end + +function buttonClick(button) + if button:FindFirstChild "UnequipContextMenu" and not button.Active then + button.UnequipContextMenu.Visible = true + browsingMenu = true + end +end + +function previewGear(button) + if not browsingMenu then + gearPreview.Visible = false + gearPreview.GearImage.Image = button.Image + gearPreview.GearStats.GearName.Text = button.GearReference.Value.Name + end +end + +function findEmptySlot() + local smallestNum = nil + local loadout = currentLoadout:GetChildren() + for i = 1, #loadout do + if loadout[i]:IsA "Frame" and #loadout[i]:GetChildren() <= 0 then + local frameNum = tonumber(string.sub(loadout[i].Name, 5)) + if frameNum == 0 then + frameNum = 10 + end + if not smallestNum or (smallestNum > frameNum) then + smallestNum = frameNum + end + end + end + if smallestNum == 10 then + smallestNum = 0 + end + return smallestNum +end + +function checkForSwap(button, x, y) + local loadoutChildren = currentLoadout:GetChildren() + for i = 1, #loadoutChildren do + if loadoutChildren[i]:IsA "Frame" and string.find(loadoutChildren[i].Name, "Slot") then + if + x >= loadoutChildren[i].AbsolutePosition.x + and x <= (loadoutChildren[i].AbsolutePosition.x + loadoutChildren[i].AbsoluteSize.x) + then + if + y >= loadoutChildren[i].AbsolutePosition.y + and y <= (loadoutChildren[i].AbsolutePosition.y + loadoutChildren[i].AbsoluteSize.y) + then + local slot = tonumber(string.sub(loadoutChildren[i].Name, 5)) + swapGearSlot(slot, button) + return true + end + end + end + end + return false +end + +function resizeGrid() + for _, v in pairs(backpackItems) do + if not v:FindFirstChild "RobloxBuildTool" then + if not buttons[v] then + local buttonClone = gearButton:clone() + buttonClone.Parent = grid.ScrollingFrame + buttonClone.Visible = true + buttonClone.Image = v.TextureId + if buttonClone.Image == "" then + buttonClone.GearText.Text = v.Name + end + + buttonClone.GearReference.Value = v + buttonClone.Draggable = true + buttons[v] = buttonClone + + if not IsTouchDevice() then + local unequipMenu = getGearContextMenu() + + unequipMenu.Visible = false + unequipMenu.Parent = buttonClone + end + + local beginPos = nil + buttonClone.DragBegin:connect(function(value) + waitForChild(buttonClone, "Background") + buttonClone["Background"].ZIndex = 10 + buttonClone.ZIndex = 10 + beginPos = value + end) + buttonClone.DragStopped:connect(function(x, y) + waitForChild(buttonClone, "Background") + buttonClone["Background"].ZIndex = 1 + buttonClone.ZIndex = 2 + if beginPos ~= buttonClone.Position then + if not checkForSwap(buttonClone, x, y) then + buttonClone:TweenPosition( + beginPos, + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + 0.5, + true + ) + buttonClone.Draggable = false + delay(0.5, function() + buttonClone.Draggable = true + end) + else + buttonClone.Position = beginPos + end + end + end) + local clickTime = tick() + mouseEnterCons[buttonClone] = buttonClone.MouseEnter:connect(function() + previewGear(buttonClone) + end) + mouseClickCons[buttonClone] = buttonClone.MouseButton1Click:connect(function() + local newClickTime = tick() + if buttonClone.Active and (newClickTime - clickTime) < 0.5 then + local slot = findEmptySlot() + if slot then + buttonClone.ZIndex = 1 + swapGearSlot(slot, buttonClone) + end + else + buttonClick(buttonClone) + end + clickTime = newClickTime + end) + end + end + end + recalculateScroll() +end + +function showPartialGrid(subset) + for _, v in pairs(buttons) do + v.Parent = nil + end + if subset then + for _, v in pairs(subset) do + v.Parent = grid.ScrollingFrame + end + end + recalculateScroll() +end + +function showEntireGrid() + for _, v in pairs(buttons) do + v.Parent = grid.ScrollingFrame + end + recalculateScroll() +end + +function inLoadout(gear) + local children = currentLoadout:GetChildren() + for i = 1, #children do + if children[i]:IsA "Frame" then + local button = children[i]:GetChildren() + if #button > 0 then + if button[1].GearReference.Value and button[1].GearReference.Value == gear then + return true + end + end + end + end + return false +end + +function updateGridActive() + for _, v in pairs(backpackItems) do + if buttons[v] then + local gear = nil + local gearRef = buttons[v]:FindFirstChild "GearReference" + + if gearRef then + gear = gearRef.Value + end + + if (not gear) or inLoadout(gear) then + buttons[v].Active = false + else + buttons[v].Active = true + end + end + end +end + +function centerGear(loadoutChildren) + local gearButtons = {} + local lastSlotAdd = nil + for i = 1, #loadoutChildren do + if loadoutChildren[i]:IsA "Frame" and #loadoutChildren[i]:GetChildren() > 0 then + if loadoutChildren[i].Name == "Slot0" then + lastSlotAdd = loadoutChildren[i] + else + table.insert(gearButtons, loadoutChildren[i]) + end + end + end + if lastSlotAdd then + table.insert(gearButtons, lastSlotAdd) + end + + local startPos = (1 - (#gearButtons * 0.1)) / 2 + for i = 1, #gearButtons do + gearButtons[i]:TweenPosition( + UDim2.new(startPos + ((i - 1) * 0.1), 0, 0, 0), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + 0.25, + true + ) + end +end + +function tabClickHandler(tabName) + if tabName == StaticTabName then + backpackOpenHandler(tabName) + else + backpackCloseHandler(tabName) + end +end + +function backpackOpenHandler(currentTab) + if currentTab and currentTab ~= StaticTabName then + backpack.Gear.Visible = false + return + end + + backpack.Gear.Visible = true + updateGridActive() + + resizeGrid() + resize() + tellBackpackReadyFunc:Invoke() +end + +function backpackCloseHandler(currentTab) + if currentTab and currentTab ~= StaticTabName then + backpack.Gear.Visible = false + return + end + + backpack.Gear.Visible = false + + resizeGrid() + resize() + tellBackpackReadyFunc:Invoke() +end + +function loadoutCheck(child, selectState) + if not child:IsA "ImageButton" then + return + end + for _, v in pairs(backpackItems) do + if buttons[v] then + if child:FindFirstChild "GearReference" and buttons[v]:FindFirstChild "GearReference" then + if buttons[v].GearReference.Value == child.GearReference.Value then + buttons[v].Active = selectState + break + end + end + end + end +end + +function clearPreview() + gearPreview.GearImage.Image = "" + gearPreview.GearStats.GearName.Text = "" +end + +-- function removeAllEquippedGear(physGear) +-- local stuff = player.Character:GetChildren() +-- for i = 1, #stuff do +-- if (stuff[i]:IsA "Tool" or stuff[i]:IsA "HopperBin") and stuff[i] ~= physGear then +-- stuff[i].Parent = playerBackpack +-- end +-- end +-- end + +-- function equipGear(physGear) +-- removeAllEquippedGear(physGear) +-- physGear.Parent = player.Character +-- updateGridActive() +-- end + +function unequipGear(physGear) + physGear.Parent = playerBackpack + updateGridActive() +end + +function highlight(button) + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundColor3 = Color3.new(0.8, 0.8, 0.8) +end +function clearHighlight(button) + button.TextColor3 = Color3.new(1, 1, 1) + button.BackgroundColor3 = Color3.new(0, 0, 0) +end + +function swapGearSlot(slot, gearButton) + if not swapSlot.Value then -- signal loadout to swap a gear out + swapSlot.Slot.Value = slot + swapSlot.GearButton.Value = gearButton + swapSlot.Value = true + updateGridActive() + end +end + +local UnequipGearMenuClick = function(element, menu) + if type(element.Action) ~= "number" then + return + end + local num = element.Action + if num == 1 then -- remove from loadout + unequipGear(menu.Parent.GearReference.Value) + local inventoryButton = menu.Parent + local gearToUnequip = inventoryButton.GearReference.Value + local loadoutChildren = currentLoadout:GetChildren() + local slot = -1 + for i = 1, #loadoutChildren do + if loadoutChildren[i]:IsA "Frame" then + local button = loadoutChildren[i]:GetChildren() + if button[1] and button[1].GearReference.Value == gearToUnequip then + slot = button[1].SlotNumber.Text + break + end + end + end + swapGearSlot(slot, nil) + end +end + +function setupCharacterConnections() + if backpackAddCon then + backpackAddCon:disconnect() + end + backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) + addToGrid(child) + end) + + -- make sure we get all the children + local backpackChildren = game.Players.LocalPlayer.Backpack:GetChildren() + for i = 1, #backpackChildren do + addToGrid(backpackChildren[i]) + end + + if characterChildAddedCon then + characterChildAddedCon:disconnect() + end + characterChildAddedCon = game.Players.LocalPlayer.Character.ChildAdded:connect(function(child) + addToGrid(child) + updateGridActive() + end) + + if characterChildRemovedCon then + characterChildRemovedCon:disconnect() + end + characterChildRemovedCon = game.Players.LocalPlayer.Character.ChildRemoved:connect(function(_) + updateGridActive() + end) + + wait() + centerGear(currentLoadout:GetChildren()) +end + +function removeCharacterConnections() + if characterChildAddedCon then + characterChildAddedCon:disconnect() + end + if characterChildRemovedCon then + characterChildRemovedCon:disconnect() + end + if backpackAddCon then + backpackAddCon:disconnect() + end +end + +function trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) +end + +function filterGear(terms) + local filteredGear = {} + for _, v in pairs(backpackItems) do + if buttons[v] then + local gearString = string.lower(buttons[v].GearReference.Value.Name) + gearString = trim(gearString) + for i = 1, #terms do + if string.match(gearString, terms[i]) then + table.insert(filteredGear, buttons[v]) + break + end + end + end + end + + return filteredGear +end +function splitByWhitespace(text) + if type(text) ~= "string" then + return nil + end + + local terms = {} + for token in string.gmatch(text, "[^%s]+") do + if string.len(token) > 0 then + table.insert(terms, token) + end + end + return terms +end +function showSearchGear(searchTerms) + if not backpack.Gear.Visible then + return + end -- currently not active tab + + local searchTermTable = splitByWhitespace(searchTerms) + local currSearchTerms + if searchTermTable and (#searchTermTable > 0) then + currSearchTerms = searchTermTable + else + currSearchTerms = nil + end + + if searchTermTable == nil then + showEntireGrid() + return + end + + local filteredButtons = filterGear(currSearchTerms) + showPartialGrid(filteredButtons) +end + +function nukeBackpack() + while #buttons > 0 do + table.remove(buttons) + end + buttons = {} + while #backpackItems > 0 do + table.remove(backpackItems) + end + backpackItems = {} + local scrollingFrameChildren = grid.ScrollingFrame:GetChildren() + for i = 1, #scrollingFrameChildren do + scrollingFrameChildren[i]:remove() + end +end + +function getGearContextMenu() + local gearContextMenu = Instance.new "Frame" + gearContextMenu.Active = true + gearContextMenu.Name = "UnequipContextMenu" + gearContextMenu.Size = UDim2.new(0, 115, 0, 70) + gearContextMenu.Position = UDim2.new(0, -16, 0, -16) + gearContextMenu.BackgroundTransparency = 1 + gearContextMenu.Visible = false + + local gearContextMenuButton = Instance.new "TextButton" + gearContextMenuButton.Name = "UnequipContextMenuButton" + gearContextMenuButton.Text = "" + gearContextMenuButton.Style = Enum.ButtonStyle.RobloxButtonDefault + gearContextMenuButton.ZIndex = 8 + gearContextMenuButton.Size = UDim2.new(1, 0, 1, -20) + gearContextMenuButton.Visible = true + gearContextMenuButton.Parent = gearContextMenu + + local elementHeight = 12 + + local contextMenuElements = {} + local contextMenuElementsName = { "Remove Hotkey" } + + for i = 1, #contextMenuElementsName do + local element = {} + element.Type = "Button" + element.Text = contextMenuElementsName[i] + element.Action = i + element.DoIt = UnequipGearMenuClick + table.insert(contextMenuElements, element) + end + + for i, contextElement in ipairs(contextMenuElements) do + local element = contextElement + if element.Type == "Button" then + local button = Instance.new "TextButton" + button.Name = "UnequipContextButton" .. i + button.BackgroundColor3 = Color3.new(0, 0, 0) + button.BorderSizePixel = 0 + button.TextXAlignment = Enum.TextXAlignment.Left + button.Text = " " .. contextElement.Text + button.Font = Enum.Font.Arial + button.FontSize = Enum.FontSize.Size14 + button.Size = UDim2.new(1, 8, 0, elementHeight) + button.Position = UDim2.new(0, 0, 0, elementHeight * i) + button.TextColor3 = Color3.new(1, 1, 1) + button.ZIndex = 9 + button.Parent = gearContextMenuButton + + if not IsTouchDevice() then + button.MouseButton1Click:connect(function() + if button.Active and not gearContextMenu.Parent.Active then + pcall(function() + element.DoIt(element, gearContextMenu) + end) + browsingMenu = false + gearContextMenu.Visible = false + clearHighlight(button) + clearPreview() + end + end) + + button.MouseEnter:connect(function() + if button.Active and gearContextMenu.Parent.Active then + highlight(button) + end + end) + button.MouseLeave:connect(function() + if button.Active and gearContextMenu.Parent.Active then + clearHighlight(button) + end + end) + end + + contextElement.Button = button + contextElement.Element = button + elseif element.Type == "Label" then + local frame = Instance.new "Frame" + frame.Name = "ContextLabel" .. i + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(1, 8, 0, elementHeight) + + local label = Instance.new "TextLabel" + label.Name = "Text1" + label.BackgroundTransparency = 1 + label.BackgroundColor3 = Color3.new(1, 1, 1) + label.BorderSizePixel = 0 + label.TextXAlignment = Enum.TextXAlignment.Left + label.Font = Enum.Font.ArialBold + label.FontSize = Enum.FontSize.Size14 + label.Position = UDim2.new(0, 0, 0, 0) + label.Size = UDim2.new(0.5, 0, 1, 0) + label.TextColor3 = Color3.new(1, 1, 1) + label.ZIndex = 9 + label.Parent = frame + element.Label1 = label + + if element.GetText2 then + label = Instance.new "TextLabel" + label.Name = "Text2" + label.BackgroundTransparency = 1 + label.BackgroundColor3 = Color3.new(1, 1, 1) + label.BorderSizePixel = 0 + label.TextXAlignment = Enum.TextXAlignment.Right + label.Font = Enum.Font.Arial + label.FontSize = Enum.FontSize.Size14 + label.Position = UDim2.new(0.5, 0, 0, 0) + label.Size = UDim2.new(0.5, 0, 1, 0) + label.TextColor3 = Color3.new(1, 1, 1) + label.ZIndex = 9 + label.Parent = frame + element.Label2 = label + end + frame.Parent = gearContextMenuButton + element.Label = frame + element.Element = frame + end + end + + gearContextMenu.ZIndex = 4 + gearContextMenu.MouseLeave:connect(function() + browsingMenu = false + gearContextMenu.Visible = false + clearPreview() + end) + robloxLock(gearContextMenu) + + return gearContextMenu +end + +function coreGuiChanged(coreGuiType, enabled) + if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then + if not enabled then + backpack.Gear.Visible = false + end + end +end + +local backpackChildren = player.Backpack:GetChildren() +for i = 1, #backpackChildren do + addToGrid(backpackChildren[i]) +end + +------------------------- Start Lifelong Connections ----------------------- + +resizeEvent.Event:connect(function(_) + if debounce then + return + end + + debounce = true + wait() + resize() + resizeGrid() + debounce = false +end) + +currentLoadout.ChildAdded:connect(function(child) + loadoutCheck(child, false) +end) +currentLoadout.ChildRemoved:connect(function(child) + loadoutCheck(child, true) +end) + +currentLoadout.DescendantAdded:connect(function(descendant) + if not backpack.Visible and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") then + centerGear(currentLoadout:GetChildren()) + end +end) +currentLoadout.DescendantRemoving:connect(function(descendant) + if not backpack.Visible and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") then + wait() + centerGear(currentLoadout:GetChildren()) + end +end) + +grid.MouseEnter:connect(function() + clearPreview() +end) +grid.MouseLeave:connect(function() + clearPreview() +end) + +player.CharacterRemoving:connect(function() + removeCharacterConnections() + nukeBackpack() +end) +player.CharacterAdded:connect(function() + setupCharacterConnections() +end) + +player.ChildAdded:connect(function(child) + if child:IsA "Backpack" then + playerBackpack = child + if backpackAddCon then + backpackAddCon:disconnect() + end + backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) + addToGrid(child) + end) + end +end) + +swapSlot.Changed:connect(function() + if not swapSlot.Value then + updateGridActive() + end +end) + +local loadoutChildren = currentLoadout:GetChildren() +for i = 1, #loadoutChildren do + if loadoutChildren[i]:IsA "Frame" and string.find(loadoutChildren[i].Name, "Slot") then + loadoutChildren[i].ChildRemoved:connect(function() + updateGridActive() + end) + loadoutChildren[i].ChildAdded:connect(function() + updateGridActive() + end) + end +end +------------------------- End Lifelong Connections ----------------------- + +pcall(function() + coreGuiChanged(Enum.CoreGuiType.Backpack, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack)) + Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) +end) + +resize() +resizeGrid() + +-- make sure any items in the loadout are accounted for in inventory +local loadoutChildren = currentLoadout:GetChildren() +for i = 1, #loadoutChildren do + loadoutCheck(loadoutChildren[i], false) +end +if not backpack.Visible then + centerGear(currentLoadout:GetChildren()) +end + +-- make sure that inventory is listening to gear reparenting +if characterChildAddedCon == nil and game.Players.LocalPlayer["Character"] then + setupCharacterConnections() +end +if not backpackAddCon then + backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) + addToGrid(child) + end) +end + +backpackOpenEvent.Event:connect(backpackOpenHandler) +backpackCloseEvent.Event:connect(backpackCloseHandler) +tabClickedEvent.Event:connect(tabClickHandler) +searchRequestedEvent.Event:connect(showSearchGear) + +recalculateScrollLoadout() diff --git a/lua/89449093.lua b/lua/89449093.lua new file mode 100644 index 0000000..e241e7f --- /dev/null +++ b/lua/89449093.lua @@ -0,0 +1,476 @@ +-- This script manages context switches in the backpack (Gear to Wardrobe, etc.) and player state changes. Also manages global functions across different tabs (currently only search) +if game.CoreGui.Version < 7 then + return +end -- peace out if we aren't using the right client + +-- basic functions +local function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end + return instance:FindFirstChild(name) +end +local function waitForProperty(instance, property) + while not instance[property] do + instance.Changed:wait() + end +end + +-- don't do anything if we are in an empty game +waitForChild(game, "Players") +if #game.Players:GetChildren() < 1 then + game.Players.ChildAdded:wait() +end +-- make sure everything is loaded in before we do anything +-- get our local player +waitForProperty(game.Players, "LocalPlayer") + +------------------------ Locals ------------------------------ +local backpack = script.Parent +waitForChild(backpack, "Gear") + +local screen = script.Parent.Parent +assert(screen:IsA "ScreenGui") + +waitForChild(backpack, "Tabs") +waitForChild(backpack.Tabs, "CloseButton") +local closeButton = backpack.Tabs.CloseButton + +waitForChild(backpack.Tabs, "InventoryButton") +local inventoryButton = backpack.Tabs.InventoryButton + +local wardrobeButton +if game.CoreGui.Version >= 8 then + waitForChild(backpack.Tabs, "WardrobeButton") + wardrobeButton = backpack.Tabs.WardrobeButton +end +waitForChild(backpack.Parent, "ControlFrame") +local backpackButton = waitForChild(backpack.Parent.ControlFrame, "BackpackButton") +local currentTab = "gear" + +local searchFrame = waitForChild(backpack, "SearchFrame") +waitForChild(backpack.SearchFrame, "SearchBoxFrame") +local searchBox = waitForChild(backpack.SearchFrame.SearchBoxFrame, "SearchBox") +local searchButton = waitForChild(backpack.SearchFrame, "SearchButton") +local resetButton = waitForChild(backpack.SearchFrame, "ResetButton") + +local robloxGui = waitForChild(Game.CoreGui, "RobloxGui") +local currentLoadout = waitForChild(robloxGui, "CurrentLoadout") +local loadoutBackground = waitForChild(currentLoadout, "Background") + +local canToggle = true +local readyForNextEvent = true +local backpackIsOpen = false +local active = true +local disabledByDeveloper = false + +local humanoidDiedCon = nil + +local guiTweenSpeed = 0.25 -- how quickly we open/close the backpack + +local searchDefaultText = "Search..." +local tilde = "~" +local backquote = "`" + +local backpackSize = UDim2.new(0, 600, 0, 400) + +if robloxGui.AbsoluteSize.Y <= 320 then + backpackSize = UDim2.new(0, 200, 0, 140) +end + +------------------------ End Locals --------------------------- + +---------------------------------------- Public Event Setup ---------------------------------------- + +function createPublicEvent(eventName) + assert(eventName, "eventName is nil") + assert(tostring(eventName), "eventName is not a string") + + local newEvent = Instance.new "BindableEvent" + newEvent.Name = tostring(eventName) + newEvent.Parent = script + + return newEvent +end + +function createPublicFunction(funcName, invokeFunc) + assert(funcName, "funcName is nil") + assert(tostring(funcName), "funcName is not a string") + assert(invokeFunc, "invokeFunc is nil") + assert(type(invokeFunc) == "function", "invokeFunc should be of type 'function'") + + local newFunction = Instance.new "BindableFunction" + newFunction.Name = tostring(funcName) + newFunction.OnInvoke = invokeFunc + newFunction.Parent = script + + return newFunction +end + +-- Events +local resizeEvent = createPublicEvent "ResizeEvent" +local backpackOpenEvent = createPublicEvent "BackpackOpenEvent" +local backpackCloseEvent = createPublicEvent "BackpackCloseEvent" +local tabClickedEvent = createPublicEvent "TabClickedEvent" +local searchRequestedEvent = createPublicEvent "SearchRequestedEvent" +---------------------------------------- End Public Event Setup ---------------------------------------- + +--------------------------- Internal Functions ---------------------------------------- + +function deactivateBackpack() + backpack.Visible = false + active = false +end + +function initHumanoidDiedConnections() + if humanoidDiedCon then + humanoidDiedCon:disconnect() + end + waitForProperty(game.Players.LocalPlayer, "Character") + waitForChild(game.Players.LocalPlayer.Character, "Humanoid") + humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect(deactivateBackpack) +end + +function activateBackpack() + initHumanoidDiedConnections() + active = true + backpack.Visible = backpackIsOpen + if backpackIsOpen then + toggleBackpack() + end +end + +local hideBackpack = function() + backpackIsOpen = false + readyForNextEvent = false + backpackButton.Selected = false + resetSearch() + backpackCloseEvent:Fire(currentTab) + backpack.Tabs.Visible = false + searchFrame.Visible = false + backpack:TweenSizeAndPosition( + UDim2.new(0, backpackSize.X.Offset, 0, 0), + UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -85), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + guiTweenSpeed, + true, + function() + game.GuiService:RemoveCenterDialog(backpack) + backpack.Visible = false + backpackButton.Selected = false + end + ) + delay(guiTweenSpeed, function() + game.GuiService:RemoveCenterDialog(backpack) + backpack.Visible = false + backpackButton.Selected = false + readyForNextEvent = true + canToggle = true + end) +end + +function showBackpack() + game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, function() + backpack.Visible = true + backpackButton.Selected = true + end, function() + backpack.Visible = false + backpackButton.Selected = false + end) + backpack.Visible = true + backpackButton.Selected = true + backpack:TweenSizeAndPosition( + backpackSize, + UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -backpackSize.Y.Offset - 88), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + guiTweenSpeed, + true + ) + delay(guiTweenSpeed, function() + backpack.Tabs.Visible = false + searchFrame.Visible = true + backpackOpenEvent:Fire(currentTab) + canToggle = true + readyForNextEvent = true + backpackButton.Image = "http://www.roblox.com/asset/?id=97644093" + backpackButton.Position = UDim2.new(0.5, -60, 1, -backpackSize.Y.Offset - 103) + end) +end + +function toggleBackpack() + if not game.Players.LocalPlayer then + return + end + if not game.Players.LocalPlayer["Character"] then + return + end + if not canToggle then + return + end + if not readyForNextEvent then + return + end + readyForNextEvent = false + canToggle = false + + backpackIsOpen = not backpackIsOpen + + if backpackIsOpen then + loadoutBackground.Image = "http://www.roblox.com/asset/?id=97623721" + loadoutBackground.Position = UDim2.new(-0.03, 0, -0.17, 0) + loadoutBackground.Size = UDim2.new(1.05, 0, 1.25, 0) + loadoutBackground.ZIndex = 2.0 + loadoutBackground.Visible = true + showBackpack() + else + backpackButton.Position = UDim2.new(0.5, -60, 1, -44) + loadoutBackground.Visible = false + backpackButton.Selected = false + backpackButton.Image = "http://www.roblox.com/asset/?id=97617958" + loadoutBackground.Image = "http://www.roblox.com/asset/?id=96536002" + loadoutBackground.Position = UDim2.new(-0.1, 0, -0.1, 0) + loadoutBackground.Size = UDim2.new(1.2, 0, 1.2, 0) + hideBackpack() + + local clChildren = currentLoadout:GetChildren() + for i = 1, #clChildren do + if clChildren[i] and clChildren[i]:IsA "Frame" then + local frame = clChildren[i] + if #frame:GetChildren() > 0 then + backpackButton.Position = UDim2.new(0.5, -60, 1, -108) + backpackButton.Visible = true + loadoutBackground.Visible = true + if frame:GetChildren()[1]:IsA "ImageButton" then + local imgButton = frame:GetChildren()[1] + imgButton.Active = true + imgButton.Draggable = false + end + end + end + end + end +end + +function closeBackpack() + if backpackIsOpen then + toggleBackpack() + end +end + +function setSelected(tab) + assert(tab) + assert(tab:IsA "TextButton") + + tab.BackgroundColor3 = Color3.new(1, 1, 1) + tab.TextColor3 = Color3.new(0, 0, 0) + tab.Selected = true + tab.ZIndex = 3 +end + +function setUnselected(tab) + assert(tab) + assert(tab:IsA "TextButton") + + tab.BackgroundColor3 = Color3.new(0, 0, 0) + tab.TextColor3 = Color3.new(1, 1, 1) + tab.Selected = false + tab.ZIndex = 1 +end + +function updateTabGui(selectedTab) + assert(selectedTab) + + if selectedTab == "gear" then + setSelected(inventoryButton) + setUnselected(wardrobeButton) + elseif selectedTab == "wardrobe" then + setSelected(wardrobeButton) + setUnselected(inventoryButton) + end +end + +function mouseLeaveTab(button) + assert(button) + assert(button:IsA "TextButton") + + if button.Selected then + return + end + + button.BackgroundColor3 = Color3.new(0, 0, 0) +end + +function mouseOverTab(button) + assert(button) + assert(button:IsA "TextButton") + + if button.Selected then + return + end + + button.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255) +end + +function newTabClicked(tabName) + assert(tabName) + tabName = string.lower(tabName) + currentTab = tabName + + updateTabGui(tabName) + tabClickedEvent:Fire(tabName) + resetSearch() +end + +function trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) +end + +-- function splitByWhitespace(text) +-- if type(text) ~= "string" then +-- return nil +-- end + +-- local terms = {} +-- for token in string.gmatch(text, "[^%s]+") do +-- if string.len(token) > 0 then +-- table.insert(terms, token) +-- end +-- end +-- return terms +-- end + +function resetSearchBoxGui() + resetButton.Visible = false + searchBox.Text = searchDefaultText +end + +function doSearch() + local searchText = searchBox.Text + if searchText == "" then + resetSearch() + return + end + searchText = trim(searchText) + resetButton.Visible = true + -- termTable = splitByWhitespace(searchText) + searchRequestedEvent:Fire(searchText) -- todo: replace this with termtable when table passing is possible +end + +function resetSearch() + resetSearchBoxGui() + searchRequestedEvent:Fire() +end + +local backpackReady = function() + readyForNextEvent = true +end + +function coreGuiChanged(coreGuiType, enabled) + if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then + active = enabled + disabledByDeveloper = not enabled + + if disabledByDeveloper then + pcall(function() + game:GetService("GuiService"):RemoveKey(tilde) + game:GetService("GuiService"):RemoveKey(backquote) + end) + else + game:GetService("GuiService"):AddKey(tilde) + game:GetService("GuiService"):AddKey(backquote) + end + + resetSearch() + searchFrame.Visible = enabled and backpackIsOpen + + currentLoadout.Visible = enabled + backpack.Visible = enabled + backpackButton.Visible = enabled + end +end + +--------------------------- End Internal Functions ------------------------------------- + +------------------------------ Public Functions Setup ------------------------------------- +createPublicFunction("CloseBackpack", hideBackpack) +createPublicFunction("BackpackReady", backpackReady) +------------------------------ End Public Functions Setup --------------------------------- + +------------------------ Connections/Script Main ------------------------------------------- + +pcall(function() + coreGuiChanged(Enum.CoreGuiType.Backpack, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack)) + Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) +end) + +inventoryButton.MouseButton1Click:connect(function() + newTabClicked "gear" +end) +inventoryButton.MouseEnter:connect(function() + mouseOverTab(inventoryButton) +end) +inventoryButton.MouseLeave:connect(function() + mouseLeaveTab(inventoryButton) +end) + +if game.CoreGui.Version >= 8 then + wardrobeButton.MouseButton1Click:connect(function() + newTabClicked "wardrobe" + end) + wardrobeButton.MouseEnter:connect(function() + mouseOverTab(wardrobeButton) + end) + wardrobeButton.MouseLeave:connect(function() + mouseLeaveTab(wardrobeButton) + end) +end + +closeButton.MouseButton1Click:connect(closeBackpack) + +screen.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + resizeEvent:Fire(screen.AbsoluteSize) + end +end) + +-- GuiService key setup +game:GetService("GuiService"):AddKey(tilde) +game:GetService("GuiService"):AddKey(backquote) +game:GetService("GuiService").KeyPressed:connect(function(key) + if not active or disabledByDeveloper then + return + end + if key == tilde or key == backquote then + toggleBackpack() + end +end) +backpackButton.MouseButton1Click:connect(function() + if not active or disabledByDeveloper then + return + end + toggleBackpack() +end) + +if game.Players.LocalPlayer["Character"] then + activateBackpack() +end + +game.Players.LocalPlayer.CharacterAdded:connect(activateBackpack) + +-- search functions +searchBox.FocusLost:connect(function(enterPressed) + if enterPressed or searchBox.Text ~= "" then + doSearch() + elseif searchBox.Text == "" then + resetSearch() + end +end) +searchButton.MouseButton1Click:connect(doSearch) +resetButton.MouseButton1Click:connect(resetSearch) + +if searchFrame and robloxGui.AbsoluteSize.Y <= 320 then + searchFrame.RobloxLocked = false + searchFrame:Destroy() +end diff --git a/lua/97188756.lua b/lua/97188756.lua new file mode 100644 index 0000000..aee1491 --- /dev/null +++ b/lua/97188756.lua @@ -0,0 +1,1789 @@ +--[[ + //FileName: ChatScript.LUA + //Written by: Sorcus + //Description: Code for lua side chat on Mercury. Supports Scrolling. + //NOTE: If you find any bugs or inaccuracies PM Sorcus on Roblox or @Canavus on Twitter +]] + +local forceChatGUI = false + +-- Utility functions + Globals +local function WaitForChild(parent, childName) + while parent:FindFirstChild(childName) == nil do + parent.ChildAdded:wait(0.03) + end + return parent[childName] +end + +local function typedef(obj) + return obj +end + +local function IsPhone() + local cGui = Game:GetService "CoreGui" + local rGui = WaitForChild(cGui, "RobloxGui") + if rGui.AbsoluteSize.Y < 600 then + return true + end + return false +end + +-- Users can use enough white spaces to spoof chatting as other players +-- This function removes trailing and leading white spaces +-- AFAIK, there is no reason for spam white spaces +local function StringTrim(str) + -- %S is whitespaces + -- When we find the first non space character defined by ^%s + -- we yank out anything in between that and the end of the string + -- Everything else is replaced with %1 which is essentially nothing + return (str:gsub("^%s*(.-)%s*$", "%1")) +end + +while Game.Players.LocalPlayer == nil do + wait(0.03) +end + +local Player = Game.Players.LocalPlayer +while Player.Character == nil do + wait(0.03) +end +local RbxUtility = LoadLibrary "RbxUtility" +local Gui = typedef(RbxUtility) +local Camera = Game.Workspace.CurrentCamera + +-- Services +local CoreGuiService = Game:GetService "CoreGui" +local PlayersService = Game:GetService "Players" +local GuiService = Game:GetService "GuiService" + +-- Lua Enums +local Enums, CreateEnum +do + Enums = {} + local EnumName = {} -- used as unique key for enum name + local enum_mt = { + __call = function(self, value) + return self[value] or self[tonumber(value)] + end, + __index = { + GetEnumItems = function(self) + local t = {} + for i, item in pairs(self) do + if type(i) == "number" then + t[#t + 1] = item + end + end + table.sort(t, function(a, b) + return a.Value < b.Value + end) + return t + end, + }, + __tostring = function(self) + return "Enum." .. self[EnumName] + end, + } + local item_mt = { + __call = function(self, value) + return value == self or value == self.Name or value == self.Value + end, + __tostring = function(self) + return "Enum." .. self[EnumName] .. "." .. self.Name + end, + } + CreateEnum = function(enumName) + return function(t) + local e = { [EnumName] = enumName } + for i, name in pairs(t) do + local item = setmetatable({ Name = name, Value = i, Enum = e, [EnumName] = enumName }, item_mt) + e[i] = item + e[name] = item + e[item] = item + end + Enums[enumName] = e + return setmetatable(e, enum_mt) + end + end +end +--------------------------------------------------- +------------------ Input class -------------------- +local Input = { + Mouse = Player:GetMouse(), + Speed = 0, + Simulating = false, + + Configuration = { + DefaultSpeed = 1, + }, + UserIsScrolling = false, +} + +--------------------------------------------------- +------------------ Chat class -------------------- +local Chat = { + + ChatColors = { + BrickColor.new "Bright red", + BrickColor.new "Bright blue", + BrickColor.new "Earth green", + BrickColor.new "Bright violet", + BrickColor.new "Bright orange", + BrickColor.new "Bright yellow", + BrickColor.new "Light reddish violet", + BrickColor.new "Brick yellow", + }, + + Gui = nil, + Frame = nil, + RenderFrame = nil, + TapToChatLabel = nil, + ClickToChatButton = nil, + + ScrollingLock = false, + EventListener = nil, + + -- This is actually a ring buffer + -- Meaning at hitting the historyLength it wraps around + -- Reuses the text objects, so chat atmost uses 100 text objects + MessageQueue = {}, + + -- Stores all the values for configuring chat + Configuration = { + FontSize = Enum.FontSize.Size12, -- 10 is good + -- Also change this when you are changing the above, this is suboptimal but so is our interface to find FontSize + NumFontSize = 12, + HistoryLength = 20, -- stores up to 50 of the last chat messages for you to scroll through, + Size = UDim2.new(0.38, 0, 0.20, 0), + MessageColor = Color3.new(1, 1, 1), + AdminMessageColor = Color3.new(1, 215 / 255, 0), + XScale = 0.025, + LifeTime = 45, + Position = UDim2.new(0, 2, 0.05, 0), + DefaultTweenSpeed = 0.15, + }, + + -- This could be redone by just using the previous and next fields of the Queue + -- But the iterators cause issues, will be optimized later + SlotPositions_List = {}, + -- To precompute and store all player null strings since its an expensive process + CachedSpaceStrings_List = {}, + MouseOnFrame = false, + GotFocus = false, + + Messages_List = {}, + MessageThread = nil, + + --[[ Admins_List = {'Sorcus', 'Shedletsky', 'Telamon', 'Tarabyte', 'StickMasterLuke', 'OnlyTwentyCharacters', 'FusRoblox', 'SolarCrane', + 'HotThoth', 'JediTkacheff', 'Builderman', 'Brighteyes', 'ReeseMcblox', 'GemLocker', 'GongfuTiger', 'Erik.Cassel', 'Matt Dusek', 'Keith', + 'Totbl', 'LordRugDump', 'David.Baszucki', 'Dbapostle', 'DaveYorkRBX', 'nJay', 'OstrichSized', 'TobotRobot', 'twberg', 'Mercury', 'RBAdam', 'Doughtless', + 'Anaminus', 'Stravant', 'Cr3470r', 'CodeWriter', 'Games', 'AcesWayUpHigh', 'Phil' + }, --]] + Admins_List = { "taskmanager", "Heliodex", "tako" }, + + SafeChat_List = { + ["Use the Chat menu to talk to me."] = { "/sc 0", true }, + ["I can only see menu chats."] = { "/sc 1", true }, + ["Hello"] = { + ["Hi"] = { "/sc 2_0", true, ["Hi there!"] = true, ["Hi everyone"] = true }, + ["Howdy"] = { "/sc 2_1", true, ["Howdy partner!"] = true }, + ["Greetings"] = { + "/sc 2_2", + true, + ["Greetings everyone"] = true, + ["Greetings Robloxians!"] = true, + ["Seasons greetings!"] = true, + }, + ["Welcome"] = { + "/sc 2_3", + true, + ["Welcome to my place"] = true, + ["Welcome to my barbeque"] = true, + ["Welcome to our base"] = true, + }, + ["Hey there!"] = { "/sc 2_4", true }, + ["What's up?"] = { + "/sc 2_5", + true, + ["How are you doing?"] = true, + ["How's it going?"] = true, + ["What's new?"] = true, + }, + ["Good day"] = { + "/sc 2_6", + true, + ["Good morning"] = true, + ["Good evening"] = true, + ["Good afternoon"] = true, + ["Good night"] = true, + }, + ["Silly"] = { + "/sc 2_7", + true, + ["Waaaaaaaz up?!"] = true, + ["Hullo!"] = true, + ["Behold greatness, mortals!"] = true, + ["Pardon me, is this Sparta?"] = true, + ["THIS IS SPARTAAAA!"] = true, + }, + ["Happy Holidays!"] = { + "/sc 2_8", + true, + ["Happy New Year!"] = true, + ["Happy Valentine's Day!"] = true, + ["Beware the Ides of March!"] = true, + ["Happy St. Patrick's Day!"] = true, + ["Happy Easter!"] = true, + ["Happy Earth Day!"] = true, + ["Happy 4th of July!"] = true, + ["Happy Thanksgiving!"] = true, + ["Happy Halloween!"] = true, + ["Happy Hanukkah!"] = true, + ["Merry Christmas!"] = true, + ["Happy May Day!"] = true, + ["Happy Towel Day!"] = true, + ["Happy Mercury Day!"] = true, + ["Happy LOL Day!"] = true, + }, + + [1] = "/sc 2", + }, + ["Goodbye"] = { + ["Good Night"] = { + "/sc 3_0", + true, + ["Sweet dreams"] = true, + ["Go to sleep!"] = true, + ["Lights out!"] = true, + ["Bedtime"] = true, + ["Going to bed now"] = true, + }, + + ["Later"] = { + "/sc 3_1", + true, + ["See ya later"] = true, + ["Later gator!"] = true, + ["See you tomorrow"] = true, + }, + + ["Bye"] = { "/sc 3_2", true, ["Hasta la bye bye!"] = true }, + ["I'll be right back"] = { "/sc 3_3", true }, + ["I have to go"] = { "/sc 3_4", true }, + ["Farewell"] = { + "/sc 3_5", + true, + ["Take care"] = true, + ["Have a nice day"] = true, + ["Goodluck!"] = true, + ["Ta-ta for now!"] = true, + }, + ["Peace"] = { "/sc 3_6", true, ["Peace out!"] = true, ["Peace dudes!"] = true, ["Rest in pieces!"] = true }, + ["Silly"] = { + "/sc 3_7", + true, + ["To the batcave!"] = true, + ["Over and out!"] = true, + ["Happy trails!"] = true, + ["I've got to book it!"] = true, + ["Tootles!"] = true, + ["Smell you later!"] = true, + ["GG!"] = true, + ["My house is on fire! gtg."] = true, + }, + [1] = "/sc 3", + }, + ["Friend"] = { + ["Wanna be friends?"] = { "/sc 4_0", true }, + ["Follow me"] = { + "/sc 4_1", + true, + ["Come to my place!"] = true, + ["Come to my base!"] = true, + ["Follow me, team!"] = true, + ["Follow me"] = true, + }, + ["Your place is cool"] = { + "/sc 4_2", + true, + ["Your place is fun"] = true, + ["Your place is awesome"] = true, + ["Your place looks good"] = true, + ["This place is awesome!"] = true, + }, + ["Thank you"] = { + "/sc 4_3", + true, + ["Thanks for playing"] = true, + ["Thanks for visiting"] = true, + ["Thanks for everything"] = true, + ["No, thank you"] = true, + ["Thanx"] = true, + }, + ["No problem"] = { "/sc 4_4", true, ["Don't worry"] = true, ["That's ok"] = true, ["np"] = true }, + ["You are ..."] = { + "/sc 4_5", + true, + ["You are great!"] = true, + ["You are good!"] = true, + ["You are cool!"] = true, + ["You are funny!"] = true, + ["You are silly!"] = true, + ["You are awesome!"] = true, + ["You are doing something I don't like, please stop"] = true, + }, + ["I like ..."] = { + "/sc 4_6", + true, + ["I like your name"] = true, + ["I like your shirt"] = true, + ["I like your place"] = true, + ["I like your style"] = true, + ["I like you"] = true, + ["I like items"] = true, + ["I like money"] = true, + }, + ["Sorry"] = { + "/sc 4_7", + true, + ["My bad!"] = true, + ["I'm sorry"] = true, + ["Whoops!"] = true, + ["Please forgive me."] = true, + ["I forgive you."] = true, + ["I didn't mean to do that."] = true, + ["Sorry, I'll stop now."] = true, + }, + [1] = "/sc 4", + }, + ["Questions"] = { + ["Who?"] = { + "/sc 5_0", + true, + ["Who wants to be my friend?"] = true, + ["Who wants to be on my team?"] = true, + ["Who made this brilliant game?"] = true, + }, + ["What?"] = { + "/sc 5_1", + true, + ["What is your favorite animal?"] = true, + ["What is your favorite game?"] = true, + ["What is your favorite movie?"] = true, + ["What is your favorite TV show?"] = true, + ["What is your favorite music?"] = true, + ["What are your hobbies?"] = true, + ["LOLWUT?"] = true, + }, + ["When?"] = { + "/sc 5_2", + true, + ["When are you online?"] = true, + ["When is the new version coming out?"] = true, + ["When can we play again?"] = true, + ["When will your place be done?"] = true, + }, + ["Where?"] = { + "/sc 5_3", + true, + ["Where do you want to go?"] = true, + ["Where are you going?"] = true, + ["Where am I?!"] = true, + ["Where did you go?"] = true, + }, + ["How?"] = { + "/sc 5_4", + true, + ["How are you today?"] = true, + ["How did you make this cool place?"] = true, + ["LOLHOW?"] = true, + }, + ["Can I..."] = { + "/sc 5_5", + true, + ["Can I have a tour?"] = true, + ["Can I be on your team?"] = true, + ["Can I be your friend?"] = true, + ["Can I try something?"] = true, + ["Can I have that please?"] = true, + ["Can I have that back please?"] = true, + ["Can I have borrow your hat?"] = true, + ["Can I have borrow your gear?"] = true, + }, + [1] = "/sc 5", + }, + ["Answers"] = { + ["You need help?"] = { + "/sc 6_0", + true, + ["Check out the news section"] = true, + ["Check out the help section"] = true, + ["Read the wiki!"] = true, + ["All the answers are in the wiki!"] = true, + ["I will help you with this."] = true, + }, + ["Some people ..."] = { + "/sc 6_1", + true, + ["Me"] = true, + ["Not me"] = true, + ["You"] = true, + ["All of us"] = true, + ["Everyone but you"] = true, + ["Builderman!"] = true, + ["Telamon!"] = true, + ["My team"] = true, + ["My group"] = true, + ["Mom"] = true, + ["Dad"] = true, + ["Sister"] = true, + ["Brother"] = true, + ["Cousin"] = true, + ["Grandparent"] = true, + ["Friend"] = true, + }, + ["Time ..."] = { + "/sc 6_2", + true, + ["In the morning"] = true, + ["In the afternoon"] = true, + ["At night"] = true, + ["Tomorrow"] = true, + ["This week"] = true, + ["This month"] = true, + ["Sometime"] = true, + ["Sometimes"] = true, + ["Whenever you want"] = true, + ["Never"] = true, + ["After this"] = true, + ["In 10 minutes"] = true, + ["In a couple hours"] = true, + ["In a couple days"] = true, + }, + ["Animals"] = { + "/sc 6_3", + true, + ["Cats"] = { ["Lion"] = true, ["Tiger"] = true, ["Leopard"] = true, ["Cheetah"] = true }, + ["Dogs"] = { + ["Wolves"] = true, + ["Beagle"] = true, + ["Collie"] = true, + ["Dalmatian"] = true, + ["Poodle"] = true, + ["Spaniel"] = true, + ["Shepherd"] = true, + ["Terrier"] = true, + ["Retriever"] = true, + }, + ["Horses"] = { ["Ponies"] = true, ["Stallions"] = true, ["Pwnyz"] = true }, + ["Reptiles"] = { ["Dinosaurs"] = true, ["Lizards"] = true, ["Snakes"] = true, ["Turtles!"] = true }, + ["Hamster"] = true, + ["Monkey"] = true, + ["Bears"] = true, + ["Fish"] = { + ["Goldfish"] = true, + ["Sharks"] = true, + ["Sea Bass"] = true, + ["Halibut"] = true, + ["Tropical Fish"] = true, + }, + ["Birds"] = { + ["Eagles"] = true, + ["Penguins"] = true, + ["Parakeets"] = true, + ["Owls"] = true, + ["Hawks"] = true, + ["Pidgeons"] = true, + }, + ["Elephants"] = true, + ["Mythical Beasts"] = { + ["Dragons"] = true, + ["Unicorns"] = true, + ["Sea Serpents"] = true, + ["Sphinx"] = true, + ["Cyclops"] = true, + ["Minotaurs"] = true, + ["Goblins"] = true, + ["Honest Politicians"] = true, + ["Ghosts"] = true, + ["Scylla and Charybdis"] = true, + }, + }, + ["Games"] = { + "/sc 6_4", + true, + ["Action"] = true, + ["Puzzle"] = true, + ["Strategy"] = true, + ["Racing"] = true, + ["RPG"] = true, + ["Obstacle Course"] = true, + ["Tycoon"] = true, + ["Roblox"] = { + ["BrickBattle"] = true, + ["Community Building"] = true, + ["Roblox Minigames"] = true, + ["Contest Place"] = true, + }, + ["Board games"] = { + ["Chess"] = true, + ["Checkers"] = true, + ["Settlers of Catan"] = true, + ["Tigris and Euphrates"] = true, + ["El Grande"] = true, + ["Stratego"] = true, + ["Carcassonne"] = true, + }, + }, + ["Sports"] = { + "/sc 6_5", + true, + ["Hockey"] = true, + ["Soccer"] = true, + ["Football"] = true, + ["Baseball"] = true, + ["Basketball"] = true, + ["Volleyball"] = true, + ["Tennis"] = true, + ["Sports team practice"] = true, + ["Watersports"] = { ["Surfing"] = true, ["Swimming"] = true, ["Water Polo"] = true }, + ["Winter sports"] = { + ["Skiing"] = true, + ["Snowboarding"] = true, + ["Sledding"] = true, + ["Skating"] = true, + }, + ["Adventure"] = { + ["Rock climbing"] = true, + ["Hiking"] = true, + ["Fishing"] = true, + ["Horseback riding"] = true, + }, + ["Wacky"] = { + ["Foosball"] = true, + ["Calvinball"] = true, + ["Croquet"] = true, + ["Cricket"] = true, + ["Dodgeball"] = true, + ["Squash"] = true, + ["Trampoline"] = true, + }, + }, + ["Movies/TV"] = { + "/sc 6_6", + true, + ["Science Fiction"] = true, + ["Animated"] = { ["Anime"] = true }, + ["Comedy"] = true, + ["Romantic"] = true, + ["Action"] = true, + ["Fantasy"] = true, + }, + ["Music"] = { + "/sc 6_7", + true, + ["Country"] = true, + ["Jazz"] = true, + ["Rap"] = true, + ["Hip-hop"] = true, + ["Techno"] = true, + ["Classical"] = true, + ["Pop"] = true, + ["Rock"] = true, + }, + ["Hobbies"] = { + "/sc 6_8", + true, + ["Computers"] = { + ["Building computers"] = true, + ["Videogames"] = true, + ["Coding"] = true, + ["Hacking"] = true, + }, + ["The Internet"] = { ["lol. teh internets!"] = true, ["Watching vids"] = true }, + ["Dance"] = true, + ["Gymnastics"] = true, + ["Listening to music"] = true, + ["Arts and crafts"] = true, + ["Martial Arts"] = { + ["Karate"] = true, + ["Judo"] = true, + ["Taikwon Do"] = true, + ["Wushu"] = true, + ["Street fighting"] = true, + }, + ["Music lessons"] = { + ["Playing in my band"] = true, + ["Playing piano"] = true, + ["Playing guitar"] = true, + ["Playing violin"] = true, + ["Playing drums"] = true, + ["Playing a weird instrument"] = true, + }, + }, + ["Location"] = { + "/sc 6_9", + true, + ["USA"] = { + ["West"] = { + ["Alaska"] = true, + ["Arizona"] = true, + ["California"] = true, + ["Colorado"] = true, + ["Hawaii"] = true, + ["Idaho"] = true, + ["Montana"] = true, + ["Nevada"] = true, + ["New Mexico"] = true, + ["Oregon"] = true, + ["Utah"] = true, + ["Washington"] = true, + ["Wyoming"] = true, + }, + ["South"] = { + ["Alabama"] = true, + ["Arkansas"] = true, + ["Florida"] = true, + ["Georgia"] = true, + ["Kentucky"] = true, + ["Louisiana"] = true, + ["Mississippi"] = true, + ["North Carolina"] = true, + ["Oklahoma"] = true, + ["South Carolina"] = true, + ["Tennessee"] = true, + ["Texas"] = true, + ["Virginia"] = true, + ["West Virginia"] = true, + }, + ["Northeast"] = { + ["Connecticut"] = true, + ["Delaware"] = true, + ["Maine"] = true, + ["Maryland"] = true, + ["Massachusetts"] = true, + ["New Hampshire"] = true, + ["New Jersey"] = true, + ["New York"] = true, + ["Pennsylvania"] = true, + ["Rhode Island"] = true, + ["Vermont"] = true, + }, + ["Midwest"] = { + ["Illinois"] = true, + ["Indiana"] = true, + ["Iowa"] = true, + ["Kansas"] = true, + ["Michigan"] = true, + ["Minnesota"] = true, + ["Missouri"] = true, + ["Nebraska"] = true, + ["North Dakota"] = true, + ["Ohio"] = true, + ["South Dakota"] = true, + ["Wisconsin"] = true, + }, + }, + ["Canada"] = { + ["Alberta"] = true, + ["British Columbia"] = true, + ["Manitoba"] = true, + ["New Brunswick"] = true, + ["Newfoundland"] = true, + ["Northwest Territories"] = true, + ["Nova Scotia"] = true, + ["Nunavut"] = true, + ["Ontario"] = true, + ["Prince Edward Island"] = true, + ["Quebec"] = true, + ["Saskatchewan"] = true, + ["Yukon"] = true, + }, + ["Mexico"] = true, + ["Central America"] = true, + ["Europe"] = { + ["France"] = true, + ["Germany"] = true, + ["Spain"] = true, + ["Italy"] = true, + ["Poland"] = true, + ["Switzerland"] = true, + ["Greece"] = true, + ["Romania"] = true, + ["Netherlands"] = true, + ["Great Britain"] = { + ["England"] = true, + ["Scotland"] = true, + ["Wales"] = true, + ["Northern Ireland"] = true, + }, + }, + ["Asia"] = { + ["China"] = true, + ["India"] = true, + ["Japan"] = true, + ["Korea"] = true, + ["Russia"] = true, + ["Vietnam"] = true, + }, + ["South America"] = { ["Argentina"] = true, ["Brazil"] = true }, + ["Africa"] = { ["Eygpt"] = true, ["Swaziland"] = true }, + ["Australia"] = true, + ["Middle East"] = true, + ["Antarctica"] = true, + ["New Zealand"] = true, + }, + ["Age"] = { + "/sc 6_10", + true, + ["Rugrat"] = true, + ["Kid"] = true, + ["Tween"] = true, + ["Teen"] = true, + ["Twenties"] = true, + ["Old"] = true, + ["Ancient"] = true, + ["Mesozoic"] = true, + ["I don't want to say my age. Don't ask."] = true, + }, + ["Mood"] = { + "/sc 6_11", + true, + ["Good"] = true, + ["Great!"] = true, + ["Not bad"] = true, + ["Sad"] = true, + ["Hyper"] = true, + ["Chill"] = true, + ["Happy"] = true, + ["Kind of mad"] = true, + }, + ["Boy"] = { "/sc 6_12", true }, + ["Girl"] = { "/sc 6_13", true }, + ["I don't want to say boy or girl. Don't ask."] = { "/sc 6_14", true }, + [1] = "/sc 6", + }, + ["Game"] = { + ["Let's build"] = { "/sc 7_0", true }, + ["Let's battle"] = { "/sc 7_1", true }, + ["Nice one!"] = { "/sc 7_2", true }, + ["So far so good"] = { "/sc 7_3", true }, + ["Lucky shot!"] = { "/sc 7_4", true }, + ["Oh man!"] = { "/sc 7_5", true }, + ["I challenge you to a fight!"] = { "/sc 7_6", true }, + ["Help me with this"] = { "/sc 7_7", true }, + ["Let's go to your game"] = { "/sc 7_8", true }, + ["Can you show me how do to that?"] = { "/sc 7_9", true }, + ["Backflip!"] = { "/sc 7_10", true }, + ["Frontflip!"] = { "/sc 7_11", true }, + ["Dance!"] = { "/sc 7_12", true }, + ["I'm on your side!"] = { "/sc 7_13", true }, + ["Game Commands"] = { + "/sc 7_14", + true, + ["regen"] = true, + ["reset"] = true, + ["go"] = true, + ["fix"] = true, + ["respawn"] = true, + }, + [1] = "/sc 7", + }, + ["Silly"] = { + ["Muahahahaha!"] = true, + ["all your base are belong to me!"] = true, + ["GET OFF MAH LAWN"] = true, + ["TEH EPIK DUCK IS COMING!!!"] = true, + ["ROFL"] = true, + ["1337"] = { + true, + ["i r teh pwnz0r!"] = true, + ["w00t!"] = true, + ["z0mg h4x!"] = true, + ["ub3rR0xXorzage!"] = true, + }, + }, + ["Yes"] = { + ["Absolutely!"] = true, + ["Rock on!"] = true, + ["Totally!"] = true, + ["Juice!"] = true, + ["Yay!"] = true, + ["Yesh"] = true, + }, + ["No"] = { + ["Ummm. No."] = true, + ["..."] = true, + ["Stop!"] = true, + ["Go away!"] = true, + ["Don't do that"] = true, + ["Stop breaking the rules"] = true, + ["I don't want to"] = true, + }, + ["Ok"] = { + ["Well... ok"] = true, + ["Sure"] = true, + }, + ["Uncertain"] = { + ["Maybe"] = true, + ["I don't know"] = true, + ["idk"] = true, + ["I can't decide"] = true, + ["Hmm..."] = true, + }, + [":-)"] = { + [":-("] = true, + [":D"] = true, + [":-O"] = true, + ["lol"] = true, + ["=D"] = true, + ["D="] = true, + ["XD"] = true, + [";D"] = true, + [";)"] = true, + ["O_O"] = true, + ["=)"] = true, + ["@_@"] = true, + [">_<"] = true, + ["T_T"] = true, + ["^_^"] = true, + ["<(0_0<) <(0_0)> (>0_0)> KIRBY DANCE"] = true, + [")';"] = true, + [":3"] = true, + }, + ["Ratings"] = { + ["Rate it!"] = true, + ["I give it a 1 out of 10"] = true, + ["I give it a 2 out of 10"] = true, + ["I give it a 3 out of 10"] = true, + ["I give it a 4 out of 10"] = true, + ["I give it a 5 out of 10"] = true, + ["I give it a 6 out of 10"] = true, + ["I give it a 7 out of 10"] = true, + ["I give it a 8 out of 10"] = true, + ["I give it a 9 out of 10"] = true, + ["I give it a 10 out of 10!"] = true, + }, + }, + CreateEnum "SafeChat" { "Level1", "Level2", "Level3" }, + SafeChatTree = {}, + TempSpaceLabel = nil, +} +--------------------------------------------------- + +local function GetNameValue(pName) + local value = 0 + for index = 1, #pName do + local cValue = string.byte(string.sub(pName, index, index)) + local reverseIndex = #pName - index + 1 + if #pName % 2 == 1 then + reverseIndex = reverseIndex - 1 + end + if reverseIndex % 4 >= 2 then + cValue = -cValue + end + value = value + cValue + end + return value % 8 +end + +function Chat:ComputeChatColor(pName) + return self.ChatColors[GetNameValue(pName) + 1].Color +end + +-- This is context based scrolling +function Chat:EnableScrolling(toggle) + -- Genius idea gone to fail, if we switch the camera type we can effectively lock the + -- camera and do no click scrolling + self.MouseOnFrame = false + if self.RenderFrame then + self.RenderFrame.MouseEnter:connect(function() + local character = Player.Character + local torso = WaitForChild(character, "Torso") + local head = WaitForChild(character, "Head") + if toggle then + self.MouseOnFrame = true + Camera.CameraType = "Scriptable" + -- Get relative position of camera and keep to it + Spawn(function() + local currentRelativePos = Camera.CoordinateFrame.p - torso.Position + while Chat.MouseOnFrame do + Camera.CoordinateFrame = CFrame.new(torso.Position + currentRelativePos, head.Position) + wait(0.015) + end + end) + end + end) + + self.RenderFrame.MouseLeave:connect(function() + Camera.CameraType = "Custom" + self.MouseOnFrame = false + end) + end +end + +-- TODO: Scrolling using Mouse wheel +-- function Chat:OnScroll(speed) +-- if self.MouseOnFrame then +-- -- +-- end +-- end + +-- Check if we are running on a touch device +function Chat:IsTouchDevice() + local touchEnabled = false + pcall(function() + touchEnabled = Game:GetService("UserInputService").TouchEnabled + end) + return touchEnabled +end + +-- Scrolling +-- function Chat:ScrollQueue(value) +-- --[[for i = 1, #self.MessageQueue do +-- if self.MessageQueue[i] then +-- for _, label in pairs(self.MessageQueue[i]) do +-- local next = self.MessageQueue[i].Next +-- local previous = self.MessageQueue[i].Previous +-- if label and label:IsA('TextLabel') or label:IsA('TextButton') then +-- if value > 0 and previous and previous['Message'] then +-- label.Position = previous['Message'].Position +-- elseif value < 1 and next['Message'] then +-- label.Position = previous['Message'].Position +-- end +-- end +-- end +-- end +-- end ]] +-- end + +-- Handles the rendering of the text objects in their appropriate places +function Chat:UpdateQueue(field, diff) + -- Have to do some sort of correction here + for i = #self.MessageQueue, 1, -1 do + if self.MessageQueue[i] then + for _, label in pairs(self.MessageQueue[i]) do + if label and type(label) ~= "table" and type(label) ~= "number" then + if label:IsA "TextLabel" or label:IsA "TextButton" then + if diff then + label.Position = label.Position - UDim2.new(0, 0, diff, 0) + else + if field == self.MessageQueue[i] then + label.Position = UDim2.new( + self.Configuration.XScale, + 0, + label.Position.Y.Scale - field["Message"].Size.Y.Scale, + 0 + ) + -- Just to show up popping effect for the latest message in chat + Spawn(function() + wait(0.05) + while label.TextTransparency >= 0 do + label.TextTransparency = label.TextTransparency - 0.2 + wait(0.03) + end + if label == field["Message"] then + label.TextStrokeTransparency = 0.8 + else + label.TextStrokeTransparency = 1 + end + end) + else + label.Position = UDim2.new( + self.Configuration.XScale, + 0, + label.Position.Y.Scale - field["Message"].Size.Y.Scale, + 0 + ) + end + if label.Position.Y.Scale < -0.01 then + -- NOTE: Remove this fix when Textbounds is fixed + label.Visible = false + label:Destroy() + end + end + end + end + end + end + end +end + +function Chat:CreateScrollBar() + -- Code for scrolling is in here, partially, but scroll bar drawing isn't drawn + -- TODO: Implement +end + +-- For scrolling, to see if we hit the bounds so that we can stop it from scrolling anymore +function Chat:CheckIfInBounds(value) + if #Chat.MessageQueue < 3 then + return true + end + + if + value > 0 + and Chat.MessageQueue[1] + and Chat.MessageQueue[1]["Player"] + and Chat.MessageQueue[1]["Player"].Position.Y.Scale == 0 + then + return true + elseif + value < 0 + and Chat.MessageQueue[1] + and Chat.MessageQueue[1]["Player"] + and Chat.MessageQueue[1]["Player"].Position.Y.Scale < 0 + then + return true + else + return false + end + return false +end + +-- This is to precompute all playerName space strings +-- This is used to offset the message by exactly this + 2 spacestrings +function Chat:ComputeSpaceString(pLabel) + local nString = " " + if not self.TempSpaceLabel then + self.TempSpaceLabel = Gui.Create "TextButton" { + Size = UDim2.new(0, pLabel.AbsoluteSize.X, 0, pLabel.AbsoluteSize.Y), + FontSize = self.Configuration.FontSize, + Parent = self.RenderFrame, + BackgroundTransparency = 1, + Text = nString, + Name = "SpaceButton", + } + else + self.TempSpaceLabel.Text = nString + end + + while self.TempSpaceLabel.TextBounds.X < pLabel.TextBounds.X do + nString = nString .. " " + self.TempSpaceLabel.Text = nString + end + nString = nString .. " " + self.CachedSpaceStrings_List[pLabel.Text] = nString + self.TempSpaceLabel.Text = "" + return nString +end + +-- When the playerChatted event fires +-- The message is what the player chatted +function Chat:UpdateChat(cPlayer, message) + local messageField = { + ["Player"] = cPlayer, + ["Message"] = message, + } + if coroutine.status(Chat.MessageThread) == "dead" then + --Chat.Messages_List = {} + table.insert(Chat.Messages_List, messageField) + Chat.MessageThread = coroutine.create(function() + for i = 1, #Chat.Messages_List do + local field = Chat.Messages_List[i] + Chat:CreateMessage(field["Player"], field["Message"]) + end + Chat.Messages_List = {} + end) + coroutine.resume(Chat.MessageThread) + else + table.insert(Chat.Messages_List, messageField) + end +end + +function Chat:RecalculateSpacing() + --[[for i = 1, #self.MessageQueue do + local pLabel = self.MessageQueue[i]['Player'] + local mLabel = self.MessageQueue[i]['Message'] + + local prevYScale = mLabel.Size.Y.Scale + local prevText = mLabel.Text + mLabel.Text = prevText + + local heightField = mLabel.TextBounds.Y + + mLabel.Size = UDim2.new(1, 0, heightField/self.RenderFrame.AbsoluteSize.Y, 0) + pLabel.Size = mLabel.Size + + local diff = mLabel.Size.Y.Scale - prevYScale + + Chat:UpdateQueue(self.MessageQueue[i], diff) + end ]] +end + +-- function Chat:ApplyFilter(str) +-- --[[for _, word in pair(self.Filter_List) do +-- if string.find(str, word) then +-- str:gsub(word, '@#$^') +-- end +-- end ]] +-- end + +-- NOTE: Temporarily disabled ring buffer to allow for chat to always wrap around +function Chat:CreateMessage(cPlayer, message) + local pName + if not cPlayer then + pName = "" + else + pName = cPlayer.Name + end + message = StringTrim(message) + local pLabel + local mLabel + -- Our history stores upto 50 messages that is 100 textlabels + -- If we ever hit the mark, which would be in every popular game btw + -- we wrap around and reuse the labels + if #self.MessageQueue > self.Configuration.HistoryLength then + --[[pLabel = self.MessageQueue[#self.MessageQueue]['Player'] + mLabel = self.MessageQueue[#self.MessageQueue]['Message'] + + pLabel.Text = pName .. ':' + pLabel.Name = pName + + local pColor + if cPlayer.Neutral then + pLabel.TextColor3 = Chat:ComputeChatColor(pName) + else + pLabel.TextColor3 = cPlayer.TeamColor.Color + end + + local nString + + if not self.CachedSpaceStrings_List[pName] then + nString = Chat:ComputeSpaceString(pLabel) + else + nString = self.CachedSpaceStrings_List[pName] + end + + mLabel.Text = "" + mLabel.Name = pName .. " - message" + mLabel.Text = nString .. message; + + mLabel.Parent = nil + mLabel.Parent = self.RenderFrame + + mLabel.Position = UDim2.new(0, 0, 1, 0); + pLabel.Position = UDim2.new(0, 0, 1, 0);]] + + -- Reinserted at the beginning, ring buffer + self.MessageQueue[#self.MessageQueue] = nil + end + --else + -- Haven't hit the mark yet, so keep creating + pLabel = Gui.Create "TextLabel" { + Name = pName, + Text = pName .. ":", + -- TextColor3 = pColor, + FontSize = Chat.Configuration.FontSize, + TextXAlignment = Enum.TextXAlignment.Left, + TextYAlignment = Enum.TextYAlignment.Top, + Parent = self.RenderFrame, + TextWrapped = false, + Size = UDim2.new(1, 0, 0.1, 0), + BackgroundTransparency = 1, + TextTransparency = 1, + Position = UDim2.new(0, 0, 1, 0), + BorderSizePixel = 0, + TextStrokeColor3 = Color3.new(0.5, 0.5, 0.5), + TextStrokeTransparency = 0.75, + --Active = false; + } + if cPlayer.Neutral then + pLabel.TextColor3 = Chat:ComputeChatColor(pName) + else + pLabel.TextColor3 = cPlayer.TeamColor.Color + end + + local nString + + if not self.CachedSpaceStrings_List[pName] then + nString = Chat:ComputeSpaceString(pLabel) + else + nString = self.CachedSpaceStrings_List[pName] + end + + mLabel = Gui.Create "TextLabel" { + Name = pName .. " - message", + -- Max is 3 lines + Size = UDim2.new(1, 0, 0.5, 0), + TextColor3 = Chat.Configuration.MessageColor, + FontSize = Chat.Configuration.FontSize, + TextXAlignment = Enum.TextXAlignment.Left, + TextYAlignment = Enum.TextYAlignment.Top, + Text = "", -- this is to stop when the engine reverts the swear words to default, which is button, ugh + Parent = self.RenderFrame, + TextWrapped = true, + BackgroundTransparency = 1, + TextTransparency = 1, + Position = UDim2.new(0, 0, 1, 0), + BorderSizePixel = 0, + TextStrokeColor3 = Color3.new(0, 0, 0), + --TextStrokeTransparency = 0.8; + --Active = false; + } + mLabel.Text = nString .. message + + if not pName then + pLabel.Text = "" + mLabel.TextColor3 = Color3.new(0, 0.4, 1.0) + end + --end + + for _, adminName in pairs(self.Admins_List) do + if string.lower(adminName) == string.lower(pName) then + mLabel.TextColor3 = self.Configuration.AdminMessageColor + end + end + + pLabel.Visible = true + mLabel.Visible = true + + -- This will give beautiful multilines as well + local heightField = mLabel.TextBounds.Y + + mLabel.Size = UDim2.new(1, 0, heightField / self.RenderFrame.AbsoluteSize.Y, 0) + pLabel.Size = mLabel.Size + + local queueField = {} + queueField["Player"] = pLabel + queueField["Message"] = mLabel + queueField["SpawnTime"] = tick() -- Used for identifying when to make the message invisible + + table.insert(self.MessageQueue, 1, queueField) + Chat:UpdateQueue(queueField) +end + +function Chat:ScreenSizeChanged() + wait() + while self.Frame.AbsoluteSize.Y > 120 do + self.Frame.Size = self.Frame.Size - UDim2.new(0, 0, 0.005, 0) + end + Chat:RecalculateSpacing() +end + +function Chat:FindButtonTree(scButton, rootList) + local list = {} + rootList = rootList or self.SafeChatTree + for button, _ in pairs(rootList) do + if button == scButton then + list = rootList[button] + elseif type(rootList[button]) == "table" then + list = Chat:FindButtonTree(scButton, rootList[button]) + end + end + return list +end + +function Chat:ToggleSafeChatMenu(scButton) + local list = Chat:FindButtonTree(scButton, self.SafeChatTree) + if list then + for button, _ in pairs(list) do + if button:IsA "TextButton" or button:IsA "ImageButton" then + button.Visible = not button.Visible + end + end + return true + end + return false +end + +function Chat:CreateSafeChatOptions(list, rootButton) + local text_List = {} + local count = 0 + text_List[rootButton] = {} + text_List[rootButton][1] = list[1] + rootButton = rootButton or self.SafeChatButton + for msg, _ in pairs(list) do + if type(msg) == "string" then + local chatText = Gui.Create "TextButton" { + Name = msg, + Text = msg, + Size = UDim2.new(0, 100, 0, 20), + TextXAlignment = Enum.TextXAlignment.Center, + TextColor3 = Color3.new(0.2, 0.1, 0.1), + BackgroundTransparency = 0.5, + BackgroundColor3 = Color3.new(1, 1, 1), + Parent = self.SafeChatFrame, + Visible = false, + Position = UDim2.new( + 0, + rootButton.Position.X.Scale + 105, + 0, + rootButton.Position.Y.Scale - ((count - 3) * 100) + ), + } + + count = count + 1 + + if type(list[msg]) == "table" then + text_List[rootButton][chatText] = Chat:CreateSafeChatOptions(list[msg], chatText) + -- else + -- --table.insert(text_List[chatText], true) + end + chatText.MouseEnter:connect(function() + Chat:ToggleSafeChatMenu(chatText) + end) + + chatText.MouseLeave:connect(function() + Chat:ToggleSafeChatMenu(chatText) + end) + + chatText.MouseButton1Click:connect(function() + local lList = Chat:FindButtonTree(chatText) + -- if lList then + -- for i, v in pairs(lList) do + -- end + -- else + -- end + pcall(function() + PlayersService:Chat(lList[1]) + end) + end) + end + end + return text_List +end + +function Chat:CreateSafeChatGui() + self.SafeChatFrame = Gui.Create "Frame" { + Name = "SafeChatFrame", + Size = UDim2.new(1, 0, 1, 0), + Parent = self.Gui, + BackgroundTransparency = 1, + + Gui.Create "ImageButton" { + Name = "SafeChatButton", + Size = UDim2.new(0, 44, 0, 31), + Position = UDim2.new(0, 1, 0.35, 0), + BackgroundTransparency = 1, + Image = "http://www.roblox.com/asset/?id=97080365", + }, + } + + self.SafeChatButton = self.SafeChatFrame.SafeChatButton + -- safe chat button is the root of this tree + self.SafeChatTree[self.SafeChatButton] = Chat:CreateSafeChatOptions(self.SafeChat_List, self.SafeChatButton) + + self.SafeChatButton.MouseButton1Click:connect(function() + Chat:ToggleSafeChatMenu(self.SafeChatButton) + end) +end + +function Chat:FocusOnChatBar() + if self.ClickToChatButton then + self.ClickToChatButton.Visible = false + end + + self.GotFocus = true + if self.Frame["Background"] then + self.Frame.Background.Visible = false + end + self.ChatBar:CaptureFocus() +end + +-- For touch devices we create a button instead +function Chat:CreateTouchButton() + self.ChatTouchFrame = Gui.Create "Frame" { + Name = "ChatTouchFrame", + Size = UDim2.new(0, 128, 0, 32), + Position = UDim2.new(0, 88, 0, 0), + BackgroundTransparency = 1, + Parent = self.Gui, + + Gui.Create "ImageButton" { + Name = "ChatLabel", + Size = UDim2.new(0, 74, 0, 28), + Position = UDim2.new(0, 0, 0, 0), + BackgroundTransparency = 1, + ZIndex = 2.0, + }, + Gui.Create "ImageLabel" { + Name = "Background", + Size = UDim2.new(1, 0, 1, 0), + Position = UDim2.new(0, 0, 0, 0), + BackgroundTransparency = 1, + Image = "http://www.roblox.com/asset/?id=97078724", + }, + } + self.TapToChatLabel = self.ChatTouchFrame.ChatLabel + self.TouchLabelBackground = self.ChatTouchFrame.Background + + self.ChatBar = Gui.Create "TextBox" { + Name = "ChatBar", + Size = UDim2.new(1, 0, 0.2, 0), + Position = UDim2.new(0, 0, 0.8, 800), + Text = "", + ZIndex = 1, + BackgroundTransparency = 1, + Parent = self.Frame, + TextXAlignment = Enum.TextXAlignment.Left, + TextColor3 = Color3.new(1, 1, 1), + ClearTextOnFocus = false, + } + + self.TapToChatLabel.MouseButton1Click:connect(function() + self.TapToChatLabel.Visible = false + --self.ChatBar.Visible = true + --self.Frame.Background.Visible = true + self.ChatBar:CaptureFocus() + self.GotFocus = true + if self.TouchLabelBackground then + self.TouchLabelBackground.Visible = false + end + end) +end + +-- Non touch devices, create the bottom chat bar +function Chat:CreateChatBar() + -- okay now we do + local status, result = pcall(function() + return GuiService.UseLuaChat + end) + if forceChatGUI or (status and result) then + self.ClickToChatButton = Gui.Create "TextButton" { + Name = "ClickToChat", + Size = UDim2.new(1, 0, 0, 20), + BackgroundTransparency = 1, + ZIndex = 2.0, + Parent = self.Gui, + Text = 'To chat click here or press "/" key', + TextColor3 = Color3.new(1, 1, 0.9), + Position = UDim2.new(0, 0, 1, 0), + TextXAlignment = Enum.TextXAlignment.Left, + FontSize = Enum.FontSize.Size12, + } + + self.ChatBar = Gui.Create "TextBox" { + Name = "ChatBar", + Size = UDim2.new(1, 0, 0, 20), + Position = UDim2.new(0, 0, 1, 0), + Text = "", + ZIndex = 1, + BackgroundColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 0.25, + Parent = self.Gui, + TextXAlignment = Enum.TextXAlignment.Left, + TextColor3 = Color3.new(1, 1, 1), + FontSize = Enum.FontSize.Size12, + ClearTextOnFocus = false, + } + + -- Engine has code to offset the entire world, so if we do it by -20 pixels nothing gets in our chat's way + --GuiService:SetGlobalSizeOffsetPixel(0, -20) + local success, error = pcall(function() + GuiService:SetGlobalGuiInset(0, 0, 0, 20) + end) + if not success then + GuiService:SetGlobalSizeOffsetPixel(0, -20) + end + -- CHatHotKey is '/' + GuiService:AddSpecialKey(Enum.SpecialKey.ChatHotkey) + GuiService.SpecialKeyPressed:connect(function(key) + if key == Enum.SpecialKey.ChatHotkey then + Chat:FocusOnChatBar() + end + end) + + self.ClickToChatButton.MouseButton1Click:connect(function() + Chat:FocusOnChatBar() + end) + end +end + +-- Create the initial Chat stuff +-- Done only once +function Chat:CreateGui() + self.Gui = WaitForChild(CoreGuiService, "RobloxGui") + self.Frame = Gui.Create "Frame" { + Name = "ChatFrame", + --Size = self.Configuration.Size; + Size = UDim2.new(0, 500, 0, 120), + Position = UDim2.new(0, 0, 0, 5), + BackgroundTransparency = 1, + --ClipsDescendants = true; + ZIndex = 0, + Parent = self.Gui, + Active = false, + + Gui.Create "ImageLabel" { + Name = "Background", + Image = "http://www.roblox.com/asset/?id=97120937", --96551212'; + Size = UDim2.new(1.3, 0, 1.64, 0), + Position = UDim2.new(0, 0, 0, 0), + BackgroundTransparency = 1, + ZIndex = 0, + Visible = false, + }, + + Gui.Create "Frame" { + Name = "Border", + Size = UDim2.new(1, 0, 0, 1), + Position = UDim2.new(0, 0, 0.8, 0), + BackgroundTransparency = 0, + BackgroundColor3 = Color3.new(236 / 255, 236 / 255, 236 / 255), + BorderSizePixel = 0, + Visible = false, + }, + + Gui.Create "Frame" { + Name = "ChatRenderFrame", + Size = UDim2.new(1.02, 0, 1.01, 0), + Position = UDim2.new(0, 0, 0, 0), + BackgroundTransparency = 1, + --ClipsDescendants = true; + ZIndex = 0, + Active = false, + }, + } + + Spawn(function() + wait(0.5) + if IsPhone() then + self.Frame.Size = UDim2.new(0, 280, 0, 120) + end + end) + + self.RenderFrame = self.Frame.ChatRenderFrame + if Chat:IsTouchDevice() then + self.Frame.Position = self.Configuration.Position + self.RenderFrame.Size = UDim2.new(1, 0, 1, 0) + elseif self.Frame.AbsoluteSize.Y > 120 then + Chat:ScreenSizeChanged() + self.Gui.Changed:connect(function(property) + if property == "AbsoluteSize" then + Chat:ScreenSizeChanged() + end + end) + end + + if forceChatGUI or Player.ChatMode == Enum.ChatMode.TextAndMenu then + if Chat:IsTouchDevice() then + Chat:CreateTouchButton() + else + Chat:CreateChatBar() + --Chat:CreateSafeChatGui() + end + + if self.ChatBar then + self.ChatBar.FocusLost:connect(function(enterPressed) + Chat.GotFocus = false + if Chat:IsTouchDevice() then + self.ChatBar.Visible = false + self.TapToChatLabel.Visible = true + + if self.TouchLabelBackground then + self.TouchLabelBackground.Visible = true + end + end + if enterPressed and self.ChatBar.Text ~= "" then + local cText = self.ChatBar.Text + if string.sub(self.ChatBar.Text, 1, 1) == "%" then + cText = "(TEAM) " .. string.sub(cText, 2, #cText) + pcall(function() + PlayersService:TeamChat(cText) + end) + else + pcall(function() + PlayersService:Chat(cText) + end) + end + + if self.ClickToChatButton then + self.ClickToChatButton.Visible = true + end + self.ChatBar.Text = "" + end + Spawn(function() + wait(5.0) + if not Chat.GotFocus then + Chat.Frame.Background.Visible = false + end + end) + end) + end + end +end + +-- Scrolling function +-- Applies a speed(velocity) to have nice scrolling effect +function Input:OnMouseScroll() + Spawn(function() + -- How long should the speed last? + while Input.Speed ~= 0 do + if Input.Speed > 1 then + while Input.Speed > 0 do + Input.Speed = Input.Speed - 1 + wait(0.25) + end + elseif Input.Speed < 0 then + while Input.Speed < 0 do + Input.Speed = Input.Speed + 1 + wait(0.25) + end + end + wait(0.03) + end + end) + if Chat:CheckIfInBounds(Input.Speed) then + return + end + Chat:ScrollQueue() +end + +function Input:ApplySpeed(value) + Input.Speed = Input.Speed + value + if not self.Simulating then + Input:OnMouseScroll() + end +end + +function Input:Initialize() + self.Mouse.WheelBackward:connect(function() + Input:ApplySpeed(self.Configuration.DefaultSpeed) + end) + + self.Mouse.WheelForward:connect(function() + Input:ApplySpeed(self.Configuration.DefaultSpeed) + end) +end + +function Chat:FindMessageInSafeChat(message, list) + local foundMessage = false + for msg, _ in pairs(list) do + if msg == message then + return true + end + if type(list[msg]) == "table" then + foundMessage = Chat:FindMessageInSafeChat(message, list[msg]) + if foundMessage then + return true + end + end + end + return foundMessage +end + +-- Just a wrapper around our PlayerChatted event +function Chat:PlayerChatted(...) + local args = { ... } + -- local argCount = select("#", ...) + local player + local message + -- This doesn't look very good, but what else to do? + if args[2] then + player = args[2] + end + if args[3] then + message = args[3] + if string.sub(message, 1, 1) == "%" then + message = "(TEAM) " .. string.sub(message, 2, #message) + end + end + + if PlayersService.ClassicChat then + if + not (string.sub(message, 1, 3) == "/e " or string.sub(message, 1, 7) == "/emote ") + and (forceChatGUI or Player.ChatMode == Enum.ChatMode.TextAndMenu) + or (Player.ChatMode == Enum.ChatMode.Menu and string.sub(message, 1, 3) == "/sc") + or (Chat:FindMessageInSafeChat(message, self.SafeChat_List)) + then + Chat:UpdateChat(player, message) + end + end +end + +-- After Chat.Configuration.Lifetime seconds of existence, the labels become invisible +-- Runs only every 5 seconds and has to loop through 50 values +-- Shouldn't be too expensive +function Chat:CullThread() + while true do + if #self.MessageQueue > 0 then + for _, field in pairs(self.MessageQueue) do + if + field["SpawnTime"] + and field["Player"] + and field["Message"] + and tick() - field["SpawnTime"] > self.Configuration.LifeTime + then + field["Player"].Visible = false + field["Message"].Visible = false + end + end + end + wait(5.0) + end +end + +-- RobloxLock everything so users can't delete them(?) +function Chat:LockAllFields(gui) + local children = gui:GetChildren() + for i = 1, #children do + children[i].RobloxLocked = true + if #children[i]:GetChildren() > 0 then + Chat:LockAllFields(children[i]) + end + end +end + +function Chat:CoreGuiChanged(coreGuiType, enabled) + if coreGuiType == Enum.CoreGuiType.Chat or coreGuiType == Enum.CoreGuiType.All then + if self.Frame then + self.Frame.Visible = enabled + end + + if not Chat:IsTouchDevice() and self.ChatBar then + self.ChatBar.Visible = enabled + if enabled then + GuiService:SetGlobalGuiInset(0, 0, 0, 20) + else + GuiService:SetGlobalGuiInset(0, 0, 0, 0) + end + end + end +end + +-- Constructor +-- This function initializes everything +function Chat:Initialize() + Chat:CreateGui() + + pcall(function() + Chat:CoreGuiChanged(Enum.CoreGuiType.Chat, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Chat)) + Game.StarterGui.CoreGuiChangedSignal:connect(function(coreGuiType, enabled) + Chat:CoreGuiChanged(coreGuiType, enabled) + end) + end) + + self.EventListener = PlayersService.PlayerChatted:connect(function(...) + -- This event has 4 callback arguments + -- Enum.PlayerChatType.All, chatPlayer, message, targetPlayer + Chat:PlayerChatted(...) + end) + + self.MessageThread = coroutine.create(function() end) + coroutine.resume(self.MessageThread) + + -- Initialize input for us + Input:Initialize() + -- Eww, everytime a player is added, you have to redo the connection + -- Seems this is not automatic + -- NOTE: PlayerAdded only fires on the server, hence ChildAdded is used here + PlayersService.ChildAdded:connect(function() + Chat.EventListener:disconnect() + self.EventListener = PlayersService.PlayerChatted:connect(function(...) + -- This event has 4 callback arguments + -- Enum.PlayerChatType.All, chatPlayer, message, targetPlayer + Chat:PlayerChatted(...) + end) + end) + + Spawn(function() + Chat:CullThread() + end) + + self.Frame.RobloxLocked = true + Chat:LockAllFields(self.Frame) + self.Frame.DescendantAdded:connect(function(descendant) + Chat:LockAllFields(descendant) + end) +end + +Chat:Initialize() diff --git a/lua/host.lua b/lua/host.lua new file mode 100644 index 0000000..0c1d6ee --- /dev/null +++ b/lua/host.lua @@ -0,0 +1,201 @@ +print "[Mercury]: Loaded Host corescript" +local placeId, sleeptime, access, url, killID, deathID, timeout, injectScriptAssetID, servicesUrl, libraryRegistrationScriptAssetID +pcall(function() + return game:GetService("ScriptContext"):AddStarterScript(injectScriptAssetID) +end) +game:GetService("RunService"):Run() +local waitForChild +waitForChild = function(parent, childName) + while true do + local child = parent:findFirstChild(childName) + if child then + return child + end + parent.ChildAdded:wait() + end +end +local getKillerOfHumanoidIfStillInGame +getKillerOfHumanoidIfStillInGame = function(humanoid) + local tag = humanoid:findFirstChild "creator" + if tag and tag.Value.Parent then + return tag.Value + end +end +local onDied +onDied = function(victim, humanoid) + local killer, victorId = getKillerOfHumanoidIfStillInGame(humanoid), 0 + if killer then + victorId = killer.userId + print("STAT: kill by " .. tostring(victorId) .. " of " .. tostring(victim.userId)) + game:HttpGet(tostring(url) .. "/Game/Knockouts.ashx?UserID=" .. tostring(victorId) .. "&" .. tostring(access)) + end + print("STAT: death of " .. tostring(victim.userId) .. " by " .. tostring(victorId)) + return game:HttpGet( + tostring(url) .. "/Game/Wipeouts.ashx?UserID=" .. tostring(victim.userId) .. "&" .. tostring(access) + ) +end +pcall(function() + settings().Network.UseInstancePacketCache = true +end) +pcall(function() + settings().Network.UsePhysicsPacketCache = true +end) +pcall(function() + settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError +end) +settings().Network.PhysicsSend = Enum.PhysicsSendMethod.ErrorComputation2 +settings().Network.ExperimentalPhysicsEnabled = true +settings().Network.WaitingForCharacterLogRate = 100 +pcall(function() + return settings().Diagnostics:LegacyScriptMode() +end) +url = "_BASE_URL" +local scriptContext = game:GetService "ScriptContext" +pcall(function() + return scriptContext:AddStarterScript(libraryRegistrationScriptAssetID) +end) +scriptContext.ScriptsDisabled = true +game:GetService("ChangeHistoryService"):SetEnabled(false) +local ns = game:GetService "NetworkServer" +if url ~= nil then + pcall(function() + return game:GetService("Players"):SetAbuseReportUrl(tostring(url) .. "/Report/Games.ashx") + end) + pcall(function() + return game:GetService("ScriptInformationProvider"):SetAssetUrl(tostring(url) .. "/Asset/") + end) + pcall(function() + return game:GetService("ContentProvider"):SetBaseUrl(tostring(url) .. "/") + end) + if access ~= nil then + do + local _with_0 = game:GetService "BadgeService" + _with_0:SetAwardBadgeUrl( + tostring(url) .. "/Game/Badge/AwardBadge.ashx?UserID=%d&BadgeID=%d&PlaceID=%d&" .. tostring(access) + ) + _with_0:SetHasBadgeUrl( + tostring(url) .. "/Game/Badge/HasBadge.ashx?UserID=%d&BadgeID=%d&" .. tostring(access) + ) + _with_0:SetIsBadgeDisabledUrl( + tostring(url) .. "/Game/Badge/IsBadgeDisabled.ashx?BadgeID=%d&PlaceID=%d&" .. tostring(access) + ) + end + do + local _with_0 = game:GetService "FriendService" + _with_0:SetMakeFriendUrl( + tostring(servicesUrl) .. "/Friend/CreateFriend?firstUserId=%d&secondUserId=%d&" .. tostring(access) + ) + _with_0:SetBreakFriendUrl( + tostring(servicesUrl) .. "/Friend/BreakFriend?firstUserId=%d&secondUserId=%d&" .. tostring(access) + ) + _with_0:SetGetFriendsUrl(tostring(servicesUrl) .. "/Friend/AreFriends?userId=%d&" .. tostring(access)) + end + end + game:GetService("BadgeService"):SetIsBadgeLegalUrl "" + do + local _with_0 = game:GetService "InsertService" + _with_0:SetBaseSetsUrl(tostring(url) .. "/game/tools/insertasset?nsets=10&type=base") + _with_0:SetUserSetsUrl(tostring(url) .. "/game/tools/insertasset?nsets=20&type=user&userid=%d") + _with_0:SetCollectionUrl(tostring(url) .. "/game/tools/insertasset?sid=%d") + _with_0:SetAssetUrl(tostring(url) .. "/Asset/?id=%d") + _with_0:SetAssetVersionUrl(tostring(url) .. "/Asset/?assetversionid=%d") + end + pcall(function() + return loadfile(tostring(url) .. "/Game/LoadPlaceInfo.ashx?PlaceId=" .. tostring(placeId))() + end) + pcall(function() + if access then + return loadfile( + tostring(url) + .. "/Game/PlaceSpecificScript.ashx?PlaceId=" + .. tostring(placeId) + .. "&" + .. tostring(access) + )() + end + end) +end +pcall(function() + return game:GetService("NetworkServer"):SetIsPlayerAuthenticationRequired(true) +end) +settings().Diagnostics.LuaRamLimit = 0 +if (placeId ~= nil) and (killID ~= nil) and (deathID ~= nil) and (url ~= nil) then + local createDeathMonitor + createDeathMonitor = function(player) + if player.Character then + local humanoid = waitForChild(player.Character, "Humanoid") + return humanoid.Died:connect(function() + return onDied(player, humanoid) + end) + end + end + game:GetService("Players").ChildAdded:connect(function(player) + createDeathMonitor(player) + return player.Changed:connect(function(property) + if property == "Character" then + return createDeathMonitor(player) + end + end) + end) +end +game:GetService("Players").PlayerAdded:connect(function(player) + print("Player " .. tostring(player.userId) .. " added") + if url and access and placeId and player and player.userId then + game:HttpGet( + tostring(url) + .. "/Game/ClientPresence.ashx?action=connect&" + .. tostring(access) + .. "&PlaceID=" + .. tostring(placeId) + .. "&UserID=" + .. tostring(player.userId) + ) + return game:HttpGet( + tostring(url) + .. "/Game/PlaceVisit.ashx?UserID=" + .. tostring(player.userId) + .. "&AssociatedPlaceID=" + .. tostring(placeId) + .. "&" + .. tostring(access) + ) + end +end) +game:GetService("Players").PlayerRemoving:connect(function(player) + print("Player " .. tostring(player.userId) .. " leaving") + if url and access and placeId and player and player.userId then + return game:HttpGet( + tostring(url) + .. "/Game/ClientPresence.ashx?action=disconnect&" + .. tostring(access) + .. "&PlaceID=" + .. tostring(placeId) + .. "&UserID=" + .. tostring(player.userId) + ) + end +end) +if (placeId ~= nil) and (url ~= nil) then + wait() + game:Load(tostring(url) .. "/asset/?id=" .. tostring(placeId)) +end +if _MAP_LOCATION_EXISTS then + wait() + game:Load "_MAP_LOCATION" +end +ns:Start(_SERVER_PORT, sleeptime) +game:GetService("Visit"):SetPing("_SERVER_PRESENCE_URL", 30) +if timeout then + scriptContext:SetTimeout(timeout) +end +scriptContext.ScriptsDisabled = false +local reset = ";mc" +return game.Players.PlayerAdded:connect(function(player) + return player.Chatted:connect(function(msg) + if msg == reset then + if player.Character then + player.Character.Humanoid.Health = 0 + end + end + end) +end) diff --git a/lua/join.lua b/lua/join.lua new file mode 100644 index 0000000..8b29920 --- /dev/null +++ b/lua/join.lua @@ -0,0 +1,226 @@ +print "[Mercury]: Loaded Join corescript" -- MultiplayerSharedScript.lua inserted here ------ Prepended to Join.lua -- + +pcall(function() + return game:SetPlaceID(_PLACE_ID, false) +end) +local isTouchDevice = Game:GetService("UserInputService").TouchEnabled +settings()["Game Options"].CollisionSoundEnabled = true +pcall(function() + settings().Rendering.EnableFRM = true +end) +pcall(function() + settings().Physics.Is30FpsThrottleEnabled = false +end) +pcall(function() + settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError +end) +pcall(function() + settings().Physics.PhysicsEnvironmentalThrottle = Enum.EnviromentalPhysicsThrottle.DefaultAuto +end) +local threadSleepTime = ... +if threadSleepTime == nil then + threadSleepTime = 15 +end +local test = _IS_STUDIO_JOIN +print "! Joining game '_PLACE_ID' place _PLACE_ID at _SERVER_ADDRESS" +game:GetService("ChangeHistoryService"):SetEnabled(false) +game:GetService("ContentProvider"):SetThreadPool(16) +do + local _with_0 = game:GetService "InsertService" + _with_0:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" + _with_0:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" + _with_0:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" + _with_0:SetAssetUrl "http://banland.xyz/Asset/?id=%d" + _with_0:SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" +end +do + local _with_0 = game:GetService "SocialService" + pcall(function() + return _with_0:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" + end) + pcall(function() + return _with_0:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" + end) + pcall(function() + return _with_0:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" + end) + pcall(function() + return _with_0:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" + end) + pcall(function() + return _with_0:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" + end) +end +pcall(function() + return game:GetService("GamePassService") + :SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" +end) +pcall(function() + return game:GetService("MarketplaceService") + :SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" +end) +pcall(function() + return game:GetService("MarketplaceService") + :SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" +end) +pcall(function() + return game:SetCreatorID(_CREATOR_ID, Enum.CreatorType.User) +end) +pcall(function() + return game:GetService("Players"):SetChatStyle(Enum.ChatStyle.ClassicAndBubble) +end) +local waitingForCharacter = false +pcall(function() + if settings().Network.MtuOverride == 0 then + settings().Network.MtuOverride = 1400 + end +end) +client = game:GetService "NetworkClient" +visit = game:GetService "Visit" +setMessage = function(message) + return game:SetMessage((function() + do + return message + end + end)()) +end +showErrorWindow = function(message, _, _) + return game:SetMessage(message) +end +reportError = function(err, message) + print("***ERROR*** " .. tostring(err)) + if not test then + visit:SetUploadUrl "" + end + client:disconnect() + wait(4) + return showErrorWindow("Error: " .. tostring(err), message, "Other") +end +onDisconnection = function(_, lostConnection) + if lostConnection then + return showErrorWindow("You have lost the connection to the game", "LostConnection", "LostConnection") + else + return showErrorWindow("This game has shut down", "Kick", "Kick") + end +end +requestCharacter = function(replicator) + local connection + connection = player.Changed:connect(function(property) + if property == "Character" then + game:ClearMessage() + waitingForCharacter = false + return connection:disconnect() + end + end) + setMessage "Requesting character" + local success, err = pcall(function() + replicator:RequestCharacter() + setMessage "Waiting for character" + waitingForCharacter = true + end) + if not success then + reportError(err, "W4C") + return + end +end +onConnectionAccepted = function(url, replicator) + local connectResolved, waitingForMarker = true, true + local success, err = pcall(function() + if not test then + visit:SetPing("_PING_URL", 30) + end + do + game:SetMessageBrickCount() + end + + replicator.Disconnection:connect(onDisconnection) + local marker = replicator:SendMarker() + return marker.Received:connect(function() + waitingForMarker = false + return requestCharacter(replicator) + end) + end) + if not success then + reportError(err, "ConnectionAccepted") + return + end + while waitingForMarker do + workspace:ZoomToExtents() + wait(0.5) + end +end +onConnectionFailed = function(_, err) + return showErrorWindow( + "Failed to connect to the Game. (ID=" .. tostring(err) .. ")", + "ID" .. tostring(err), + "Other" + ) +end +onConnectionRejected = function() + connectionFailed:disconnect() + return showErrorWindow("This game is not available. Please try another", "WrongVersion", "WrongVersion") +end +local idled = false +onPlayerIdled = function(time) + if time > 20 * 60 then + showErrorWindow(string.format("You were disconnected for being idle %d minutes", time / 60), "Idle", "Idle") + client:disconnect() + if not idled then + idled = true + end + end +end +pcall(function() + return settings().Diagnostics:LegacyScriptMode() +end) +local success, err = pcall(function() + game:SetRemoteBuildMode(true) + setMessage "Connecting to Server" + client.ConnectionAccepted:connect(onConnectionAccepted) + client.ConnectionRejected:connect(onConnectionRejected) + connectionFailed = client.ConnectionFailed:connect(onConnectionFailed) + client.Ticket = "" + playerConnectSucces, player = pcall(function() + return client:PlayerConnect(_USER_ID, "_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime) + end) + if not playerConnectSucces then + player = game:GetService("Players"):CreateLocalPlayer(_USER_ID) + client:Connect("_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime) + end + if not test then + delay(300, function() end) + end + do + local _with_0 = player + _with_0:SetSuperSafeChat(false) + pcall(function() + return _with_0:SetUnder13(false) + end) + pcall(function() + return _with_0:SetMembershipType(Enum.MembershipType._MEMBERSHIP_TYPE) + end) + pcall(function() + return _with_0:SetAccountAge(1) + end) + end + player.Idled:connect(onPlayerIdled) + pcall(function() + player.Name = [========[_USER_NAME]========] + end) + player.CharacterAppearance = "_CHAR_APPEARANCE" + if not test then + return visit:SetUploadUrl "" + end +end) +if not success then + reportError(err, "CreatePlayer") +end +if not test then + loadfile ""("", -1, 0) +end +pcall(function() + return game:SetScreenshotInfo "" +end) +return pcall(function() + return game:SetVideoInfo 'GamesROBLOX, video, free game, online virtual world' +end) diff --git a/lua/studio.lua b/lua/studio.lua new file mode 100644 index 0000000..d4d531c --- /dev/null +++ b/lua/studio.lua @@ -0,0 +1,60 @@ +print "[Mercury]: Loaded Studio corescript" +do + local _with_0 = game:GetService "InsertService" + pcall(function() + return _with_0:SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" + end) + pcall(function() + return _with_0:SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" + end) + game:GetService("ScriptInformationProvider"):SetAssetUrl "http://banland.xyz/Asset/" + _with_0:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" + _with_0:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" + _with_0:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" + _with_0:SetAssetUrl "http://banland.xyz/Asset/?id=%d" + _with_0:SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" + _with_0:SetTrustLevel(0) +end +do + local _with_0 = game:GetService "SocialService" + pcall(function() + return _with_0:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" + end) + pcall(function() + return _with_0:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" + end) + pcall(function() + return _with_0:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" + end) + pcall(function() + return _with_0:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" + end) + pcall(function() + return _with_0:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" + end) +end +pcall(function() + return game:GetService("GamePassService") + :SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" +end) +do + local _with_0 = game:GetService "MarketplaceService" + pcall(function() + return _with_0:SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" + end) + pcall(function() + return _with_0:SetDevProductInfoUrl "https://banland.xyz/marketplace/productDetails?productId=%d" + end) + pcall(function() + return _with_0:SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" + end) +end +local result, _ = pcall(function() + return game:GetService("ScriptContext"):AddStarterScript(37801172) +end) +if not result then + return pcall(function() + return game:GetService("ScriptContext") + :AddCoreScript(37801172, game:GetService("ScriptContext", "StarterScript")) + end) +end diff --git a/lua/visit.lua b/lua/visit.lua new file mode 100644 index 0000000..996a6df --- /dev/null +++ b/lua/visit.lua @@ -0,0 +1,127 @@ +print "[Mercury]: Loaded Visit corescript" +do + pcall(function() + return game:SetPlaceID(_PLACE_ID) + end) +end + +local visit, message = game:GetService "Visit", Instance.new "Message" +message.Parent = workspace +message.archivable = false +game:GetService("ScriptInformationProvider"):SetAssetUrl "http://banland.xyz/Asset/" +game:GetService("ContentProvider"):SetThreadPool(16) +pcall(function() + return game:GetService("InsertService") + :SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" +end) +pcall(function() + return game:GetService("InsertService") + :SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" +end) +settings().Diagnostics:LegacyScriptMode() +do + local _with_0 = game:GetService "InsertService" + _with_0:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" + _with_0:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" + _with_0:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" + _with_0:SetAssetUrl "http://banland.xyz/Asset/?id=%d" + _with_0:SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" +end +do + local _with_0 = game:GetService "SocialService" + pcall(function() + return _with_0:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" + end) + pcall(function() + return _with_0:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" + end) + pcall(function() + return _with_0:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" + end) + pcall(function() + return _with_0:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" + end) + pcall(function() + return _with_0:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" + end) +end +pcall(function() + return game:GetService("GamePassService") + :SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" +end) +pcall(function() + return game:SetCreatorID(0, Enum.CreatorType.User) +end) +pcall(function() + return game:SetScreenshotInfo "" +end) +pcall(function() + return game:SetVideoInfo "" +end) +pcall(function() + settings().Rendering.EnableFRM = true +end) +pcall(function() + settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError +end) +game:GetService("ChangeHistoryService"):SetEnabled(false) +pcall(function() + return game:GetService("Players") + :SetBuildUserPermissionsUrl "http://banland.xyz/Game/BuildActionPermissionCheck.ashx?assetId=0&userId=%d&isSolo=true" +end) +workspace:SetPhysicsThrottleEnabled(true) +local addedBuildTools, screenGui, doVisit = false, game:GetService("CoreGui"):FindFirstChild "RobloxGui", nil +doVisit = function() + message.Text = "Loading Game" + do + pcall(function() + return visit:SetUploadUrl "" + end) + end + + message.Text = "Running" + game:GetService("RunService"):Run() + message.Text = "Creating Player" + do + player = game:GetService("Players"):CreateLocalPlayer(0) + end + + player.CharacterAppearance = "" + local propExists, canAutoLoadChar = false, false + propExists = pcall(function() + canAutoLoadChar = game.Players.CharacterAutoLoads + end) + if (propExists and canAutoLoadChar) or not propExists then + player:LoadCharacter() + end + message.Text = "Setting GUI" + player:SetSuperSafeChat(true) + pcall(function() + return player:SetMembershipType(Enum.MembershipType.None) + end) + pcall(function() + return player:SetAccountAge(0) + end) +end +local success, err = pcall(doVisit) +if not addedBuildTools then + do + local _with_0 = Instance.new "StringValue" + _with_0.Name = "PlayerName" + _with_0.Value = player.Name + _with_0.RobloxLocked = true + _with_0.Parent = screenGui + end + pcall(function() + return game:GetService("ScriptContext"):AddCoreScript(59431535, screenGui, "BuildToolsScript") + end) + addedBuildTools = true +end +if success then + message.Parent = nil +else + print(err) + + wait(5) + message.Text = "Error on visit: " .. tostring(err) +end diff --git a/yue/107893730.yue b/yue/107893730.yue deleted file mode 100644 index 39ebb77..0000000 --- a/yue/107893730.yue +++ /dev/null @@ -1,1142 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- this script creates the gui and sends the web requests for in game purchase prompts - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - --- wait for important items to appear -wait 0.1 until Game -wait 0.1 until game\GetService "MarketplaceService" -wait 0.1 until game\FindFirstChild "CoreGui" -wait 0.1 until game.CoreGui\FindFirstChild "RobloxGui" - --------------------------------- Global Variables ---------------------------------------- --- utility variables -local RbxUtility -baseUrl = game\GetService"ContentProvider".BaseUrl\lower! - --- data variables -local currentProductInfo, currentAssetId, currentCurrencyType, currentCurrencyAmount, currentEquipOnPurchase, currentProductId, currentServerResponseTable -checkingPlayerFunds = false -local openBCUpSellWindowConnection -purchasingConsumable = false -enableBrowserWindowClosedEvent = true - --- gui variables -local openBuyCurrencyWindowConnection -currentlyPrompting = false -local purchaseDialog -tweenTime = 0.3 -showPosition = UDim2.new 0.5, -330, 0.5, -200 -hidePosition = UDim2.new 0.5, -330, 1, 25 -local isSmallScreen -spinning = false -local spinnerIcons -smallScreenThreshold = 450 - --- user facing images -assetUrls = {} -assetUrl = (str) -> "http://banland.xyz/asset/?id=#{str}" -errorImageUrl = assetUrl "42557901" -table.insert assetUrls, errorImageUrl -buyImageUrl = assetUrl "104651457" -table.insert assetUrls, buyImageUrl -buyImageDownUrl = assetUrl "104651515" -table.insert assetUrls, buyImageDownUrl -buyImageDisabledUrl = assetUrl "104651532" -table.insert assetUrls, buyImageDisabledUrl -cancelButtonImageUrl = assetUrl "104651592" -table.insert assetUrls, cancelButtonImageUrl -cancelButtonDownUrl = assetUrl "104651639" -table.insert assetUrls, cancelButtonDownUrl -okButtonUrl = assetUrl "104651665" -table.insert assetUrls, okButtonUrl -okButtonPressedrl = assetUrl "104651707" -table.insert assetUrls, okButtonPressedrl -freeButtonImageUrl = assetUrl "104651733" -table.insert assetUrls, freeButtonImageUrl -freeButtonImageDownUrl = assetUrl "104651761" -table.insert assetUrls, freeButtonImageDownUrl -tixIcon = assetUrl "102481431" -table.insert assetUrls, tixIcon -robuxIcon = assetUrl "102481419" -table.insert assetUrls, robuxIcon - --- user facing string -buyHeaderText = "Buy" -takeHeaderText = "Take" -buyFailedHeaderText = "An Error Occurred" - -errorPurchasesDisabledText = "in-game purchases are disabled" -errorPurchasesUnknownText = "Roblox is performing maintenance" - -purchaseSucceededText = "Your purchase of itemName succeeded!" -purchaseFailedText = "Your purchase of itemName failed because errorReason. Your account has not been charged. Please try again soon." -productPurchaseText = "Would you like to buy 'itemName' for currencyType currencyAmount?" -freeItemPurchaseText = "Would you like to take the assetType 'itemName' for FREE?" -freeItemBalanceText = "Your balance of Robux or Tix will not be affected by this transaction." - --------------------------------- End Global Variables ---------------------------------------- - ------------------------------ Util Functions --------------------------------------------- -getSecureApiBaseUrl = -> - secureApiUrl = string.gsub baseUrl, "http", "https" - secureApiUrl = string.gsub secureApiUrl, "www", "api" - secureApiUrl - - -getRbxUtility = -> - if not RbxUtility - RbxUtility = LoadLibrary "RbxUtility" - RbxUtility - - -preloadAssets = -> - for i in *assetUrls - game\GetService"ContentProvider"\Preload i - - ------------------------------ End Util Functions --------------------------------------------- - --------------------------------- Accept/Decline Functions -------------------------------------- -removeCurrentPurchaseInfo = -> - currentAssetId \ - = currentCurrencyType \ - = currentCurrencyAmount \ - = currentEquipOnPurchase \ - = currentProductId \ - = currentProductInfo \ - = currentServerResponseTable \ - = nil - - checkingPlayerFunds = false - -hidePurchasing = -> - purchaseDialog.PurchasingFrame.Visible = false - spinning = false - -closePurchasePrompt = -> - purchaseDialog\TweenPosition( - hidePosition, - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - tweenTime, - true, - -> - game.GuiService\RemoveCenterDialog purchaseDialog - hidePurchasing! - purchaseDialog.Visible = false - currentlyPrompting = false - ) - --- convenience method to say exactly what buttons should be visible (all others are not!) -setButtonsVisible = (...) -> - args = { ... } - argCount = select "#", ... - - bodyFrameChildren = purchaseDialog.BodyFrame\GetChildren! - for i in *bodyFrameChildren - if i\IsA "GuiButton" - i.Visible = false - for j = 1, argCount - if i == args[j] - i.Visible = true - break - -signalPromptEnded = (isSuccess) -> - closePurchasePrompt! - if purchasingConsumable - game\GetService"MarketplaceService" - \SignalPromptProductPurchaseFinished game.Players.LocalPlayer.userId, currentProductId, isSuccess - else - game\GetService"MarketplaceService" - \SignalPromptPurchaseFinished game.Players.LocalPlayer, currentAssetId, isSuccess - - removeCurrentPurchaseInfo! - -userPurchaseActionsEnded = (isSuccess) -> - checkingPlayerFunds = false - - if isSuccess -- show the user we bought the item successfully, when they close this dialog we will call signalPromptEnded - newPurchasedSucceededText = string.gsub( - purchaseSucceededText, "itemName", - "#{currentProductInfo["Name"]}" - ) - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText - setButtonsVisible purchaseDialog.BodyFrame.OkPurchasedButton - hidePurchasing! - else -- otherwise we didn't purchase, no need to show anything, just signal and close dialog - signalPromptEnded isSuccess - -isFreeItem = -> - -- if both of these are true, then the item is free, just prompt user if they want to take one - currentProductInfo and - currentProductInfo["IsForSale"] == true and - currentProductInfo["IsPublicDomain"] == true - -setHeaderText = (text) -> - purchaseDialog.TitleLabel.Text = text - purchaseDialog.TitleBackdrop.Text = text - --- oi, this is ugly -assetTypeToString = (assetType) -> - switch assetType - when 1 then "Image" - when 2 then "T-Shirt" - when 3 then "Audio" - when 4 then "Mesh" - when 5 then "Lua" - when 6 then "HTML" - when 7 then "Text" - when 8 then "Hat" - when 9 then "Place" - when 10 then "Model" - when 11 then "Shirt" - when 12 then "Pants" - when 13 then "Decal" - when 16 then "Avatar" - when 17 then "Head" - when 18 then "Face" - when 19 then "Gear" - when 21 then "Badge" - when 22 then "Group Emblem" - when 24 then "Animation" - when 25 then "Arms" - when 26 then "Legs" - when 27 then "Torso" - when 28 then "Right Arm" - when 29 then "Left Arm" - when 30 then "Left Leg" - when 31 then "Right Leg" - when 32 then "Package" - when 33 then "YouTube Video" - when 34 then "Game Pass" - when 0 then "Product" - else "" - -currencyTypeToString = (currencyType) -> - if currencyType == Enum.CurrencyType.Tix - "Tix" - else - "R$" - --- make sure our gui displays the proper purchase data, and set the productid we will try and buy if use specifies a buy action -updatePurchasePromptData = (_) -> - newItemDescription = "" - - -- id to use when we request a purchase - if not currentProductId - currentProductId = currentProductInfo["ProductId"] - - - if isFreeItem! - newItemDescription = string.gsub freeItemPurchaseText, "itemName", "#{currentProductInfo["Name"]}" - newItemDescription = string.gsub( - newItemDescription, "assetType", - "#{assetTypeToString currentProductInfo["AssetTypeId"]}" - ) - setHeaderText takeHeaderText - else -- otherwise item costs something, so different prompt - newItemDescription = string.gsub productPurchaseText, "itemName", "#{currentProductInfo["Name"]}" - newItemDescription = string.gsub( - newItemDescription, "currencyType", - "#{currencyTypeToString currentCurrencyType}" - ) - newItemDescription = string.gsub newItemDescription, "currencyAmount", "#{currentCurrencyAmount}" - setHeaderText buyHeaderText - - - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newItemDescription - - purchaseDialog.BodyFrame.ItemPreview.Image = "#{baseUrl}thumbs/asset.ashx?assetid=" .. - if purchasingConsumable - "#{currentProductInfo["IconImageAssetId"]}&x=100&y=100&format=png" - else - "#{currentAssetId}&x=100&y=100&format=png" - --- figure out what currency to use based on the currency you can actually sell the item in and what the script specified -setCurrencyAmountAndType = (priceInRobux, priceInTix) -> - if currentCurrencyType == Enum.CurrencyType.Default or currentCurrencyType == Enum.CurrencyType.Robux -- sell for default (user doesn't care) or robux - if priceInRobux? and priceInRobux ~= 0 -- we can sell for robux - currentCurrencyAmount = priceInRobux - currentCurrencyType = Enum.CurrencyType.Robux - else -- have to use tix - currentCurrencyAmount = priceInTix - currentCurrencyType = Enum.CurrencyType.Tix - - elseif currentCurrencyType == Enum.CurrencyType.Tix -- we want to sell for tix - if priceInTix? and priceInTix ~= 0 -- we can sell for tix - currentCurrencyAmount = priceInTix - currentCurrencyType = Enum.CurrencyType.Tix - else -- have to use robux - currentCurrencyAmount = priceInRobux - currentCurrencyType = Enum.CurrencyType.Robux - - else - return false - - - if currentCurrencyAmount == nil - return false - true - --- will get the player's balance of robux and tix, return in a table -getPlayerBalance = -> - local playerBalance - success, errorCode = try - playerBalance = game\HttpGetAsync "#{getSecureApiBaseUrl!}currency/balance" - - if not success - print "Get player balance failed because", errorCode - return nil - - if playerBalance == "" - return nil - - playerBalance = getRbxUtility!.DecodeJSON playerBalance - playerBalance - --- more enum to int fun! -membershipTypeToNumber = (membership) -> - switch membership - when Enum.MembershipType.None then 0 - when Enum.MembershipType.BuildersClub then 1 - when Enum.MembershipType.TurboBuildersClub then 2 - when Enum.MembershipType.OutrageousBuildersClub then 3 - else -1 - --- should open an external default browser window to this url -openBuyCurrencyWindow = -> - checkingPlayerFunds = true - game\GetService"GuiService"\OpenBrowserWindow "#{baseUrl}Upgrades/Robux.aspx" - --- set up the gui text at the bottom of the prompt (alerts user to how much money they will have left, or if they need to buy more to buy the item) -updateAfterBalanceText = (playerBalance, notRightBc) -> - if isFreeItem! - purchaseDialog.BodyFrame.AfterBalanceButton.Text = freeItemBalanceText - return true, false - - local keyWord - keyWord = if currentCurrencyType == Enum.CurrencyType.Robux - "robux" - elseif currentCurrencyType == Enum.CurrencyType.Tix - "tickets" - - if not keyWord - return false - - playerBalanceNumber = tonumber playerBalance[keyWord] - if not playerBalanceNumber - return false - - afterBalanceNumber = playerBalanceNumber - currentCurrencyAmount - - -- check to see if we have enough of the desired currency to allow a purchase, if not we need to prompt user to buy robux - if not notRightBc - if afterBalanceNumber < 0 and keyWord == "robux" - if openBuyCurrencyWindowConnection == nil - openBuyCurrencyWindowConnection = purchaseDialog.BodyFrame.AfterBalanceButton.MouseButton1Click\connect openBuyCurrencyWindow - - purchaseDialog.BodyFrame.AfterBalanceButton.Text = "You need " .. - "#{currencyTypeToString currentCurrencyType} #{-afterBalanceNumber}" .. - " more to buy this, click here to purchase more." - return true, true - elseif afterBalanceNumber < 0 and keyWord == "tickets" - purchaseDialog.BodyFrame.AfterBalanceButton.Text = "You need #{-afterBalanceNumber} " .. - "#{currencyTypeToString currentCurrencyType} more to buy this item." - return true, true -- user can't buy more tickets, so we say fail the transaction (maybe instead we can prompt them to trade currency???) - - - -- this ensures that we only have one connection to openBuyCurrencyWindow at a time (otherwise might open multiple browser windows) - if openBuyCurrencyWindowConnection - openBuyCurrencyWindowConnection\disconnect! - openBuyCurrencyWindowConnection = nil - - purchaseDialog.BodyFrame.AfterBalanceButton.Text = "Your balance after this transaction will be " .. - "#{currencyTypeToString currentCurrencyType} #{afterBalanceNumber}." - true, false - --- This functions checks to make sure the purchase is even possible, if not it returns false and we don't prompt user (some situations require user feedback when we won't prompt) -canPurchaseItem = -> - -- first we see if player already owns the asset/get the productinfo - playerOwnsAsset = false - notRightBc = false - local descText - success = false - - if purchasingConsumable - local currentProductInfoRaw - success = try - currentProductInfoRaw = Game\HttpGetAsync "#{getSecureApiBaseUrl!}marketplace/productDetails?productid=#{currentProductId}" - - if success - currentProductInfo = getRbxUtility!.DecodeJSON currentProductInfoRaw - - else - success = try - currentProductInfo = game\GetService"MarketplaceService"\GetProductInfo currentAssetId - - - if currentProductInfo == nil or not success - descText = "In-game sales are temporarily disabled. Please try again later." - return true, nil, nil, true, descText - - - if not purchasingConsumable - if not currentAssetId - print "current asset id is nil, this should always have a value" - return false - - if currentAssetId <= 0 - print "current asset id is negative, this should always be positive" - return false - - - success, errorCode = try - playerOwnsAsset = game\HttpGetAsync( - getSecureApiBaseUrl! .. - "ownership/hasAsset?userId=#{game.Players.LocalPlayer.userId}" .. - "&assetId=#{currentAssetId}" - ) - - - if not success - print "could not tell if player owns asset because", errorCode - return false - - if playerOwnsAsset == true or playerOwnsAsset == "true" - descText = "You already own this item." - return true, nil, nil, true, descText - - - purchaseDialog.BodyFrame.AfterBalanceButton.Visible = true - - -- next we parse through product info and see if we can purchase - - if type(currentProductInfo) ~= "table" - currentProductInfo = getRbxUtility!.DecodeJSON currentProductInfo - - - if not currentProductInfo - descText = "Could not get product info. Please try again later." - return true, nil, nil, true, descText - - - if currentProductInfo["IsForSale"] == false and currentProductInfo["IsPublicDomain"] == false - descText = "This item is no longer for sale." - return true, nil, nil, true, descText - - - -- now we start talking money, making sure we are going to be able to purchase this - if not setCurrencyAmountAndType( - tonumber(currentProductInfo["PriceInRobux"]), - tonumber currentProductInfo["PriceInTickets"] - ) - descText = "We could retrieve the price of the item correctly. Please try again later." - return true, nil, nil, true, descText - - - playerBalance = getPlayerBalance! - if not playerBalance - descText = "Could not retrieve your balance. Please try again later." - return true, nil, nil, true, descText - - - if tonumber(currentProductInfo["MinimumMembershipLevel"]) > - membershipTypeToNumber game.Players.LocalPlayer.MembershipType - - notRightBc = true - - - updatedBalance, insufficientFunds = updateAfterBalanceText playerBalance, notRightBc - - if notRightBc - purchaseDialog.BodyFrame.AfterBalanceButton.Active = true - return true, insufficientFunds, notRightBc, false - - - if currentProductInfo["ContentRatingTypeId"] == 1 - if game.Players.LocalPlayer\GetUnder13! - descText = "Your account is under 13 so purchase of this item is not allowed." - return true, nil, nil, true, descText - - - if (currentProductInfo["IsLimited"] == true or currentProductInfo["IsLimitedUnique"] == true) and - ( - currentProductInfo["Remaining"] == "" or - currentProductInfo["Remaining"] == 0 or - not currentProductInfo["Remaining"]? - ) - - descText = "All copies of this item have been sold out! Try buying from other users on the website." - return true, nil, nil, true, descText - - - if not updatedBalance - descText = "Could not update your balance. Please check back after some time." - return true, nil, nil, true, descText - - - -- we use insufficient funds to display a prompt to buy more robux - purchaseDialog.BodyFrame.AfterBalanceButton.Active = true - true, insufficientFunds - -doPlayerFundsCheck = (checkIndefinitely) -> - if checkingPlayerFunds - canPurchase, insufficientFunds = canPurchaseItem! -- check again to see if we can buy item - if canPurchase and insufficientFunds -- wait a bit and try a few more times - retries = 1000 - while (retries > 0 or checkIndefinitely) and insufficientFunds and checkingPlayerFunds and canPurchase - wait 1 / 10 - canPurchase, insufficientFunds = canPurchaseItem! - retries -= 1 - - - if canPurchase and not insufficientFunds - -- we can buy item! set our buttons up and we will exit this loop - setButtonsVisible( - purchaseDialog.BodyFrame.BuyButton, - purchaseDialog.BodyFrame.CancelButton, - purchaseDialog.BodyFrame.AfterBalanceButton - ) - -openBCUpSellWindow = -> - Game\GetService"GuiService"\OpenBrowserWindow "#{baseUrl}Upgrades/BuildersClubMemberships.aspx" - --- user pressed the cancel button, just remove all purchasing prompts -doDeclinePurchase = -> - userPurchaseActionsEnded false - -showPurchasePrompt = -> - canPurchase, insufficientFunds, notRightBC, override, descText = canPurchaseItem! - - if canPurchase - updatePurchasePromptData! - - with purchaseDialog - if override and descText - .BodyFrame.ItemPreview.ItemDescription.Text = descText - .BodyFrame.AfterBalanceButton.Visible = false - - game.GuiService\AddCenterDialog( - purchaseDialog, - Enum.CenterDialogType.ModalDialog, - --ShowFunction - -> - -- set the state for our buttons - .Visible = true - if isFreeItem! - setButtonsVisible( - .BodyFrame.FreeButton, - .BodyFrame.CancelButton, - .BodyFrame.AfterBalanceButton - ) - elseif notRightBC - .BodyFrame.AfterBalanceButton.Text = "You require an upgrade to your Builders Club membership to purchase this item. Click here to upgrade." - if not openBCUpSellWindowConnection - openBCUpSellWindowConnection = .BodyFrame.AfterBalanceButton.MouseButton1Click\connect -> - if .BodyFrame.AfterBalanceButton.Text == - "You require an upgrade to your Builders Club membership to purchase this item. Click here to upgrade." - - openBCUpSellWindow! - - - setButtonsVisible( - .BodyFrame.BuyDisabledButton, - .BodyFrame.CancelButton, - .BodyFrame.AfterBalanceButton - ) - elseif insufficientFunds - setButtonsVisible( - .BodyFrame.BuyDisabledButton, - .BodyFrame.CancelButton, - .BodyFrame.AfterBalanceButton - ) - elseif override - setButtonsVisible .BodyFrame.BuyDisabledButton, .BodyFrame.CancelButton -- , .BodyFrame.AfterBalanceButton) - else - setButtonsVisible .BodyFrame.BuyButton, .BodyFrame.CancelButton -- , .BodyFrame.AfterBalanceButton) - - - \TweenPosition( - showPosition, - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - tweenTime, - true - ) - - if canPurchase and insufficientFunds and not enableBrowserWindowClosedEvent - checkingPlayerFunds = true - doPlayerFundsCheck true - - --HideFunction - -> .Visible = false - ) - else -- we failed in prompting a purchase, do a decline - doDeclinePurchase! - - --- given an asset id, this function will grab that asset from the website, and return the first "Tool" object found inside it -getToolAssetID = (assetID) -> - newTool = game\GetService"InsertService"\LoadAsset assetID - return if not newTool - - if newTool\IsA "Tool" - return newTool - - toolChildren = newTool\GetChildren! - for i in *toolChildren - if i\IsA "Tool" - return i - --- the user tried to purchase by clicking the purchase button, but something went wrong. --- let them know their account was not charged, and that they do not own the item yet. -purchaseFailed = (inGamePurchasesDisabled) -> - name = "Item" - if currentProductInfo - name = currentProductInfo["Name"] - - - newPurchasedFailedText = string.gsub purchaseFailedText, "itemName", "#{name}" - if inGamePurchasesDisabled - newPurchasedFailedText = string.gsub( - newPurchasedFailedText, "errorReason", - "#{errorPurchasesDisabledText}" - ) - else - newPurchasedFailedText = string.gsub newPurchasedFailedText, "errorReason", "#{errorPurchasesUnknownText}" - - - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedFailedText - purchaseDialog.BodyFrame.ItemPreview.Image = errorImageUrl - - setButtonsVisible purchaseDialog.BodyFrame.OkButton - - setHeaderText buyFailedHeaderText - - hidePurchasing! - -startSpinner = -> - spinning = true - Spawn -> - spinPos = 0 - while spinning - pos = 0 - - while pos < 8 - spinnerIcons[pos + 1].Image = "http://banland.xyz/asset/?id=" .. - if pos == spinPos or pos == (spinPos + 1) % 8 - "45880668" - else - "45880710" - - pos += 1 - - spinPos = (spinPos + 1) % 8 - wait 1 / 15 - --- next two functions control the "Purchasing..." overlay -showPurchasing = -> - startSpinner! - purchaseDialog.PurchasingFrame.Visible = true - --- enums have no implicit conversion to numbers in lua, has to have a function to do this -currencyEnumToInt = (currencyEnum) -> - if currencyEnum == Enum.CurrencyType.Robux or currencyEnum == Enum.CurrencyType.Default - 1 - elseif currencyEnum == Enum.CurrencyType.Tix - 2 - --- user has specified they want to buy an item, now try to attempt to buy it for them -doAcceptPurchase = (_) -> - showPurchasing! -- shows a purchasing ui (shows spinner) - - startTime = tick! - - -- http call to do the purchase - response = "none" - local url - - -- consumables need to use a different url - if purchasingConsumable - url = getSecureApiBaseUrl! .. - "marketplace/submitpurchase?productId=#{currentProductId}" .. - "¤cyTypeId=#{currencyEnumToInt currentCurrencyType}" .. - "&expectedUnitPrice=#{currentCurrencyAmount}" .. - "&placeId=#{Game.PlaceId}" - else - url = getSecureApiBaseUrl! .. - "marketplace/purchase?productId=#{currentProductId}" .. - "¤cyTypeId=#{currencyEnumToInt currentCurrencyType}" .. - "&purchasePrice=#{currentCurrencyAmount}" .. - "&locationType=Game" .. - "&locationId=#{Game.PlaceId}" - - - success, reason = try - response = game\HttpPostAsync url, "RobloxPurchaseRequest" - - - -- debug output for us (found in the logs from local) - print "doAcceptPurchase success from ypcall is ", success, "reason is", reason - - if (tick! - startTime) < 1 - wait 1 -- allow the purchasing waiting dialog to at least be readable (otherwise it might flash, looks bad)... - - - -- check to make sure purchase actually happened on the web end - if response == "none" or not response? or response == "" - print "did not get a proper response from web on purchase of", currentAssetId, currentProductId - purchaseFailed! - return - - - -- parse our response, decide how to react - response = getRbxUtility!.DecodeJSON response - - if response - if response["success"] == false and - response["status"] ~= "AlreadyOwned" - - print "web return response of fail on purchase of", currentAssetId, currentProductId - purchaseFailed response["status"] == "EconomyDisabled" - return - - else - print "web return response of non parsable JSON on purchase of", currentAssetId - purchaseFailed! - return - - - -- check to see if this item was bought, and if we want to equip it (also need to make sure the asset type was gear) - if currentEquipOnPurchase and success and currentAssetId and tonumber(currentProductInfo["AssetTypeId"]) == 19 - if tool = getToolAssetID tonumber currentAssetId - tool.Parent = game.Players.LocalPlayer.Backpack - - - if purchasingConsumable - if not response["receipt"] - print "tried to buy productId, but no receipt returned. productId was", currentProductId - purchaseFailed! - return - - Game\GetService"MarketplaceService" - \SignalClientPurchaseSuccess( - "#{response["receipt"]}", - game.Players.LocalPlayer.userId, - currentProductId - ) - else - userPurchaseActionsEnded success - --------------------------------- End Accept/Decline Functions -------------------------------------- - ----------------------------------------------- Data Functions ----------------------------------------------------- - --- computeSpaceString = (pLabel) -> --- nString = " " --- tempSpaceLabel = New "TextButton", "SpaceButton" --- Size: UDim2.new 0, pLabel.AbsoluteSize.X, 0, pLabel.AbsoluteSize.Y --- FontSize: pLabel.FontSize --- Parent: pLabel.Parent --- BackgroundTransparency: 1 --- Text: nString - --- while tempSpaceLabel.TextBounds.X < pLabel.TextBounds.X --- nString ..= " " --- tempSpaceLabel.Text = nString --- nString ..= " " --- tempSpaceLabel.Text = "" --- nString - ----------------------------------------------- End Data Functions ----------------------------------------------------- - ----------------------------------------------- Gui Functions ---------------------------------------------- - --- used for the "Purchasing..." frame -createSpinner = (size, position, parent) -> - spinnerFrame = New "Frame", "Spinner" - Size: size - Position: position - BackgroundTransparency: 1 - ZIndex: 10 - Parent: parent - - spinnerIcons = {} - spinnerNum = 1 - while spinnerNum <= 8 - spinnerImage = New "ImageLabel", "Spinner#{spinnerNum}" - Size: UDim2.new 0, 16, 0, 16 - Position: UDim2.new( - 0.5 + 0.3 * math.cos(math.rad 45 * spinnerNum), - -8, - 0.5 + 0.3 * math.sin(math.rad 45 * spinnerNum), - -8 - ) - BackgroundTransparency: 1 - ZIndex: 10 - Image: "http://banland.xyz/asset/?id=45880710" - Parent: spinnerFrame - - spinnerIcons[spinnerNum] = spinnerImage - spinnerNum += 1 - --- next 2 functions are convenienvce creation functions for guis -createTextObject = (name, text, type, size) -> - New type, name, - Font: Enum.Font.ArialBold - TextColor3: Color3.new 217 / 255, 217 / 255, 217 / 255 - TextWrapped: true - Text: text - BackgroundTransparency: 1 - BorderSizePixel: 0 - FontSize: size - -createImageButton = (name) -> - New "ImageButton", name, - Size: UDim2.new 0, 153, 0, 46 - -userPurchaseProductActionsEnded = (userIsClosingDialog) -> - checkingPlayerFunds = false - - if userIsClosingDialog - closePurchasePrompt! - if currentServerResponseTable - isPurchased = false - if "#{currentServerResponseTable["isValid"]}"\lower! == "true" - isPurchased = true - - Game\GetService"MarketplaceService"\SignalPromptProductPurchaseFinished( - tonumber(currentServerResponseTable["playerId"]), - tonumber(currentServerResponseTable["productId"]), - isPurchased - ) - else - print "Something went wrong, no currentServerResponseTable" - - removeCurrentPurchaseInfo! - else - newPurchasedSucceededText = string.gsub( - purchaseSucceededText, "itemName", - "#{currentProductInfo["Name"]}" - ) - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText - setButtonsVisible purchaseDialog.BodyFrame.OkPurchasedButton - hidePurchasing! - --- all the gui init. Would be nice if this didn't have to be a script -createPurchasePromptGui = -> - purchaseDialog = New "Frame", "PurchaseFrame" - Size: UDim2.new 0, 660, 0, 400 - Position: hidePosition - Visible: false - BackgroundColor3: Color3.new 141 / 255, 141 / 255, 141 / 255 - BorderColor3: Color3.new 204 / 255, 204 / 255, 204 / 255 - Parent: game.CoreGui.RobloxGui - - * New "Frame", "BodyFrame" - Size: UDim2.new 1, 0, 1, -60 - Position: UDim2.new 0, 0, 0, 60 - BackgroundColor3: Color3.new 67 / 255, 67 / 255, 67 / 255 - BorderSizePixel: 0 - ZIndex: 8 - - bodyFrame = purchaseDialog.BodyFrame - - with createTextObject "TitleLabel", "Buy Item", "TextLabel", Enum.FontSize.Size48 - .ZIndex = 8 - .Size = UDim2.new 1, 0, 0, 60 - with \Clone! - .Name = "TitleBackdrop" - .TextColor3 = Color3.new 32 / 255, 32 / 255, 32 / 255 - .BackgroundTransparency = 0.0 - .BackgroundColor3 = Color3.new 54 / 255, 96 / 255, 171 / 255 - .Position = UDim2.new 0, 0, 0, -2 - .ZIndex = 8 - .Parent = purchaseDialog - .Parent = purchaseDialog - - distanceBetweenButtons = 90 - - with createImageButton "CancelButton" - .Position = UDim2.new 0.5, distanceBetweenButtons / 2, 1, -120 - .BackgroundTransparency = 1 - .BorderSizePixel = 0 - .Parent = bodyFrame - .Modal = true - .ZIndex = 8 - .Image = cancelButtonImageUrl - .MouseButton1Down\connect -> - .Image = cancelButtonDownUrl - - .MouseButton1Up\connect -> - .Image = cancelButtonImageUrl - - .MouseLeave\connect -> - .Image = cancelButtonImageUrl - - .MouseButton1Click\connect doDeclinePurchase - - buyButton = createImageButton "BuyButton" - with buyButton - .Position = UDim2.new 0.5, -153 - (distanceBetweenButtons / 2), 1, -120 - .BackgroundTransparency = 1 - .BorderSizePixel = 0 - .Image = buyImageUrl - .ZIndex = 8 - .MouseButton1Down\connect -> - .Image = buyImageDownUrl - - .MouseButton1Up\connect -> - .Image = buyImageUrl - - .MouseLeave\connect -> - .Image = buyImageUrl - - .Parent = bodyFrame - - with buyButton\Clone! - .Name = "BuyDisabledButton" - .AutoButtonColor = false - .Visible = false - .Active = false - .Image = buyImageDisabledUrl - .ZIndex = 8 - .Parent = bodyFrame - - freeButton = buyButton\Clone! - with freeButton - .BackgroundTransparency = 1 - .Name = "FreeButton" - .Visible = false - .ZIndex = 8 - .Image = freeButtonImageUrl - .MouseButton1Down\connect -> - .Image = freeButtonImageDownUrl - - .MouseButton1Up\connect -> - .Image = freeButtonImageUrl - - .MouseLeave\connect -> - .Image = freeButtonImageUrl - - .Parent = bodyFrame - - okButton = buyButton\Clone! - with okButton - .Name = "OkButton" - .BackgroundTransparency = 1 - .Visible = false - .Position = UDim2.new 0.5, -.Size.X.Offset / 2, 1, -120 - .Modal = true - .Image = okButtonUrl - .ZIndex = 8 - .MouseButton1Down\connect -> - .Image = okButtonPressedrl - - .MouseButton1Up\connect -> - .Image = okButtonUrl - - .MouseLeave\connect -> - .Image = okButtonUrl - - .Parent = bodyFrame - - with okButton\Clone! - .ZIndex = 8 - .Name = "OkPurchasedButton" - .MouseButton1Down\connect -> - .Image = okButtonPressedrl - - .MouseButton1Up\connect -> - .Image = okButtonUrl - - .MouseLeave\connect -> - .Image = okButtonUrl - - .Parent = bodyFrame - - .MouseButton1Click\connect -> - if purchasingConsumable - userPurchaseProductActionsEnded true - else - signalPromptEnded true - - okButton.MouseButton1Click\connect -> - userPurchaseActionsEnded false - - buyButton.MouseButton1Click\connect -> - doAcceptPurchase Enum.CurrencyType.Robux - - freeButton.MouseButton1Click\connect -> - doAcceptPurchase false - - itemPreview = New "ImageLabel", "ItemPreview" - BackgroundColor3: Color3.new 32 / 255, 32 / 255, 32 / 255 - BorderColor3: Color3.new 141 / 255, 141 / 255, 141 / 255 - Position: UDim2.new 0, 30, 0, 20 - Size: UDim2.new 0, 180, 0, 180 - ZIndex: 9 - Parent: bodyFrame - - with createTextObject( - "ItemDescription", - "Would you like to buy the 'itemName' for currencyType currencyAmount?", - "TextLabel", - Enum.FontSize.Size24 - ) - .Position = UDim2.new 1, 20, 0, 0 - .Size = UDim2.new 0, 410, 1, 0 - .ZIndex = 8 - .Parent = itemPreview - - with createTextObject( - "AfterBalanceButton", - "Place holder text ip sum lorem dodo ashs", - "TextButton", - Enum.FontSize.Size24 - ) - .AutoButtonColor = false - .TextColor3 = Color3.new 222 / 255, 59 / 255, 30 / 255 - .Position = UDim2.new 0, 5, 1, -55 - .Size = UDim2.new 1, -10, 0, 50 - .ZIndex = 8 - .Parent = bodyFrame - - purchasingFrame = New "Frame", "PurchasingFrame" - Size: UDim2.new 1, 0, 1, 0 - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.2 - BorderSizePixel: 0 - ZIndex: 9 - Visible: false - Active: true - Parent: purchaseDialog - - purchasingLabel = createTextObject "PurchasingLabel", "Purchasing...", "TextLabel", Enum.FontSize.Size48 - with purchasingLabel - .Size = UDim2.new 1, 0, 1, 0 - .ZIndex = 10 - .Parent = purchasingFrame - - createSpinner UDim2.new(0, 50, 0, 50), UDim2.new(0.5, -25, 0.5, 30), purchasingLabel - -cutSizeInHalfRecursive = (_) -> - -- todo: change the gui size based on how much space we have - --[[changeSize instance,0.5 - - children = instance\GetChildren! - for i in *children - cutSizeInHalfRecursive i - ]] - - -doubleSizeRecursive = (_) -> - -- todo: change the gui size based on how much space we have - --[[changeSize instance,2 - - children = instance\GetChildren! - for i in *children - doubleSizeRecursive i - ]] - --- depending on screen size, we need to change the gui -changeGuiToScreenSize = (smallScreen) -> - if smallScreen - cutSizeInHalfRecursive purchaseDialog - else - doubleSizeRecursive purchaseDialog - -doPurchasePrompt = (player, assetId, equipIfPurchased, currencyType, productId) -> - if not purchaseDialog - createPurchasePromptGui! - - - if player == game.Players.LocalPlayer - return if currentlyPrompting - - currentlyPrompting = true - - currentAssetId = assetId - currentProductId = productId - currentCurrencyType = currencyType - currentEquipOnPurchase = equipIfPurchased - - purchasingConsumable = currentProductId? - - showPurchasePrompt! - -doProcessServerPurchaseResponse = (serverResponseTable) -> - if not serverResponseTable - print "Server response table was nil, cancelling purchase" - purchaseFailed! - return - - - if serverResponseTable["playerId"] and - tonumber(serverResponseTable["playerId"]) == game.Players.LocalPlayer.userId - - currentServerResponseTable = serverResponseTable - userPurchaseProductActionsEnded false - - ----------------------------------------------- End Gui Functions ---------------------------------------------- - ----------------------------------------------- Script Event start/initialization ---------------------------------------------- -preloadAssets! - -game\GetService"MarketplaceService".PromptProductPurchaseRequested - \connect (player, productId, equipIfPurchased, currencyType) -> - doPurchasePrompt player, nil, equipIfPurchased, currencyType, productId - - -Game\GetService"MarketplaceService".PromptPurchaseRequested - \connect (player, assetId, equipIfPurchased, currencyType) -> - doPurchasePrompt player, assetId, equipIfPurchased, currencyType, nil - - -Game\GetService"MarketplaceService".ServerPurchaseVerification\connect (serverResponseTable) -> - doProcessServerPurchaseResponse serverResponseTable - - -if enableBrowserWindowClosedEvent - Game\GetService"GuiService".BrowserWindowClosed\connect -> - doPlayerFundsCheck false - - -Game.CoreGui.RobloxGui.Changed\connect -> - nowIsSmallScreen = game.CoreGui.RobloxGui.AbsoluteSize.Y <= smallScreenThreshold - changeGuiToScreenSize if nowIsSmallScreen and not isSmallScreen - true - elseif not nowIsSmallScreen and isSmallScreen - false - - isSmallScreen = nowIsSmallScreen - -if isSmallScreen = game.CoreGui.RobloxGui.AbsoluteSize.Y <= smallScreenThreshold - changeGuiToScreenSize true - diff --git a/yue/152908679.yue b/yue/152908679.yue deleted file mode 100644 index ac63fa6..0000000 --- a/yue/152908679.yue +++ /dev/null @@ -1,247 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- ContextActionTouch.lua --- Created by Ben Tkacheff --- this script controls ui and firing of lua functions that are bound in ContextActionService for touch inputs --- Essentially a user can bind a lua function to a key code, input type (mousebutton1 etc.) and this - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - --- Variables -contextActionService = Game\GetService "ContextActionService" -isTouchDevice = Game\GetService"UserInputService".TouchEnabled -functionTable = {} -buttonVector = {} -local buttonScreenGui -local buttonFrame - -ContextDownImage = "http://www.banland.xyz/asset/?id=97166756" -ContextUpImage = "http://www.banland.xyz/asset/?id=97166444" - -oldTouches = {} - -buttonPositionTable = - * UDim2.new 0, 123, 0, 70 - * UDim2.new 0, 30, 0, 60 - * UDim2.new 0, 180, 0, 160 - * UDim2.new 0, 85, 0, -25 - * UDim2.new 0, 185, 0, -25 - * UDim2.new 0, 185, 0, 260 - * UDim2.new 0, 216, 0, 65 - -maxButtons = #buttonPositionTable - --- Preload images -with Game\GetService"ContentProvider" - \Preload ContextDownImage - \Preload ContextUpImage - -wait! until Game.Players -wait! until Game.Players.LocalPlayer - -createContextActionGui = -> - if not buttonScreenGui and isTouchDevice - buttonScreenGui = New "ScreenGui", "ContextActionGui" - * New "Frame", "ContextButtonFrame" - BackgroundTransparency: 1 - Size: UDim2.new 0.3, 0, 0.5, 0 - Position: UDim2.new 0.7, 0, 0.5, 0 - --- functions --- setButtonSizeAndPosition = (object) -> --- buttonSize = 55 --- xOffset = 10 --- yOffset = 95 - --- -- todo: better way to determine mobile sized screens --- onSmallScreen = game.CoreGui.RobloxGui.AbsoluteSize.X < 600 --- if not onSmallScreen --- buttonSize = 85 --- xOffset = 40 - --- object.Size = UDim2.new 0, buttonSize, 0, buttonSize - -contextButtonDown = (button, inputObject, actionName) -> - if inputObject.UserInputType == Enum.UserInputType.Touch - button.Image = ContextDownImage - contextActionService\CallFunction actionName, Enum.UserInputState.Begin - -contextButtonMoved = (button, inputObject, actionName) -> - if inputObject.UserInputType == Enum.UserInputType.Touch - button.Image = ContextDownImage - contextActionService\CallFunction actionName, Enum.UserInputState.Change - -contextButtonUp = (button, inputObject, actionName) -> - button.Image = ContextUpImage - if inputObject.UserInputType == Enum.UserInputType.Touch and - inputObject.UserInputState == Enum.UserInputState.End - - contextActionService\CallFunction actionName, Enum.UserInputState.End, inputObject - -isSmallScreenDevice = -> - Game\GetService"GuiService"\GetScreenResolution!.y <= 320 - -createNewButton = (actionName, functionInfoTable) -> - contextButton = New "ImageButton", "ContextActionButton" - BackgroundTransparency: 1 - Size: UDim2.new if isSmallScreenDevice! - 0, 90, 0, 90 - else - 0, 70, 0, 70 - Active: true - Image: ContextUpImage - Parent: buttonFrame - - local currentButtonTouch - - Game\GetService"UserInputService".InputEnded\connect (inputObject) -> - oldTouches[inputObject] = nil - - contextButton.InputBegan\connect (inputObject) -> - return if oldTouches[inputObject] - - if inputObject.UserInputState == Enum.UserInputState.Begin and not currentButtonTouch? - currentButtonTouch = inputObject - contextButtonDown contextButton, inputObject, actionName - - contextButton.InputChanged\connect (inputObject) -> - return if oldTouches[inputObject] or - currentButtonTouch ~= inputObject - - contextButtonMoved contextButton, inputObject, actionName - - contextButton.InputEnded\connect (inputObject) -> - return if oldTouches[inputObject] or - currentButtonTouch ~= inputObject - - currentButtonTouch = nil - oldTouches[inputObject] = true - contextButtonUp contextButton, inputObject, actionName - - actionIcon = New "ImageLabel", "ActionIcon" - Position: UDim2.new 0.175, 0, 0.175, 0 - Size: UDim2.new 0.65, 0, 0.65, 0 - BackgroundTransparency: 1 - - if functionInfoTable["image"] and type(functionInfoTable["image"]) == "string" - actionIcon.Image = functionInfoTable["image"] - - actionIcon.Parent = contextButton - - actionTitle = New "TextLabel", "ActionTitle" - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - Font: Enum.Font.SourceSansBold - TextColor3: Color3.new 1, 1, 1 - TextStrokeTransparency: 0 - FontSize: Enum.FontSize.Size18 - TextWrapped: true - Text: "" - - if functionInfoTable["title"] and type(functionInfoTable["title"]) == "string" - actionTitle.Text = functionInfoTable["title"] - - actionTitle.Parent = contextButton - - contextButton - -createButton = (actionName, functionInfoTable) -> - button = createNewButton actionName, functionInfoTable - - local position - for i = 1, #buttonVector - if buttonVector[i] == "empty" - position = i - break - - if not position - position = #buttonVector + 1 - - -- todo: let user know we have too many buttons already? - return if position > maxButtons - - buttonVector[position] = button - functionTable[actionName]["button"] = button - - button.Position = buttonPositionTable[position] - button.Parent = buttonFrame - - if buttonScreenGui and not buttonScreenGui.Parent? - buttonScreenGui.Parent = Game.Players.LocalPlayer.PlayerGui - -removeAction = (actionName) -> - return if not functionTable[actionName] - - actionButton = functionTable[actionName]["button"] - - if actionButton - actionButton.Parent = nil - - for i in *buttonVector - if i == actionButton - i = "empty" - break - - actionButton\Destroy! - - functionTable[actionName] = nil - -addAction = (actionName, createTouchButton, functionInfoTable) -> - if functionTable[actionName] - removeAction actionName - - functionTable[actionName] = { functionInfoTable } - if createTouchButton and isTouchDevice - createContextActionGui! - createButton actionName, functionInfoTable - --- Connections -contextActionService.BoundActionChanged\connect (actionName, changeName, changeTable) -> - if functionTable[actionName] and changeTable - if button = functionTable[actionName]["button"] - if changeName == "image" - button.ActionIcon.Image = changeTable[changeName] - elseif changeName == "title" - button.ActionTitle.Text = changeTable[changeName] - -- elseif changeName == "description" - -- -- todo: add description to menu - elseif changeName == "position" - button.Position = changeTable[changeName] - -contextActionService.BoundActionAdded\connect (actionName, createTouchButton, functionInfoTable) -> - addAction actionName, createTouchButton, functionInfoTable - -contextActionService.BoundActionRemoved\connect (actionName, _) -> - removeAction actionName - -contextActionService.GetActionButtonEvent\connect (actionName) -> - if functionTable[actionName] - contextActionService\FireActionButtonFoundSignal actionName, functionTable[actionName]["button"] - --- make sure any bound data before we setup connections is handled -boundActions = contextActionService\GetAllBoundActionInfo! -for actionName, actionData in pairs boundActions - addAction actionName, actionData["createTouchButton"], actionData diff --git a/yue/153556783.yue b/yue/153556783.yue deleted file mode 100644 index 65f6008..0000000 --- a/yue/153556783.yue +++ /dev/null @@ -1,578 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- This is responsible for all touch controls we show (as of this writing, only on iOS) --- this includes character move thumbsticks, and buttons for jump, use of items, camera, etc. --- Written by Ben Tkacheff, Roblox 2013 - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - --- obligatory stuff to make sure we don't access nil data -wait! until Game -wait! until Game\FindFirstChild "Players" -wait! until Game.Players.LocalPlayer -wait! until Game\FindFirstChild "CoreGui" -wait! until Game.CoreGui\FindFirstChild "RobloxGui" - -userInputService = Game\GetService "UserInputService" -success = try - userInputService\IsLuaTouchControls! - -if not success - script\Destroy! - - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- --- Variables -screenResolution = Game\GetService"GuiService"\GetScreenResolution! -isSmallScreenDevice = -> - return screenResolution.y <= 320 - - -localPlayer = Game.Players.LocalPlayer -thumbstickSize = 120 -if isSmallScreenDevice! - thumbstickSize = 70 - - -touchControlsSheet = "rbxasset://textures/ui/TouchControlsSheet.png" -ThumbstickDeadZone = 5 -ThumbstickMaxPercentGive = 0.92 -thumbstickTouches = {} - -jumpButtonSize = 90 -if isSmallScreenDevice! - jumpButtonSize = 70 - -oldJumpTouches = {} -local currentJumpTouch - -CameraRotateSensitivity = 0.007 -CameraRotateDeadZone = CameraRotateSensitivity * 16 -CameraZoomSensitivity = 0.03 -PinchZoomDelay = 0.2 -local cameraTouch - --- make sure all of our images are good to go -Game\GetService"ContentProvider"\Preload touchControlsSheet - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- --- Functions - -DistanceBetweenTwoPoints = (point1, point2) -> - dx = point2.x - point1.x - dy = point2.y - point1.y - math.sqrt dx * dx + dy * dy - - -transformFromCenterToTopLeft = (pointToTranslate, guiObject) -> - UDim2.new( - 0, - pointToTranslate.x - guiObject.AbsoluteSize.x / 2, - 0, - pointToTranslate.y - guiObject.AbsoluteSize.y / 2 - ) - - -rotatePointAboutLocation = (pointToRotate, pointToRotateAbout, radians) -> - sinAnglePercent = math.sin radians - cosAnglePercent = math.cos radians - - transformedPoint = pointToRotate - - -- translate point back to origin: - transformedPoint = Vector2.new transformedPoint.x - pointToRotateAbout.x, transformedPoint.y - pointToRotateAbout.y - - -- rotate point - xNew = transformedPoint.x * cosAnglePercent - transformedPoint.y * sinAnglePercent - yNew = transformedPoint.x * sinAnglePercent + transformedPoint.y * cosAnglePercent - - -- translate point back: - transformedPoint = Vector2.new xNew + pointToRotateAbout.x, yNew + pointToRotateAbout.y - - transformedPoint - - -dotProduct = (v1, v2) -> v1.x * v2.x + v1.y * v2.y - - -stationaryThumbstickTouchMove = (thumbstickFrame, thumbstickOuter, touchLocation) -> - thumbstickOuterCenterPosition = Vector2.new( - thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, - thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2 - ) - centerDiff = DistanceBetweenTwoPoints touchLocation, thumbstickOuterCenterPosition - - -- thumbstick is moving outside our region, need to cap its distance - if centerDiff > (thumbstickSize / 2) - thumbVector = Vector2.new( - touchLocation.x - thumbstickOuterCenterPosition.x, - touchLocation.y - thumbstickOuterCenterPosition.y - ) - normal = thumbVector.unit - if normal.x == math.nan or normal.x == math.inf - normal = Vector2.new 0, normal.y - - if normal.y == math.nan or normal.y == math.inf - normal = Vector2.new normal.x, 0 - - - newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize / 2)) - thumbstickFrame.Position = transformFromCenterToTopLeft newThumbstickInnerPosition, thumbstickFrame - else - thumbstickFrame.Position = transformFromCenterToTopLeft touchLocation, thumbstickFrame - - - Vector2.new( - thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset, - thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset - ) - - -followThumbstickTouchMove = (thumbstickFrame, thumbstickOuter, touchLocation) -> - thumbstickOuterCenter = Vector2.new( - thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, - thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2 - ) - - -- thumbstick is moving outside our region, need to position outer thumbstick texture carefully (to make look and feel like actual joystick controller) - if DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) > thumbstickSize / 2 - thumbstickInnerCenter = Vector2.new( - thumbstickFrame.Position.X.Offset + thumbstickFrame.AbsoluteSize.x / 2, - thumbstickFrame.Position.Y.Offset + thumbstickFrame.AbsoluteSize.y / 2 - ) - movementVectorUnit = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit - - outerToInnerVectorCurrent = Vector2.new( - thumbstickInnerCenter.x - thumbstickOuterCenter.x, - thumbstickInnerCenter.y - thumbstickOuterCenter.y - ) - outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit - movementVector = Vector2.new touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y - - -- First, find the angle between the new thumbstick movement vector, - -- and the vector between thumbstick inner and thumbstick outer. - -- We will use this to pivot thumbstick outer around thumbstick inner, gives a nice joystick feel - crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y) - - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x) - angle = math.atan2 crossOuterToInnerWithMovement, dotProduct outerToInnerVectorCurrentUnit, movementVectorUnit - anglePercent = angle * math.min movementVector.magnitude / outerToInnerVectorCurrent.magnitude, 1.0 - - -- If angle is significant, rotate about the inner thumbsticks current center - if math.abs(anglePercent) > 0.00001 - outerThumbCenter = rotatePointAboutLocation thumbstickOuterCenter, thumbstickInnerCenter, anglePercent - thumbstickOuter.Position = transformFromCenterToTopLeft Vector2.new(outerThumbCenter.x, outerThumbCenter.y), thumbstickOuter - - - -- now just translate outer thumbstick to make sure it stays nears inner thumbstick - thumbstickOuter.Position = UDim2.new( - 0, - thumbstickOuter.Position.X.Offset + movementVector.x, - 0, - thumbstickOuter.Position.Y.Offset + movementVector.y - ) - - - thumbstickFrame.Position = transformFromCenterToTopLeft touchLocation, thumbstickFrame - - -- a bit of error checking to make sure thumbsticks stay close to eachother - thumbstickFramePosition = Vector2.new thumbstickFrame.Position.X.Offset, thumbstickFrame.Position.Y.Offset - thumbstickOuterPosition = Vector2.new thumbstickOuter.Position.X.Offset, thumbstickOuter.Position.Y.Offset - if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize / 2 - vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize / 2 - thumbstickOuter.Position = UDim2.new( - 0, - thumbstickFramePosition.x + vectorWithLength.x, - 0, - thumbstickFramePosition.y + vectorWithLength.y - ) - - - Vector2.new( - thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset, - thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset - ) - - -movementOutsideDeadZone = (movementVector) -> - (math.abs(movementVector.x) > ThumbstickDeadZone) or (math.abs(movementVector.y) > ThumbstickDeadZone) - - -constructThumbstick = (defaultThumbstickPos, updateFunction, stationaryThumbstick) -> - thumbstickFrame = New "Frame", "ThumbstickFrame" - Active: true - Size: UDim2.new 0, thumbstickSize, 0, thumbstickSize - Position: defaultThumbstickPos - BackgroundTransparency: 1 - - New "ImageLabel", "InnerThumbstick" - Image: touchControlsSheet - ImageRectOffset: Vector2.new 220, 0 - ImageRectSize: Vector2.new 111, 111 - BackgroundTransparency: 1 - Size: UDim2.new 0, thumbstickSize / 2, 0, thumbstickSize / 2 - Position: UDim2.new( - 0, - thumbstickFrame.Size.X.Offset / 2 - thumbstickSize / 4, - 0, - thumbstickFrame.Size.Y.Offset / 2 - thumbstickSize / 4 - ) - ZIndex: 2 - Parent: thumbstickFrame - - outerThumbstick = New "ImageLabel", "OuterThumbstick" - Image: touchControlsSheet - ImageRectOffset: Vector2.new 0, 0 - ImageRectSize: Vector2.new 220, 220 - BackgroundTransparency: 1 - Size: UDim2.new 0, thumbstickSize, 0, thumbstickSize - Position: defaultThumbstickPos - Parent: Game.CoreGui.RobloxGui - - - local thumbstickTouch - local userInputServiceTouchMovedCon - local userInputSeviceTouchEndedCon - - startInputTracking = (inputObject) -> - return if thumbstickTouch - return if inputObject == cameraTouch - return if inputObject == currentJumpTouch - return if inputObject.UserInputType ~= Enum.UserInputType.Touch - - thumbstickTouch = inputObject - table.insert thumbstickTouches, thumbstickTouch - - thumbstickFrame.Position = transformFromCenterToTopLeft thumbstickTouch.Position, thumbstickFrame - outerThumbstick.Position = thumbstickFrame.Position - - userInputServiceTouchMovedCon = userInputService.TouchMoved\connect (movedInput) -> - if movedInput == thumbstickTouch - local movementVector - if stationaryThumbstick - movementVector = stationaryThumbstickTouchMove( - thumbstickFrame, - outerThumbstick, - Vector2.new movedInput.Position.x, movedInput.Position.y - ) - else - movementVector = followThumbstickTouchMove( - thumbstickFrame, - outerThumbstick, - Vector2.new movedInput.Position.x, movedInput.Position.y - ) - - - if updateFunction - updateFunction movementVector, outerThumbstick.Size.X.Offset / 2 - - - userInputSeviceTouchEndedCon = userInputService.TouchEnded\connect (endedInput) -> - if endedInput == thumbstickTouch - if updateFunction - updateFunction Vector2.new(0, 0), 1 - - - userInputSeviceTouchEndedCon\disconnect! - userInputServiceTouchMovedCon\disconnect! - - thumbstickFrame.Position = defaultThumbstickPos - outerThumbstick.Position = defaultThumbstickPos - - for i, object in pairs thumbstickTouches - if object == thumbstickTouch - table.remove thumbstickTouches, i - break - - thumbstickTouch = nil - - userInputService.Changed\connect (prop) -> - if prop == "ModalEnabled" - thumbstickFrame.Visible = outerThumbstick.Visible = not userInputService.ModalEnabled - - thumbstickFrame.InputBegan\connect startInputTracking - thumbstickFrame - -setupCharacterMovement = (parentFrame) -> - local lastMovementVector, lastMaxMovement - moveCharacterFunc = localPlayer.MoveCharacter - moveCharacterFunction = (movementVector, maxMovement) -> - if localPlayer - if movementOutsideDeadZone movementVector - lastMovementVector = movementVector - lastMaxMovement = maxMovement - -- sometimes rounding error will not allow us to go max speed at some - -- thumbstick angles, fix this with a bit of fudging near 100% throttle - if movementVector.magnitude / maxMovement > ThumbstickMaxPercentGive - maxMovement = movementVector.magnitude - 1 - - moveCharacterFunc localPlayer, movementVector, maxMovement - else - lastMovementVector = Vector2.new 0, 0 - lastMaxMovement = 1 - moveCharacterFunc localPlayer, lastMovementVector, lastMaxMovement - - thumbstickPos = UDim2.new 0, thumbstickSize / 2, 1, -thumbstickSize * 1.75 - if isSmallScreenDevice! - thumbstickPos = UDim2.new 0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20 - - characterThumbstick = constructThumbstick thumbstickPos, moveCharacterFunction, false - characterThumbstick.Name = "CharacterThumbstick" - characterThumbstick.Parent = parentFrame - - refreshCharacterMovement = -> - if localPlayer and moveCharacterFunc and lastMovementVector and lastMaxMovement - moveCharacterFunc localPlayer, lastMovementVector, lastMaxMovement - - refreshCharacterMovement - -setupJumpButton = (parentFrame) -> - jumpButton = New "ImageButton", "JumpButton" - BackgroundTransparency: 1 - Image: touchControlsSheet - ImageRectOffset: Vector2.new 176, 222 - ImageRectSize: Vector2.new 174, 174 - Size: UDim2.new 0, jumpButtonSize, 0, jumpButtonSize - Position: UDim2.new 1, if isSmallScreenDevice! - -(jumpButtonSize * 2.25), 1, -jumpButtonSize - 20 - else - -(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120 - - - playerJumpFunc = localPlayer.JumpCharacter - - doJumpLoop = -> - while currentJumpTouch - if localPlayer - playerJumpFunc localPlayer - - wait 1 / 60 - - - jumpButton.InputBegan\connect (inputObject) -> - return if inputObject.UserInputType ~= Enum.UserInputType.Touch - return if currentJumpTouch - return if inputObject == cameraTouch - for _, touch in pairs oldJumpTouches - return if touch == inputObject - - currentJumpTouch = inputObject - jumpButton.ImageRectOffset = Vector2.new 0, 222 - jumpButton.ImageRectSize = Vector2.new 174, 174 - doJumpLoop! - - jumpButton.InputEnded\connect (inputObject) -> - return if inputObject.UserInputType ~= Enum.UserInputType.Touch - - jumpButton.ImageRectOffset = Vector2.new 176, 222 - jumpButton.ImageRectSize = Vector2.new 174, 174 - - if inputObject == currentJumpTouch - table.insert oldJumpTouches, currentJumpTouch - currentJumpTouch = nil - - - userInputService.InputEnded\connect (globalInputObject) -> - for i, touch in pairs oldJumpTouches - if touch == globalInputObject - table.remove oldJumpTouches, i - break - - userInputService.Changed\connect (prop) -> - if prop == "ModalEnabled" - jumpButton.Visible = not userInputService.ModalEnabled - - jumpButton.Parent = parentFrame - - -isTouchUsedByJumpButton = (touch) -> - if touch == currentJumpTouch - return true - - for _, touchToCompare in pairs oldJumpTouches - if touch == touchToCompare - return true - false - -isTouchUsedByThumbstick = (touch) -> - for _, touchToCompare in pairs thumbstickTouches - if touch == touchToCompare - return true - false - - -setupCameraControl = (parentFrame, refreshCharacterMoveFunc) -> - local lastPos - hasRotatedCamera = false - rotateCameraFunc = userInputService.RotateCamera - - pinchTime = -1 - shouldPinch = false - local lastPinchScale - zoomCameraFunc = userInputService.ZoomCamera - pinchTouches = {} - local pinchFrame - - resetCameraRotateState = -> - cameraTouch = nil - hasRotatedCamera = false - lastPos = nil - - resetPinchState = -> - pinchTouches = {} - lastPinchScale = nil - shouldPinch = false - pinchFrame\Destroy! - pinchFrame = nil - - startPinch = (firstTouch, secondTouch) -> - -- track pinching in new frame - pinchFrame?\Destroy! - -- make sure we didn't track in any mud - pinchFrame = New "Frame", "PinchFrame" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - Parent: parentFrame - - pinchFrame.InputChanged\connect (inputObject) -> - if not shouldPinch - resetPinchState! - return - - resetCameraRotateState! - - if lastPinchScale == nil -- first pinch move, just set up scale - if inputObject == firstTouch - lastPinchScale = (inputObject.Position - secondTouch.Position).magnitude - firstTouch = inputObject - elseif inputObject == secondTouch - lastPinchScale = (inputObject.Position - firstTouch.Position).magnitude - secondTouch = inputObject - - else -- we are now actually pinching, do comparison to last pinch size - newPinchDistance = 0 - if inputObject == firstTouch - newPinchDistance = (inputObject.Position - secondTouch.Position).magnitude - firstTouch = inputObject - elseif inputObject == secondTouch - newPinchDistance = (inputObject.Position - firstTouch.Position).magnitude - secondTouch = inputObject - - if newPinchDistance ~= 0 - pinchDiff = newPinchDistance - lastPinchScale - if pinchDiff ~= 0 - zoomCameraFunc userInputService, (pinchDiff * CameraZoomSensitivity) - - lastPinchScale = newPinchDistance - - pinchFrame.InputEnded\connect (inputObject) -> -- pinch is over, destroy all - if inputObject == firstTouch or inputObject == secondTouch - resetPinchState! - - - pinchGestureReceivedTouch = (inputObject) -> - if #pinchTouches < 1 - table.insert pinchTouches, inputObject - pinchTime = tick! - shouldPinch = false - elseif #pinchTouches == 1 - shouldPinch = ((tick! - pinchTime) <= PinchZoomDelay) - - if shouldPinch - table.insert pinchTouches, inputObject - startPinch pinchTouches[1], pinchTouches[2] - else -- shouldn't ever get here, but just in case - pinchTouches = {} - - parentFrame.InputBegan\connect (inputObject) -> - return if inputObject.UserInputType ~= Enum.UserInputType.Touch - return if isTouchUsedByJumpButton inputObject - - usedByThumbstick = isTouchUsedByThumbstick inputObject - if not usedByThumbstick - pinchGestureReceivedTouch inputObject - - - if cameraTouch == nil and not usedByThumbstick - cameraTouch = inputObject - lastPos = Vector2.new cameraTouch.Position.x, cameraTouch.Position.y - -- lastTick = tick! - - userInputService.InputChanged\connect (inputObject) -> - return if inputObject.UserInputType ~= Enum.UserInputType.Touch - return if cameraTouch ~= inputObject - - newPos = Vector2.new cameraTouch.Position.x, cameraTouch.Position.y - touchDiff = (lastPos - newPos) * CameraRotateSensitivity - - -- first time rotating outside deadzone, just setup for next changed event - if not hasRotatedCamera and (touchDiff.magnitude > CameraRotateDeadZone) - hasRotatedCamera = true - lastPos = newPos - - - -- fire everytime after we have rotated out of deadzone - if hasRotatedCamera and (lastPos ~= newPos) - rotateCameraFunc userInputService, touchDiff - refreshCharacterMoveFunc! - lastPos = newPos - - - userInputService.InputEnded\connect (inputObject) -> - if cameraTouch == inputObject or not cameraTouch? - resetCameraRotateState! - - for i, touch in pairs pinchTouches - if touch == inputObject - table.remove pinchTouches, i - -setupTouchControls = -> - touchControlFrame = New "Frame", "TouchControlFrame" - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - Parent: Game.CoreGui.RobloxGui - - refreshCharacterMoveFunc = setupCharacterMovement touchControlFrame - setupJumpButton touchControlFrame - setupCameraControl touchControlFrame, refreshCharacterMoveFunc - - userInputService.ProcessedEvent\connect (inputObject, processed) -> - return if not processed - - -- kill camera pan if the touch is used by some user controls - if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin - cameraTouch = nil - ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- --- Start of Script - --- if true --userInputService\IsLuaTouchControls! -setupTouchControls! --- else - -- script\Destroy! - diff --git a/yue/157877000.yue b/yue/157877000.yue deleted file mode 100644 index c856c1e..0000000 --- a/yue/157877000.yue +++ /dev/null @@ -1,875 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - --- A Few Script Globals -gui = script.Parent\FindFirstChild"ControlFrame" or script.Parent - --- Dev-Console Root - -Dev_Container = New "Frame", "DevConsoleContainer" - Parent: gui - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.9 - Position: UDim2.new 0, 100, 0, 10 - Size: UDim2.new 0.5, 20, 0.5, 20 - Visible: false - -ToggleConsole = New "BindableFunction", "ToggleDevConsole" - Parent: gui - -devConsoleInitialized = false -initializeDeveloperConsole = -> - return if devConsoleInitialized - devConsoleInitialized = true - - ---Dev-Console Variables - LOCAL_CONSOLE = 1 - SERVER_CONSOLE = 2 - - MAX_LIST_SIZE = 1000 - - minimumSize = Vector2.new 245, 180 - currentConsole = LOCAL_CONSOLE - - localMessageList = {} - serverMessageList = {} - - localOffset = 0 - serverOffset = 0 - - errorToggleOn = true - warningToggleOn = true - infoToggleOn = true - outputToggleOn = true - wordWrapToggleOn = false - - textHolderSize = 0 - - frameNumber = 0 - - --Create Dev-Console - - Dev_Body = New "Frame", "Body" - Parent: Dev_Container - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 0, 0, 0, 21 - Size: UDim2.new 1, 0, 1, -25 - - * New "ImageButton", "ResizeButton" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 1, -20, 1, -20 - Size: UDim2.new 0, 20, 0, 20 - - * New "ImageLabel", "ImageLabel" - BackgroundTransparency: 1 - Position: UDim2.new 0, 6, 0, 6 - Size: UDim2.new 0.8, 0, 0.8, 0 - Rotation: 135 - Image: "http://banland.xyz/asset?id=151205813" - - * New "TextButton", "LocalConsole" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.6 - Position: UDim2.new 0, 7, 0, 5 - Size: UDim2.new 0, 90, 0, 20 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "Local Console" - TextColor3: Color3.new 1, 1, 1 - TextYAlignment: Enum.TextYAlignment.Center - - * New "TextButton", "ServerConsole" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.8 - Position: UDim2.new 0, 102, 0, 5 - Size: UDim2.new 0, 90, 0, 17 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "Server Console" - TextColor3: Color3.new 1, 1, 1 - TextYAlignment: Enum.TextYAlignment.Center - - Dev_OptionsHolder = New "Frame", "OptionsHolder" - Parent: Dev_Body - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 1 - Position: UDim2.new 0, 220, 0, 0 - Size: UDim2.new 1, -255, 0, 24 - ClipsDescendants: true - - Dev_OptionsBar = New "Frame", "OptionsBar" - Parent: Dev_OptionsHolder - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 1 - Position: UDim2.new 0, -250, 0, 4 - Size: UDim2.new 0, 234, 0, 18 - - * New "TextButton", "ErrorToggleButton" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 0, 0 - Position: UDim2.new 0, 115, 0, 0 - Size: UDim2.new 0, 18, 0, 18 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "" - TextColor3: Color3.new 1, 0, 0 - - * New "Frame", "CheckFrame" - BackgroundColor3: Color3.new 1, 0, 0 - BorderColor3: Color3.new 1, 0, 0 - Position: UDim2.new 0, 4, 0, 4 - Size: UDim2.new 0, 10, 0, 10 - - * New "TextButton", "InfoToggleButton" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 0.4, 0.5, 1.0 - Position: UDim2.new 0, 65, 0, 0 - Size: UDim2.new 0, 18, 0, 18 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "" - TextColor3: Color3.new 0.4, 0.5, 1.0 - - * New "Frame", "CheckFrame" - BackgroundColor3: Color3.new 0.4, 0.5, 1.0 - BorderColor3: Color3.new 0.4, 0.5, 1.0 - Position: UDim2.new 0, 4, 0, 4 - Size: UDim2.new 0, 10, 0, 10 - - * New "TextButton", "OutputToggleButton" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 1, 1.0 - Position: UDim2.new 0, 40, 0, 0 - Size: UDim2.new 0, 18, 0, 18 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "" - TextColor3: Color3.new 1, 1, 1.0 - - * New "Frame", "CheckFrame" - BackgroundColor3: Color3.new 1, 1, 1.0 - BorderColor3: Color3.new 1, 1, 1.0 - Position: UDim2.new 0, 4, 0, 4 - Size: UDim2.new 0, 10, 0, 10 - - * New "TextButton", "WarningToggleButton" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 0.6, 0.4 - Position: UDim2.new 0, 90, 0, 0 - Size: UDim2.new 0, 18, 0, 18 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "" - TextColor3: Color3.new 1, 0.6, 0.4 - - * New "Frame", "CheckFrame" - BackgroundColor3: Color3.new 1, 0.6, 0.4 - BorderColor3: Color3.new 1, 0.6, 0.4 - Position: UDim2.new 0, 4, 0, 4 - Size: UDim2.new 0, 10, 0, 10 - - * New "TextButton", "WordWrapToggleButton" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 0.8, 0.8, 0.8 - Position: UDim2.new 0, 215, 0, 0 - Size: UDim2.new 0, 18, 0, 18 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "" - TextColor3: Color3.new 0.8, 0.8, 0.8 - - * New "Frame", "CheckFrame" - BackgroundColor3: Color3.new 0.8, 0.8, 0.8 - BorderColor3: Color3.new 0.8, 0.8, 0.8 - Position: UDim2.new 0, 4, 0, 4 - Size: UDim2.new 0, 10, 0, 10 - Visible: false - - * New "TextLabel", "Filter" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 0, 40, 0, 18 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "Filter" - TextColor3: Color3.new 1, 1, 1 - - * New "TextLabel", "WordWrap" - BackgroundTransparency: 1 - Position: UDim2.new 0, 150, 0, 0 - Size: UDim2.new 0, 50, 0, 18 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size14 - Text: "Word Wrap" - TextColor3: Color3.new 1, 1, 1, - - Dev_ScrollBar = New "Frame", "ScrollBar" - Parent: Dev_Body - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.9 - Position: UDim2.new 1, -20, 0, 26 - Size: UDim2.new 0, 20, 1, -50 - Visible: false - - * New "ImageButton", "Down" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 0, 0, 1, -20 - Size: UDim2.new 0, 20, 0, 20 - - * New "ImageLabel", "ImageLabel" - BackgroundTransparency: 1 - Position: UDim2.new 0, 3, 0, 3 - Size: UDim2.new 0, 14, 0, 14 - Rotation: 180 - Image: "http://banland.xyz/asset?id=151205813" - - * New "ImageButton", "Up" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 0, 20, 0, 20 - - * New "ImageLabel", "ImageLabel" - BackgroundTransparency: 1 - Position: UDim2.new 0, 3, 0, 3 - Size: UDim2.new 0, 14, 0, 14 - Image: "http://banland.xyz/asset?id=151205813" - - Dev_ScrollArea = New "Frame", "ScrollArea" - Parent: Dev_ScrollBar - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 23 - Size: UDim2.new 1, 0, 1, -46 - - * New "ImageButton", "Handle" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 0, 0, 0.2, 0 - Size: UDim2.new 0, 20, 0, 40 - - * New "ImageLabel", "ImageLabel" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.5, -8 - Rotation: 180 - Size: UDim2.new 1, 0, 0, 16 - Image: "http://banland.xyz/asset?id=151205881" - - - Dev_TextBox = New "Frame", "TextBox" - Parent: Dev_Body - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.6 - Position: UDim2.new 0, 2, 0, 26 - Size: UDim2.new 1, -4, 1, -28 - ClipsDescendants: true - - Dev_TextHolder = New "Frame", "TextHolder" - Parent: Dev_TextBox - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - - Dev_OptionsButton = New "ImageButton", "OptionsButton" - Parent: Dev_Body - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 1 - Position: UDim2.new 0, 200, 0, 2 - Size: UDim2.new 0, 20, 0, 20 - - * New "ImageLabel", "ImageLabel" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - Rotation: 0 - Image: "http://banland.xyz/asset?id=152093917" - - Dev_TitleBar = New "Frame", "TitleBar" - Parent: Dev_Container - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0, 20 - - * New "ImageButton", "CloseButton" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 1, -20, 0, 0 - Size: UDim2.new 0, 20, 0, 20 - - * New "ImageLabel" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 1 - Position: UDim2.new 0, 3, 0, 3 - Size: UDim2.new 0, 14, 0, 14 - Image: "http://banland.xyz/asset?id=151205852" - - * New "TextButton", "TextButton" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, -23, 1, 0 - Text: "" - - * New "TextLabel", "TitleText" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 0, 185, 0, 20 - Font: "SourceSansBold" - FontSize: Enum.FontSize.Size18 - -- Text: "Server Console" - TextColor3: Color3.new 1, 1, 1 - Text: "Roblox Developer Console" - TextYAlignment: Enum.TextYAlignment.Top - - ---Saved Mouse Information - local previousMousePos, pPos - local previousMousePosResize, pSize - local previousMousePosScroll - - -- local pScrollHandle - - local pOffset - - scrollUpIsDown = false - scrollDownIsDown = false - - clean = -> - previousMousePos \ - = pPos \ - = previousMousePosResize \ - = pSize \ - = previousMousePosScroll \ - = pOffset \ - = nil - -- pScrollHandle = nil - scrollUpIsDown = scrollDownIsDown = false - - - ---Handle Dev-Console Position - refreshConsolePosition = (x, y) -> - return if not previousMousePos - - delta = Vector2.new x, y - previousMousePos - Dev_Container.Position = UDim2.new 0, pPos.X + delta.X, 0, pPos.Y + delta.Y - - - Dev_TitleBar.TextButton.MouseButton1Down\connect (x, y) -> - previousMousePos = Vector2.new x, y - pPos = Dev_Container.AbsolutePosition - - - Dev_TitleBar.TextButton.MouseButton1Up\connect clean - - - ---Handle Dev-Console Size - refreshConsoleSize = (x, y) -> - return if not previousMousePosResize - - delta = Vector2.new x, y - previousMousePosResize - Dev_Container.Size = UDim2.new 0, math.max(pSize.X + delta.X, minimumSize.X), 0, math.max pSize.Y + delta.Y, minimumSize.Y - - Dev_Container.Body.ResizeButton.MouseButton1Down\connect (x, y) -> - previousMousePosResize = Vector2.new x, y - pSize = Dev_Container.AbsoluteSize - - - Dev_Container.Body.ResizeButton.MouseButton1Up\connect clean - - - ---Handle Dev-Console Close Button - Dev_TitleBar.CloseButton.MouseButton1Down\connect -> - Dev_Container.Visible = false - - - Dev_Container.TitleBar.CloseButton.MouseButton1Up\connect clean - - - optionsHidden = true - animating = false - --Options - startAnimation = -> - return if animating - animating = true - - repeat - frameNumber += if optionsHidden - -1 - else - 1 - - - x = frameNumber / 5 - smoothStep = x * x * (3 - (2 * x)) - Dev_OptionsButton.ImageLabel.Rotation = smoothStep * 5 * 9 - Dev_OptionsBar.Position = UDim2.new(0, (smoothStep * 5 * 50) - 250, 0, 4) - - wait! - if (frameNumber <= 0 and optionsHidden) or (frameNumber >= 5 and not optionsHidden) - animating = false - - until not animating - - - Dev_OptionsButton.MouseButton1Down\connect -> - optionsHidden = not optionsHidden - startAnimation! - - --Refresh Dev-Console Message Positions - repositionList = -> - if currentConsole == LOCAL_CONSOLE - localOffset = math.min math.max(localOffset, 0), textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y - Dev_TextHolder.Size = UDim2.new 1, 0, 0, textHolderSize - elseif currentConsole == SERVER_CONSOLE - serverOffset = math.min math.max(serverOffset, 0), textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y - Dev_TextHolder.Size = UDim2.new 1, 0, 0, textHolderSize - - - ratio = Dev_Container.Body.TextBox.AbsoluteSize.Y / Dev_TextHolder.AbsoluteSize.Y - - if ratio >= 1 - Dev_Container.Body.ScrollBar.Visible = false - Dev_Container.Body.TextBox.Size = UDim2.new 1, -4, 1, -28 - - if currentConsole == LOCAL_CONSOLE or currentConsole == SERVER_CONSOLE - Dev_TextHolder.Position = UDim2.new 0, 0, 1, 0 - textHolderSize - - else - Dev_Container.Body.ScrollBar.Visible = true - Dev_Container.Body.TextBox.Size = UDim2.new 1, -25, 1, -28 - - backRatio = 1 - ratio - local offsetRatio - - offsetRatio = if currentConsole == LOCAL_CONSOLE - localOffset / Dev_TextHolder.AbsoluteSize.Y - elseif currentConsole == SERVER_CONSOLE - serverOffset / Dev_TextHolder.AbsoluteSize.Y - - - topRatio = math.max 0, backRatio - offsetRatio - - scrollHandleSize = math.max Dev_ScrollArea.AbsoluteSize.Y * ratio, 21 - - scrollRatio = scrollHandleSize / Dev_ScrollArea.AbsoluteSize.Y - ratioConversion = (1 - scrollRatio) / (1 - ratio) - - topScrollRatio = topRatio * ratioConversion - - sPos = math.min( - Dev_ScrollArea.AbsoluteSize.Y * topScrollRatio, - Dev_ScrollArea.AbsoluteSize.Y - scrollHandleSize - ) - - Dev_ScrollArea.Handle.Size = UDim2.new 1, 0, 0, scrollHandleSize - Dev_ScrollArea.Handle.Position = UDim2.new 0, 0, 0, sPos - - Dev_TextHolder.Position = UDim2.new 0, 0, 1, 0 - textHolderSize + if currentConsole == LOCAL_CONSOLE - localOffset - elseif currentConsole == SERVER_CONSOLE - serverOffset - - - --Scroll Position - - changeOffset = (value) -> - if currentConsole == LOCAL_CONSOLE - localOffset += value - elseif currentConsole == SERVER_CONSOLE - serverOffset += value - - repositionList! - - - --Refresh Dev-Console Text - refreshTextHolderForReal = -> - childMessages = Dev_TextHolder\GetChildren! - - local messageList - - messageList = if currentConsole == LOCAL_CONSOLE - localMessageList - elseif currentConsole == SERVER_CONSOLE - serverMessageList - - posOffset = 0 - - for i in *childMessages - i.Visible = false - - for i = 1, #messageList - local message - - movePosition = false - - if i > #childMessages - message = New "TextLabel", "Message" - Parent: Dev_TextHolder - BackgroundTransparency: 1 - TextXAlignment: "Left" - Size: UDim2.new 1, 0, 0, 14 - FontSize: "Size10" - ZIndex: 1 - movePosition = true - else - message = childMessages[i] - - - if (outputToggleOn or messageList[i].Type ~= Enum.MessageType.MessageOutput) and - (infoToggleOn or messageList[i].Type ~= Enum.MessageType.MessageInfo) and - (warningToggleOn or messageList[i].Type ~= Enum.MessageType.MessageWarning) and - (errorToggleOn or messageList[i].Type ~= Enum.MessageType.MessageError) - - with message - .TextWrapped = wordWrapToggleOn - .Size = UDim2.new 0.98, 0, 0, 2000 - .Parent = Dev_Container - .Text = "#{messageList[i].Time} -- #{messageList[i].Message}" - .Size = UDim2.new 0.98, 0, 0, .TextBounds.Y - .Position = UDim2.new 0, 5, 0, posOffset - .Parent = Dev_TextHolder - posOffset += .TextBounds.Y - - if movePosition - if (currentConsole == LOCAL_CONSOLE and localOffset > 0) or - (currentConsole == SERVER_CONSOLE and serverOffset > 0) - - changeOffset message.TextBounds.Y - - message.Visible = true - - message.TextColor3 = Color3.new if messageList[i].Type == Enum.MessageType.MessageError - 1, 0, 0 - elseif messageList[i].Type == Enum.MessageType.MessageInfo - 0.4, 0.5, 1 - elseif messageList[i].Type == Enum.MessageType.MessageWarning - 1, 0.6, 0.4 - else - 1, 1, 1 - - textHolderSize = posOffset - - - -- Refreshing the textholder every 0.1 (if needed) is good enough, surely fast enough - -- We don't want it to update 50x in a tick because there are 50 messages in that tick - -- (Whenever for one reason or another a lot of output comes in, it can lag - -- This will make it behave better in a situation of a lot of output comming in) - refreshQueued = false - refreshTextHolder = -> - return if refreshQueued - - Delay 0.1, -> - refreshQueued = false - refreshTextHolderForReal! - - refreshQueued = true - - - --Handle Dev-Console Scrollbar - - inside = 0 - holdingUpButton = -> - return if scrollUpIsDown - - scrollUpIsDown = true - wait 0.6 - inside += 1 - while scrollUpIsDown and inside < 2 - wait! - changeOffset 12 - - inside -= 1 - - - holdingDownButton = -> - return if scrollDownIsDown - - scrollDownIsDown = true - wait 0.6 - inside += 1 - while scrollDownIsDown and inside < 2 - wait! - changeOffset -12 - - inside -= 1 - - - Dev_Container.Body.ScrollBar.Up.MouseButton1Click\connect -> - changeOffset 10 - - Dev_Container.Body.ScrollBar.Up.MouseButton1Down\connect -> - changeOffset 10 - holdingUpButton! - - Dev_Container.Body.ScrollBar.Up.MouseButton1Up\connect clean - - Dev_Container.Body.ScrollBar.Down.MouseButton1Down\connect -> - changeOffset -10 - holdingDownButton! - - Dev_Container.Body.ScrollBar.Down.MouseButton1Up\connect clean - - handleScroll = (x, y) -> - return if not previousMousePosScroll - - delta = (Vector2.new x, y - previousMousePosScroll).Y - - backRatio = 1 - (Dev_Container.Body.TextBox.AbsoluteSize.Y / Dev_TextHolder.AbsoluteSize.Y) - - movementSize = Dev_ScrollArea.AbsoluteSize.Y - Dev_ScrollArea.Handle.AbsoluteSize.Y - normalDelta = math.max(math.min(delta, movementSize), 0 - movementSize) - normalRatio = normalDelta / movementSize - - textMovementSize = (backRatio * Dev_TextHolder.AbsoluteSize.Y) - offsetChange = textMovementSize * normalRatio - - if currentConsole == LOCAL_CONSOLE - localOffset = pOffset - offsetChange - elseif currentConsole == SERVER_CONSOLE - serverOffset = pOffset - offsetChange - - - Dev_ScrollArea.Handle.MouseButton1Down\connect (x, y) -> - previousMousePosScroll = Vector2.new x, y - -- pScrollHandle = Dev_ScrollArea.Handle.AbsolutePosition - pOffset = if currentConsole == LOCAL_CONSOLE - localOffset - elseif currentConsole == SERVER_CONSOLE - serverOffset - - - Dev_ScrollArea.Handle.MouseButton1Up\connect clean - - existsInsideContainer = (container, x, y) -> - pos = container.AbsolutePosition - size = container.AbsoluteSize - if x < pos.X or x > pos.X + size.X or y < pos.y or y > pos.y + size.y - return false - true - - - -- Easy, fast, and working nicely - numberWithZero = (num) -> - if num < 10 - "0#{num}" - else - num - - - timestr = "%s:%s:%s" - - ConvertTimeStamp = (timeStamp) -> - localTime = timeStamp - os.time! + math.floor tick! - dayTime = localTime % 86400 - - hour = math.floor dayTime / 3600 - - dayTime -= hour * 3600 - minute = math.floor dayTime / 60 - - dayTime -= minute * 60 - - h = numberWithZero hour - m = numberWithZero minute - s = numberWithZero dayTime - - timestr\format h, m, s - - - --Filter - - Dev_OptionsBar.ErrorToggleButton.MouseButton1Down\connect -> - errorToggleOn = not errorToggleOn - Dev_OptionsBar.ErrorToggleButton.CheckFrame.Visible = errorToggleOn - refreshTextHolder! - repositionList! - - - Dev_OptionsBar.WarningToggleButton.MouseButton1Down\connect -> - warningToggleOn = not warningToggleOn - Dev_OptionsBar.WarningToggleButton.CheckFrame.Visible = warningToggleOn - refreshTextHolder! - repositionList! - - - Dev_OptionsBar.InfoToggleButton.MouseButton1Down\connect -> - infoToggleOn = not infoToggleOn - Dev_OptionsBar.InfoToggleButton.CheckFrame.Visible = infoToggleOn - refreshTextHolder! - repositionList! - - - Dev_OptionsBar.OutputToggleButton.MouseButton1Down\connect -> - outputToggleOn = not outputToggleOn - Dev_OptionsBar.OutputToggleButton.CheckFrame.Visible = outputToggleOn - refreshTextHolder! - repositionList! - - - Dev_OptionsBar.WordWrapToggleButton.MouseButton1Down\connect -> - wordWrapToggleOn = not wordWrapToggleOn - Dev_OptionsBar.WordWrapToggleButton.CheckFrame.Visible = wordWrapToggleOn - refreshTextHolder! - repositionList! - - - ---Dev-Console Message Functionality - AddLocalMessage = (str, messageType, timeStamp) -> - localMessageList[] = - Message: str - Time: ConvertTimeStamp timeStamp - Type: messageType - - while #localMessageList > MAX_LIST_SIZE - table.remove localMessageList, 1 - - refreshTextHolder! - repositionList! - - AddServerMessage = (str, messageType, timeStamp) -> - serverMessageList[] = - Message: str - Time: ConvertTimeStamp timeStamp - Type: messageType - - while #serverMessageList > MAX_LIST_SIZE - table.remove serverMessageList, 1 - - - refreshTextHolder! - repositionList! - - --Handle Dev-Console Local/Server Buttons - Dev_Container.Body.LocalConsole.MouseButton1Click\connect -> - if currentConsole == SERVER_CONSOLE - currentConsole = LOCAL_CONSOLE - localConsole = Dev_Container.Body.LocalConsole - serverConsole = Dev_Container.Body.ServerConsole - - localConsole.Size = UDim2.new 0, 90, 0, 20 - serverConsole.Size = UDim2.new 0, 90, 0, 17 - localConsole.BackgroundTransparency = 0.6 - serverConsole.BackgroundTransparency = 0.8 - - if game\FindFirstChild"Players" and game.Players["LocalPlayer"] - mouse = game.Players.LocalPlayer\GetMouse! - refreshConsolePosition mouse.X, mouse.Y - refreshConsoleSize mouse.X, mouse.Y - handleScroll mouse.X, mouse.Y - - - refreshTextHolder! - repositionList! - - - Dev_Container.Body.LocalConsole.MouseButton1Up\connect clean - - - serverHistoryRequested = false - - Dev_Container.Body.ServerConsole.MouseButton1Click\connect -> - if not serverHistoryRequested - serverHistoryRequested = true - game\GetService"LogService"\RequestServerOutput! - - - if currentConsole == LOCAL_CONSOLE - currentConsole = SERVER_CONSOLE - localConsole = Dev_Container.Body.LocalConsole - serverConsole = Dev_Container.Body.ServerConsole - - serverConsole.Size = UDim2.new 0, 90, 0, 20 - localConsole.Size = UDim2.new 0, 90, 0, 17 - serverConsole.BackgroundTransparency = 0.6 - localConsole.BackgroundTransparency = 0.8 - - if game\FindFirstChild"Players" and game.Players["LocalPlayer"] - mouse = game.Players.LocalPlayer\GetMouse! - refreshConsolePosition mouse.X, mouse.Y - refreshConsoleSize mouse.X, mouse.Y - handleScroll mouse.X, mouse.Y - - refreshTextHolder! - repositionList! - - - ---Extra Mouse Handlers for Dev-Console - Dev_Container.Body.ServerConsole.MouseButton1Up\connect clean - - - if game\FindFirstChild"Players" and game.Players["LocalPlayer"] - LocalMouse = game.Players.LocalPlayer\GetMouse! - LocalMouse.Move\connect -> - return if not Dev_Container.Visible - - mouse = game.Players.LocalPlayer\GetMouse! - refreshConsolePosition mouse.X, mouse.Y - refreshConsoleSize mouse.X, mouse.Y - handleScroll mouse.X, mouse.Y - - refreshTextHolder! - repositionList! - - LocalMouse.Button1Up\connect clean - - LocalMouse.WheelForward\connect -> - return if not Dev_Container.Visible - if existsInsideContainer Dev_Container, LocalMouse.X, LocalMouse.Y - changeOffset 10 - - LocalMouse.WheelBackward\connect -> - return if not Dev_Container.Visible - if existsInsideContainer Dev_Container, LocalMouse.X, LocalMouse.Y - changeOffset -10 - - - Dev_ScrollArea.Handle.MouseButton1Down\connect -> - repositionList! - - - ---Populate Dev-Console with dummy messages - - history = game\GetService"LogService"\GetLogHistory! - - for i in *history - AddLocalMessage i.message, i.messageType, i.timestamp - - with game\GetService"LogService" - .MessageOut\connect (message, messageType) -> - AddLocalMessage message, messageType, os.time! - .ServerMessageOut\connect AddServerMessage - -currentlyToggling = false -ToggleConsole.OnInvoke = -> - return if currentlyToggling - - currentlyToggling = true - initializeDeveloperConsole! - Dev_Container.Visible = not Dev_Container.Visible - currentlyToggling = false diff --git a/yue/36868950.yue b/yue/36868950.yue deleted file mode 100644 index 387f0da..0000000 --- a/yue/36868950.yue +++ /dev/null @@ -1,125 +0,0 @@ -import "macros" as { $ } -$load $FILE - -controlFrame = script.Parent\FindFirstChild "ControlFrame" - -return if not controlFrame - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -bottomLeftControl = controlFrame\FindFirstChild "BottomLeftControl" -bottomRightControl = controlFrame\FindFirstChild "BottomRightControl" - -frameTip = New "TextLabel", "ToolTip" - Text: "" - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size12 - TextColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - ZIndex: 10 - Size: UDim2.new 2, 0, 1, 0 - Position: UDim2.new 1, 0, 0, 0 - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 1 - TextTransparency: 1 - TextWrap: true - - * New "BoolValue", "inside" - Value: false - -setUpListeners = (frameToListen) -> - fadeSpeed = 0.1 - frameToListen.Parent.MouseEnter\connect -> - if frameToListen\FindFirstChild "inside" - frameToListen.inside.Value = true - wait 1.2 - if frameToListen.inside.Value - while frameToListen.inside.Value and frameToListen.BackgroundTransparency > 0 - frameToListen.BackgroundTransparency -= fadeSpeed - frameToListen.TextTransparency -= fadeSpeed - wait! - - killTip = (killFrame) -> - killFrame.inside.Value = false - killFrame.BackgroundTransparency = 1 - killFrame.TextTransparency = 1 - - frameToListen.Parent.MouseLeave\connect -> - killTip frameToListen - - frameToListen.Parent.MouseButton1Click\connect -> - killTip frameToListen - -createSettingsButtonTip = (parent) -> - if parent == nil - parent = bottomLeftControl\FindFirstChild "SettingsButton" - - - with toolTip = frameTip\clone! - .RobloxLocked = true - .Text = "Settings/Leave Game" - .Position = UDim2.new 0, 0, 0, -18 - .Size = UDim2.new 0, 120, 0, 20 - .Parent = parent - setUpListeners toolTip - -wait 5 -- make sure we are loaded in, won't need tool tips for first 5 seconds anyway - ----------------- set up Bottom Left Tool Tips ------------------------- - -bottomLeftChildren = bottomLeftControl\GetChildren! - -for i in *bottomLeftChildren - if i.Name == "Exit" - - with exitTip = frameTip\clone! - .RobloxLocked = true - .Text = "Leave Place" - .Position = UDim2.new 0, 0, -1, 0 - .Size = UDim2.new 1, 0, 1, 0 - .Parent = i - setUpListeners exitTip - - elseif i.Name == "SettingsButton" - createSettingsButtonTip i - ----------------- set up Bottom Right Tool Tips ------------------------- - -bottomRightChildren = bottomRightControl\GetChildren! - -for i in *bottomRightChildren - if i.Name\find"Camera"? - with cameraTip = frameTip\clone! - .RobloxLocked = true - .Text = "Camera View" - - .Position = if i.Name\find "Zoom" - UDim2.new -1, 0, -1.5 - else - UDim2.new 0, 0, -1.5, 0 - - .Size = UDim2.new 2, 0, 1.25, 0 - .Parent = i - setUpListeners cameraTip diff --git a/yue/37801172.yue b/yue/37801172.yue deleted file mode 100644 index ba58fd7..0000000 --- a/yue/37801172.yue +++ /dev/null @@ -1,101 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Creates all neccessary scripts for the gui on initial load, everything except build tools --- Created by Ben T. 10/29/10 --- Please note that these are loaded in a specific order to diminish errors/perceived load time by user - -scriptContext = game\GetService "ScriptContext" -touchEnabled = false - -try - touchEnabled = game\GetService"UserInputService".TouchEnabled - --- library registration -scriptContext\AddCoreScript 60595695, scriptContext, "/Libraries/LibraryRegistration/LibraryRegistration" - -waitForChild = (instance, name) -> - until instance\FindFirstChild name - instance.ChildAdded\wait! - --- waitForProperty = (instance, property) -> --- until instance[property] --- instance.Changed\wait! - --- Responsible for tracking logging items -scriptContext = game\GetService "ScriptContext" -scriptContext\AddCoreScript 59002209, scriptContext, "CoreScripts/Sections" - -waitForChild game\GetService"CoreGui", "RobloxGui" -screenGui = game\GetService"CoreGui"\FindFirstChild "RobloxGui" - -if not touchEnabled - -- ToolTipper (creates tool tips for gui) - scriptContext\AddCoreScript 36868950, screenGui, "CoreScripts/ToolTip" - -- SettingsScript - scriptContext\AddCoreScript 46295863, screenGui, "CoreScripts/Settings" -else - scriptContext\AddCoreScript 153556783, screenGui, "CoreScripts/TouchControls" - --- MainBotChatScript -scriptContext\AddCoreScript 39250920, screenGui, "CoreScripts/MainBotChatScript" - --- Popup Script -scriptContext\AddCoreScript 48488451, screenGui, "CoreScripts/PopupScript" --- Friend Notification Script (probably can use this script to expand out to other notifications) -scriptContext\AddCoreScript 48488398, screenGui, "CoreScripts/NotificationScript" --- Chat script -scriptContext\AddCoreScript 97188756, screenGui, "CoreScripts/ChatScript" --- Purchase Prompt Script -scriptContext\AddCoreScript 107893730, screenGui, "CoreScripts/PurchasePromptScript" - -if not touchEnabled or screenGui.AbsoluteSize.Y > 600 - -- New Player List - scriptContext\AddCoreScript 48488235, screenGui, "CoreScripts/PlayerListScript" -else - delay 5, -> - if screenGui.AbsoluteSize.Y >= 600 - -- New Player List - scriptContext\AddCoreScript 48488235, screenGui, "CoreScripts/PlayerListScript" - -if game.CoreGui.Version >= 3 and game.PlaceId ~= 130815926 --todo: remove placeid hack for halloween - -- Backpack Builder, creates most of the backpack gui - scriptContext\AddCoreScript 53878047, screenGui, "CoreScripts/BackpackScripts/BackpackBuilder" - - waitForChild screenGui, "CurrentLoadout" - waitForChild screenGui, "Backpack" - Backpack = screenGui.Backpack - - -- Manager handles all big backpack state changes, other scripts subscribe to this and do things accordingly - if game.CoreGui.Version >= 7 - scriptContext\AddCoreScript 89449093, Backpack, "CoreScripts/BackpackScripts/BackpackManager" - - - -- Backpack Gear (handles all backpack gear tab stuff) - scriptContext\AddCoreScript 89449008, Backpack, "CoreScripts/BackpackScripts/BackpackGear" - -- Loadout Script, used for gear hotkeys - scriptContext\AddCoreScript 53878057, screenGui.CurrentLoadout, "CoreScripts/BackpackScripts/LoadoutScript" - if game.CoreGui.Version >= 8 - -- Wardrobe script handles all character dressing operations - scriptContext\AddCoreScript -1, Backpack, "CoreScripts/BackpackScripts/BackpackWardrobe" - -IsPersonalServer = not not game.Workspace\FindFirstChild "PSVariable" - -if IsPersonalServer - scriptContext\AddCoreScript 64164692, game.Players.LocalPlayer, "BuildToolManager" - -game.Workspace.ChildAdded\connect (nchild) -> - if nchild.Name == "PSVariable" and nchild\IsA "BoolValue" - IsPersonalServer = true - scriptContext\AddCoreScript 64164692, game.Players.LocalPlayer, "BuildToolManager" - -if touchEnabled -- touch devices don't use same control frame - -- only used for touch device button generation - scriptContext\AddCoreScript 152908679, screenGui, "CoreScripts/ContextActionTouch" - - waitForChild screenGui, "ControlFrame" - waitForChild screenGui.ControlFrame, "BottomLeftControl" - screenGui.ControlFrame.BottomLeftControl.Visible = false - - waitForChild screenGui.ControlFrame, "TopLeftControl" - screenGui.ControlFrame.TopLeftControl.Visible = false diff --git a/yue/38037565.yue b/yue/38037565.yue deleted file mode 100644 index d5142c5..0000000 --- a/yue/38037565.yue +++ /dev/null @@ -1,230 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -damageGuiWidth = 5.0 -damageGuiHeight = 5.0 - -waitForChild = (parent, childName) -> - child = parent\findFirstChild childName - if child - return child - - while true - child = parent.ChildAdded\wait! - if child.Name == childName - return child - --- declarations -Figure = script.Parent -Humanoid = waitForChild Figure, "Humanoid" -Torso = waitForChild Figure, "Torso" - -config = Figure\FindFirstChild "PlayerStats" - -inCharTag = New "BoolValue" - Name: "InCharTag" - -hider = New "BoolValue" - Name: "RobloxBuildTool" - -if config == nil - config = New "Configuration", "PlayerStats" - Parent: Figure - -myHealth = config\FindFirstChild "MaxHealth" -if myHealth == nil - myHealth = New "NumberValue", "MaxHealth" - Value: 100 - Parent: config - -Humanoid.MaxHealth = myHealth.Value -Humanoid.Health = myHealth.Value - -onMaxHealthChange = -> - Humanoid.MaxHealth = myHealth.Value - Humanoid.Health = myHealth.Value - -myHealth.Changed\connect onMaxHealthChange - ---Humanoid.MaxHealth = myHealth.Value ---Humanoid.Health = Humanoid.MaxHealth - -vPlayer = game.Players\GetPlayerFromCharacter script.Parent -dotGui = vPlayer.PlayerGui\FindFirstChild "DamageOverTimeGui" -if dotGui == nil - dotGui = New "BillboardGui", "DamageOverTimeGui" - Parent: vPlayer.PlayerGui - Adornee: script.Parent\FindFirstChild "Head" - Active: true - size: UDim2.new damageGuiWidth, 0, damageGuiHeight, 0.0 - StudsOffset: Vector3.new 0, 2.0, 0.0 - - -print "newHealth declarations finished" - -billboardHealthChange = (dmg) -> - with New "TextLabel", - Text: "#{dmg}" - TextColor3: Color3.new if dmg > 0 - 0, 1, 0 - else - 1, 0, 1 - size: UDim2.new 1, 0, 1, 0.0 - Active: true - FontSize: 6 - BackgroundTransparency: 1 - Parent: dotGui - - for t = 1, 10 - wait 0.1 - .TextTransparency = t / 10 - .Position = UDim2.new 0, 0, 0, -t * 5 - .FontSize = 6 - t * 0.6 - - \remove! - -setMaxHealth = -> - --print Humanoid.Health - if myHealth.Value >= 0 - Humanoid.MaxHealth = myHealth.Value - print Humanoid.MaxHealth - if Humanoid.Health > Humanoid.MaxHealth - Humanoid.Health = Humanoid.MaxHealth - -myHealth.Changed\connect setMaxHealth - --- Visual Effects -- - -fireEffect = New "Fire", "FireEffect" - Heat: 0.1 - Size: 3.0 - Enabled: false --- - --- regeneration -while true - s = wait 1 - health = Humanoid.Health - if health > 0 -- and health < Humanoid.MaxHealth - delta = 0 - if config - regen = config\FindFirstChild "Regen" - poison = config\FindFirstChild "Poison" - ice = config\FindFirstChild "Ice" - fire = config\FindFirstChild "Fire" - stun = config\FindFirstChild "Stun" - with regen do if regen - delta += .Value.X - if .Value.Y >= 0 - .Value = Vector3.new .Value.X + .Value.Z, .Value.Y - s, .Value.Z -- maybe have 3rd parameter be an increaser/decreaser? - elseif .Value.Y == -1 - .Value = Vector3.new .Value.X + .Value.Z, -1, .Value.Z - else - \remove! - -- infinity is -1 - - with poison do if poison - delta -= .Value.X - if .Value.Y >= 0 - .Value = Vector3.new .Value.X + .Value.Z, .Value.Y - s, .Value.Z - elseif .Value.Y == -1 - .Value = Vector3.new .Value.X + .Value.Z, -1, .Value.Z - else - \remove! - -- infinity is -1 - - with ice do if ice - --print "IN ICE" - delta -= .Value.X - if .Value.Y >= 0 - .Value = Vector3.new .Value.X, .Value.Y - s, .Value.Z - else - \remove! - - with fire do if fire - fireEffect.Enabled = true - fireEffect.Parent = Figure.Torso - delta -= .Value.X - if .Value.Y >= 0 - .Value = Vector3.new .Value.X, .Value.Y - s, .Value.Z - else - \remove! - fireEffect.Enabled = false - fireEffect.Parent = nil - - if stun - local backpackTools - if stun.Value > 0 - Torso.Anchored = true - currentChildren = script.Parent\GetChildren! - backpackTools = game.Players\GetPlayerFromCharacter(script.Parent).Backpack\GetChildren! - for i in *currentChildren - if i.className == "Tool" - inCharTag\Clone!.Parent = i - print backpackTools - table.insert backpackTools, i - - for i in *backpackTools - if not i\FindFirstChild"RobloxBuildTool"? - hider\Clone!.Parent = i - i.Parent = game.Lighting - - wait 0.2 - for i in *backpackTools - i.Parent = game.Players\GetPlayerFromCharacter(script.Parent).Backpack - - stun.Value = stun.Value - s - else - Torso.Anchored = false - for i in *backpackTools - i\FindFirstChild"RobloxBuildTool"?\Remove! - - i.Parent = game.Lighting - - wait 0.2 - for i in *backpackTools - wasInChar = i\FindFirstChild "InCharTag" - i.Parent = if wasInChar - wasInChar\Remove! - script.Parent - else - game.Players\GetPlayerFromCharacter(script.Parent).Backpack - - stun\Remove! - - if delta ~= 0 - coroutine.resume coroutine.create(billboardHealthChange), delta - --delta *= 0.01 - --health += delta * s * Humanoid.MaxHealth - - health = Humanoid.Health + delta * s - Humanoid.Health = if health * 1.01 < Humanoid.MaxHealth - health - --myHealth.Value = math.floor Humanoid.Health - elseif delta > 0 - Humanoid.MaxHealth - --myHealth.Value = Humanoid.Health diff --git a/yue/39250920.yue b/yue/39250920.yue deleted file mode 100644 index 36a07ab..0000000 --- a/yue/39250920.yue +++ /dev/null @@ -1,519 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -waitForProperty = (instance, name) -> - until instance[name] - instance.Changed\wait! - -waitForChild = (instance, name) -> - until instance\FindFirstChild name - instance.ChildAdded\wait! - -local mainFrame -choices = {} -local lastChoice -choiceMap = {} -local currentConversationDialog -local currentConversationPartner -local currentAbortDialogScript - -tooFarAwayMessage = "You are too far away to chat!" -tooFarAwaySize = 300 -characterWanderedOffMessage = "Chat ended because you walked away" -characterWanderedOffSize = 350 -conversationTimedOut = "Chat ended because you didn't reply" -conversationTimedOutSize = 350 - -local player -local chatNotificationGui -local messageDialog -local timeoutScript -local reenableDialogScript -dialogMap = {} -dialogConnections = {} - -local gui -waitForChild game, "CoreGui" -waitForChild game.CoreGui, "RobloxGui" - -gui = if game.CoreGui.RobloxGui\FindFirstChild "ControlFrame" - game.CoreGui.RobloxGui.ControlFrame -else - game.CoreGui.RobloxGui - -currentTone = -> - if currentConversationDialog - currentConversationDialog.Tone - else - Enum.DialogTone.Neutral - -createChatNotificationGui = -> - chatNotificationGui = New "BillboardGui", "ChatNotificationGui" - ExtentsOffset: Vector3.new 0, 1, 0 - Size: UDim2.new 4, 0, 5.42857122, 0 - SizeOffset: Vector2.new 0, 0 - StudsOffset: Vector3.new 0.4, 4.3, 0 - Enabled: true - RobloxLocked: true - Active: true - - * New "ImageLabel", "Image" - Active: false - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - Image: "" - RobloxLocked: true - - * New "ImageButton", "Button" - AutoButtonColor: false - Position: UDim2.new 0.088, 0, 0.053, 0 - Size: UDim2.new 0.83, 0, 0.46, 0 - Image: "" - BackgroundTransparency: 1 - RobloxLocked: true - -getChatColor = (tone) -> - if tone == Enum.DialogTone.Neutral - Enum.ChatColor.Blue - elseif tone == Enum.DialogTone.Friendly - Enum.ChatColor.Green - elseif tone == Enum.DialogTone.Enemy - Enum.ChatColor.Red - -resetColor = (frame, tone) -> - if tone == Enum.DialogTone.Neutral - frame.BackgroundColor3 = Color3.new 0, 0, 179 / 255 - frame.Number.TextColor3 = Color3.new 45 / 255, 142 / 255, 245 / 255 - elseif tone == Enum.DialogTone.Friendly - frame.BackgroundColor3 = Color3.new 0, 77 / 255, 0 - frame.Number.TextColor3 = Color3.new 0, 190 / 255, 0 - elseif tone == Enum.DialogTone.Enemy - frame.BackgroundColor3 = Color3.new 140 / 255, 0, 0 - frame.Number.TextColor3 = Color3.new 255 / 255, 88 / 255, 79 / 255 - -styleChoices = (tone) -> - for _, obj in pairs choices - resetColor obj, tone - resetColor lastChoice, tone - -styleMainFrame = (tone) -> - if tone == Enum.DialogTone.Neutral - mainFrame.Style = Enum.FrameStyle.ChatBlue - mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" - elseif tone == Enum.DialogTone.Friendly - mainFrame.Style = Enum.FrameStyle.ChatGreen - mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botGreen_tailRight.png" - elseif tone == Enum.DialogTone.Enemy - mainFrame.Style = Enum.FrameStyle.ChatRed - mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botRed_tailRight.png" - - styleChoices tone - -setChatNotificationTone = (gui, purpose, tone) -> - gui.Image.Image = if tone == Enum.DialogTone.Neutral - "rbxasset://textures/chatBubble_botBlue_notify_bkg.png" - elseif tone == Enum.DialogTone.Friendly - "rbxasset://textures/chatBubble_botGreen_notify_bkg.png" - elseif tone == Enum.DialogTone.Enemy - "rbxasset://textures/chatBubble_botRed_notify_bkg.png" - - gui.Image.Button.Image = if purpose == Enum.DialogPurpose.Quest - "rbxasset://textures/chatBubble_bot_notify_bang.png" - elseif purpose == Enum.DialogPurpose.Help - "rbxasset://textures/chatBubble_bot_notify_question.png" - elseif purpose == Enum.DialogPurpose.Shop - "rbxasset://textures/chatBubble_bot_notify_money.png" - -createMessageDialog = -> - messageDialog = New "Frame", "DialogScriptMessage" - Style: Enum.FrameStyle.RobloxRound - Visible: false - - * New "TextLabel", "Text" - Position: UDim2.new 0, 0, 0, -1 - Size: UDim2.new 1, 0, 1, 0 - FontSize: Enum.FontSize.Size14 - BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - RobloxLocked: true - -showMessage = (msg, size) -> - with messageDialog - .Text.Text = msg - .Size = UDim2.new 0, size, 0, 40 - .Position = UDim2.new 0.5, -size / 2, 0.5, -40 - .Visible = true - wait 2 - .Visible = false - -variableDelay = (str) -> - length = math.min string.len(str), 100 - wait 0.75 + (length / 75) * 1.5 - -highlightColor = (frame, tone) -> - if tone == Enum.DialogTone.Neutral - frame.BackgroundColor3 = Color3.new 2 / 255, 108 / 255, 255 / 255 - frame.Number.TextColor3 = Color3.new 1, 1, 1 - elseif tone == Enum.DialogTone.Friendly - frame.BackgroundColor3 = Color3.new 0, 128 / 255, 0 - frame.Number.TextColor3 = Color3.new 1, 1, 1 - elseif tone == Enum.DialogTone.Enemy - frame.BackgroundColor3 = Color3.new 204 / 255, 0, 0 - frame.Number.TextColor3 = Color3.new 1, 1, 1 - -endDialog = -> - if currentAbortDialogScript - currentAbortDialogScript\Remove! - currentAbortDialogScript = nil - - dialog = currentConversationDialog - currentConversationDialog = nil - if dialog and dialog.InUse - with reenableDialogScript\Clone! - .archivable = false - .Disabled = false - .Parent = dialog - - for dialog, gui in pairs dialogMap - if dialog and gui - gui.Enabled = not dialog.InUse - - currentConversationPartner = nil - -wanderDialog = -> - print "Wander" - mainFrame.Visible = false - endDialog! - showMessage characterWanderedOffMessage, characterWanderedOffSize - -timeoutDialog = -> - print "Timeout" - mainFrame.Visible = false - endDialog! - showMessage conversationTimedOut, conversationTimedOutSize -normalEndDialog = -> - print "Done" - endDialog! - -sanitizeMessage = (msg) -> - if string.len(msg) == 0 - "..." - else - msg - -renewKillswitch = (dialog) -> - with currentAbortDialogScript - if currentAbortDialogScript - \Remove! - currentAbortDialogScript = nil - - currentAbortDialogScript = timeoutScript\Clone! - .archivable = false - .Disabled = false - .Parent = dialog - -presentDialogChoices = (talkingPart, dialogChoices) -> - return if not currentConversationDialog - - currentConversationPartner = talkingPart - - sortedDialogChoices = [obj \ - for _, obj in pairs sortedDialogChoices \ - when obj\IsA "DialogChoice"] - - table.sort sortedDialogChoices, (a, b) -> a.Name < b.Name - - if #sortedDialogChoices == 0 - normalEndDialog! - return - - pos = 1 - yPosition = 0 - choiceMap = {} - for _, obj in pairs choices - obj.Visible = false - - for _, obj in pairs sortedDialogChoices - if pos <= #choices - --3 lines is the maximum, set it to that temporarily - choices[pos].Size = UDim2.new 1, 0, 0, 24 * 3 - choices[pos].UserPrompt.Text = obj.UserDialog - height = math.ceil(choices[pos].UserPrompt.TextBounds.Y / 24) * 24 - - choices[pos].Position = UDim2.new 0, 0, 0, yPosition - choices[pos].Size = UDim2.new 1, 0, 0, height - choices[pos].Visible = true - - choiceMap[choices[pos]] = obj - - yPosition += height - pos += 1 - - lastChoice.Position = UDim2.new 0, 0, 0, yPosition - lastChoice.Number.Text = pos .. ")" - - mainFrame.Size = UDim2.new 0, 350, 0, yPosition + 24 + 32 - mainFrame.Position = UDim2.new 0, 20, 0, -mainFrame.Size.Y.Offset - 20 - styleMainFrame currentTone! - mainFrame.Visible = true - -selectChoice = (choice) -> - renewKillswitch currentConversationDialog - - --First hide the Gui - mainFrame.Visible = false - if choice == lastChoice - game.Chat\Chat game.Players.LocalPlayer.Character, "Goodbye!", getChatColor currentTone! - - normalEndDialog! - else - dialogChoice = choiceMap[choice] - - game.Chat\Chat( - game.Players.LocalPlayer.Character, - sanitizeMessage(dialogChoice.UserDialog), - getChatColor currentTone! - ) - - wait 1 - currentConversationDialog\SignalDialogChoiceSelected player, dialogChoice - game.Chat\Chat( - currentConversationPartner, - sanitizeMessage(dialogChoice.ResponseDialog), - getChatColor currentTone! - ) - - variableDelay dialogChoice.ResponseDialog - presentDialogChoices currentConversationPartner, dialogChoice\GetChildren! - -newChoice = (numberText) -> - frame = New "TextButton" - BackgroundColor3: Color3.new 0, 0, 179 / 255 - AutoButtonColor: false - BorderSizePixel: 0 - Text: "" - RobloxLocked: true - - * New "TextLabel", "Number" - TextColor3: Color3.new 127 / 255, 212 / 255, 255 / 255 - Text: numberText - FontSize: Enum.FontSize.Size14 - BackgroundTransparency: 1 - Position: UDim2.new 0, 4, 0, 2 - Size: UDim2.new 0, 20, 0, 24 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - RobloxLocked: true - - * New "TextLabel", "UserPrompt" - BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - FontSize: Enum.FontSize.Size14 - Position: UDim2.new 0, 28, 0, 2 - Size: UDim2.new 1, -32, 1, -4 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - TextWrap: true - RobloxLocked: true - - frame.MouseEnter\connect -> highlightColor frame, currentTone! - frame.MouseLeave\connect -> resetColor frame, currentTone! - frame.MouseButton1Click\connect -> selectChoice frame - frame - -initialize = (parent) -> - choices[1] = newChoice "1)" - choices[2] = newChoice "2)" - choices[3] = newChoice "3)" - choices[4] = newChoice "4)" - - lastChoice = newChoice "5)" - lastChoice.UserPrompt.Text = "Goodbye!" - lastChoice.Size = UDim2.new 1, 0, 0, 28 - - mainFrame = New "Frame", "UserDialogArea" - Size: UDim2.new 0, 350, 0, 200 - Style: Enum.FrameStyle.ChatBlue - Visible: false - - * New "ImageLabel", "Tail" - Size: UDim2.new 0, 62, 0, 53 - Position: UDim2.new 1, 8, 0.25 - Image: "rbxasset://textures/chatBubble_botBlue_tailRight.png" - BackgroundTransparency: 1 - RobloxLocked: true - - for _, obj in pairs choices - obj.RobloxLocked = true - obj.Parent = mainFrame - lastChoice.RobloxLocked = true - lastChoice.Parent = mainFrame - - mainFrame.RobloxLocked = true - mainFrame.Parent = parent - -doDialog = (dialog) -> - until Instance.Lock dialog, player - wait! - - if dialog.InUse - Instance.Unlock dialog - return - else - dialog.InUse = true - Instance.Unlock dialog - - currentConversationDialog = dialog - game.Chat\Chat dialog.Parent, dialog.InitialPrompt, getChatColor dialog.Tone - variableDelay dialog.InitialPrompt - - presentDialogChoices dialog.Parent, dialog\GetChildren! - -checkForLeaveArea = -> - while currentConversationDialog - if currentConversationDialog.Parent and ( - player\DistanceFromCharacter currentConversationDialog.Parent.Position >= currentConversationDialog.ConversationDistance - ) - wanderDialog! - - wait 1 - -startDialog = (dialog) -> - if dialog.Parent and dialog.Parent\IsA "BasePart" - if player\DistanceFromCharacter(dialog.Parent.Position) >= dialog.ConversationDistance - showMessage tooFarAwayMessage, tooFarAwaySize - return - - for dialog, gui in pairs dialogMap - if dialog and gui - gui.Enabled = false - - renewKillswitch dialog - - delay 1, checkForLeaveArea - doDialog dialog - -removeDialog = (dialog) -> - if dialogMap[dialog] - dialogMap[dialog]\Remove! - dialogMap[dialog] = nil - if dialogConnections[dialog] - dialogConnections[dialog]\disconnect! - dialogConnections[dialog] = nil - -addDialog = (dialog) -> - if dialog.Parent - if dialog.Parent\IsA "BasePart" - chatGui = chatNotificationGui\clone! - with chatGui - .Enabled = not dialog.InUse - .Adornee = dialog.Parent - .RobloxLocked = true - .Parent = game.CoreGui - .Image.Button.MouseButton1Click\connect -> - startDialog dialog - - setChatNotificationTone chatGui, dialog.Purpose, dialog.Tone - - dialogMap[dialog] = chatGui - - dialogConnections[dialog] = dialog.Changed\connect (prop) -> - if prop == "Parent" and dialog.Parent - --This handles the reparenting case, seperate from removal case - removeDialog dialog - addDialog dialog - elseif prop == "InUse" - chatGui.Enabled = not currentConversationDialog and not dialog.InUse - if dialog == currentConversationDialog - timeoutDialog! - - elseif prop == "Tone" or prop == "Purpose" - setChatNotificationTone chatGui, dialog.Purpose, dialog.Tone - - else -- still need to listen to parent changes even if current parent is not a BasePart - dialogConnections[dialog] = dialog.Changed\connect (prop) -> - if prop == "Parent" and dialog.Parent - --This handles the reparenting case, seperate from removal case - removeDialog dialog - addDialog dialog - -fetchScripts = -> - model = game\GetService"InsertService"\LoadAsset 39226062 - if type(model) == "string" -- load failed, lets try again - wait 0.1 - model = game\GetService"InsertService"\LoadAsset 39226062 - return if type(model) == "string" -- not going to work, lets bail - - waitForChild model, "TimeoutScript" - timeoutScript = model.TimeoutScript - waitForChild model, "ReenableDialogScript" - reenableDialogScript = model.ReenableDialogScript - -onLoad = -> - waitForProperty game.Players, "LocalPlayer" - player = game.Players.LocalPlayer - waitForProperty player, "Character" - - --print "Fetching Scripts" - fetchScripts! - - --print "Creating Guis" - createChatNotificationGui! - - --print "Creating MessageDialog" - createMessageDialog! - messageDialog.RobloxLocked = true - messageDialog.Parent = gui - - --print "Waiting for BottomLeftControl" - waitForChild gui, "BottomLeftControl" - - --print "Initializing Frame" - frame = New "Frame", "DialogFrame" - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 0, 0, 0, 0 - BackgroundTransparency: 1 - RobloxLocked: true - Parent: gui.BottomLeftControl - - initialize frame - - --print "Adding Dialogs" - game.CollectionService.ItemAdded\connect (obj) -> - if obj\IsA "Dialog" - addDialog obj - - game.CollectionService.ItemRemoved\connect (obj) -> - if obj\IsA "Dialog" - removeDialog obj - - for _, obj in pairs game.CollectionService\GetCollection "Dialog" - if obj\IsA "Dialog" - addDialog obj - -onLoad! diff --git a/yue/45284430.yue b/yue/45284430.yue deleted file mode 100644 index 4ae68ed..0000000 --- a/yue/45284430.yue +++ /dev/null @@ -1,3636 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -t = {} - -ScopedConnect = (parentInstance, instance, event, signalFunc, syncFunc, removeFunc) -> - local eventConnection - - --Connection on parentInstance is scoped by parentInstance (when destroyed, it goes away) - tryConnect = -> - if game\IsAncestorOf parentInstance - --Entering the world, make sure we are connected/synced - if not eventConnection - eventConnection = instance[event]\connect signalFunc - syncFunc?! - - - else - --Probably leaving the world, so disconnect for now - if eventConnection - eventConnection\disconnect! - removeFunc?! - - - --Hook it up to ancestryChanged signal - connection = parentInstance.AncestryChanged\connect tryConnect - - --Now connect us if we're already in the world - tryConnect! - - connection - - -getScreenGuiAncestor = (instance) -> - localInstance = instance - while localInstance and not localInstance\IsA "ScreenGui" - localInstance = localInstance.Parent - - localInstance - - -CreateButtons = (frame, buttons, yPos, ySize) -> - buttonNum = 1 - buttonObjs = {} - for _, obj in ipairs buttons - button = New "TextButton", "Button#{buttonNum}" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - AutoButtonColor: true - Modal: true - Style: if obj["Style"] - obj.Style - else - Enum.ButtonStyle.RobloxButton - - Text: obj.Text - TextColor3: Color3.new 1, 1, 1 - Parent: frame - - button.MouseButton1Click\connect obj.Function - buttonObjs[buttonNum] = button - - buttonNum += 1 - - numButtons = buttonNum - 1 - - if numButtons == 1 - frame.Button1.Position = UDim2.new 0.35, 0, yPos.Scale, yPos.Offset - frame.Button1.Size = UDim2.new 0.4, 0, ySize.Scale, ySize.Offset - elseif numButtons == 2 - frame.Button1.Position = UDim2.new 0.1, 0, yPos.Scale, yPos.Offset - frame.Button1.Size = UDim2.new 0.8 / 3, 0, ySize.Scale, ySize.Offset - - frame.Button2.Position = UDim2.new 0.55, 0, yPos.Scale, yPos.Offset - frame.Button2.Size = UDim2.new 0.35, 0, ySize.Scale, ySize.Offset - elseif numButtons >= 3 - spacing = 0.1 / numButtons - buttonSize = 0.9 / numButtons - - buttonNum = 1 - while buttonNum <= numButtons - buttonObjs[buttonNum].Position = UDim2.new spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, yPos.Scale, yPos.Offset - buttonObjs[buttonNum].Size = UDim2.new buttonSize, 0, ySize.Scale, ySize.Offset - buttonNum += 1 - - -setSliderPos = (newAbsPosX, slider, sliderPosition, bar, steps) -> - newStep = steps - 1 --otherwise we really get one more step than we want - relativePosX = math.min 1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X) - wholeNum, remainder = math.modf relativePosX * newStep - if remainder > 0.5 - wholeNum += 1 - - relativePosX = wholeNum / newStep - - result = math.ceil relativePosX * newStep - if sliderPosition.Value ~= (result + 1) --only update if we moved a step - sliderPosition.Value = result + 1 - slider.Position = UDim2.new relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset - - -cancelSlide = (areaSoak) -> - areaSoak.Visible = false - areaSoakMouseMoveCon?\disconnect! - - -t.CreateStyledMessageDialog = (title, message, style, buttons) -> - frame = New "Frame", "MessageDialog" - Size: UDim2.new 0.5, 0, 0, 165 - Position: UDim2.new 0.25, 0, 0.5, -72.5 - Active: true - Style: Enum.FrameStyle.RobloxRound - - * New "TextLabel", "Title" - Text: title - TextStrokeTransparency: 0 - BackgroundTransparency: 1 - TextColor3: Color3.new 221 / 255, 221 / 255, 221 / 255 - Position: UDim2.new 0, 80, 0, 0 - Size: UDim2.new 1, -80, 0, 40 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - TextXAlignment: Enum.TextXAlignment.Center - TextYAlignment: Enum.TextYAlignment.Center - - * New "TextLabel", "Message" - Text: message - TextStrokeTransparency: 0 - TextColor3: Color3.new 221 / 255, 221 / 255, 221 / 255 - Position: UDim2.new 0.025, 80, 0, 45 - Size: UDim2.new 0.95, -80, 0, 55 - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextWrap: true - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - - styleImage = New "ImageLabel", "StyleImage" - BackgroundTransparency: 1 - Position: UDim2.new 0, 5, 0, 15 - - if style == "error" or style == "Error" - styleImage.Size = UDim2.new 0, 71, 0, 71 - styleImage.Image = "http://banland.xyz/asset?id=42565285" - elseif style == "notify" or style == "Notify" - styleImage.Size = UDim2.new 0, 71, 0, 71 - styleImage.Image = "http://banland.xyz/asset?id=42604978" - elseif style == "confirm" or style == "Confirm" - styleImage.Size = UDim2.new 0, 74, 0, 76 - styleImage.Image = "http://banland.xyz/asset?id=42557901" - else - return t.CreateMessageDialog title, message, buttons - - styleImage.Parent = frame - - CreateButtons frame, buttons, UDim.new(0, 105), UDim.new 0, 40 - - frame - - -t.CreateMessageDialog = (title, message, buttons) -> - frame = New "Frame", "MessageDialog" - Size: UDim2.new 0.5, 0, 0.5, 0 - Position: UDim2.new 0.25, 0, 0.25, 0 - Active: true - Style: Enum.FrameStyle.RobloxRound - - * New "TextLabel", "Title" - Text: title - BackgroundTransparency: 1 - TextColor3: Color3.new 221 / 255, 221 / 255, 221 / 255 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0.15, 0 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - TextXAlignment: Enum.TextXAlignment.Center - TextYAlignment: Enum.TextYAlignment.Center - - * New "TextLabel", "Message" - Text: message - TextColor3: Color3.new 221 / 255, 221 / 255, 221 / 255 - Position: UDim2.new 0.025, 0, 0.175, 0 - Size: UDim2.new 0.95, 0, 0.55, 0 - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextWrap: true - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - - CreateButtons frame, buttons, UDim.new(0.8, 0), UDim.new 0.15, 0 - - frame - - -t.CreateDropDownMenu = (items, onSelect, forRoblox) -> - width = UDim.new 0, 100 - height = UDim.new 0, 32 - - frame = New "Frame", "DropDownMenu" - BackgroundTransparency: 1 - Size: UDim2.new width, height - - dropDownMenu = New "TextButton", "DropDownMenuButton" - TextWrap: true - TextColor3: Color3.new 1, 1, 1 - Text: "Choose One" - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Center - BackgroundTransparency: 1 - AutoButtonColor: true - Style: Enum.ButtonStyle.RobloxButton - Size: UDim2.new 1, 0, 1, 0 - Parent: frame - ZIndex: 2 - - * New "ImageLabel", "Icon" - Active: false - Image: "http://banland.xyz/asset/?id=45732894" - BackgroundTransparency: 1 - Size: UDim2.new 0, 11, 0, 6 - Position: UDim2.new 1, -11, 0.5, -2 - ZIndex: 2 - - itemCount = #items - dropDownItemCount = #items - useScrollButtons = false - if dropDownItemCount > 6 - useScrollButtons = true - dropDownItemCount = 6 - - - droppedDownMenu = New "TextButton", "List" - Text: "" - BackgroundTransparency: 1 - --AutoButtonColor: true - Style: Enum.ButtonStyle.RobloxButton - Visible: false - Active: true --Blocks clicks - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, (1 + dropDownItemCount) * 0.8, 0 - Parent: frame - ZIndex: 2 - - choiceButton = New "TextButton", "ChoiceButton" - BackgroundTransparency: 1 - BorderSizePixel: 0 - Text: "ReplaceMe" - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Center - BackgroundColor3: Color3.new 1, 1, 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Size: UDim2.new 1, if useScrollButtons - -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 - else - 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0 - - TextWrap: true - ZIndex: 2 - - areaSoak = New "TextButton", "AreaSoak" - Text: "" - BackgroundTransparency: 1 - Active: true - Size: UDim2.new 1, 0, 1, 0 - Visible: false - ZIndex: 3 - - dropDownSelected = false - - local scrollUpButton - local scrollDownButton - scrollMouseCount = 0 - - setZIndex = (baseZIndex) -> - droppedDownMenu.ZIndex = baseZIndex + 1 - if scrollUpButton - scrollUpButton.ZIndex = baseZIndex + 3 - - if scrollDownButton - scrollDownButton.ZIndex = baseZIndex + 3 - - if children = droppedDownMenu\GetChildren! - for _, child in ipairs children - if child.Name == "ChoiceButton" - child.ZIndex = baseZIndex + 2 - elseif child.Name == "ClickCaptureButton" - child.ZIndex = baseZIndex - - - scrollBarPosition = 1 - updateScroll = -> - if scrollUpButton - scrollUpButton.Active = scrollBarPosition > 1 - - if scrollDownButton - scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount - - - children = droppedDownMenu\GetChildren! - return if not children - - childNum = 1 - for _, obj in ipairs children - if obj.Name == "ChoiceButton" - if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount - obj.Visible = false - else - obj.Position = UDim2.new 0, 0, ((childNum - scrollBarPosition + 1) * 0.8) / ((dropDownItemCount + 1) * 0.8), 0 - obj.Visible = true - - obj.TextColor3 = Color3.new 1, 1, 1 - obj.BackgroundTransparency = 1 - - childNum += 1 - - - toggleVisibility = -> - dropDownSelected = not dropDownSelected - - areaSoak.Visible = not areaSoak.Visible - dropDownMenu.Visible = not dropDownSelected - droppedDownMenu.Visible = dropDownSelected - setZIndex if dropDownSelected - 4 - else - 2 - - if useScrollButtons - updateScroll! - - - droppedDownMenu.MouseButton1Click\connect toggleVisibility - - updateSelection = (text) -> - foundItem = false - children = droppedDownMenu\GetChildren! - childNum = 1 - if children - for _, obj in ipairs children - if obj.Name == "ChoiceButton" - if obj.Text == text - obj.Font = Enum.Font.ArialBold - foundItem = true - scrollBarPosition = childNum - else - obj.Font = Enum.Font.Arial - - childNum += 1 - - - if not text - dropDownMenu.Text = "Choose One" - scrollBarPosition = 1 - else - if not foundItem - error "Invalid Selection Update -- " .. text - - - if scrollBarPosition + dropDownItemCount > itemCount + 1 - scrollBarPosition = itemCount - dropDownItemCount + 1 - - - dropDownMenu.Text = text - - - scrollDown = -> - if scrollBarPosition + dropDownItemCount <= itemCount - scrollBarPosition += 1 - updateScroll! - return true - false - - scrollUp = -> - if scrollBarPosition > 1 - scrollBarPosition -= 1 - updateScroll! - return true - false - - - if useScrollButtons - --Make some scroll buttons - scrollUpButton = New "ImageButton", "ScrollUpButton" - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/scrollbuttonUp.png" - Size: UDim2.new 0, 17, 0, 17 - Position: UDim2.new 1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0 - - scrollUpButton.MouseButton1Click\connect -> scrollMouseCount += 1 - scrollUpButton.MouseLeave\connect -> scrollMouseCount += 1 - scrollUpButton.MouseButton1Down\connect -> - scrollMouseCount += 1 - - scrollUp! - val = scrollMouseCount - wait 0.5 - while val == scrollMouseCount - break if scrollUp! == false - - wait 0.1 - - - scrollUpButton.Parent = droppedDownMenu - - scrollDownButton = New "ImageButton", "ScrollDownButton" - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/scrollbuttonDown.png" - Size: UDim2.new 0, 17, 0, 17 - Position: UDim2.new 1, -11, 1, -11 - Parent: droppedDownMenu - - scrollDownButton.MouseButton1Click\connect -> scrollMouseCount += 1 - scrollDownButton.MouseLeave\connect -> scrollMouseCount += 1 - scrollDownButton.MouseButton1Down\connect -> - scrollMouseCount += 1 - - scrollDown! - val = scrollMouseCount - wait 0.5 - while val == scrollMouseCount - break if scrollDown! == false - - wait 0.1 - - New "ImageLabel", "ScrollBar" - Image: "rbxasset://textures/ui/scrollbar.png" - BackgroundTransparency: 1 - Size: UDim2.new 0, 18, (dropDownItemCount * 0.8) / ((dropDownItemCount + 1) * 0.8), -17 - 11 - 4 - Position: UDim2.new 1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 17 + 2 - Parent: droppedDownMenu - - - for _, item in ipairs items - -- needed to maintain local scope for items in event listeners below - button = choiceButton\clone! - if forRoblox - button.RobloxLocked = true - - button.Text = item - button.Parent = droppedDownMenu - button.MouseButton1Click\connect -> - --Remove Highlight - button.TextColor3 = Color3.new 1, 1, 1 - button.BackgroundTransparency = 1 - - updateSelection item - onSelect item - - toggleVisibility! - - button.MouseEnter\connect -> - --Add Highlight - button.TextColor3 = Color3.new 0, 0, 0 - button.BackgroundTransparency = 0 - - - button.MouseLeave\connect -> - --Remove Highlight - button.TextColor3 = Color3.new 1, 1, 1 - button.BackgroundTransparency = 1 - - - --This does the initial layout of the buttons - updateScroll! - - frame.AncestryChanged\connect (_, parent) -> - areaSoak.Parent = if parent == nil - nil - else - getScreenGuiAncestor frame - - - dropDownMenu.MouseButton1Click\connect toggleVisibility - areaSoak.MouseButton1Click\connect toggleVisibility - return frame, updateSelection - - -t.CreatePropertyDropDownMenu = (instance, property, enum) -> - items = enum\GetEnumItems! - names = {} - nameToItem = {} - for i, obj in ipairs items - names[i] = obj.Name - nameToItem[obj.Name] = obj - - - local frame, updateSelection - frame, updateSelection = t.CreateDropDownMenu names, (text) -> - instance[property] = nameToItem[text] - - - ScopedConnect(frame, instance, "Changed" - (prop) -> - if prop == property - updateSelection instance[property].Name - -> - updateSelection instance[property].Name - ) - - frame - - -t.GetFontHeight = (font, fontSize) -> - if font == nil or fontSize == nil - error "Font and FontSize must be non-nil" - - - if font == Enum.Font.Legacy - switch fontSize - when Enum.FontSize.Size8 then 12 - when Enum.FontSize.Size9 then 14 - when Enum.FontSize.Size10 then 15 - when Enum.FontSize.Size11 then 17 - when Enum.FontSize.Size12 then 18 - when Enum.FontSize.Size14 then 21 - when Enum.FontSize.Size18 then 27 - when Enum.FontSize.Size24 then 36 - when Enum.FontSize.Size36 then 54 - when Enum.FontSize.Size48 then 72 - else error "Unknown FontSize" - - elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold - switch fontSize - when Enum.FontSize.Size8 then 8 - when Enum.FontSize.Size9 then 9 - when Enum.FontSize.Size10 then 10 - when Enum.FontSize.Size11 then 11 - when Enum.FontSize.Size12 then 12 - when Enum.FontSize.Size14 then 14 - when Enum.FontSize.Size18 then 18 - when Enum.FontSize.Size24 then 24 - when Enum.FontSize.Size36 then 36 - when Enum.FontSize.Size48 then 48 - else error "Unknown FontSize" - - else - error "Unknown Font " .. font - - -layoutGuiObjectsHelper = (frame, guiObjects, settingsTable) -> - totalPixels = frame.AbsoluteSize.Y - pixelsRemaining = frame.AbsoluteSize.Y - for _, child in ipairs guiObjects - if child\IsA"TextLabel" or child\IsA "TextButton" - isLabel = child\IsA "TextLabel" - pixelsRemaining -= if isLabel - settingsTable["TextLabelPositionPadY"] - else - settingsTable["TextButtonPositionPadY"] - - child.Position = UDim2.new child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining - child.Size = UDim2.new child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining - - if child.TextFits and child.TextBounds.Y < pixelsRemaining - child.Visible = true - child.Size = if isLabel - UDim2.new( - child.Size.X.Scale, - child.Size.X.Offset, - 0, - child.TextBounds.Y + settingsTable["TextLabelSizePadY"] - ) - else - UDim2.new( - child.Size.X.Scale, - child.Size.X.Offset, - 0, - child.TextBounds.Y + settingsTable["TextButtonSizePadY"] - ) - - - while not child.TextFits - child.Size = UDim2.new child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1 - - pixelsRemaining -= child.AbsoluteSize.Y - - pixelsRemaining -= if isLabel - settingsTable["TextLabelPositionPadY"] - else - settingsTable["TextButtonPositionPadY"] - - else - child.Visible = false - pixelsRemaining = -1 - - else - --GuiObject - child.Position = UDim2.new child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining - pixelsRemaining -= child.AbsoluteSize.Y - child.Visible = (pixelsRemaining >= 0) - - -t.LayoutGuiObjects = (frame, guiObjects, settingsTable) -> - if not frame\IsA "GuiObject" - error "Frame must be a GuiObject" - - for _, child in ipairs guiObjects - if not child\IsA "GuiObject" - error "All elements that are layed out must be of type GuiObject" - - - if not settingsTable - settingsTable = {} - - if not settingsTable["TextLabelSizePadY"] - settingsTable["TextLabelSizePadY"] = 0 - - if not settingsTable["TextLabelPositionPadY"] - settingsTable["TextLabelPositionPadY"] = 0 - - if not settingsTable["TextButtonSizePadY"] - settingsTable["TextButtonSizePadY"] = 12 - - if not settingsTable["TextButtonPositionPadY"] - settingsTable["TextButtonPositionPadY"] = 2 - - - --Wrapper frame takes care of styled objects - wrapperFrame = New "Frame", "WrapperFrame" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - Parent: frame - - for _, child in ipairs guiObjects - child.Parent = wrapperFrame - - - recalculate = -> - wait! - layoutGuiObjectsHelper wrapperFrame, guiObjects, settingsTable - - - frame.Changed\connect (prop) -> - if prop == "AbsoluteSize" - --Wait a heartbeat for it to sync in - recalculate! - - - frame.AncestryChanged\connect recalculate - - layoutGuiObjectsHelper wrapperFrame, guiObjects, settingsTable - - -t.CreateSlider = (steps, width, position) -> - sliderGui = New "Frame", "SliderGui" - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - - sliderSteps = New "IntValue", "SliderSteps" - Value: steps - Parent: sliderGui - - areaSoak = New "TextButton", "AreaSoak" - Text: "" - BackgroundTransparency: 1 - Active: false - Size: UDim2.new 1, 0, 1, 0 - Visible: false - ZIndex: 4 - - sliderGui.AncestryChanged\connect (_, parent) -> - areaSoak.Parent = if parent == nil - nil - else - getScreenGuiAncestor sliderGui - - - sliderPosition = New "IntValue", "SliderPosition" - Value: 0 - Parent: sliderGui - - bar = New "TextButton", "Bar" - Text: "" - AutoButtonColor: false - BackgroundColor3: Color3.new 0, 0, 0 - Size: UDim2.new 0, if type(width) == "number" - width, 0, 5 - else - 200, 0, 5 - - BorderColor3: Color3.new 95 / 255, 95 / 255, 95 / 255 - ZIndex: 2 - Parent: sliderGui - - if position["X"] and - position["X"]["Scale"] and - position["X"]["Offset"] and - position["Y"] and - position["Y"]["Scale"] and - position["Y"]["Offset"] - - bar.Position = position - - - slider = New "ImageButton", "Slider" - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/Slider.png" - Position: UDim2.new 0, 0, 0.5, -10 - Size: UDim2.new 0, 20, 0, 20 - ZIndex: 3 - Parent: bar - - local areaSoakMouseMoveCon - - f = -> if areaSoak.Visible - cancelSlide areaSoak - - areaSoak.MouseLeave\connect f - areaSoak.MouseButton1Up\connect f - - - slider.MouseButton1Down\connect -> - areaSoak.Visible = true - areaSoakMouseMoveCon?\disconnect! - - areaSoakMouseMoveCon = areaSoak.MouseMoved\connect (x, _) -> - setSliderPos x, slider, sliderPosition, bar, steps - - - slider.MouseButton1Up\connect -> - cancelSlide areaSoak - - - sliderPosition.Changed\connect (_) -> - sliderPosition.Value = math.min steps, math.max 1, sliderPosition.Value - relativePosX = (sliderPosition.Value - 1) / (steps - 1) - slider.Position = UDim2.new relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset - - - bar.MouseButton1Down\connect (x, _) -> - setSliderPos x, slider, sliderPosition, bar, steps - - - sliderGui, sliderPosition, sliderSteps - - -t.CreateTrueScrollingFrame = -> - local lowY, highY, dragCon, upCon - - internalChange = false - - descendantsChangeConMap = {} - - scrollingFrame = New "Frame", "ScrollingFrame" - Active: true - Size: UDim2.new 1, 0, 1, 0 - ClipsDescendants: true - - * New "Frame", "ControlFrame" - BackgroundTransparency: 1 - Size: UDim2.new 0, 18, 1, 0 - Position: UDim2.new 1, -20, 0, 0 - - * New "BoolValue", "ScrollBottom" - Value: false - - * New "BoolValue", "ScrollUp" - Value: false - - * New "TextButton", "ScrollUpButton" - Text: "" - AutoButtonColor: false - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 1, 1 - BackgroundTransparency: 0.5 - Size: UDim2.new 0, 18, 0, 18 - ZIndex: 2 - - { - ControlFrame: controlFrame - ControlFrame: - ScrollBottom: scrollBottom - ScrollUp: scrollUpBool - ScrollUpButton: scrollUpButton - } = scrollingFrame - - - for i = 1, 6 - New "Frame", "tri#{i}" - BorderColor3: Color3.new 1, 1, 1 - ZIndex: 3 - BackgroundTransparency: 0.5 - Size: UDim2.new 0, 12 - ((i - 1) * 2), 0, 0 - Position: UDim2.new 0, 3 + (i - 1), 0.5, 2 - (i - 1) - Parent: scrollUpButton - - scrollUpButton.MouseEnter\connect -> - scrollUpButton.BackgroundTransparency = 0.1 - upChildren = scrollUpButton\GetChildren! - for i in *upChildren - i.BackgroundTransparency = 0.1 - - - scrollUpButton.MouseLeave\connect -> - scrollUpButton.BackgroundTransparency = 0.5 - upChildren = scrollUpButton\GetChildren! - for i in *upChildren - i.BackgroundTransparency = 0.5 - - - scrollDownButton = scrollUpButton\clone! - scrollDownButton.Name = "ScrollDownButton" - scrollDownButton.Position = UDim2.new 0, 0, 1, -18 - downChildren = scrollDownButton\GetChildren! - for i = 1, #downChildren - downChildren[i].Position = UDim2.new 0, 3 + (i - 1), 0.5, -2 + (i - 1) - - scrollDownButton.MouseEnter\connect -> - scrollDownButton.BackgroundTransparency = 0.1 - downChildren = scrollDownButton\GetChildren! - for i in *downChildren - i.BackgroundTransparency = 0.1 - - - scrollDownButton.MouseLeave\connect -> - scrollDownButton.BackgroundTransparency = 0.5 - downChildren = scrollDownButton\GetChildren! - for i in *downChildren - i.BackgroundTransparency = 0.5 - - - scrollDownButton.Parent = controlFrame - - scrollTrack = New "Frame", "ScrollTrack" - BackgroundTransparency: 1 - Size: UDim2.new 0, 18, 1, -38 - Position: UDim2.new 0, 0, 0, 19 - Parent: controlFrame - - * New "TextButton", "ScrollBar" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 1, 1 - BackgroundTransparency: 0.5 - AutoButtonColor: false - Text: "" - Active: true - ZIndex: 2 - Size: UDim2.new 0, 18, 0.1, 0 - Position: UDim2.new 0, 0, 0, 0 - - * New "Frame", "ScrollNub" - BorderColor3: Color3.new 1, 1, 1 - Size: UDim2.new 0, 10, 0, 0 - Position: UDim2.new 0.5, -5, 0.5, 0 - ZIndex: 2 - BackgroundTransparency: 0.5 - - { - ScrollBar: scrollbar - ScrollBar: - ScrollNub: scrollNub - } = scrollTrack - - - newNub = scrollNub\clone! - newNub.Position = UDim2.new 0.5, -5, 0.5, -2 - newNub.Parent = scrollbar - - lastNub = scrollNub\clone! - lastNub.Position = UDim2.new 0.5, -5, 0.5, 2 - lastNub.Parent = scrollbar - - scrollbar.MouseEnter\connect -> - scrollbar.BackgroundTransparency = \ - scrollNub.BackgroundTransparency = \ - newNub.BackgroundTransparency = \ - lastNub.BackgroundTransparency = 0.1 - - scrollbar.MouseLeave\connect -> - scrollbar.BackgroundTransparency = \ - scrollNub.BackgroundTransparency = \ - newNub.BackgroundTransparency = \ - lastNub.BackgroundTransparency = 0.5 - - - mouseDrag = New "ImageButton", "mouseDrag" - Active: false - Size: UDim2.new 1.5, 0, 1.5, 0 - AutoButtonColor: false - BackgroundTransparency: 1 - Position: UDim2.new -0.25, 0, -0.25, 0 - ZIndex: 10 - - positionScrollBar = (_, y, offset) -> - oldPos = scrollbar.Position - - if y < scrollTrack.AbsolutePosition.y - scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0 - return oldPos ~= scrollbar.Position - - - relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y - - if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) - scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0 - return oldPos ~= scrollbar.Position - - newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset) / scrollTrack.AbsoluteSize.y - if newScaleYPos + relativeSize > 1 - newScaleYPos = 1 - relativeSize - scrollBottom.Value = true - scrollUpBool.Value = false - elseif newScaleYPos <= 0 - newScaleYPos = 0 - scrollUpBool.Value = true - scrollBottom.Value = false - else - scrollUpBool.Value = false - scrollBottom.Value = false - - scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, newScaleYPos, 0 - - oldPos ~= scrollbar.Position - - - drillDownSetHighLow = (instance) -> - return if not instance or not instance\IsA "GuiObject" - return if instance == controlFrame - return if instance\IsDescendantOf controlFrame - return if not instance.Visible - - if (lowY and lowY > instance.AbsolutePosition.Y) or not lowY - lowY = instance.AbsolutePosition.Y - - if (highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y)) or not highY - highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - - children = instance\GetChildren! - for i in *children - drillDownSetHighLow i - - - resetHighLow = -> - firstChildren = scrollingFrame\GetChildren! - - for i in *firstChildren - drillDownSetHighLow i - - - recalculate = -> - internalChange = true - - percentFrame = 0 - if scrollbar.Position.Y.Scale > 0 - percentFrame = if scrollbar.Visible - scrollbar.Position.Y.Scale / ((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) / scrollTrack.AbsoluteSize.Y) - else - 0 - - - if percentFrame > 0.99 - percentFrame = 1 - - - hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame - - guiChildren = scrollingFrame\GetChildren! - for i in *guiChildren - if i ~= controlFrame - i.Position = UDim2.new( - i.Position.X.Scale, - i.Position.X.Offset, - 0, - math.ceil(i.AbsolutePosition.Y) - math.ceil lowY + hiddenYAmount - ) - - - lowY = \ - highY = nil - resetHighLow! - internalChange = false - - - setSliderSizeAndPosition = -> - return if not highY or not lowY - - totalYSpan = math.abs highY - lowY - if totalYSpan == 0 - scrollbar.Visible = \ - scrollDownButton.Visible = \ - scrollUpButton.Visible = false - - if dragCon - dragCon\disconnect! - dragCon = nil - - if upCon - upCon\disconnect! - upCon = nil - - return - - - percentShown = scrollingFrame.AbsoluteSize.Y / totalYSpan - if percentShown >= 1 - scrollbar.Visible = false - scrollDownButton.Visible = false - scrollUpButton.Visible = false - recalculate! - else - scrollbar.Visible = true - scrollDownButton.Visible = true - scrollUpButton.Visible = true - - scrollbar.Size = UDim2.new scrollbar.Size.X.Scale, scrollbar.Size.X.Offset, percentShown, 0 - - - percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY) / totalYSpan - scrollbar.Position = UDim2.new( - scrollbar.Position.X.Scale, - scrollbar.Position.X.Offset, - percentPosition, - -scrollbar.AbsoluteSize.X / 2 - ) - - if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y - scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0 - - - if (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) - - relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y - scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0 - - - buttonScrollAmountPixels = 7 - reentrancyGuardScrollUp = false - doScrollUp = -> - return if reentrancyGuardScrollUp - - reentrancyGuardScrollUp = true - if positionScrollBar 0, scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels, 0 - recalculate! - - reentrancyGuardScrollUp = false - - - reentrancyGuardScrollDown = false - doScrollDown = -> - return if reentrancyGuardScrollDown - - reentrancyGuardScrollDown = true - if positionScrollBar 0, scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels, 0 - recalculate! - - reentrancyGuardScrollDown = false - - - scrollUp = (mouseYPos) -> - if scrollUpButton.Active - scrollStamp = tick! - current = scrollStamp - local upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - upCon\disconnect! - - mouseDrag.Parent = getScreenGuiAncestor scrollbar - doScrollUp! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollUp! - break if mouseYPos and mouseYPos > scrollbar.AbsolutePosition.y - break if not scrollUpButton.Active - - w = if tick! - t > 5 - 0 - elseif tick! - t > 2 - 0.06 - - wait w - - - scrollDown = (mouseYPos) -> - if scrollDownButton.Active - scrollStamp = tick! - current = scrollStamp - local downCon - downCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - downCon\disconnect! - - mouseDrag.Parent = getScreenGuiAncestor scrollbar - doScrollDown! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollDown! - break if mouseYPos and mouseYPos < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x) - break if not scrollDownButton.Active - - w = if tick! - t > 5 - 0 - elseif tick! - t > 2 - 0.06 - - wait w - - - scrollbar.MouseButton1Down\connect (_, y) -> - if scrollbar.Active - scrollStamp = tick! - mouseOffset = y - scrollbar.AbsolutePosition.y - if dragCon - dragCon\disconnect! - dragCon = nil - - if upCon - upCon\disconnect! - upCon = nil - - reentrancyGuardMouseScroll = false - dragCon = mouseDrag.MouseMoved\connect (x2, y2) -> - return if reentrancyGuardMouseScroll - - reentrancyGuardMouseScroll = true - if positionScrollBar x2, y2, mouseOffset - recalculate! - - reentrancyGuardMouseScroll = false - - upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - dragCon\disconnect! - dragCon = nil - upCon\disconnect! - global drag = nil - - mouseDrag.Parent = getScreenGuiAncestor scrollbar - - - scrollMouseCount = 0 - - scrollUpButton.MouseButton1Down\connect -> scrollUp! - scrollDownButton.MouseButton1Down\connect -> scrollDown! - - - scrollTick = -> - global scrollStamp = tick! - - - scrollUpButton.MouseButton1Up\connect scrollTick - scrollDownButton.MouseButton1Up\connect scrollTick - scrollbar.MouseButton1Up\connect scrollTick - - -- heightCheck = (instance) -> - -- if (highY and (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) > highY) or not highY - -- highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - -- end - -- setSliderSizeAndPosition! - -- end - - highLowRecheck = -> - oldLowY = lowY - oldHighY = highY - lowY = nil - highY = nil - resetHighLow! - - if (lowY ~= oldLowY) or (highY ~= oldHighY) - setSliderSizeAndPosition! - - - descendantChanged = (this, prop) -> - return if internalChange - return if not this.Visible - - - if prop == "Size" or prop == "Position" - wait! - highLowRecheck! - - - scrollingFrame.DescendantAdded\connect (instance) -> - return if not instance\IsA "GuiObject" - - if instance.Visible - wait! -- wait a heartbeat for sizes to reconfig - highLowRecheck! - - - descendantsChangeConMap[instance] = instance.Changed\connect (prop) -> - descendantChanged instance, prop - - - scrollingFrame.DescendantRemoving\connect (instance) -> - return if not instance\IsA "GuiObject" - - if descendantsChangeConMap[instance] - descendantsChangeConMap[instance]\disconnect! - descendantsChangeConMap[instance] = nil - - wait! -- wait a heartbeat for sizes to reconfig - highLowRecheck! - - - scrollingFrame.Changed\connect (prop) -> - if prop == "AbsoluteSize" - return if not highY or not lowY - - highLowRecheck! - setSliderSizeAndPosition! - - - scrollingFrame, controlFrame - - -t.CreateScrollingFrame = (orderList, scrollStyle) -> - frame = New "Frame", "ScrollingFrame" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - - scrollUpButton = New "ImageButton", "ScrollUpButton" - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/scrollbuttonUp.png" - Size: UDim2.new 0, 17, 0, 17 - - scrollDownButton = New "ImageButton", "ScrollDownButton" - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/scrollbuttonDown.png" - Size: UDim2.new 0, 17, 0, 17 - - scrollbar = New "ImageButton", "ScrollBar" - Image: "rbxasset://textures/ui/scrollbar.png" - BackgroundTransparency: 1 - Size: UDim2.new 0, 18, 0, 150 - - scrollStamp = 0 - - scrollDrag = New "ImageButton", "ScrollDrag" - Image: "http://banland.xyz/asset/?id=61367186" - Size: UDim2.new 1, 0, 0, 16 - BackgroundTransparency: 1 - Active: true - Parent: scrollbar - - mouseDrag = New "ImageButton", "mouseDrag" - Active: false - Size: UDim2.new 1.5, 0, 1.5, 0 - AutoButtonColor: false - BackgroundTransparency: 1 - Position: UDim2.new -0.25, 0, -0.25, 0 - ZIndex: 10 - - style = "simple" - if scrollStyle and "#{scrollStyle}" - style = scrollStyle - - - scrollPosition = 1 - rowSize = 0 - howManyDisplayed = 0 - - layoutGridScrollBar = -> - howManyDisplayed = 0 - guiObjects = {} - if orderList - for _, child in ipairs orderList - if child.Parent == frame - table.insert guiObjects, child - - - else - children = frame\GetChildren! - if children - for _, child in ipairs children - if child\IsA "GuiObject" - table.insert guiObjects, child - - - if #guiObjects == 0 - scrollUpButton.Active = false - scrollDownButton.Active = false - scrollDrag.Active = false - scrollPosition = 1 - return - - - if scrollPosition > #guiObjects - scrollPosition = #guiObjects - - - if scrollPosition < 1 - scrollPosition = 1 - - - totalPixelsY = frame.AbsoluteSize.Y - pixelsRemainingY = frame.AbsoluteSize.Y - - totalPixelsX = frame.AbsoluteSize.X - - xCounter = \ - rowSizeCounter = 0 - setRowSize = true - - pixelsBelowScrollbar = 0 - pos = #guiObjects - - currentRowY = 0 - - pos = scrollPosition - --count up from current scroll position to fill out grid - while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY - xCounter += guiObjects[pos].AbsoluteSize.X - --previous pos was the end of a row - if xCounter >= totalPixelsX - pixelsBelowScrollbar += currentRowY - currentRowY = 0 - xCounter = guiObjects[pos].AbsoluteSize.X - - if guiObjects[pos].AbsoluteSize.Y > currentRowY - currentRowY = guiObjects[pos].AbsoluteSize.Y - - pos += 1 - - --Count wherever current row left off - pixelsBelowScrollbar += currentRowY - currentRowY = 0 - - pos = scrollPosition - 1 - xCounter = 0 - - --objects with varying X,Y dimensions can rarely cause minor errors - --rechecking every new scrollPosition is necessary to avoid 100% of errors - - --count backwards from current scrollPosition to see if we can add more rows - while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 - xCounter += guiObjects[pos].AbsoluteSize.X - rowSizeCounter += 1 - if xCounter >= totalPixelsX - rowSize = rowSizeCounter - 1 - rowSizeCounter = 0 - xCounter = guiObjects[pos].AbsoluteSize.X - if pixelsBelowScrollbar + currentRowY <= totalPixelsY - --It fits, so back up our scroll position - pixelsBelowScrollbar += currentRowY - if scrollPosition <= rowSize - scrollPosition = 1 - break - else - scrollPosition -= rowSize - - currentRowY = 0 - else - break - - - if guiObjects[pos].AbsoluteSize.Y > currentRowY - currentRowY = guiObjects[pos].AbsoluteSize.Y - - - pos -= 1 - - - --Do check last time if pos = 0 - if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) - scrollPosition = 1 - - - xCounter = 0 - --pos = scrollPosition - rowSizeCounter = 0 - setRowSize = true - lastChildSize = 0 - - xOffset = yOffset = 0 - if guiObjects[1] - yOffset = math.ceil math.floor(math.fmod totalPixelsY, guiObjects[1].AbsoluteSize.X) / 2 - xOffset = math.ceil math.floor(math.fmod totalPixelsX, guiObjects[1].AbsoluteSize.Y) / 2 - - - for i, child in ipairs guiObjects - if i < scrollPosition - --print "Hiding " .. child.Name - child.Visible = false - else - if pixelsRemainingY < 0 - --print "Out of Space " .. child.Name - child.Visible = false - else - --print "Laying out " .. child.Name - --GuiObject - if setRowSize - rowSizeCounter += 1 - - if xCounter + child.AbsoluteSize.X >= totalPixelsX - if setRowSize - rowSize = rowSizeCounter - 1 - setRowSize = false - - xCounter = 0 - pixelsRemainingY -= child.AbsoluteSize.Y - - child.Position = UDim2.new( - child.Position.X.Scale, - xCounter + xOffset, - 0, - totalPixelsY - pixelsRemainingY + yOffset - ) - xCounter += child.AbsoluteSize.X - child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) - if child.Visible - howManyDisplayed += 1 - - lastChildSize = child.AbsoluteSize - - - scrollUpButton.Active = (scrollPosition > 1) - if lastChildSize == 0 - scrollDownButton.Active = false - else - scrollDownButton.Active = ((pixelsRemainingY - lastChildSize.Y) < 0) - - scrollDrag.Active = #guiObjects > howManyDisplayed - scrollDrag.Visible = scrollDrag.Active - - - layoutSimpleScrollBar = -> - guiObjects = {} - howManyDisplayed = 0 - - if orderList - for _, child in ipairs orderList - if child.Parent == frame - table.insert guiObjects, child - - - else - children = frame\GetChildren! - if children - for _, child in ipairs children - if child\IsA "GuiObject" - table.insert guiObjects, child - - - if #guiObjects == 0 - scrollUpButton.Active = false - scrollDownButton.Active = false - scrollDrag.Active = false - scrollPosition = 1 - return - - - if scrollPosition > #guiObjects - scrollPosition = #guiObjects - - - totalPixels = frame.AbsoluteSize.Y - pixelsRemaining = frame.AbsoluteSize.Y - - pixelsBelowScrollbar = 0 - pos = #guiObjects - while pixelsBelowScrollbar < totalPixels and pos >= 1 - if pos >= scrollPosition - pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y - else - if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels - --It fits, so back up our scroll position - pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y - if scrollPosition <= 1 - scrollPosition = 1 - break - else - --local ("Backing up ScrollPosition from -- " ..scrollPosition) - scrollPosition -= 1 - - else - break - - - pos -= 1 - - - pos = scrollPosition - for i, child in ipairs guiObjects - if i < scrollPosition - --print "Hiding " .. child.Name - child.Visible = false - else - if pixelsRemaining < 0 - --print "Out of Space " .. child.Name - child.Visible = false - else - --print "Laying out " .. child.Name - --GuiObject - child.Position = UDim2.new child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining - pixelsRemaining -= child.AbsoluteSize.Y - if pixelsRemaining >= 0 - child.Visible = true - howManyDisplayed += 1 - else - child.Visible = false - - - scrollUpButton.Active = (scrollPosition > 1) - scrollDownButton.Active = (pixelsRemaining < 0) - scrollDrag.Active = #guiObjects > howManyDisplayed - scrollDrag.Visible = scrollDrag.Active - - - moveDragger = -> - guiObjects = 0 - children = frame\GetChildren! - if children - for _, child in ipairs children - if child\IsA "GuiObject" - guiObjects += 1 - - - return if not scrollDrag.Parent - - dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1 / (guiObjects - howManyDisplayed + 1)) - if dragSizeY < 16 - dragSizeY = 16 - - scrollDrag.Size = UDim2.new scrollDrag.Size.X.Scale, scrollDrag.Size.X.Offset, scrollDrag.Size.Y.Scale, dragSizeY - - relativeYPos = (scrollPosition - 1) / (guiObjects - howManyDisplayed) - relativeYPos = if relativeYPos > 1 - 1 - elseif relativeYPos < 0 - 0 - - absYPos = 0 - - if relativeYPos ~= 0 - absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) - - - scrollDrag.Position = UDim2.new scrollDrag.Position.X.Scale, scrollDrag.Position.X.Offset, scrollDrag.Position.Y.Scale, absYPos - - - reentrancyGuard = false - recalculate = -> - return if reentrancyGuard - reentrancyGuard = true - wait! - local success, err - if style == "grid" - success, err = try - layoutGridScrollBar! - - elseif style == "simple" - success, err = try - layoutSimpleScrollBar! - - - if not success - print err - - moveDragger! - reentrancyGuard = false - - - doScrollUp = -> - scrollPosition -= rowSize - if scrollPosition < 1 - scrollPosition = 1 - - recalculate! - - - doScrollDown = -> - scrollPosition += rowSize - recalculate! - - - scrollUp = (mouseYPos) -> - if scrollUpButton.Active - scrollStamp = tick! - current = scrollStamp - local upCon - upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - upCon\disconnect! - - mouseDrag.Parent = getScreenGuiAncestor scrollbar - doScrollUp! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollUp! - break if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y - break if not scrollUpButton.Active - w = if tick! - t > 5 - 0 - elseif tick! - t > 2 - 0.06 - - wait w - - - scrollDown = (mouseYPos) -> - if scrollDownButton.Active - scrollStamp = tick! - current = scrollStamp - local downCon - downCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - downCon\disconnect! - - mouseDrag.Parent = getScreenGuiAncestor scrollbar - doScrollDown! - wait 0.2 - t = tick! - w = 0.1 - while scrollStamp == current - doScrollDown! - break if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) - break if not scrollDownButton.Active - w = if tick! - t > 5 - 0 - elseif tick! - t > 2 - 0.06 - - wait w - - - -- y = 0 - scrollDrag.MouseButton1Down\connect (_, y) -> - if scrollDrag.Active - scrollStamp = tick! - mouseOffset = y - scrollDrag.AbsolutePosition.y - local dragCon, upCon - dragCon = mouseDrag.MouseMoved\connect (_, y) -> - barAbsPos = scrollbar.AbsolutePosition.y - barAbsSize = scrollbar.AbsoluteSize.y - - dragAbsSize = scrollDrag.AbsoluteSize.y - barAbsOne = barAbsPos + barAbsSize - dragAbsSize - y -= mouseOffset - y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y - y -= barAbsPos - - guiObjects = 0 - children = frame\GetChildren! - if children - for _, child in ipairs children - if child\IsA "GuiObject" - guiObjects += 1 - - - doublePercent = y / (barAbsSize - dragAbsSize) - rowDiff = rowSize - totalScrollCount = guiObjects - (howManyDisplayed - 1) - newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff - if newScrollPosition < scrollPosition - rowDiff = -rowDiff - - - if newScrollPosition < 1 - newScrollPosition = 1 - - - scrollPosition = newScrollPosition - recalculate! - - upCon = mouseDrag.MouseButton1Up\connect -> - scrollStamp = tick! - mouseDrag.Parent = nil - dragCon\disconnect! - dragCon = nil - upCon\disconnect! - global drag = nil - - mouseDrag.Parent = getScreenGuiAncestor scrollbar - - - scrollMouseCount = 0 - - scrollUpButton.MouseButton1Down\connect -> scrollUp! - scrollUpButton.MouseButton1Up\connect -> scrollStamp = tick! - scrollDownButton.MouseButton1Up\connect -> scrollStamp = tick! - scrollDownButton.MouseButton1Down\connect -> scrollDown! - - - scrollbar.MouseButton1Up\connect -> - scrollStamp = tick! - - scrollbar.MouseButton1Down\connect (_, y) -> - if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y) - scrollDown y - elseif y < scrollDrag.AbsolutePosition.y - scrollUp y - - - frame.ChildAdded\connect -> recalculate! - frame.ChildRemoved\connect -> recalculate! - - - frame.Changed\connect (prop) -> - if prop == "AbsoluteSize" - --Wait a heartbeat for it to sync in - recalculate! - - - frame.AncestryChanged\connect -> - recalculate! - - - return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar - -binaryGrow = (min, max, fits) -> - if min > max - return min - - biggestLegal = min - - while min <= max - mid = min + math.floor (max - min) / 2 - if fits mid and (biggestLegal == nil or biggestLegal < mid) - biggestLegal = mid - - --Try growing - min = mid + 1 - else - --Doesn't fit, shrink - max = mid - 1 - - biggestLegal - - -binaryShrink = (min, max, fits) -> - if min > max - return min - - smallestLegal = max - - while min <= max - mid = min + math.floor (max - min) / 2 - if fits mid and (smallestLegal == nil or smallestLegal > mid) - smallestLegal = mid - - --It fits, shrink - max = mid - 1 - else - --Doesn't fit, grow - min = mid + 1 - - smallestLegal - - -getGuiOwner = (instance) -> - while instance? - if instance\IsA"ScreenGui" or instance\IsA "BillboardGui" - return instance - - instance = instance.Parent - - nil - - -t.AutoTruncateTextObject = (textLabel) -> - text = textLabel.Text - - fullLabel = textLabel\Clone! - with fullLabel - .Name = "Full" .. textLabel.Name - .BorderSizePixel = 0 - .BackgroundTransparency = 0 - .Text = text - .TextXAlignment = Enum.TextXAlignment.Center - .Position = UDim2.new 0, -3, 0, 0 - .Size = UDim2.new 0, 100, 1, 0 - .Visible = false - .Parent = textLabel - - local shortText, mouseEnterConnection, mouseLeaveConnection - - checkForResize = -> - return if getGuiOwner(textLabel) == nil - - textLabel.Text = text - if textLabel.TextFits - --Tear down the rollover if it is active - if mouseEnterConnection - mouseEnterConnection\disconnect! - mouseEnterConnection = nil - - if mouseLeaveConnection - mouseLeaveConnection\disconnect! - mouseLeaveConnection = nil - - else - len = string.len text - textLabel.Text = text .. "~" - - --Shrink the text - textSize = binaryGrow 0, len, (pos) -> - textLabel.Text = if pos == 0 - "~" - else - string.sub(text, 1, pos) .. "~" - - textLabel.TextFits - - shortText = string.sub(text, 1, textSize) .. "~" - textLabel.Text = shortText - - --Make sure the fullLabel fits - if not fullLabel.TextFits - --Already too small, grow it really bit to start - fullLabel.Size = UDim2.new 0, 10000, 1, 0 - - - --Okay, now try to binary shrink it back down - fullLabelSize = binaryShrink textLabel.AbsoluteSize.X, fullLabel.AbsoluteSize.X, (size) -> - fullLabel.Size = UDim2.new 0, size, 1, 0 - fullLabel.TextFits - - fullLabel.Size = UDim2.new 0, fullLabelSize + 6, 1, 0 - - --Now setup the rollover effects, if they are currently off - if mouseEnterConnection == nil - mouseEnterConnection = textLabel.MouseEnter\connect -> - fullLabel.ZIndex = textLabel.ZIndex + 1 - fullLabel.Visible = true - --textLabel.Text = "" - - - if mouseLeaveConnection == nil - mouseLeaveConnection = textLabel.MouseLeave\connect -> - fullLabel.Visible = false - --textLabel.Text = shortText - - - textLabel.AncestryChanged\connect checkForResize - textLabel.Changed\connect (prop) -> - if prop == "AbsoluteSize" - checkForResize! - - - checkForResize! - - changeText = (newText) -> - text = newText - fullLabel.Text = text - checkForResize! - - textLabel, changeText - - -TransitionTutorialPages = (fromPage, toPage, transitionFrame, currentPageValue) -> - if fromPage - fromPage.Visible = false - if transitionFrame.Visible == false - transitionFrame.Size = fromPage.Size - transitionFrame.Position = fromPage.Position - - else - if transitionFrame.Visible == false - transitionFrame.Size = UDim2.new 0, 50, 0, 50 - transitionFrame.Position = UDim2.new 0.5, -25, 0.5, -25 - - - transitionFrame.Visible = true - currentPageValue.Value = nil - - local newSize, newPosition - if toPage - --Make it visible so it resizes - toPage.Visible = true - - newSize = toPage.Size - newPosition = toPage.Position - - toPage.Visible = false - else - newSize = UDim2.new 0, 50, 0, 50 - newPosition = UDim2.new 0.5, -25, 0.5, -25 - - transitionFrame\TweenSizeAndPosition( - newSize, - newPosition, - Enum.EasingDirection.InOut, - Enum.EasingStyle.Quad, - 0.3, - true, - (state) -> - if state == Enum.TweenStatus.Completed - transitionFrame.Visible = false - if toPage - toPage.Visible = true - currentPageValue.Value = toPage - ) - - -t.CreateTutorial = (name, tutorialKey, createButtons) -> - frame = New "Frame", "Tutorial-#{name}" - BackgroundTransparency: 1 - Size: UDim2.new 0.6, 0, 0.6, 0 - Position: UDim2.new 0.2, 0, 0.2, 0 - - * New "BoolValue", "Buttons" - Value: createButtons - - transitionFrame = New "Frame", "TransitionFrame" - Style: Enum.FrameStyle.RobloxRound - Size: UDim2.new 0.6, 0, 0.6, 0 - Position: UDim2.new 0.2, 0, 0.2, 0 - Visible: false - Parent: frame - - currentPageValue = New "ObjectValue", "CurrentTutorialPage" - Value: nil - Parent: frame - - pages = New "Frame", "Pages" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - Parent: frame - - getVisiblePageAndHideOthers = -> - local visiblePage - children = pages\GetChildren! - if children - for _, child in ipairs children - if child.Visible - if visiblePage - child.Visible = false - else - visiblePage = child - - visiblePage - - - showTutorial = (alwaysShow) -> - if alwaysShow or UserSettings!.GameSettings\GetTutorialState tutorialKey == false - print "Showing tutorial-", tutorialKey - currentTutorialPage = getVisiblePageAndHideOthers! - - firstPage = pages\FindFirstChild "TutorialPage1" - if firstPage - TransitionTutorialPages currentTutorialPage, firstPage, transitionFrame, currentPageValue - else - error "Could not find TutorialPage1" - - - dismissTutorial = -> - currentTutorialPage = getVisiblePageAndHideOthers! - - if currentTutorialPage - TransitionTutorialPages currentTutorialPage, nil, transitionFrame, currentPageValue - - - UserSettings!.GameSettings\SetTutorialState tutorialKey, true - - - gotoPage = (pageNum) -> - page = pages\FindFirstChild "TutorialPage" .. pageNum - currentTutorialPage = getVisiblePageAndHideOthers! - TransitionTutorialPages currentTutorialPage, page, transitionFrame, currentPageValue - - - frame, showTutorial, dismissTutorial, gotoPage - - -CreateBasicTutorialPage = (name, handleResize, skipTutorial, giveDoneButton) -> - frame = New "Frame", "TutorialPage" - Style: Enum.FrameStyle.RobloxRound - Size: UDim2.new 0.6, 0, 0.6, 0 - Position: UDim2.new 0.2, 0, 0.2, 0 - Visible: false - - * New "TextButton", "NextButton" - Text: "Next" - TextColor3: Color3.new 1, 1, 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Style: Enum.ButtonStyle.RobloxButtonDefault - Size: UDim2.new 0, 80, 0, 32 - Position: UDim2.new 0.5, 5, 1, -32 - Active: false - Visible: false - - * New "TextButton", "PrevButton" - Text: "Previous" - TextColor3: Color3.new 1, 1, 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Style: Enum.ButtonStyle.RobloxButton - Size: UDim2.new 0, 80, 0, 32 - Position: UDim2.new 0.5, -85, 1, -32 - Active: false - Visible: false - - * New "TextLabel", "Header" - Text: name - BackgroundTransparency: 1 - FontSize: Enum.FontSize.Size24 - Font: Enum.Font.ArialBold - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: Enum.TextXAlignment.Center - TextWrap: true - Size: UDim2.new 1, -55, 0, 22 - Position: UDim2.new 0, 0, 0, 0 - - * New "ImageButton", "SkipButton" - AutoButtonColor: false - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/closeButton.png" - Size: UDim2.new 0, 25, 0, 25 - Position: UDim2.new 1, -25, 0, 0 - - { SkipButton: skipButton } = frame - - skipButton.MouseButton1Click\connect -> - skipTutorial! - - skipButton.MouseEnter\connect -> - skipButton.Image = "rbxasset://textures/ui/closeButton_dn.png" - - skipButton.MouseLeave\connect -> - skipButton.Image = "rbxasset://textures/ui/closeButton.png" - - - if giveDoneButton - doneButton = New "TextButton", "DoneButton" - Style: Enum.ButtonStyle.RobloxButtonDefault - Text: "Done" - TextColor3: Color3.new 1, 1, 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Size: UDim2.new 0, 100, 0, 50 - Position: UDim2.new 0.5, -50, 1, -50 - - if skipTutorial - doneButton.MouseButton1Click\connect -> - skipTutorial! - - - doneButton.Parent = frame - - - innerFrame = New "Frame", "ContentFrame" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 25 - Parent: frame - - innerFrame.Size = UDim2.new 1, 0, 1, if giveDoneButton - -75 - else - -22 - - - local parentConnection - - basicHandleResize = -> - if frame.Visible and frame.Parent - maxSize = math.min frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y - handleResize 200, maxSize - - - frame.Changed\connect (prop) -> - if prop == "Parent" - if parentConnection? - parentConnection\disconnect! - parentConnection = nil - - if frame.Parent and frame.Parent\IsA "GuiObject" - parentConnection = frame.Parent.Changed\connect (parentProp) -> - if parentProp == "AbsoluteSize" - wait! - basicHandleResize! - - basicHandleResize! - - if prop == "Visible" - basicHandleResize! - - - frame, innerFrame - - -t.CreateTextTutorialPage = (name, text, skipTutorialFunc) -> - local frame - local contentFrame - - textLabel = New "TextLabel" - BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - Text: text - TextWrap: true - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Center - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size14 - Size: UDim2.new 1, 0, 1, 0 - - handleResize = (minSize, maxSize) -> - size = binaryShrink minSize, maxSize, (size) -> - frame.Size = UDim2.new 0, size, 0, size - textLabel.TextFits - - frame.Size = UDim2.new 0, size, 0, size - frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2 - - - frame, contentFrame = CreateBasicTutorialPage name, handleResize, skipTutorialFunc - textLabel.Parent = contentFrame - - frame - - -t.CreateImageTutorialPage = (name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) -> - local frame - local contentFrame - - imageLabel = New "ImageLabel" - BackgroundTransparency: 1 - Image: imageAsset - Size: UDim2.new 0, x, 0, y - Position: UDim2.new 0.5, -x / 2, 0.5, -y / 2 - - handleResize = (minSize, maxSize) -> - size = binaryShrink minSize, maxSize, (size) -> - size >= x and size >= y - - if size >= x and size >= y - imageLabel.Size = UDim2.new 0, x, 0, y - imageLabel.Position = UDim2.new 0.5, -x / 2, 0.5, -y / 2 - else - if x > y - --X is limiter, so - imageLabel.Size = UDim2.new 1, 0, y / x, 0 - imageLabel.Position = UDim2.new 0, 0, 0.5 - (y / x) / 2, 0 - else - --Y is limiter - imageLabel.Size = UDim2.new x / y, 0, 1, 0 - imageLabel.Position = UDim2.new 0.5 - (x / y) / 2, 0, 0, 0 - - - size += 50 - frame.Size = UDim2.new 0, size, 0, size - frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2 - - - frame, contentFrame = CreateBasicTutorialPage name, handleResize, skipTutorialFunc, giveDoneButton - imageLabel.Parent = contentFrame - - frame - - -t.AddTutorialPage = (tutorial, tutorialPage) -> - transitionFrame = tutorial.TransitionFrame - currentPageValue = tutorial.CurrentTutorialPage - - if not tutorial.Buttons.Value - tutorialPage.NextButton.Parent = nil - tutorialPage.PrevButton.Parent = nil - - - children = tutorial.Pages\GetChildren! - if children and #children > 0 - tutorialPage.Name = "TutorialPage#{#children + 1}" - previousPage = children[#children] - if not previousPage\IsA "GuiObject" - error "All elements under Pages must be GuiObjects" - - - if tutorial.Buttons.Value - if previousPage.NextButton.Active - error "NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function" - - previousPage.NextButton.MouseButton1Click\connect -> - TransitionTutorialPages previousPage, tutorialPage, transitionFrame, currentPageValue - - previousPage.NextButton.Active = true - previousPage.NextButton.Visible = true - - if tutorialPage.PrevButton.Active - error "PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function" - - tutorialPage.PrevButton.MouseButton1Click\connect -> - TransitionTutorialPages tutorialPage, previousPage, transitionFrame, currentPageValue - - tutorialPage.PrevButton.Active = true - tutorialPage.PrevButton.Visible = true - - - tutorialPage.Parent = tutorial.Pages - else - --First child - tutorialPage.Name = "TutorialPage1" - tutorialPage.Parent = tutorial.Pages - - -t.CreateSetPanel = (userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) -> - if not userIdsForSets - error "CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids" - - if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" - error "CreateSetPanel: userIdsForSets (first arg) is of type #{type userIdsForSets}, should be of type table or userdata" - - if not objectSelected - error "CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!" - - if type(objectSelected) ~= "function" - error "CreateSetPanel: objectSelected (second arg) is of type #{type objectSelected}, should be of type function!" - - if dialogClosed and type(dialogClosed) ~= "function" - error "CreateSetPanel: dialogClosed (third arg) is of type #{type dialogClosed}, should be of type function!" - - - if showAdminCategories == nil -- by default, don't show beta sets - showAdminCategories = false - - - arrayPosition = 1 - insertButtons = {} - insertButtonCons = {} - local contents - local setGui - - -- used for water selections - waterForceDirection = "NegX" - waterForce = "None" - local waterGui, waterTypeChangedEvent - - Data = {} - Data.CurrentCategory = nil - Data.Category = {} - SetCache = {} - - local userCategoryButtons - - buttonWidth = 64 - buttonHeight = buttonWidth - - local SmallThumbnailUrl - local LargeThumbnailUrl - BaseUrl = game\GetService"ContentProvider".BaseUrl\lower! - - if useAssetVersionId - LargeThumbnailUrl = BaseUrl .. "game/tools/thumbnailasset?fmt=png&wd=420&ht=420&assetversionid=" - SmallThumbnailUrl = BaseUrl .. "game/tools/thumbnailasset?fmt=png&wd=75&ht=75&assetversionid=" - else - LargeThumbnailUrl = BaseUrl .. "game/tools/thumbnailasset?fmt=png&wd=420&ht=420&aid=" - SmallThumbnailUrl = BaseUrl .. "game/tools/thumbnailasset?fmt=png&wd=75&ht=75&aid=" - - - drillDownSetZIndex = (parent, index) -> - children = parent\GetChildren! - for i in *children - if i\IsA "GuiObject" - i.ZIndex = index - - drillDownSetZIndex i, index - - - -- for terrain stamping - local currTerrainDropDownFrame - terrainShapes = { "Block", "Vertical Ramp", "Corner Wedge", "Inverse Corner Wedge", "Horizontal Ramp", "Auto-Wedge" } - terrainShapeMap = {} - for i = 1, #terrainShapes - terrainShapeMap[terrainShapes[i]] = i - 1 - - terrainShapeMap[terrainShapes[#terrainShapes]] = 6 - - createWaterGui = -> - waterForceDirections = { "NegX", "X", "NegY", "Y", "NegZ", "Z" } - waterForces = { "None", "Small", "Medium", "Strong", "Max" } - - waterFrame = New "Frame", "WaterFrame" - Style: Enum.FrameStyle.RobloxSquare - Size: UDim2.new 0, 150, 0, 110 - Visible: false - - waterForceLabel = New "TextLabel", "WaterForceLabel" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 0, 12 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size12 - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: Enum.TextXAlignment.Left - Text: "Water Force" - Parent: waterFrame - - waterForceDirLabel = waterForceLabel\Clone! - waterForceDirLabel.Name = "WaterForceDirectionLabel" - waterForceDirLabel.Text = "Water Force Direction" - waterForceDirLabel.Position = UDim2.new 0, 0, 0, 50 - waterForceDirLabel.Parent = waterFrame - - waterTypeChangedEvent = New "BindableEvent", "WaterTypeChangedEvent" - Parent: waterFrame - - waterForceDirectionSelectedFunc = (newForceDirection) -> - waterForceDirection = newForceDirection - waterTypeChangedEvent\Fire { waterForce, waterForceDirection } - - waterForceSelectedFunc = (newForce) -> - waterForce = newForce - waterTypeChangedEvent\Fire { waterForce, waterForceDirection } - - - waterForceDirectionDropDown, forceWaterDirectionSelection = t.CreateDropDownMenu waterForceDirections, waterForceDirectionSelectedFunc - waterForceDirectionDropDown.Size = UDim2.new 1, 0, 0, 25 - waterForceDirectionDropDown.Position = UDim2.new 0, 0, 1, 3 - forceWaterDirectionSelection "NegX" - waterForceDirectionDropDown.Parent = waterForceDirLabel - - waterForceDropDown, forceWaterForceSelection = t.CreateDropDownMenu waterForces, waterForceSelectedFunc - forceWaterForceSelection "None" - waterForceDropDown.Size = UDim2.new 1, 0, 0, 25 - waterForceDropDown.Position = UDim2.new 0, 0, 1, 3 - waterForceDropDown.Parent = waterForceLabel - - waterFrame, waterTypeChangedEvent - - - -- Helper Function that contructs gui elements - createSetGui = -> - setGui = New "ScreenGui", "SetGui" - - * New "Frame", "SetPanel" - Active: true - BackgroundTransparency: 1 - Position: position or UDim2.new 0.2, 29, 0.1, 24 - Size: size or UDim2.new 0.6, -58, 0.64, 0 - Style: Enum.FrameStyle.RobloxRound - ZIndex: 6 - Parent: setGui - - * New "TextButton", "CancelButton" - Position: UDim2.new 1, -32, 0, -2 - Size: UDim2.new 0, 34, 0, 34 - Style: Enum.ButtonStyle.RobloxButtonDefault - ZIndex: 6 - Text: "" - Modal: true - - * New "ImageLabel", "CancelImage" - BackgroundTransparency: 1 - Image: "http://banland.xyz/asset?id=54135717" - Position: UDim2.new 0, -2, 0, -2 - Size: UDim2.new 0, 16, 0, 16 - ZIndex: 6 - - * New "Frame", "ItemPreview" - BackgroundTransparency: 1 - Position: UDim2.new 0.8, 5, 0.085, 0 - Size: UDim2.new 0.21, 0, 0.9, 0 - ZIndex: 6 - - * New "ImageLabel", "LargePreview" - BackgroundTransparency: 1 - Image: "" - Size: UDim2.new 1, 0, 0, 170 - ZIndex: 6 - - * New "Frame", "TextPanel" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.45, 0 - Size: UDim2.new 1, 0, 0.55, 0 - ZIndex: 6 - - * New "TextLabel", "RolloverText" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 0, 48 - ZIndex: 6 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size24 - Text: "" - TextColor3: Color3.new 1, 1, 1 - TextWrap: true - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - - * New "Frame", "Sets" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 5 - Size: UDim2.new 0.23, 0, 1, -5 - ZIndex: 6 - - * New "TextLabel", "SetsHeader" - BackgroundTransparency: 1 - Size: UDim2.new 0, 47, 0, 24 - ZIndex: 6 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size24 - Text: "Sets" - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - - * New "Frame", "Line" - BackgroundColor3: Color3.new 1, 1, 1 - BackgroundTransparency: 0.7 - BorderSizePixel: 0 - Position: UDim2.new 1, -3, 0.06, 0 - Size: UDim2.new 0, 3, 0.9, 0 - ZIndex: 6 - - setsLists, controlFrame = t.CreateTrueScrollingFrame! - with setsLists - .Size = UDim2.new 1, -6, 0.94, 0 - .Position = UDim2.new 0, 0, 0.06, 0 - .BackgroundTransparency = 1 - .Name = "SetsLists" - .ZIndex = 6 - .Parent = setGui.SetPanel.Sets - drillDownSetZIndex controlFrame, 7 - - setGui - - - createSetButton = (text) -> - New "TextButton" - Text: text or "" - AutoButtonColor: false - BackgroundTransparency: 1 - BackgroundColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - Size: UDim2.new 1, -5, 0, 18 - ZIndex: 6 - Visible: false - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: Enum.TextXAlignment.Left - - - buildSetButton = (name, setId, _, _, _) -> - button = createSetButton name - button.Text = name - button.Name = "SetButton" - button.Visible = true - - New "IntValue", "SetId" - Value: setId - Parent: button - - New "StringValue", "SetName" - Value: name - Parent: button - - button - - - processCategory = (sets) -> - setButtons = {} - numSkipped = 0 - for i = 1, #sets - if not showAdminCategories and sets[i].Name == "Beta" - numSkipped += 1 - else - setButtons[i - numSkipped] = buildSetButton sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets - - setButtons - - - handleResize = -> - wait! -- neccessary to insure heartbeat happened - - itemPreview = setGui.SetPanel.ItemPreview - - itemPreview.LargePreview.Size = UDim2.new 1, 0, 0, itemPreview.AbsoluteSize.X - itemPreview.LargePreview.Position = UDim2.new 0.5, -itemPreview.LargePreview.AbsoluteSize.X / 2, 0, 0 - itemPreview.TextPanel.Position = UDim2.new 0, 0, 0, itemPreview.LargePreview.AbsoluteSize.Y - itemPreview.TextPanel.Size = UDim2.new 1, 0, 0, itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y - - - makeInsertAssetButton = -> - insertAssetButtonExample = New "Frame", "InsertAssetButtonExample" - Position: UDim2.new 0, 128, 0, 64 - Size: UDim2.new 0, 64, 0, 64 - BackgroundTransparency: 1 - ZIndex: 6 - Visible: false - - * New "IntValue", "AssetId" - Value: 0 - - * New "StringValue", "AssetName" - Value: "" - - button = New "TextButton", "Button" - Text: "" - Style: Enum.ButtonStyle.RobloxButton - Position: UDim2.new 0.025, 0, 0.025, 0 - Size: UDim2.new 0.95, 0, 0.95, 0 - ZIndex: 6 - Parent: insertAssetButtonExample - - buttonImage = New "ImageLabel", "ButtonImage" - Image: "" - Position: UDim2.new 0, -7, 0, -7 - Size: UDim2.new 1, 14, 1, 14 - BackgroundTransparency: 1 - ZIndex: 7 - Parent: button - - with buttonImage\clone! - .Name = "ConfigIcon" - .Visible = false - .Position = UDim2.new 1, -23, 1, -24 - .Size = UDim2.new 0, 16, 0, 16 - .Image = "" - .ZIndex = 6 - .Parent = insertAssetButtonExample - - insertAssetButtonExample - - - showLargePreview = (insertButton) -> - if insertButton\FindFirstChild "AssetId" - delay 0, -> - game\GetService"ContentProvider"\Preload LargeThumbnailUrl .. - "#{insertButton.AssetId.Value}" - - setGui.SetPanel.ItemPreview.LargePreview.Image = "LargeThumbnailUrl#{insertButton.AssetId.Value}" - - - if insertButton\FindFirstChild "AssetName" - setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value - - - selectTerrainShape = (shape) -> - if currTerrainDropDownFrame - objectSelected( - "#{currTerrainDropDownFrame.AssetName.Value}", - tonumber(currTerrainDropDownFrame.AssetId.Value), - shape - ) - - - createTerrainTypeButton = (name, parent) -> - dropDownTextButton = New "TextButton", "#{name}Button" - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size14 - BorderSizePixel: 0 - TextColor3: Color3.new 1, 1, 1 - Text: name - TextXAlignment: Enum.TextXAlignment.Left - BackgroundTransparency: 1 - ZIndex: parent.ZIndex + 1 - Size: UDim2.new 0, parent.Size.X.Offset - 2, 0, 16 - Position: UDim2.new 0, 1, 0, 0 - - dropDownTextButton.MouseEnter\connect -> - dropDownTextButton.BackgroundTransparency = 0 - dropDownTextButton.TextColor3 = Color3.new 0, 0, 0 - - - dropDownTextButton.MouseLeave\connect -> - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new 1, 1, 1 - - - dropDownTextButton.MouseButton1Click\connect -> - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new 1, 1, 1 - if dropDownTextButton.Parent and dropDownTextButton.Parent\IsA "GuiObject" - dropDownTextButton.Parent.Visible = false - - selectTerrainShape terrainShapeMap[dropDownTextButton.Text] - - dropDownTextButton - - - createTerrainDropDownMenu = (zIndex) -> - dropDown = New "Frame", "TerrainDropDown" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 0, 0 - Size: UDim2.new 0, 200, 0, 0 - Visible: false - ZIndex: zIndex - Parent: setGui - - for i = 1, #terrainShapes - shapeButton = createTerrainTypeButton terrainShapes[i], dropDown - shapeButton.Position = UDim2.new 0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset - shapeButton.Parent = dropDown - dropDown.Size = UDim2.new 0, 200, 0, dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset - - - dropDown.MouseLeave\connect -> - dropDown.Visible = false - - - createDropDownMenuButton = (parent) -> - dropDownButton = New "ImageButton", "DropDownButton" - Image: "http://banland.xyz/asset/?id=67581509" - BackgroundTransparency: 1 - Size: UDim2.new 0, 16, 0, 16 - Position: UDim2.new 1, -24, 0, 6 - ZIndex: parent.ZIndex + 2 - Parent: parent - - if not setGui\FindFirstChild "TerrainDropDown" - createTerrainDropDownMenu 8 - - - dropDownButton.MouseButton1Click\connect -> - setGui.TerrainDropDown.Visible = true - setGui.TerrainDropDown.Position = UDim2.new 0, parent.AbsolutePosition.X, 0, parent.AbsolutePosition.Y - currTerrainDropDownFrame = parent - - - buildInsertButton = -> - insertButton = makeInsertAssetButton! - insertButton.Name = "InsertAssetButton" - insertButton.Visible = true - - if Data.Category[Data.CurrentCategory].SetName == "High Scalability" - createDropDownMenuButton insertButton - - - local lastEnter - mouseEnterCon = insertButton.MouseEnter\connect -> - lastEnter = insertButton - delay 0.1, -> - if lastEnter == insertButton - showLargePreview insertButton - - - insertButton, mouseEnterCon - - - realignButtonGrid = (columns) -> - x = 0 - y = 0 - for i in *insertButtons - i.Position = UDim2.new 0, buttonWidth * x, 0, buttonHeight * y - x += 1 - if x >= columns - x = 0 - y += 1 - - - setInsertButtonImageBehavior = (insertFrame, visible, name, assetId) -> - return if not insertFrame.Button - - if visible - insertFrame.AssetName.Value = name - insertFrame.AssetId.Value = assetId - newImageUrl = SmallThumbnailUrl .. assetId - - - if newImageUrl ~= insertFrame.Button.ButtonImage.Image - delay 0, -> - game\GetService"ContentProvider"\Preload SmallThumbnailUrl .. assetId - insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId - - - table.insert( - insertButtonCons, - insertFrame.Button.MouseButton1Click\connect -> - -- special case for water, show water selection gui - isWaterSelected = (name == "Water") and - (Data.Category[Data.CurrentCategory].SetName == "High Scalability") - waterGui.Visible = isWaterSelected - objectSelected name, if isWaterSelected - tonumber assetId, nil - else - tonumber assetId - ) - insertFrame.Visible = true - else - insertFrame.Visible = false - - - loadSectionOfItems = (setGui, rows, columns) -> - pageSize = rows * columns - - return if arrayPosition > #contents - - origArrayPos = arrayPosition - - for _ = 1, pageSize + 1 - break if arrayPosition >= #contents + 1 - - local buttonCon - insertButtons[arrayPosition], buttonCon = buildInsertButton! - table.insert insertButtonCons, buttonCon - insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame - arrayPosition += 1 - - realignButtonGrid columns - - -- indexCopy = origArrayPos - for index = origArrayPos, arrayPosition - if insertButtons[index] - if contents[index] - -- we don't want water to have a drop down button - if (contents[index].Name == "Water") and - (Data.Category[Data.CurrentCategory].SetName == "High Scalability") - - insertButtons[index]\FindFirstChild("DropDownButton", true)\Destroy! - - - local assetId - assetId = if useAssetVersionId - contents[index].AssetVersionId - else - contents[index].AssetId - - setInsertButtonImageBehavior insertButtons[index], true, contents[index].Name, assetId - else break - - else break - -- indexCopy = index - - - setSetIndex = -> - Data.Category[Data.CurrentCategory].Index = 0 - - rows = 7 - columns = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth - - contents = Data.Category[Data.CurrentCategory].Contents - if contents - -- remove our buttons and their connections - for i in *insertButtons - i\remove! - - for i in *insertButtonCons - i?\disconnect! - - - insertButtonCons = {} - insertButtons = {} - - arrayPosition = 1 - loadSectionOfItems setGui, rows, columns - - - selectSet = (button, setName, setId, _) -> - if button and Data.Category[Data.CurrentCategory]? - if button ~= Data.Category[Data.CurrentCategory].Button - Data.Category[Data.CurrentCategory].Button = button - - if SetCache[setId] == nil - SetCache[setId] = game\GetService"InsertService"\GetCollection setId - - Data.Category[Data.CurrentCategory].Contents = SetCache[setId] - - Data.Category[Data.CurrentCategory].SetName = setName - Data.Category[Data.CurrentCategory].SetId = setId - - setSetIndex! - - - selectCategoryPage = (buttons, _) -> - if buttons ~= Data.CurrentCategory - if Data.CurrentCategory - for _, button in pairs Data.CurrentCategory - button.Visible = false - - - Data.CurrentCategory = buttons - if Data.Category[Data.CurrentCategory] == nil - Data.Category[Data.CurrentCategory] = {} - if #buttons > 0 - selectSet buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0 - - else - Data.Category[Data.CurrentCategory].Button = nil - selectSet( - Data.Category[Data.CurrentCategory].ButtonFrame, - Data.Category[Data.CurrentCategory].SetName, - Data.Category[Data.CurrentCategory].SetId, - Data.Category[Data.CurrentCategory].Index - ) - - - selectCategory = (category) -> - selectCategoryPage category, 0 - - - resetAllSetButtonSelection = -> - setButtons = setGui.SetPanel.Sets.SetsLists\GetChildren! - for i in *setButtons - if i\IsA "TextButton" - i.Selected = false - i.BackgroundTransparency = 1 - i.TextColor3 = Color3.new 1, 1, 1 - i.BackgroundColor3 = Color3.new 1, 1, 1 - - - populateSetsFrame = -> - currRow = 0 - for i = 1, #userCategoryButtons - button = userCategoryButtons[i] - button.Visible = true - button.Position = UDim2.new 0, 5, 0, currRow * button.Size.Y.Offset - button.Parent = setGui.SetPanel.Sets.SetsLists - - if i == 1 -- we will have this selected by default, so show it - button.Selected = true - button.BackgroundColor3 = Color3.new 0, 204 / 255, 0 - button.TextColor3 = Color3.new 0, 0, 0 - button.BackgroundTransparency = 0 - - - button.MouseEnter\connect -> - if not button.Selected - button.BackgroundTransparency = 0 - button.TextColor3 = Color3.new 0, 0, 0 - - - button.MouseLeave\connect -> - if not button.Selected - button.BackgroundTransparency = 1 - button.TextColor3 = Color3.new 1, 1, 1 - - - button.MouseButton1Click\connect -> - resetAllSetButtonSelection! - button.Selected = not button.Selected - button.BackgroundColor3 = Color3.new 0, 204 / 255, 0 - button.TextColor3 = Color3.new 0, 0, 0 - button.BackgroundTransparency = 0 - selectSet button, button.Text, userCategoryButtons[i].SetId.Value, 0 - - - currRow += 1 - - - buttons = setGui.SetPanel.Sets.SetsLists\GetChildren! - - -- set first category as loaded for default - if buttons - for i = 1, #buttons - if buttons[i]\IsA "TextButton" - selectSet buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0 - selectCategory userCategoryButtons - break - - - setGui = createSetGui! - waterGui, waterTypeChangedEvent = createWaterGui! - waterGui.Position = UDim2.new 0, 55, 0, 0 - waterGui.Parent = setGui - setGui.Changed\connect (prop) -> -- this resizes the preview image to always be the right size - if prop == "AbsoluteSize" - handleResize! - setSetIndex! - - - scrollFrame, controlFrame = t.CreateTrueScrollingFrame! - with scrollFrame - .Size = UDim2.new 0.54, 0, 0.85, 0 - .Position = UDim2.new 0.24, 0, 0.085, 0 - .Name = "ItemsFrame" - .ZIndex = 6 - .Parent = setGui.SetPanel - .BackgroundTransparency = 1 - - drillDownSetZIndex controlFrame, 7 - - controlFrame.Parent = setGui.SetPanel - controlFrame.Position = UDim2.new 0.76, 5, 0, 0 - - debounce = false - controlFrame.ScrollBottom.Changed\connect (_) -> - if controlFrame.ScrollBottom.Value == true - return if debounce - - debounce = true - loadSectionOfItems setGui, rows, columns - debounce = false - - - userData = {} - for id in *userIdsForSets - newUserData = game\GetService"InsertService"\GetUserSets id - if newUserData and #newUserData > 2 - -- start at #3 to skip over My Decals and My Models for each account - for category = 3, #newUserData - table.insert userData, if newUserData[category].Name == "High Scalability" -- we want high scalability parts to show first - 1, newUserData[category] - else - newUserData[category] - - - if userData - userCategoryButtons = processCategory userData - - - global rows = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight - global columns = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth - - populateSetsFrame! - - --[[insertPanelCloseCon = ]] - setGui.SetPanel.CancelButton.MouseButton1Click\connect -> - setGui.SetPanel.Visible = false - dialogClosed?! - - - setVisibilityFunction = (visible) -> - setGui.SetPanel.Visible = if visible - true - else - false - - - getVisibilityFunction = -> - if setGui and setGui\FindFirstChild "SetPanel" - return setGui.SetPanel.Visible - false - - - setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent - - -t.CreateTerrainMaterialSelector = (size, position) -> - terrainMaterialSelectionChanged = Instance.new "BindableEvent" - terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" - - local selectedButton - - frame = New "Frame", "TerrainMaterialSelector" - Size: size or UDim2.new 0, 245, 0, 230 - BorderSizePixel: 0 - BackgroundColor3: Color3.new 0, 0, 0 - Active: true - - if position - frame.Position = position - - terrainMaterialSelectionChanged.Parent = frame - - -- waterEnabled = true -- todo: turn this on when water is ready - - materialToImageMap = {} - materialNames = - * "Grass" - * "Sand" - * "Brick" - * "Granite" - * "Asphalt" - * "Iron" - * "Aluminum" - * "Gold" - * "Plank" - * "Log" - * "Gravel" - * "Cinder Block" - * "Stone Wall" - * "Concrete" - * "Plastic (red)" - * "Plastic (blue)" - * "Water" - - currentMaterial = 1 - - getEnumFromName = (choice) -> - switch choice - when "Grass" then 1 - when "Sand" then 2 - when "Erase" then 0 - when "Brick" then 3 - when "Granite" then 4 - when "Asphalt" then 5 - when "Iron" then 6 - when "Aluminum" then 7 - when "Gold" then 8 - when "Plank" then 9 - when "Log" then 10 - when "Gravel" then 11 - when "Cinder Block" then 12 - when "Stone Wall" then 13 - when "Concrete" then 14 - when "Plastic (red)" then 15 - when "Plastic (blue)" then 16 - when "Water" then 17 - - - getNameFromEnum = (choice) -> - switch choice - when Enum.CellMaterial.Grass, 1 then "Grass" - when Enum.CellMaterial.Sand, 2 then "Sand" - when Enum.CellMaterial.Empty, 0 then "Erase" - when Enum.CellMaterial.Brick, 3 then "Brick" - when Enum.CellMaterial.Granite, 4 then "Granite" - when Enum.CellMaterial.Asphalt, 5 then "Asphalt" - when Enum.CellMaterial.Iron, 6 then "Iron" - when Enum.CellMaterial.Aluminum, 7 then "Aluminum" - when Enum.CellMaterial.Gold, 8 then "Gold" - when Enum.CellMaterial.WoodPlank, 9 then "Plank" - when Enum.CellMaterial.WoodLog, 10 then "Log" - when Enum.CellMaterial.Gravel, 11 then "Gravel" - when Enum.CellMaterial.CinderBlock, 12 then "Cinder Block" - when Enum.CellMaterial.MossyStone, 13 then "Stone Wall" - when Enum.CellMaterial.Cement, 14 then "Concrete" - when Enum.CellMaterial.RedPlastic, 15 then "Plastic (red)" - when Enum.CellMaterial.BluePlastic, 16 then "Plastic (blue)" - when Enum.CellMaterial.Water, 17 then "Water" - - - updateMaterialChoice = (choice) -> - currentMaterial = getEnumFromName choice - terrainMaterialSelectionChanged\Fire currentMaterial - - - -- we so need a better way to do this - for _, v in pairs materialNames - materialToImageMap[v] = {} - materialToImageMap[v].Regular = "http://banland.xyz/asset/?id=" .. - switch v - when "Grass" then "56563112" - when "Sand" then "62356652" - when "Brick" then "65961537" - when "Granite" then "67532153" - when "Asphalt" then "67532038" - when "Iron" then "67532093" - when "Aluminum" then "67531995" - when "Gold" then "67532118" - when "Plastic (red)" then "67531848" - when "Plastic (blue)" then "67531924" - when "Plank" then "67532015" - when "Log" then "67532051" - when "Gravel" then "67532206" - when "Cinder Block" then "67532103" - when "Stone Wall" then "67531804" - when "Concrete" then "67532059" - when "Water" then "81407474" - else "66887593" -- fill in the rest here!! - - - scrollFrame, scrollUpB, scrollDownB, recalculateScroll = t.CreateScrollingFrame nil, "grid" - scrollFrame.Size = UDim2.new 0.85, 0, 1, 0 - scrollFrame.Position = UDim2.new 0, 0, 0, 0 - scrollFrame.Parent = frame - - scrollUpB.Parent = frame - scrollUpB.Visible = true - scrollUpB.Position = UDim2.new 1, -19, 0, 0 - - scrollDownB.Parent = frame - scrollDownB.Visible = true - scrollDownB.Position = UDim2.new 1, -19, 1, -17 - - goToNewMaterial = (buttonWrap, materialName) -> - updateMaterialChoice materialName - buttonWrap.BackgroundTransparency = 0 - selectedButton.BackgroundTransparency = 1 - selectedButton = buttonWrap - - - createMaterialButton = (name) -> - buttonWrap = New "TextButton", "#{name}" - Text: "" - Size: UDim2.new 0, 32, 0, 32 - BackgroundColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - BackgroundTransparency: 1 - AutoButtonColor: false - - * New "NumberValue", "EnumType" - Value: 0 - - imageButton = New "ImageButton", "#{name}" - AutoButtonColor: false - BackgroundTransparency: 1 - Size: UDim2.new 0, 30, 0, 30 - Position: UDim2.new 0, 1, 0, 1 - Parent: buttonWrap - Image: materialToImageMap[name].Regular - - - imageButton.MouseEnter\connect -> - buttonWrap.BackgroundTransparency = 0 - - imageButton.MouseLeave\connect -> - if selectedButton ~= buttonWrap - buttonWrap.BackgroundTransparency = 1 - - - imageButton.MouseButton1Click\connect -> - if selectedButton ~= buttonWrap - goToNewMaterial buttonWrap, "#{name}" - - buttonWrap - - - for i in *materialNames - imageButton = createMaterialButton i - - if i == "Grass" -- always start with grass as the default - selectedButton = imageButton - imageButton.BackgroundTransparency = 0 - - - imageButton.Parent = scrollFrame - - - forceTerrainMaterialSelection = (newMaterialType) -> - return if not newMaterialType - return if currentMaterial == newMaterialType - - matName = getNameFromEnum newMaterialType - buttons = scrollFrame\GetChildren! - for i in *buttons - if i.Name == "Plastic (blue)" and matName == "Plastic (blue)" - goToNewMaterial i, matName - return - - if i.Name == "Plastic (red)" and matName == "Plastic (red)" - goToNewMaterial i, matName - return - - if string.find i.Name, matName - goToNewMaterial i, matName - return - - frame.Changed\connect (prop) -> - if prop == "AbsoluteSize" - recalculateScroll! - - - recalculateScroll! - frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection - - -t.CreateLoadingFrame = (name, size, position) -> - game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=35238053" - - loadingFrame = New "Frame", "LoadingFrame" - Style: Enum.FrameStyle.RobloxRound - Size: size or UDim2.new 0, 300, 0, 160 - Position: position or UDim2.new 0.5, -150, 0.5, -80 - - * New "TextLabel", "loadingName" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 0, 18 - Position: UDim2.new 0, 0, 0, 2 - Font: Enum.Font.Arial - Text: name - TextColor3: Color3.new 1, 1, 1 - TextStrokeTransparency: 1 - FontSize: Enum.FontSize.Size18 - - - loadingBar = New "Frame", "LoadingBar" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 79 / 255, 79 / 255, 79 / 255 - Position: UDim2.new 0, 0, 0, 41 - Size: UDim2.new 1, 0, 0, 30 - Parent: loadingFrame - - loadingGreenBar = New "ImageLabel", "LoadingGreenBar" - Image: "http://banland.xyz/asset/?id=35238053" - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 0, 0, 1, 0 - Visible: false - Parent: loadingBar - - loadingPercent = New "TextLabel", "LoadingPercent" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 1, 0 - Size: UDim2.new 1, 0, 0, 14 - Font: Enum.Font.Arial - Text: "0%" - FontSize: Enum.FontSize.Size14 - TextColor3: Color3.new 1, 1, 1 - Parent: loadingBar - - cancelButton = New "TextButton", "CancelButton" - Position: UDim2.new 0.5, -60, 1, -40 - Size: UDim2.new 0, 120, 0, 40 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextColor3: Color3.new 1, 1, 1 - Text: "Cancel" - Style: Enum.ButtonStyle.RobloxButton - Parent: loadingFrame - - cancelButtonClicked = New "BindableEvent", "CancelButtonClicked" - Parent: cancelButton - - cancelButton.MouseButton1Click\connect -> - cancelButtonClicked\Fire! - - - updateLoadingGuiPercent = (percent, tweenAction, tweenLength) -> - if percent and type(percent) ~= "number" - error "updateLoadingGuiPercent expects number as argument, got #{type percent} instead" - - - newSize = UDim2.new if percent < 0 - 0, 0, 1, 0 - elseif percent > 1 - 1, 0, 1, 0 - else - percent, 0, 1, 0 - - - if tweenAction - if not tweenLength - error "updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument" - - - if newSize.X.Scale > 0 - loadingGreenBar.Visible = true - loadingGreenBar\TweenSize newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, true - else - loadingGreenBar\TweenSize( - newSize, - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - tweenLength, - true, - -> - if newSize.X.Scale < 0 - loadingGreenBar.Visible = false - - - ) - - else - loadingGreenBar.Size = newSize - loadingGreenBar.Visible = (newSize.X.Scale > 0) - - - loadingGreenBar.Changed\connect (prop) -> - if prop == "Size" - loadingPercent.Text = "#{math.ceil loadingGreenBar.Size.X.Scale * 100}%" - - - loadingFrame, updateLoadingGuiPercent, cancelButtonClicked - - -t.CreatePluginFrame = (name, size, position, scrollable, parent) -> - createMenuButton = (size, position, text, fontsize, name, parent) -> - button = New "TextButton", name, - AutoButtonColor: false - BackgroundTransparency: 1 - Position: position - Size: size - Font: Enum.Font.ArialBold - FontSize: fontsize - Text: text - TextColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - BackgroundColor3: Color3.new 20 / 255, 20 / 255, 20 / 255 - - button.MouseEnter\connect -> - return if button.Selected - button.BackgroundTransparency = 0 - - button.MouseLeave\connect -> - return if button.Selected - button.BackgroundTransparency = 1 - - button.Parent = parent - button - - - dragBar = New "Frame", "#{name}" .. "DragBar" - BackgroundColor3: Color3.new 39 / 255, 39 / 255, 39 / 255 - BorderColor3: Color3.new 0, 0, 0 - Size: if size - UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + UDim2.new 0, 20, 0, 0 - else - UDim2.new 0, 183, 0, 20 - - Active: true - Draggable: true - --Visible: false - - if position - dragBar.Position = position - dragBar.MouseEnter\connect -> - dragBar.BackgroundColor3 = Color3.new 49 / 255, 49 / 255, 49 / 255 - - dragBar.MouseLeave\connect -> - dragBar.BackgroundColor3 = Color3.new 39 / 255, 39 / 255, 39 / 255 - - dragBar.Parent = parent - - -- plugin name label - New "TextLabel", "BarNameLabel" - Text: " #{name}" - TextColor3: Color3.new 1, 1, 1 - TextStrokeTransparency: 0 - Size: UDim2.new 1, 0, 1, 0 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - TextXAlignment: Enum.TextXAlignment.Left - BackgroundTransparency: 1 - Parent: dragBar - - -- close button - closeButton = createMenuButton( - UDim2.new(0, 15, 0, 17), - UDim2.new(1, -16, 0.5, -8), - "X", - Enum.FontSize.Size14, - "CloseButton", - dragBar - ) - closeEvent = New "BindableEvent", "CloseEvent" - Parent: closeButton - closeButton.MouseButton1Click\connect -> - closeEvent\Fire! - closeButton.BackgroundTransparency = 1 - - - -- help button - helpButton = createMenuButton( - UDim2.new(0, 15, 0, 17), - UDim2.new(1, -51, 0.5, -8), - "?", - Enum.FontSize.Size14, - "HelpButton", - dragBar - ) - helpFrame = New "Frame", "HelpFrame" - BackgroundColor3: Color3.new 0, 0, 0 - Size: UDim2.new 0, 300, 0, 552 - Position: UDim2.new 1, 5, 0, 0 - Active: true - BorderSizePixel: 0 - Visible: false - Parent: dragBar - - helpButton.MouseButton1Click\connect -> - helpFrame.Visible = not helpFrame.Visible - if helpFrame.Visible - helpButton.Selected = true - helpButton.BackgroundTransparency = 0 - screenGui = getScreenGuiAncestor helpFrame - if screenGui - if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X --position on left hand side - helpFrame.Position = UDim2.new 0, -5 - helpFrame.AbsoluteSize.X, 0, 0 - else -- position on right hand side - helpFrame.Position = UDim2.new 1, 5, 0, 0 - - else - helpFrame.Position = UDim2.new 1, 5, 0, 0 - - else - helpButton.Selected = false - helpButton.BackgroundTransparency = 1 - - - minimizeButton = createMenuButton( - UDim2.new(0, 16, 0, 17), - UDim2.new(1, -34, 0.5, -8), - "-", - Enum.FontSize.Size14, - "MinimizeButton", - dragBar - ) - minimizeButton.TextYAlignment = Enum.TextYAlignment.Top - - minimizeFrame = New "Frame", "MinimizeFrame" - BackgroundColor3: Color3.new 73 / 255, 73 / 255, 73 / 255 - BorderColor3: Color3.new 0, 0, 0 - Position: UDim2.new 0, 0, 1, 0 - Size: if size - UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + UDim2.new 0, 20, 0, 0 - else - UDim2.new 0, 183, 0, 50 - Visible: false - Parent: dragBar - - minimizeBigButton = New "TextButton", "MinimizeButton" - Position: UDim2.new 0.5, -50, 0.5, -20 - Size: UDim2.new 0, 100, 0, 40 - Style: Enum.ButtonStyle.RobloxButton - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - TextColor3: Color3.new 1, 1, 1 - Text: "Show" - Parent: minimizeFrame - - separatingLine = New "Frame", "SeparatingLine" - BackgroundColor3: Color3.new 115 / 255, 115 / 255, 115 / 255 - BorderSizePixel: 0 - Position: UDim2.new 1, -18, 0.5, -7 - Size: UDim2.new 0, 1, 0, 14 - Parent: dragBar - - otherSeparatingLine = separatingLine\clone! - otherSeparatingLine.Position = UDim2.new 1, -35, 0.5, -7 - otherSeparatingLine.Parent = dragBar - - widgetContainer = New "Frame", "WidgetContainer" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 1, 0 - BorderColor3: Color3.new 0, 0, 0 - if not scrollable - widgetContainer.BackgroundTransparency = 0 - widgetContainer.BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255 - - widgetContainer.Parent = dragBar - - widgetContainer.Size = if size - if scrollable - size - else - UDim2.new 0, dragBar.AbsoluteSize.X, size.Y.Scale, size.Y.Offset - else - UDim2.new 0, if scrollable - 163, 0, 400 - else - dragBar.AbsoluteSize.X, 0, 400 - - if position - widgetContainer.Position += UDim2.new 0, 0, 0, 20 - - - local frame, control, verticalDragger - if scrollable - --frame for widgets - frame, control = t.CreateTrueScrollingFrame! - with frame - .Size = UDim2.new 1, 0, 1, 0 - .BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255 - .BorderColor3 = Color3.new 0, 0, 0 - .Active = true - .Parent = widgetContainer - with control - .Parent = dragBar - .BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255 - .BorderSizePixel = 0 - .BackgroundTransparency = 0 - .Position = UDim2.new 1, -21, 1, 1 - .Size = UDim2.new 0, 21, if size - size.Y.Scale, size.Y.Offset - else - 0, 400 - - control\FindFirstChild"ScrollDownButton".Position = UDim2.new 0, 0, 1, -20 - - New "Frame", "FakeLine" - BorderSizePixel: 0 - BackgroundColor3: Color3.new 0, 0, 0 - Size: UDim2.new 0, 1, 1, 1 - Position: UDim2.new 1, 0, 0, 0 - Parent: control - - verticalDragger = New "TextButton", "VerticalDragger" - ZIndex: 2 - AutoButtonColor: false - BackgroundColor3: Color3.new 50 / 255, 50 / 255, 50 / 255 - BorderColor3: Color3.new 0, 0, 0 - Size: UDim2.new 1, 20, 0, 20 - Position: UDim2.new 0, 0, 1, 0 - Active: true - Text: "" - Parent: widgetContainer - - scrubFrame = New "Frame", "ScrubFrame" - BackgroundColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - Position: UDim2.new 0.5, -5, 0.5, 0 - Size: UDim2.new 0, 10, 0, 1 - ZIndex: 5 - Parent: verticalDragger - - scrubTwo = scrubFrame\clone! - scrubTwo.Position = UDim2.new 0.5, -5, 0.5, -2 - scrubTwo.Parent = verticalDragger - scrubThree = scrubFrame\clone! - scrubThree.Position = UDim2.new 0.5, -5, 0.5, 2 - scrubThree.Parent = verticalDragger - - areaSoak = New "TextButton", "AreaSoak" - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - BorderSizePixel: 0 - Text: "" - ZIndex: 10 - Visible: false - Active: true - Parent: getScreenGuiAncestor parent - - draggingVertical = false - local startYPos - verticalDragger.MouseEnter\connect -> - verticalDragger.BackgroundColor3 = Color3.new 60 / 255, 60 / 255, 60 / 255 - - verticalDragger.MouseLeave\connect -> - verticalDragger.BackgroundColor3 = Color3.new 50 / 255, 50 / 255, 50 / 255 - - verticalDragger.MouseButton1Down\connect (_, y) -> - draggingVertical = true - areaSoak.Visible = true - startYPos = y - - areaSoak.MouseButton1Up\connect -> - draggingVertical = false - areaSoak.Visible = false - - areaSoak.MouseMoved\connect (_, y) -> - return if not draggingVertical - - yDelta = y - startYPos - return if not control.ScrollDownButton.Visible and yDelta > 0 - - if (widgetContainer.Size.Y.Offset + yDelta) < 150 - widgetContainer.Size = UDim2.new( - widgetContainer.Size.X.Scale, - widgetContainer.Size.X.Offset, - widgetContainer.Size.Y.Scale, - 150 - ) - control.Size = UDim2.new 0, 21, 0, 150 - return - - - startYPos = y - - if widgetContainer.Size.Y.Offset + yDelta >= 0 - widgetContainer.Size = UDim2.new( - widgetContainer.Size.X.Scale, - widgetContainer.Size.X.Offset, - widgetContainer.Size.Y.Scale, - widgetContainer.Size.Y.Offset + yDelta - ) - control.Size = UDim2.new 0, 21, 0, control.Size.Y.Offset + yDelta - - - switchMinimize = -> - minimizeFrame.Visible = not minimizeFrame.Visible - if scrollable - frame.Visible = not frame.Visible - verticalDragger.Visible = not verticalDragger.Visible - control.Visible = not control.Visible - else - widgetContainer.Visible = not widgetContainer.Visible - - - minimizeButton.Text = if minimizeFrame.Visible - "+" - else - "-" - - minimizeBigButton.MouseButton1Click\connect -> switchMinimize! - minimizeButton.MouseButton1Click\connect -> switchMinimize! - - dragBar, (if scrollable then frame else widgetContainer), helpFrame, closeEvent - - -t.Help = (funcNameOrFunc) -> - --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu - "Function CreatePropertyDropDownMenu. " .. - "Arguments: (instance, propertyName, enumType). " .. - "Side effect: returns a container with a drop-down-box that is linked to the 'property' field of 'instance' which is of type 'enumType'" - - elseif funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu - "Function CreateDropDownMenu. " .. - "Arguments: (items, onItemSelected). " .. - "Side effect: Returns 2 results, a container to the gui object and a 'updateSelection' function for external updating. The container is a drop-down-box created around a list of items" - - elseif funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog - "Function CreateMessageDialog. " .. - "Arguments: (title, message, buttons). " .. - "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button" - - elseif funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog - "Function CreateStyledMessageDialog. " .. - "Arguments: (title, message, style, buttons). " .. - "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button, 'style' is a string, either Error, Notify or Confirm" - - elseif funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight - "Function GetFontHeight. " .. - "Arguments: (font, fontSize). " .. - "Side effect: returns the size in pixels of the given font + fontSize" - - elseif funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame - "Function CreateScrollingFrame. " .. - "Arguments: (orderList, style) " .. - "Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). 'scrollFrame' can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a 'grid' styling if style is passed 'grid' as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)" - - elseif funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame - "Function CreateTrueScrollingFrame. " .. - "Arguments: (nil) " .. - "Side effect: returns 2 objects, (scrollFrame, controlFrame). 'scrollFrame' can be filled with GuiObjects, and they will be clipped if not inside the frame's bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit." - - elseif funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject - "Function AutoTruncateTextObject. " .. - "Arguments: (textLabel) " .. - "Side effect: returns 2 objects, (textLabel, changeText). The 'textLabel' input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. 'changeText' is a function that can be used to change the text, it takes 1 string as an argument" - - elseif funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider - "Function CreateSlider. " .. - "Arguments: (steps, width, position) " .. - "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." - - elseif funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame - "Function CreateLoadingFrame. " .. - "Arguments: (name, size, position) " .. - "Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that when fired means that someone clicked the cancel button on the dialog." - - elseif funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector - "Function CreateTerrainMaterialSelector. " .. - "Arguments: (size, position) " .. - "Side effect: Size and position are UDim2 values that specifies the selector's size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected." - -t diff --git a/yue/45374389.yue b/yue/45374389.yue deleted file mode 100644 index d8c94b5..0000000 --- a/yue/45374389.yue +++ /dev/null @@ -1,17 +0,0 @@ -import "macros" as { $ } -$load $FILE - -t = {} - -t.Foo = -> print "foo" -t.Bar = -> print "bar" - -t.Help = (funcNameOrFunc) -> - --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - switch funcNameOrFunc - when "Foo", t.Foo - "Function Foo. Arguments: None. Side effect: prints foo" - when "Bar", t.Bar - "Function Bar. Arguments: None. Side effect: prints bar" - -t diff --git a/yue/46295863.yue b/yue/46295863.yue deleted file mode 100644 index 79558d7..0000000 --- a/yue/46295863.yue +++ /dev/null @@ -1,2257 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -waitForChild = (instance, name) -> - until instance\FindFirstChild name - instance.ChildAdded\wait! - -waitForProperty = (instance, property) -> - until instance[property] - instance.Changed\wait! - --- A Few Script Globals -gui = if script.Parent\FindFirstChild "ControlFrame" - script.Parent\FindFirstChild "ControlFrame" -else - script.Parent - - -local helpButton -local updateCameraDropDownSelection -local updateVideoCaptureDropDownSelection -tweenTime = 0.2 - -mouseLockLookScreenUrl = "http://banland.xyz/asset?id=54071825" -classicLookScreenUrl = "http://banland.xyz/asset?id=45915798" - -hasGraphicsSlider = game\GetService"CoreGui".Version >= 5 -GraphicsQualityLevels = 10 -- how many levels we allow on graphics slider -recordingVideo = false - -local currentMenuSelection -lastMenuSelection = {} - --- defaultPosition = UDim2.new 0, 0, 0, 0 --- newGuiPlaces = { 0, 41324860 } - -centerDialogs = {} -local mainShield - -inStudioMode = UserSettings!.GameSettings\InStudioMode! - -macClient = false -success, isMac = try - not game.GuiService.IsWindows - -macClient = success and isMac - -Color3I = (r, g, b) -> Color3.new r / 255, g / 255, b / 255 - -robloxLock = (instance) -> - instance.RobloxLocked = true - children = instance\GetChildren! - if children - for _, child in ipairs children - robloxLock child - -resumeGameFunction = (shield) -> - shield.Settings\TweenPosition( - UDim2.new(0.5, -262, -0.5, -200), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - delay tweenTime, -> - shield.Visible = false - for i in *centerDialogs - i.Visible = false - game.GuiService\RemoveCenterDialog i - - game.GuiService\RemoveCenterDialog shield - settingsButton.Active = true - currentMenuSelection = nil - lastMenuSelection = {} - - -goToMenu = (container, menuName, moveDirection, size, position) -> - return if type(menuName) ~= "string" - - table.insert lastMenuSelection, currentMenuSelection - if menuName == "GameMainMenu" - lastMenuSelection = {} - - containerChildren = container\GetChildren! - for i in *containerChildren - if i.Name == menuName - i.Visible = true - currentMenuSelection = - container: container - name: menuName - direction: moveDirection - lastSize: size - - -- selectedMenu = true - if size and position - i\TweenSizeAndPosition( - size, - position, - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - elseif size - i\TweenSizeAndPosition( - size, - UDim2.new(0.5, -size.X.Offset / 2, 0.5, -size.Y.Offset / 2), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - else - i\TweenPosition( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - - else - if moveDirection == "left" - i\TweenPosition( - UDim2.new(-1, -525, 0, 0), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - elseif moveDirection == "right" - i\TweenPosition( - UDim2.new(1, 525, 0, 0), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - elseif moveDirection == "up" - i\TweenPosition( - UDim2.new(0, 0, -1, -400), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - elseif moveDirection == "down" - i\TweenPosition( - UDim2.new(0, 0, 1, 400), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - - delay tweenTime, -> - i.Visible = false - - -resetLocalCharacter = -> - player = game.Players.LocalPlayer - if player and - player.Character and - player.Character\FindFirstChild "Humanoid" - - player.Character.Humanoid.Health = 0 - - -createTextButton = (text, style, fontSize, buttonSize, buttonPosition) -> - New "TextButton" - Font: Enum.Font.Arial - FontSize: fontSize - Size: buttonSize - Position: buttonPosition - Style: style - TextColor3: Color3.new 1, 1, 1 - Text: text - - -CreateTextButtons = (frame, buttons, yPos, ySize) -> - if #buttons < 1 - error "Must have more than one button" - - - buttonNum = 1 - buttonObjs = {} - - toggleSelection = (button) -> - for _, obj in ipairs buttonObjs - obj.Style = if obj == button - Enum.ButtonStyle.RobloxButtonDefault - else - Enum.ButtonStyle.RobloxButton - - - for _, obj in ipairs buttons - button = New "TextButton", "Button#{buttonNum}" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - AutoButtonColor: true - Style: Enum.ButtonStyle.RobloxButton - Text: obj.Text - TextColor3: Color3.new 1, 1, 1 - Parent: frame - - button.MouseButton1Click\connect -> - toggleSelection button - obj.Function! - buttonObjs[buttonNum] = button - - buttonNum += 1 - - - toggleSelection buttonObjs[1] - - numButtons = buttonNum - 1 - - if numButtons == 1 - frame.Button1.Position = UDim2.new 0.35, 0, yPos.Scale, yPos.Offset - frame.Button1.Size = UDim2.new 0.4, 0, ySize.Scale, ySize.Offset - elseif numButtons == 2 - frame.Button1.Position = UDim2.new 0.1, 0, yPos.Scale, yPos.Offset - frame.Button1.Size = UDim2.new 0.35, 0, ySize.Scale, ySize.Offset - - frame.Button2.Position = UDim2.new 0.55, 0, yPos.Scale, yPos.Offset - frame.Button2.Size = UDim2.new 0.35, 0, ySize.Scale, ySize.Offset - elseif numButtons >= 3 - spacing = 0.1 / numButtons - buttonSize = 0.9 / numButtons - - buttonNum = 1 - while buttonNum <= numButtons - buttonObjs[buttonNum].Position = UDim2.new( - spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, - yPos.Scale, yPos.Offset - ) - buttonObjs[buttonNum].Size = UDim2.new buttonSize, 0, ySize.Scale, ySize.Offset - buttonNum += 1 - - -setRecordGui = (recording, stopRecordButton, recordVideoButton) -> - if recording - stopRecordButton.Visible = true - recordVideoButton.Text = "Stop Recording" - else - stopRecordButton.Visible = false - recordVideoButton.Text = "Record Video" - - -recordVideoClick = (recordVideoButton, stopRecordButton) -> - recordingVideo = not recordingVideo - setRecordGui recordingVideo, stopRecordButton, recordVideoButton - - -backToGame = (buttonClicked, shield, settingsButton) -> - buttonClicked.Parent.Parent.Parent.Parent.Visible = false - shield.Visible = false - for i in *centerDialogs - game.GuiService\RemoveCenterDialog i - i.Visible = false - - centerDialogs = {} - game.GuiService\RemoveCenterDialog shield - settingsButton.Active = true - - -setDisabledState = (guiObject) -> - return if not guiObject - - if guiObject\IsA "TextLabel" - guiObject.TextTransparency = 0.9 - elseif guiObject\IsA "TextButton" - guiObject.TextTransparency = 0.9 - guiObject.Active = false - else - if guiObject["ClassName"] - print "setDisabledState! got object of unsupported type. object type is ", guiObject.ClassName - - -createHelpDialog = (baseZIndex) -> - if helpButton == nil - helpButton = if gui\FindFirstChild "TopLeftControl" and gui.TopLeftControl\FindFirstChild "Help" - gui.TopLeftControl.Help - elseif gui\FindFirstChild "BottomRightControl" and gui.BottomRightControl\FindFirstChild "Help" - gui.BottomRightControl.Help - - shield = New "Frame", "HelpDialogShield" - Active: true - Visible: false - Size: UDim2.new 1, 0, 1, 0 - BackgroundColor3: Color3I 51, 51, 51 - BorderColor3: Color3I 27, 42, 53 - BackgroundTransparency: 0.4 - ZIndex: baseZIndex + 1 - - helpDialog = New "Frame", "HelpDialog" - Style: Enum.FrameStyle.RobloxRound - Position: UDim2.new 0.2, 0, 0.2, 0 - Size: UDim2.new 0.6, 0, 0.6, 0 - Active: true - Parent: shield - - * New "TextLabel", "Title" - Text: "Keyboard & Mouse Controls" - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - Position: UDim2.new 0, 0, 0.025, 0 - Size: UDim2.new 1, 0, 0, 40 - TextColor3: Color3.new 1, 1, 1 - BackgroundTransparency: 1 - - * New "Frame", "Buttons" - Position: UDim2.new 0.1, 0, 0.07, 40 - Size: UDim2.new 0.8, 0, 0, 45 - BackgroundTransparency: 1 - - * New "Frame", "ImageFrame" - Position: UDim2.new 0.05, 0, 0.075, 80 - Size: UDim2.new 0.9, 0, 0.9, -120 - BackgroundTransparency: 1 - - * New "Frame", "LayoutFrame" - Position: UDim2.new 0.5, 0, 0, 0 - Size: UDim2.new 1.5, 0, 1, 0 - BackgroundTransparency: 1 - SizeConstraint: Enum.SizeConstraint.RelativeYY - - * New "ImageLabel", "Image" - Image: if UserSettings!.GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] - mouseLockLookScreenUrl - else - classicLookScreenUrl - Position: UDim2.new -0.5, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - - { - Buttons: buttonRow - ImageFrame: - LayoutFrame: - Image: image - } = helpDialog - - - buttons = {} - buttons[1] = {} - buttons[1].Text = "Look" - buttons[1].Function = -> - image.Image = if UserSettings!.GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] - mouseLockLookScreenUrl - else - classicLookScreenUrl - - buttons[2] = {} - buttons[2].Text = "Move" - buttons[2].Function = -> - image.Image = "http://banland.xyz/asset?id=45915811" - - buttons[3] = {} - buttons[3].Text = "Gear" - buttons[3].Function = -> - image.Image = "http://banland.xyz/asset?id=45917596" - - buttons[4] = {} - buttons[4].Text = "Zoom" - buttons[4].Function = -> - image.Image = "http://banland.xyz/asset?id=45915825" - - - CreateTextButtons buttonRow, buttons, UDim.new(0, 0), UDim.new 1, 0 - - -- set up listeners for type of mouse mode, but keep constructing gui at same time - delay 0, -> - waitForChild gui, "UserSettingsShield" - waitForChild gui.UserSettingsShield, "Settings" - waitForChild gui.UserSettingsShield.Settings, "SettingsStyle" - waitForChild gui.UserSettingsShield.Settings.SettingsStyle, "GameSettingsMenu" - waitForChild gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu, "CameraField" - waitForChild gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField, "DropDownMenuButton" - gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Changed - \connect (prop) -> - return if prop ~= "Text" - - if buttonRow.Button1.Style == Enum.ButtonStyle.RobloxButtonDefault -- only change if this is the currently selected panel - image.Image = if gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Text == - "Classic" - - classicLookScreenUrl - else - mouseLockLookScreenUrl - - - okBtn = New "TextButton", "OkBtn" - Text: "OK" - Modal: true - Size: UDim2.new 0.3, 0, 0, 45 - Position: UDim2.new 0.35, 0, 0.975, -50 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - Style: Enum.ButtonStyle.RobloxButtonDefault - Parent: helpDialog - - okBtn.MouseButton1Click\connect -> - shield.Visible = false - game.GuiService\RemoveCenterDialog shield - - robloxLock shield - shield - - -createLeaveConfirmationMenu = (baseZIndex, shield) -> - frame = New "Frame", "LeaveConfirmationMenu" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - Position: UDim2.new 0, 0, 2, 400 - ZIndex: baseZIndex + 4 - - * New "TextLabel", "LeaveText" - Text: "Leave this game?" - Size: UDim2.new 1, 0, 0.8, 0 - TextWrap: true - TextColor3: Color3.new 1, 1, 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - BackgroundTransparency: 1 - ZIndex: baseZIndex + 4 - - yesButton = createTextButton( - "Leave", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size24, - UDim2.new(0, 128, 0, 50), - UDim2.new 0, 313, 0.8, 0 - ) - yesButton.Name = "YesButton" - yesButton.ZIndex = baseZIndex + 4 - yesButton.Parent = frame - yesButton.Modal = true - yesButton\SetVerb "Exit" - - noButton = createTextButton( - "Stay", - Enum.ButtonStyle.RobloxButtonDefault, - Enum.FontSize.Size24, - UDim2.new(0, 128, 0, 50), - UDim2.new 0, 90, 0.8, 0 - ) - noButton.Name = "NoButton" - noButton.Parent = frame - noButton.ZIndex = baseZIndex + 4 - noButton.MouseButton1Click\connect -> - goToMenu shield.Settings.SettingsStyle, "GameMainMenu", "down", UDim2.new 0, 525, 0, 430 - shield.Settings\TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - - frame - -createResetConfirmationMenu = (baseZIndex, shield) -> - frame = New "Frame", "ResetConfirmationMenu" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - Position: UDim2.new 0, 0, 2, 400 - ZIndex: baseZIndex + 4 - - yesButton = createTextButton( - "Reset", - Enum.ButtonStyle.RobloxButtonDefault, - Enum.FontSize.Size24, - UDim2.new(0, 128, 0, 50), - UDim2.new 0, 313, 0, 299 - ) - yesButton.Name = "YesButton" - yesButton.ZIndex = baseZIndex + 4 - yesButton.Parent = frame - yesButton.Modal = true - yesButton.MouseButton1Click\connect -> - resumeGameFunction shield - resetLocalCharacter! - - - noButton = createTextButton( - "Cancel", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size24, - UDim2.new(0, 128, 0, 50), - UDim2.new 0, 90, 0, 299 - ) - noButton.Name = "NoButton" - noButton.Parent = frame - noButton.ZIndex = baseZIndex + 4 - noButton.MouseButton1Click\connect -> - goToMenu shield.Settings.SettingsStyle, "GameMainMenu", "down", UDim2.new 0, 525, 0, 430 - shield.Settings\TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - - - resetCharacterText = New "TextLabel", "ResetCharacterText" - Text: "Are you sure you want to reset your character?" - Size: UDim2.new 1, 0, 0.8, 0 - TextWrap: true - TextColor3: Color3.new 1, 1, 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - BackgroundTransparency: 1 - ZIndex: baseZIndex + 4 - Parent: frame - - with resetCharacterText\Clone! - .Name = "FineResetCharacterText" - .Text = "You will be put back on a spawn point" - .Size = UDim2.new 0, 303, 0, 18 - .Position = UDim2.new 0, 109, 0, 215 - .FontSize = Enum.FontSize.Size18 - .Parent = frame - - frame - - -createGameMainMenu = (baseZIndex, shield) -> - gameMainMenuFrame = New "Frame", "GameMainMenu" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - ZIndex: baseZIndex + 4 - Parent: settingsFrame - - * New "TextLabel", "Title" - Text: "Game Menu" - BackgroundTransparency: 1 - TextStrokeTransparency: 0 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - Size: UDim2.new 1, 0, 0, 36 - Position: UDim2.new 0, 0, 0, 4 - TextColor3: Color3.new 1, 1, 1 - ZIndex: baseZIndex + 4 - - robloxHelpButton = createTextButton( - "Help", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size18, - UDim2.new(0, 164, 0, 50), - UDim2.new 0, 82, 0, 256 - ) - robloxHelpButton.Name = "HelpButton" - robloxHelpButton.ZIndex = baseZIndex + 4 - robloxHelpButton.Parent = gameMainMenuFrame - helpButton = robloxHelpButton - - helpDialog = createHelpDialog baseZIndex - helpDialog.Parent = gui - - helpButton.MouseButton1Click\connect -> - table.insert centerDialogs, helpDialog - game.GuiService\AddCenterDialog( - helpDialog, - Enum.CenterDialogType.ModalDialog, - --ShowFunction - -> - helpDialog.Visible = true - mainShield.Visible = false - --HideFunction - -> - helpDialog.Visible = false - - ) - - helpButton.Active = true - - helpShortcut = New "TextLabel", "HelpShortcutText" - Text: "F1" - Visible: false - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size12 - Position: UDim2.new 0, 85, 0, 0 - Size: UDim2.new 0, 30, 0, 30 - TextColor3: Color3.new 0, 1, 0 - ZIndex: baseZIndex + 4 - Parent: robloxHelpButton - - screenshotButton = createTextButton( - "Screenshot", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size18, - UDim2.new(0, 168, 0, 50), - UDim2.new 0, 254, 0, 256 - ) - screenshotButton.Name = "ScreenshotButton" - screenshotButton.ZIndex = baseZIndex + 4 - screenshotButton.Parent = gameMainMenuFrame - screenshotButton.Visible = not macClient - screenshotButton\SetVerb "Screenshot" - - with helpShortcut\clone! - .Name = "ScreenshotShortcutText" - .Text = "PrintSc" - .Position = UDim2.new 0, 118, 0, 0 - .Visible = true - .Parent = screenshotButton - - recordVideoButton = createTextButton( - "Record Video", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size18, - UDim2.new(0, 168, 0, 50), - UDim2.new 0, 254, 0, 306 - ) - recordVideoButton.Name = "RecordVideoButton" - recordVideoButton.ZIndex = baseZIndex + 4 - recordVideoButton.Parent = gameMainMenuFrame - recordVideoButton.Visible = not macClient - recordVideoButton\SetVerb "RecordToggle" - - with helpShortcut\clone! - .Visible = hasGraphicsSlider - .Name = "RecordVideoShortcutText" - .Text = "F12" - .Position = UDim2.new 0, 120, 0, 0 - .Parent = recordVideoButton - - stopRecordButton = New "ImageButton", "StopRecordButton" - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/RecordStop.png" - Size: UDim2.new 0, 59, 0, 27 - stopRecordButton\SetVerb "RecordToggle" - - stopRecordButton.MouseButton1Click\connect -> - recordVideoClick recordVideoButton, stopRecordButton - - stopRecordButton.Visible = false - stopRecordButton.Parent = gui - - reportAbuseButton = createTextButton( - "Report Abuse", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size18, - UDim2.new(0, 164, 0, 50), - UDim2.new 0, 82, 0, 306 - ) - reportAbuseButton.Name = "ReportAbuseButton" - reportAbuseButton.ZIndex = baseZIndex + 4 - reportAbuseButton.Parent = gameMainMenuFrame - - leaveGameButton = createTextButton( - "Leave Game", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size24, - UDim2.new(0, 340, 0, 50), - UDim2.new 0, 82, 0, 358 - ) - leaveGameButton.Name = "LeaveGameButton" - leaveGameButton.ZIndex = baseZIndex + 4 - leaveGameButton.Parent = gameMainMenuFrame - - resumeGameButton = createTextButton( - "Resume Game", - Enum.ButtonStyle.RobloxButtonDefault, - Enum.FontSize.Size24, - UDim2.new(0, 340, 0, 50), - UDim2.new 0, 82, 0, 54 - ) - resumeGameButton.Name = "resumeGameButton" - resumeGameButton.ZIndex = baseZIndex + 4 - resumeGameButton.Parent = gameMainMenuFrame - resumeGameButton.Modal = true - resumeGameButton.MouseButton1Click\connect -> - resumeGameFunction shield - - - gameSettingsButton = createTextButton( - "Game Settings", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size24, - UDim2.new(0, 340, 0, 50), - UDim2.new 0, 82, 0, 156 - ) - gameSettingsButton.Name = "SettingsButton" - gameSettingsButton.ZIndex = baseZIndex + 4 - gameSettingsButton.Parent = gameMainMenuFrame - - if game\FindFirstChild"LoadingGuiService" and #game.LoadingGuiService\GetChildren! > 0 - gameSettingsButton = createTextButton( - "Game Instructions", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size24, - UDim2.new(0, 340, 0, 50), - UDim2.new 0, 82, 0, 207 - ) - gameSettingsButton.Name = "GameInstructions" - gameSettingsButton.ZIndex = baseZIndex + 4 - gameSettingsButton.Parent = gameMainMenuFrame - gameSettingsButton.MouseButton1Click\connect -> - if game\FindFirstChild "Players" and game.Players["LocalPlayer"] - if loadingGui = game.Players.LocalPlayer\FindFirstChild "PlayerLoadingGui" - loadingGui.Visible = true - - - resetButton = createTextButton( - "Reset Character", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size24, - UDim2.new(0, 340, 0, 50), - UDim2.new 0, 82, 0, 105 - ) - resetButton.Name = "ResetButton" - resetButton.ZIndex = baseZIndex + 4 - resetButton.Parent = gameMainMenuFrame - - gameMainMenuFrame - - -createGameSettingsMenu = (baseZIndex, _) -> - gameSettingsMenuFrame = New "Frame", "GameSettingsMenu" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - ZIndex: baseZIndex + 4 - - * New "TextLabel", "Title" - Text: "Settings" - Size: UDim2.new 1, 0, 0, 48 - Position: UDim2.new 0, 9, 0, -9 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - TextColor3: Color3.new 1, 1, 1 - ZIndex: baseZIndex + 4 - BackgroundTransparency: 1 - - * New "TextLabel", "FullscreenText" - Text: "Fullscreen Mode" - Size: UDim2.new 0, 124, 0, 18 - Position: UDim2.new 0, 62, 0, 145 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextColor3: Color3.new 1, 1, 1 - ZIndex: baseZIndex + 4 - BackgroundTransparency: 1 - - fullscreenShortcut = New "TextLabel", "FullscreenShortcutText" - Visible: hasGraphicsSlider - Text: "F11" - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size12 - Position: UDim2.new 0, 186, 0, 141 - Size: UDim2.new 0, 30, 0, 30 - TextColor3: Color3.new 0, 1, 0 - ZIndex: baseZIndex + 4 - Parent: gameSettingsMenuFrame - - studioText = New "TextLabel", "StudioText" - Visible: false - Text: "Studio Mode" - Size: UDim2.new 0, 95, 0, 18 - Position: UDim2.new 0, 62, 0, 179 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextColor3: Color3.new 1, 1, 1 - ZIndex: baseZIndex + 4 - BackgroundTransparency: 1 - Parent: gameSettingsMenuFrame - - studioShortcut = fullscreenShortcut\clone! - with studioShortcut - .Name = "StudioShortcutText" - .Visible = false -- TODO: turn back on when f2 hack is fixed - .Text = "F2" - .Position = UDim2.new 0, 154, 0, 175 - .Parent = gameSettingsMenuFrame - - local studioCheckbox - - if hasGraphicsSlider - qualityText = New "TextLabel", "QualityText" - Text: "Graphics Quality" - Size: UDim2.new 0, 128, 0, 18 - Position: UDim2.new 0, 30, 0, 239 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextColor3: Color3.new 1, 1, 1 - ZIndex: baseZIndex + 4 - BackgroundTransparency: 1 - Parent: gameSettingsMenuFrame - Visible: not inStudioMode - - autoText = qualityText\clone! - with autoText - .Name = "AutoText" - .Text = "Auto" - .Position = UDim2.new 0, 183, 0, 214 - .TextColor3 = Color3.new 128 / 255, 128 / 255, 128 / 255 - .Size = UDim2.new 0, 34, 0, 18 - .Parent = gameSettingsMenuFrame - .Visible = not inStudioMode - - fasterText = autoText\clone! - with fasterText - .Name = "FasterText" - .Text = "Faster" - .Position = UDim2.new 0, 185, 0, 274 - .TextColor3 = Color3.new 95, 95, 95 - .FontSize = Enum.FontSize.Size14 - .Parent = gameSettingsMenuFrame - .Visible = not inStudioMode - - fasterShortcut = fullscreenShortcut\clone! - with fasterShortcut - .Name = "FasterShortcutText" - .Text = "F10 + Shift" - .Position = UDim2.new 0, 185, 0, 283 - .Parent = gameSettingsMenuFrame - .Visible = not inStudioMode - - betterQualityText = autoText\clone! - with betterQualityText - .Name = "BetterQualityText" - .Text = "Better Quality" - .TextWrap = true - .Size = UDim2.new 0, 41, 0, 28 - .Position = UDim2.new 0, 390, 0, 269 - .TextColor3 = Color3.new 95, 95, 95 - .FontSize = Enum.FontSize.Size14 - .Parent = gameSettingsMenuFrame - .Visible = not inStudioMode - - betterQualityShortcut = fullscreenShortcut\clone! - with betterQualityShortcut - .Name = "BetterQualityShortcut" - .Text = "F10" - .Position = UDim2.new 0, 394, 0, 288 - .Parent = gameSettingsMenuFrame - .Visible = not inStudioMode - - autoGraphicsButton = createTextButton( - "X", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size18, - UDim2.new(0, 25, 0, 25), - UDim2.new 0, 187, 0, 239 - ) - autoGraphicsButton.Name = "AutoGraphicsButton" - autoGraphicsButton.ZIndex = baseZIndex + 4 - autoGraphicsButton.Parent = gameSettingsMenuFrame - autoGraphicsButton.Visible = not inStudioMode - - graphicsSlider, graphicsLevel = RbxGui.CreateSlider GraphicsQualityLevels, 150, UDim2.new 0, 230, 0, 280 -- graphics - 1 because slider starts at 1 instead of 0 - graphicsSlider.Parent = gameSettingsMenuFrame - graphicsSlider.Bar.ZIndex = baseZIndex + 4 - graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5 - graphicsSlider.Visible = not inStudioMode - graphicsLevel.Value = math.floor (settings!.Rendering\GetMaxQualityLevel! - 1) / 2 - - graphicsSetter = New "TextBox", "GraphicsSetter" - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 128 / 255, 128 / 255, 128 / 255 - Size: UDim2.new 0, 50, 0, 25 - Position: UDim2.new 0, 450, 0, 269 - TextColor3: Color3.new 1, 1, 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Text: "Auto" - ZIndex: 1 - TextWrap: true - Parent: gameSettingsMenuFrame - Visible: not inStudioMode - - isAutoGraphics = true - if not inStudioMode - isAutoGraphics = (UserSettings!.GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic) - else - settings!.Rendering.EnableFRM = false - - - listenToGraphicsLevelChange = true - - setAutoGraphicsGui = (active) -> - isAutoGraphics = active - if active - autoGraphicsButton.Text = "X" - betterQualityText.ZIndex = \ - betterQualityShortcut.ZIndex = \ - fasterShortcut.ZIndex = \ - fasterText.ZIndex = \ - graphicsSlider.Bar.ZIndex = \ - graphicsSlider.Bar.Slider.ZIndex = \ - graphicsSetter.ZIndex = 1 - graphicsSetter.Text = "Auto" - else - autoGraphicsButton.Text = "" - graphicsSlider.Bar.ZIndex = baseZIndex + 4 - graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5 - betterQualityShortcut.ZIndex = baseZIndex + 4 - fasterShortcut.ZIndex = baseZIndex + 4 - betterQualityText.ZIndex = baseZIndex + 4 - fasterText.ZIndex = baseZIndex + 4 - graphicsSetter.ZIndex = baseZIndex + 4 - - - goToAutoGraphics = -> - setAutoGraphicsGui true - - UserSettings!.GameSettings.SavedQualityLevel = Enum.SavedQualitySetting.Automatic - - settings!.Rendering.QualityLevel = Enum.QualityLevel.Automatic - - - setGraphicsQualityLevel = (newLevel) -> - percentage = newLevel / GraphicsQualityLevels - newSetting = math.floor((settings!.Rendering\GetMaxQualityLevel! - 1) * percentage) - newSetting = if newSetting == 20 -- Level 20 is the same as level 21, except it doesn't render ambient occlusion - 21 - elseif newLevel == 1 -- make sure we can go to lowest settings (for terrible computers) - 1 - elseif newSetting > settings!.Rendering\GetMaxQualityLevel! - settings!.Rendering\GetMaxQualityLevel! - 1 - - - UserSettings!.GameSettings.SavedQualityLevel = newLevel - settings!.Rendering.QualityLevel = newSetting - - - goToManualGraphics = (explicitLevel) -> - setAutoGraphicsGui false - - if explicitLevel - graphicsLevel.Value = explicitLevel - else - graphicsLevel.Value = math.floor( - (settings!.Rendering.AutoFRMLevel / (settings!.Rendering\GetMaxQualityLevel! - 1)) - * GraphicsQualityLevels - ) - - - if explicitLevel == graphicsLevel.Value -- make sure we are actually in right graphics mode - setGraphicsQualityLevel graphicsLevel.Value - - - if not explicitLevel - UserSettings!.GameSettings.SavedQualityLevel = graphicsLevel.Value - - graphicsSetter.Text = "#{graphicsLevel.Value}" - - - showAutoGraphics = -> - autoText.ZIndex = baseZIndex + 4 - autoGraphicsButton.ZIndex = baseZIndex + 4 - - - hideAutoGraphics = -> - autoText.ZIndex = 1 - autoGraphicsButton.ZIndex = 1 - - - showManualGraphics = -> - graphicsSlider.Bar.ZIndex = baseZIndex + 4 - graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5 - betterQualityShortcut.ZIndex = baseZIndex + 4 - fasterShortcut.ZIndex = baseZIndex + 4 - betterQualityText.ZIndex = baseZIndex + 4 - fasterText.ZIndex = baseZIndex + 4 - graphicsSetter.ZIndex = baseZIndex + 4 - - - hideManualGraphics = -> - betterQualityText.ZIndex \ - = betterQualityShortcut.ZIndex \ - = fasterShortcut.ZIndex \ - = fasterText.ZIndex \ - = graphicsSlider.Bar.ZIndex \ - = graphicsSlider.Bar.Slider.ZIndex \ - = graphicsSetter.ZIndex = 1 - - - translateSavedQualityLevelToInt = (savedQualityLevel) -> - switch savedQualityLevel - when Enum.SavedQualitySetting.Automatic then 0 - when Enum.SavedQualitySetting.QualityLevel1 then 1 - when Enum.SavedQualitySetting.QualityLevel2 then 2 - when Enum.SavedQualitySetting.QualityLevel3 then 3 - when Enum.SavedQualitySetting.QualityLevel4 then 4 - when Enum.SavedQualitySetting.QualityLevel5 then 5 - when Enum.SavedQualitySetting.QualityLevel6 then 6 - when Enum.SavedQualitySetting.QualityLevel7 then 7 - when Enum.SavedQualitySetting.QualityLevel8 then 8 - when Enum.SavedQualitySetting.QualityLevel9 then 9 - when Enum.SavedQualitySetting.QualityLevel10 then 10 - - - enableGraphicsWidget = -> - settings!.Rendering.EnableFRM = true - - isAutoGraphics = UserSettings!.GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic - if isAutoGraphics - showAutoGraphics! - goToAutoGraphics! - else - showAutoGraphics! - showManualGraphics! - goToManualGraphics translateSavedQualityLevelToInt UserSettings!.GameSettings.SavedQualityLevel - - - disableGraphicsWidget = -> - hideManualGraphics! - hideAutoGraphics! - settings!.Rendering.EnableFRM = false - - - graphicsSetter.FocusLost\connect -> - if isAutoGraphics - graphicsSetter.Text = "#{graphicsLevel.Value}" - return - - - newGraphicsValue = tonumber graphicsSetter.Text - if newGraphicsValue == nil - graphicsSetter.Text = "#{graphicsLevel.Value}" - return - - - newGraphicsValue = if newGraphicsValue < 1 - 1 - elseif newGraphicsValue >= settings!.Rendering\GetMaxQualityLevel! - settings!.Rendering\GetMaxQualityLevel! - 1 - - - graphicsLevel.Value = newGraphicsValue - setGraphicsQualityLevel graphicsLevel.Value - graphicsSetter.Text = "#{graphicsLevel.Value}" - - - graphicsLevel.Changed\connect (_) -> - return if isAutoGraphics - return if not listenToGraphicsLevelChange - - graphicsSetter.Text = "#{graphicsLevel.Value}" - setGraphicsQualityLevel graphicsLevel.Value - - - -- setup our graphic mode on load - if inStudioMode or UserSettings!.GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic - if inStudioMode - settings!.Rendering.EnableFRM = false - disableGraphicsWidget! - else - settings!.Rendering.EnableFRM = true - goToAutoGraphics! - - else - settings!.Rendering.EnableFRM = true - goToManualGraphics translateSavedQualityLevelToInt UserSettings!.GameSettings.SavedQualityLevel - - - autoGraphicsButton.MouseButton1Click\connect -> - return if inStudioMode and not game.Players.LocalPlayer - - if not isAutoGraphics - goToAutoGraphics! - else - goToManualGraphics graphicsLevel.Value - - - game.GraphicsQualityChangeRequest\connect (graphicsIncrease) -> - return if isAutoGraphics - -- only can set graphics in manual mode - - if graphicsIncrease - return if (graphicsLevel.Value + 1) > GraphicsQualityLevels - - graphicsLevel.Value = graphicsLevel.Value + 1 - graphicsSetter.Text = "#{graphicsLevel.Value}" - setGraphicsQualityLevel graphicsLevel.Value - - game\GetService"GuiService"\SendNotification( - "Graphics Quality", - "Increased to (#{graphicsSetter.Text})", - "", - 2, - -> - ) - else - return if (graphicsLevel.Value - 1) <= 0 - - graphicsLevel.Value = graphicsLevel.Value - 1 - graphicsSetter.Text = "#{graphicsLevel.Value}" - setGraphicsQualityLevel graphicsLevel.Value - - game\GetService"GuiService"\SendNotification( - "Graphics Quality", - "Decreased to (#{graphicsSetter.Text})", - "", - 2, - -> - ) - - - game.Players.PlayerAdded\connect (player) -> - if player == game.Players.LocalPlayer and inStudioMode - enableGraphicsWidget! - - - game.Players.PlayerRemoving\connect (player) -> - if player == game.Players.LocalPlayer and inStudioMode - disableGraphicsWidget! - - - studioCheckbox = createTextButton( - "", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size18, - UDim2.new(0, 25, 0, 25), - UDim2.new 0, 30, 0, 176 - ) - studioCheckbox.Name = "StudioCheckbox" - studioCheckbox.ZIndex = baseZIndex + 4 - --studioCheckbox.Parent = gameSettingsMenuFrame -- todo: enable when studio h4x aren't an issue anymore - studioCheckbox\SetVerb "TogglePlayMode" - studioCheckbox.Visible = false -- todo: enabled when studio h4x aren't an issue anymore - - wasManualGraphics = (settings!.Rendering.QualityLevel ~= Enum.QualityLevel.Automatic) - if inStudioMode and not game.Players.LocalPlayer - studioCheckbox.Text = "X" - disableGraphicsWidget! - elseif inStudioMode - studioCheckbox.Text = "X" - enableGraphicsWidget! - - if hasGraphicsSlider - UserSettings!.GameSettings.StudioModeChanged\connect (isStudioMode) -> - inStudioMode = isStudioMode - if isStudioMode - wasManualGraphics = (settings!.Rendering.QualityLevel ~= Enum.QualityLevel.Automatic) - goToAutoGraphics! - studioCheckbox.Text = "X" - autoGraphicsButton.ZIndex = 1 - autoText.ZIndex = 1 - else - if wasManualGraphics - goToManualGraphics! - - studioCheckbox.Text = "" - autoGraphicsButton.ZIndex = baseZIndex + 4 - autoText.ZIndex = baseZIndex + 4 - - else - studioCheckbox.MouseButton1Click\connect -> - return if not studioCheckbox.Active - - studioCheckbox.Text = if studioCheckbox.Text == "" - "X" - else - "" - - - fullscreenCheckbox = createTextButton( - "", - Enum.ButtonStyle.RobloxButton, - Enum.FontSize.Size18, - UDim2.new(0, 25, 0, 25), - UDim2.new 0, 30, 0, 144 - ) - fullscreenCheckbox.Name = "FullscreenCheckbox" - fullscreenCheckbox.ZIndex = baseZIndex + 4 - fullscreenCheckbox.Parent = gameSettingsMenuFrame - fullscreenCheckbox\SetVerb "ToggleFullScreen" - if UserSettings!.GameSettings\InFullScreen! - fullscreenCheckbox.Text = "X" - - if hasGraphicsSlider - UserSettings!.GameSettings.FullscreenChanged\connect (isFullscreen) -> - fullscreenCheckbox.Text = if isFullscreen - "X" - else - "" - - else - fullscreenCheckbox.MouseButton1Click\connect -> - fullscreenCheckbox.Text = if fullscreenCheckbox.Text == "" - "X" - else - "" - - if game\FindFirstChild "NetworkClient" -- we are playing online - setDisabledState studioText - setDisabledState studioShortcut - setDisabledState studioCheckbox - - - local backButton - if hasGraphicsSlider - backButton = createTextButton( - "OK", - Enum.ButtonStyle.RobloxButtonDefault, - Enum.FontSize.Size24, - UDim2.new(0, 180, 0, 50), - UDim2.new 0, 170, 0, 330 - ) - backButton.Modal = true - else - backButton = createTextButton( - "OK", - Enum.ButtonStyle.RobloxButtonDefault, - Enum.FontSize.Size24, - UDim2.new(0, 180, 0, 50), - UDim2.new 0, 170, 0, 270 - ) - backButton.Modal = true - - - backButton.Name = "BackButton" - backButton.ZIndex = baseZIndex + 4 - backButton.Parent = gameSettingsMenuFrame - - global syncVideoCaptureSetting = nil - - if not macClient - New "TextLabel", "VideoCaptureLabel" - Text: "After Capturing Video" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, 32, 0, 100 - Size: UDim2.new 0, 164, 0, 18 - BackgroundTransparency: 1 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - ZIndex: baseZIndex + 4 - Parent: gameSettingsMenuFrame - - videoNames = {} - videoNameToItem = {} - videoNames[1] = "Just Save to Disk" - videoNameToItem[videoNames[1]] = Enum.UploadSetting["Never"] - videoNames[2] = "Upload to YouTube" - videoNameToItem[videoNames[2]] = Enum.UploadSetting["Ask me first"] - - local videoCaptureDropDown - videoCaptureDropDown, updateVideoCaptureDropDownSelection = RbxGui.CreateDropDownMenu videoNames, (text) -> - UserSettings!.GameSettings.VideoUploadPromptBehavior = videoNameToItem[text] - - with videoCaptureDropDown - .Name = "VideoCaptureField" - .ZIndex = baseZIndex + 4 - .DropDownMenuButton.ZIndex = baseZIndex + 4 - .DropDownMenuButton.Icon.ZIndex = baseZIndex + 4 - .Position = UDim2.new 0, 270, 0, 94 - .Size = UDim2.new 0, 200, 0, 32 - .Parent = gameSettingsMenuFrame - - syncVideoCaptureSetting = -> - updateVideoCaptureDropDownSelection if UserSettings!.GameSettings.VideoUploadPromptBehavior == Enum.UploadSetting["Never"] - videoNames[1] - elseif UserSettings!.GameSettings.VideoUploadPromptBehavior == Enum.UploadSetting["Ask me first"] - videoNames[2] - else - UserSettings!.GameSettings.VideoUploadPromptBehavior = Enum.UploadSetting["Ask me first"] - videoNames[2] - - - New "TextLabel", "CameraLabel" - Text: "Character & Camera Controls" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, 31, 0, 58 - Size: UDim2.new 0, 224, 0, 18 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - BackgroundTransparency: 1 - ZIndex: baseZIndex + 4 - Parent: gameSettingsMenuFrame - - mouseLockLabel = game.CoreGui.RobloxGui\FindFirstChild "MouseLockLabel", true - - enumItems = Enum.ControlMode\GetEnumItems! - enumNames = {} - enumNameToItem = {} - for i, obj in ipairs enumItems - enumNames[i] = obj.Name - enumNameToItem[obj.Name] = obj - - - local cameraDropDown - cameraDropDown, updateCameraDropDownSelection = RbxGui.CreateDropDownMenu enumNames, (text) -> - UserSettings!.GameSettings.ControlMode = enumNameToItem[text] - - try - mouseLockLabel.Visible = if mouseLockLabel and UserSettings!.GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] - true - elseif mouseLockLabel - false - - with cameraDropDown - .Name = "CameraField" - .ZIndex = baseZIndex + 4 - .DropDownMenuButton.ZIndex = baseZIndex + 4 - .DropDownMenuButton.Icon.ZIndex = baseZIndex + 4 - .Position = UDim2.new 0, 270, 0, 52 - .Size = UDim2.new 0, 200, 0, 32 - .Parent = gameSettingsMenuFrame - - gameSettingsMenuFrame - -if LoadLibrary - global RbxGui = LoadLibrary "RbxGui" - baseZIndex = 0 - if UserSettings - createSettingsDialog = -> - waitForChild gui, "BottomLeftControl" - global settingsButton = gui.BottomLeftControl\FindFirstChild "SettingsButton" - - if settingsButton == nil - settingsButton = New "ImageButton", "SettingsButton" - Image: "rbxasset://textures/ui/SettingsButton.png" - BackgroundTransparency: 1 - Active: false - Size: UDim2.new 0, 54, 0, 46 - Position: UDim2.new 0, 2, 0, 50 - Parent: gui.BottomLeftControl - - - shield = New "TextButton", "UserSettingsShield" - Text: "" - Active: true - AutoButtonColor: false - Visible: false - Size: UDim2.new 1, 0, 1, 0 - BackgroundColor3: Color3I 51, 51, 51 - BorderColor3: Color3I 27, 42, 53 - BackgroundTransparency: 0.4 - ZIndex: baseZIndex + 2 - mainShield = shield - - frame = New "Frame", "Settings" - Position: UDim2.new 0.5, -262, -0.5, -200 - Size: UDim2.new 0, 525, 0, 430 - BackgroundTransparency: 1 - Active: true - Parent: shield - - settingsFrame = New "Frame", "SettingsStyle" - Size: UDim2.new 1, 0, 1, 0 - Style: Enum.FrameStyle.RobloxRound - Active: true - ZIndex: baseZIndex + 3 - Parent: frame - - gameMainMenu = createGameMainMenu baseZIndex, shield - gameMainMenu.Parent = settingsFrame - - gameMainMenu.ScreenshotButton.MouseButton1Click\connect -> - backToGame gameMainMenu.ScreenshotButton, shield, settingsButton - - - gameMainMenu.RecordVideoButton.MouseButton1Click\connect -> - recordVideoClick gameMainMenu.RecordVideoButton, gui.StopRecordButton - backToGame gameMainMenu.RecordVideoButton, shield, settingsButton - - - if settings!\FindFirstChild "Game Options" - try - settings!\FindFirstChild"Game Options".VideoRecordingChangeRequest\connect (recording) -> - recordingVideo = recording - setRecordGui recording, gui.StopRecordButton, gameMainMenu.RecordVideoButton - - - game.CoreGui.RobloxGui.Changed\connect (prop) -> -- We have stopped recording when we resize - if prop == "AbsoluteSize" and recordingVideo - recordVideoClick gameMainMenu.RecordVideoButton, gui.StopRecordButton - - - localPlayerChange = -> - gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer - if game.Players.LocalPlayer - settings!.Rendering.EnableFRM = true - elseif inStudioMode - settings!.Rendering.EnableFRM = false - - - gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer - if game.Players.LocalPlayer? - game.Players.LocalPlayer.Changed\connect -> - localPlayerChange! - - else - delay 0, -> - waitForProperty game.Players, "LocalPlayer" - gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer - game.Players.LocalPlayer.Changed\connect -> - localPlayerChange! - - gameMainMenu.ReportAbuseButton.Visible = game\FindFirstChild "NetworkClient" - if not gameMainMenu.ReportAbuseButton.Visible - game.ChildAdded\connect (child) -> - if child\IsA "NetworkClient" - gameMainMenu.ReportAbuseButton.Visible = game\FindFirstChild "NetworkClient" - - gameMainMenu.ResetButton.MouseButton1Click\connect -> - goToMenu settingsFrame, "ResetConfirmationMenu", "up", UDim2.new 0, 525, 0, 370 - - gameMainMenu.LeaveGameButton.MouseButton1Click\connect -> - goToMenu settingsFrame, "LeaveConfirmationMenu", "down", UDim2.new 0, 525, 0, 300 - - if game.CoreGui.Version >= 4 -- we can use escape! - game\GetService"GuiService".EscapeKeyPressed\connect -> - if currentMenuSelection == nil - game.GuiService\AddCenterDialog( - shield, - Enum.CenterDialogType.ModalDialog, - --showFunction - -> - settingsButton.Active = false - updateCameraDropDownSelection UserSettings!.GameSettings.ControlMode.Name - - if syncVideoCaptureSetting - syncVideoCaptureSetting! - - - goToMenu(settingsFrame, "GameMainMenu", "right", UDim2.new(0, 525, 0, 430)) - shield.Visible = true - shield.Active = true - settingsFrame.Parent\TweenPosition( - UDim2.new(0.5, -262, 0.5, -200), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - settingsFrame.Parent\TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - --hideFunction - -> - settingsFrame.Parent\TweenPosition( - UDim2.new(0.5, -262, -0.5, -200), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - settingsFrame.Parent\TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - shield.Visible = false - settingsButton.Active = true - - ) - elseif #lastMenuSelection > 0 - if #centerDialogs > 0 - for i in *centerDialogs - game.GuiService\RemoveCenterDialog i - i.Visible = false - - centerDialogs = {} - - - goToMenu( - lastMenuSelection[#lastMenuSelection]["container"], - lastMenuSelection[#lastMenuSelection]["name"], - lastMenuSelection[#lastMenuSelection]["direction"], - lastMenuSelection[#lastMenuSelection]["lastSize"] - ) - - table.remove lastMenuSelection, #lastMenuSelection - if #lastMenuSelection == 1 -- apparently lua can't reduce count to 0... T_T - lastMenuSelection = {} - - else - resumeGameFunction shield - - - gameSettingsMenu = createGameSettingsMenu baseZIndex, shield - gameSettingsMenu.Visible = false - gameSettingsMenu.Parent = settingsFrame - - gameMainMenu.SettingsButton.MouseButton1Click\connect -> - goToMenu settingsFrame, "GameSettingsMenu", "left", UDim2.new 0, 525, 0, 350 - - - gameSettingsMenu.BackButton.MouseButton1Click\connect -> - goToMenu settingsFrame, "GameMainMenu", "right", UDim2.new 0, 525, 0, 430 - - - resetConfirmationWindow = createResetConfirmationMenu baseZIndex, shield - resetConfirmationWindow.Visible = false - resetConfirmationWindow.Parent = settingsFrame - - leaveConfirmationWindow = createLeaveConfirmationMenu baseZIndex, shield - leaveConfirmationWindow.Visible = false - leaveConfirmationWindow.Parent = settingsFrame - - robloxLock shield - - settingsButton.MouseButton1Click\connect -> - game.GuiService\AddCenterDialog( - shield, - Enum.CenterDialogType.ModalDialog, - --showFunction - -> - settingsButton.Active = false - updateCameraDropDownSelection UserSettings!.GameSettings.ControlMode.Name - - if syncVideoCaptureSetting - syncVideoCaptureSetting! - - - goToMenu settingsFrame, "GameMainMenu", "right", UDim2.new 0, 525, 0, 430 - shield.Visible = true - settingsFrame.Parent\TweenPosition( - UDim2.new(0.5, -262, 0.5, -200), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - settingsFrame.Parent\TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - --hideFunction - -> - settingsFrame.Parent\TweenPosition( - UDim2.new(0.5, -262, -0.5, -200), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - settingsFrame.Parent\TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - shield.Visible = false - settingsButton.Active = true - - ) - - shield - - - delay 0, -> - createSettingsDialog!.Parent = gui - - gui.BottomLeftControl.SettingsButton.Active = true - gui.BottomLeftControl.SettingsButton.Position = UDim2.new 0, 2, 0, -2 - - mouseLockLabel.Visible = if mouseLockLabel and UserSettings!.GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] - true - elseif mouseLockLabel - false - - - -- our script has loaded, get rid of older buttons now - leaveGameButton = gui.BottomLeftControl\FindFirstChild "Exit" - leaveGameButton?\Remove! - - - topLeft = gui\FindFirstChild "TopLeftControl" - if topLeft - leaveGameButton = topLeft\FindFirstChild "Exit" - leaveGameButton?\Remove! - - - topLeft\Remove! - - --UserSettings call - - createSaveDialogs = -> - shield = New "TextButton", "SaveDialogShield" - Text: "" - AutoButtonColor: false - Active: true - Visible: false - Size: UDim2.new 1, 0, 1, 0 - BackgroundColor3: Color3I 51, 51, 51 - BorderColor3: Color3I 27, 42, 53 - BackgroundTransparency: 0.4 - ZIndex: baseZIndex + 1 - - local clearAndResetDialog, save, saveLocal, dontSave, cancel - - messageBoxButtons = {} - messageBoxButtons[1] = {} - messageBoxButtons[1].Text = "Save" - messageBoxButtons[1].Style = Enum.ButtonStyle.RobloxButtonDefault - messageBoxButtons[1].Function = -> - save! - - messageBoxButtons[2] = {} - messageBoxButtons[2].Text = "Cancel" - messageBoxButtons[2].Function = -> - cancel! - - messageBoxButtons[3] = {} - messageBoxButtons[3].Text = "Don't Save" - messageBoxButtons[3].Function = -> - dontSave! - - - saveDialogMessageBox = RbxGui.CreateStyledMessageDialog( - "Unsaved Changes", - "Save your changes to Mercury before leaving?", - "Confirm", - messageBoxButtons - ) - saveDialogMessageBox.Visible = true - saveDialogMessageBox.Parent = shield - - errorBoxButtons = {} - - buttonOffset = 1 - if game.LocalSaveEnabled - errorBoxButtons[buttonOffset] = {} - errorBoxButtons[buttonOffset].Text = "Save to Disk" - errorBoxButtons[buttonOffset].Function = -> - saveLocal! - - buttonOffset += 1 - - errorBoxButtons[buttonOffset] = {} - errorBoxButtons[buttonOffset].Text = "Keep Playing" - errorBoxButtons[buttonOffset].Function = -> - cancel! - - errorBoxButtons[buttonOffset + 1] = {} - errorBoxButtons[buttonOffset + 1].Text = "Don't Save" - errorBoxButtons[buttonOffset + 1].Function = -> - dontSave! - - - errorDialogMessageBox = RbxGui.CreateStyledMessageDialog( - "Upload Failed", - "Sorry, we could not save your changes to Mercury.", - "Error", - errorBoxButtons - ) - errorDialogMessageBox.Visible = false - errorDialogMessageBox.Parent = shield - - spinnerDialog = New "Frame", "SpinnerDialog" - Style: Enum.FrameStyle.RobloxRound - Size: UDim2.new 0, 350, 0, 150 - Position: UDim2.new 0.5, -175, 0.5, -75 - Visible: false - Active: true - Parent: shield - - * New "TextLabel", "WaitingLabel" - Text: "Saving to Mercury..." - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.5, 25, 0.5, 0 - TextColor3: Color3.new 1, 1, 1 - - spinnerFrame = New "Frame", "Spinner" - Size: UDim2.new 0, 80, 0, 80 - Position: UDim2.new 0.5, -150, 0.5, -40 - BackgroundTransparency: 1 - Parent: spinnerDialog - - spinnerIcons = {} - spinnerNum = 1 - while spinnerNum <= 8 - spinnerImage = New "ImageLabel", "Spinner#{spinnerNum}" - Size: UDim2.new 0, 16, 0, 16 - Position: UDim2.new( - 0.5 + 0.3 * math.cos(math.rad 45 * spinnerNum), - -8, - 0.5 + 0.3 * math.sin(math.rad 45 * spinnerNum), - -8 - ) - BackgroundTransparency: 1 - Image: "http://banland.xyz/asset?id=45880710" - Parent: spinnerFrame - - spinnerIcons[spinnerNum] = spinnerImage - spinnerNum += 1 - - - save = -> - saveDialogMessageBox.Visible = false - - --Show the spinner dialog - spinnerDialog.Visible = true - spin = true - --Make it spin - delay 0, -> - spinPos = 0 - while spin - pos = 0 - - while pos < 8 - spinnerIcons[pos + 1].Image = if pos == spinPos or pos == ((spinPos + 1) % 8) - "http://banland.xyz/asset?id=45880668" - else - "http://banland.xyz/asset?id=45880710" - - pos += 1 - - spinPos = (spinPos + 1) % 8 - wait 0.2 - - - --Do the save while the spinner is going, function will wait - result = game\SaveToRoblox! - if not result - --Try once more - result = game\SaveToRoblox! - - - --Hide the spinner dialog - spinnerDialog.Visible = false - --And cause the delay thread to stop - spin = false - - --Now process the result - if result - --Success, close - game\FinishShutdown false - clearAndResetDialog! - else - --Failure, show the second dialog prompt - errorDialogMessageBox.Visible = true - - - save= -> - errorDialogMessageBox.Visible = false - game\FinishShutdown true - clearAndResetDialog! - - - dontSave = -> - saveDialogMessageBox.Visible = false - errorDialogMessageBox.Visible = false - game\FinishShutdown false - clearAndResetDialog! - - cancel = -> - saveDialogMessageBox.Visible = false - errorDialogMessageBox.Visible = false - clearAndResetDialog! - - - clearAndResetDialog = -> - saveDialogMessageBox.Visible = true - errorDialogMessageBox.Visible = false - spinnerDialog.Visible = false - shield.Visible = false - game.GuiService\RemoveCenterDialog shield - - - robloxLock shield - shield.Visible = false - shield - - - createReportAbuseDialog = -> - --Only show things if we are a NetworkClient - waitForChild game, "NetworkClient" - - waitForChild game, "Players" - waitForProperty game.Players, "LocalPlayer" - localPlayer = game.Players.LocalPlayer - - local reportAbuseButton - waitForChild gui, "UserSettingsShield" - waitForChild gui.UserSettingsShield, "Settings" - waitForChild gui.UserSettingsShield.Settings, "SettingsStyle" - waitForChild gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu" - waitForChild gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, "ReportAbuseButton" - reportAbuseButton = gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton - - shield = New "TextButton", "ReportAbuseShield" - Text: "" - AutoButtonColor: false - Active: true - Visible: false - Size: UDim2.new 1, 0, 1, 0 - BackgroundColor3: Color3I 51, 51, 51 - BorderColor3: Color3I 27, 42, 53 - BackgroundTransparency: 0.4 - ZIndex: baseZIndex + 1 - - local closeAndResetDialog - - messageBoxButtons = {} - messageBoxButtons[1] = {} - messageBoxButtons[1].Text = "Ok" - messageBoxButtons[1].Modal = true - messageBoxButtons[1].Function = -> - closeAndResetDialog! - - calmingMessageBox = RbxGui.CreateMessageDialog( - "Thanks for your report!", - "Our moderators will review the chat logs and determine what happened. The other user is probably just trying to make you mad.\n\nIf anyone used swear words, inappropriate language, or threatened you in real life, please report them for Bad Words or Threats", - messageBoxButtons - ) - calmingMessageBox.Visible = false - calmingMessageBox.Parent = shield - - recordedMessageBox = RbxGui.CreateMessageDialog( - "Thanks for your report!", - "We've recorded your report for evaluation.", - messageBoxButtons - ) - recordedMessageBox.Visible = false - recordedMessageBox.Parent = shield - - normalMessageBox = RbxGui.CreateMessageDialog( - "Thanks for your report!", - "Our moderators will review the chat logs and determine what happened.", - messageBoxButtons - ) - normalMessageBox.Visible = false - normalMessageBox.Parent = shield - - frame = New "Frame", "Settings" - Position: UDim2.new 0.5, -250, 0.5, -200 - Size: UDim2.new 0, 500, 0, 400 - BackgroundTransparency: 1 - Active: true - Parent: shield - - settingsFrame = New "Frame", "ReportAbuseStyle" - Size: UDim2.new 1, 0, 1, 0 - Style: Enum.FrameStyle.RobloxRound - Active: true - ZIndex: baseZIndex + 1 - Parent: frame - - * New "TextLabel", "Title" - Text: "Report Abuse" - TextColor3: Color3I 221, 221, 221 - Position: UDim2.new 0.5, 0, 0, 30 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - ZIndex: baseZIndex + 2 - - * New "TextLabel", "Description" - Text: "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action." - TextColor3: Color3I 221, 221, 221 - Position: UDim2.new 0, 0, 0, 55 - Size: UDim2.new 1, 0, 0, 40 - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextWrap: true - ZIndex: baseZIndex + 2 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - - * New "TextLabel", "PlayerLabel" - Text: "Which player?" - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 100 - Size: UDim2.new 0.4, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - ZIndex: baseZIndex + 2 - - * New "TextLabel", "AbuseLabel" - Text: "Type of Abuse:" - Font: Enum.Font.Arial - BackgroundTransparency: 1 - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 140 - Size: UDim2.new 0.4, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - ZIndex: baseZIndex + 2 - - local abusingPlayer - local abuse - local submitReportButton - - local updatePlayerSelection - createPlayersDropDown = -> - players = game\GetService "Players" - playerNames = {} - nameToPlayer = {} - children = players\GetChildren! - pos = 1 - if children - for _, player in ipairs children - if player\IsA"Player" and player ~= localPlayer - playerNames[pos] = player.Name - nameToPlayer[player.Name] = player - pos += 1 - - - local playerDropDown - playerDropDown, updatePlayerSelection = RbxGui.CreateDropDownMenu playerNames, (playerName) -> - abusingPlayer = nameToPlayer[playerName] - if abuse and abusingPlayer - submitReportButton.Active = true - - - playerDropDown.Name = "PlayersComboBox" - playerDropDown.ZIndex = baseZIndex + 2 - playerDropDown.Position = UDim2.new 0.425, 0, 0, 102 - playerDropDown.Size = UDim2.new 0.55, 0, 0, 32 - playerDropDown - - abuses = - * "Swearing" - * "Bullying" - * "Scamming" - * "Dating" - * "Cheating/Exploiting" - * "Personal Questions" - * "Offsite Links" - * "Bad Model or Script" - * "Bad Username" - - abuseDropDown, updateAbuseSelection = RbxGui.CreateDropDownMenu(abuses, (abuseText) -> - abuse = abuseText - if abuse and abusingPlayer - submitReportButton.Active = true - - true) - abuseDropDown.Name = "AbuseComboBox" - abuseDropDown.ZIndex = baseZIndex + 2 - abuseDropDown.Position = UDim2.new 0.425, 0, 0, 142 - abuseDropDown.Size = UDim2.new 0.55, 0, 0, 32 - abuseDropDown.Parent = settingsFrame - - New "TextLabel", "ShortDescriptionLabel" - Text: "Short Description: (optional)" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 180 - Size: UDim2.new 0.95, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - BackgroundTransparency: 1 - ZIndex: baseZIndex + 2 - Parent: settingsFrame - - shortDescriptionWrapper = New "Frame", "ShortDescriptionWrapper" - Position: UDim2.new 0.025, 0, 0, 220 - Size: UDim2.new 0.95, 0, 1, -310 - BackgroundColor3: Color3I 0, 0, 0 - BorderSizePixel: 0 - ZIndex: baseZIndex + 2 - Parent: settingsFrame - - shortDescriptionBox = New "TextBox", "TextBox" - Text: "" - ClearTextOnFocus: false - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, 3, 0, 3 - Size: UDim2.new 1, -6, 1, -6 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - TextWrap: true - BackgroundColor3: Color3I 0, 0, 0 - BorderSizePixel: 0 - ZIndex: baseZIndex + 2 - Parent: shortDescriptionWrapper - - submitReportButton = New "TextButton", "SubmitReportBtn" - Active: false - Modal: true - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.1, 0, 1, -80 - Size: UDim2.new 0.35, 0, 0, 50 - AutoButtonColor: true - Style: Enum.ButtonStyle.RobloxButtonDefault - Text: "Submit Report" - TextColor3: Color3I 255, 255, 255 - ZIndex: baseZIndex + 2 - Parent: settingsFrame - - submitReportButton.MouseButton1Click\connect -> - if submitReportButton.Active - if abuse and abusingPlayer - frame.Visible = false - game.Players\ReportAbuse abusingPlayer, abuse, shortDescriptionBox.Text - if abuse == "Cheating/Exploiting" - recordedMessageBox.Visible = true - elseif abuse == "Bullying" or abuse == "Swearing" - calmingMessageBox.Visible = true - else - normalMessageBox.Visible = true - - else - closeAndResetDialog! - - cancelButton = New "TextButton", "CancelBtn" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.55, 0, 1, -80 - Size: UDim2.new 0.35, 0, 0, 50 - AutoButtonColor: true - Style: Enum.ButtonStyle.RobloxButtonDefault - Text: "Cancel" - TextColor3: Color3I 255, 255, 255 - ZIndex: baseZIndex + 2 - Parent: settingsFrame - - closeAndResetDialog = -> - --Delete old player combo box - oldComboBox = settingsFrame\FindFirstChild "PlayersComboBox" - if oldComboBox - oldComboBox.Parent = nil - - - abusingPlayer = nil - updatePlayerSelection nil - abuse = nil - updateAbuseSelection nil - submitReportButton.Active = false - shortDescriptionBox.Text = "" - frame.Visible = true - calmingMessageBox.Visible = false - recordedMessageBox.Visible = false - normalMessageBox.Visible = false - shield.Visible = false - reportAbuseButton.Active = true - game.GuiService\RemoveCenterDialog shield - - - cancelButton.MouseButton1Click\connect closeAndResetDialog - - reportAbuseButton.MouseButton1Click\connect -> - createPlayersDropDown!.Parent = settingsFrame - table.insert centerDialogs, shield - game.GuiService\AddCenterDialog( - shield, - Enum.CenterDialogType.ModalDialog, - --ShowFunction - -> - reportAbuseButton.Active = false - shield.Visible = true - mainShield.Visible = false - --HideFunction - -> - reportAbuseButton.Active = true - shield.Visible = false - ) - - - robloxLock shield - shield - - -- createChatBar = -> - -- --Only show a chat bar if we are a NetworkClient - -- waitForChild game, "NetworkClient" - - -- waitForChild game, "Players" - -- waitForProperty game.Players, "LocalPlayer" - - -- chatBar = New "Frame", "ChatBar" - -- Size: UDim2.new 1, 0, 0, 22 - -- Position: UDim2.new 0, 0, 1, 0 - -- BackgroundColor3: Color3.new 0, 0, 0 - -- BorderSizePixel: 0 - - -- chatBox = New "TextBox" - -- Text: "" - -- Visible: false - -- Size: UDim2.new 1, -4, 1, 0 - -- Position: UDim2.new 0, 2, 0, 0 - -- TextXAlignment: Enum.TextXAlignment.Left - -- Font: Enum.Font.Arial - -- ClearTextOnFocus: false - -- FontSize: Enum.FontSize.Size14 - -- TextColor3: Color3.new 1, 1, 1 - -- BackgroundTransparency: 1 - -- -- Parent: chatBar - - -- chatButton = New "TextButton" - -- Size: UDim2.new 1, -4, 1, 0 - -- Position: UDim2.new 0, 2, 0, 0 - -- AutoButtonColor: false - -- Text: 'To chat click here or press "/" key' - -- TextXAlignment: Enum.TextXAlignment.Left - -- Font: Enum.Font.Arial - -- FontSize: Enum.FontSize.Size14 - -- TextColor3: Color3.new 1, 1, 1 - -- BackgroundTransparency: 1 - -- -- Parent: chatBar - - -- activateChat = -> - -- return if chatBox.Visible - -- chatButton.Visible = false - -- chatBox.Text = "" - -- chatBox.Visible = true - -- chatBox\CaptureFocus! - - -- chatButton.MouseButton1Click\connect activateChat - - -- -- hotKeyEnabled = true - -- toggleHotKey = (_) -> - -- -- hotKeyEnabled = value - - -- -- guiService = game\GetService "GuiService" - -- --[[newChatMode = ]]try - -- --guiService\AddSpecialKey Enum.SpecialKey.ChatHotkey - -- --guiService.SpecialKeyPressed\connect (key) -> if key == Enum.SpecialKey.ChatHotkey and hotKeyEnabled then activateChat! - - -- -- if not newChatMode - -- --guiService\AddKey "/" - -- --guiService.KeyPressed\connect (key) -> if key == "/" and hotKeyEnabled then activateChat! - - -- chatBox.FocusLost\connect (enterPressed) -> - -- if enterPressed - -- if chatBox.Text ~= "" - -- str = chatBox.Text - -- if string.sub(str, 1, 1) == "%" - -- game.Players\TeamChat string.sub str, 2 - -- else - -- game.Players\Chat str - -- chatBox.Text = "" - -- chatBox.Visible = false - -- chatButton.Visible = true - -- robloxLock chatBar - -- chatBar, toggleHotKey - - --Spawn a thread for the Save dialogs - isSaveDialogSupported = try - -- var = game.LocalSaveEnabled - - if isSaveDialogSupported - delay 0, -> - saveDialogs = createSaveDialogs! - saveDialogs.Parent = gui - - game.RequestShutdown = -> - table.insert centerDialogs, saveDialogs - game.GuiService\AddCenterDialog( - saveDialogs, - Enum.CenterDialogType.QuitDialog, - --ShowFunction - -> saveDialogs.Visible = true - --HideFunction - -> saveDialogs.Visible = false - ) - - true - - - --Spawn a thread for the Report Abuse dialogs - delay 0, -> - createReportAbuseDialog!.Parent = gui - waitForChild gui, "UserSettingsShield" - waitForChild gui.UserSettingsShield, "Settings" - waitForChild gui.UserSettingsShield.Settings, "SettingsStyle" - waitForChild gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu" - waitForChild gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, "ReportAbuseButton" - gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton.Active = true - - --Spawn a thread for Chat Bar - --[[success, luaChat = ]] - try - game.GuiService.UseLuaChat - - -- if success and luaChat - - --[[delay 0, -> - waitForChild game, "Players" - waitForProperty game.Players, "LocalPlayer" - - advancedChatBarSupported = game.Players.LocalPlayer.ChatMode - chatBar, toggleHotKey = createChatBar! - - [if advancedChatBarSupported - toggleChatBar = (chatMode) -> - if chatMode == Enum.ChatMode.Menu - chatBar.Parent = nil - game.GuiService\SetGlobalSizeOffsetPixel 0,0 - toggleHotKey false - elseif chatMode == Enum.ChatMode.TextAndMenu - --chatBar.Parent = gui - --game.GuiService\SetGlobalSizeOffsetPixel 0,-22 - toggleHotKey true - - - game.Players.LocalPlayer.Changed\connect( - function prop - if prop == "ChatMode" - toggleChatBar game.Players.LocalPlayer.ChatMode - - - toggleChatBar game.Players.LocalPlayer.ChatMode - else - --chatBar.Parent = gui - --game.GuiService\SetGlobalSizeOffsetPixel 0,-22 - ]] - - BurningManPlaceID = 41324860 - -- TODO: remove click to walk completely if testing shows we don't need it - -- Removes click to walk option from Burning Man - delay 0, -> - waitForChild game, "NetworkClient" - waitForChild game, "Players" - waitForProperty game.Players, "LocalPlayer" - waitForProperty game.Players.LocalPlayer, "Character" - waitForChild game.Players.LocalPlayer.Character, "Humanoid" - waitForProperty game, "PlaceId" - - if game.PlaceId == BurningManPlaceID - game.Players.LocalPlayer.Character.Humanoid\SetClickToWalkEnabled false - game.Players.LocalPlayer.CharacterAdded\connect (character) -> - waitForChild character, "Humanoid" - character.Humanoid\SetClickToWalkEnabled false diff --git a/yue/48488235.yue b/yue/48488235.yue deleted file mode 100644 index bc2b3df..0000000 --- a/yue/48488235.yue +++ /dev/null @@ -1,3083 +0,0 @@ -import "macros" as { $ } -$load $FILE - ---new playerlist by Zach Lindblad (fusroblox) ---contact him for any revisions/issues --------------------- --- Super Util --------------------- - -assetid = "http://banland.xyz/asset/?id=" - ---[[ ADMINS = - aceswayuphigh: 1 - adamintygum: 1 - afackler11: 1 - aleverns: 1 - aquabot8: 1 - arbolito: 1 - argforpirates: 1 - argonpirate: 1 - asmohdian: 1 - bellavour: 1 - blockhaak: 1 - brighteyes: 1 - briguy9876: 1 - builderman: 1 - cdakkar: 1 - chiefjustus: 1 - chro: 1 - cmed: 1 - coatp0cketninja: 1 - codewriter: 1 - commandercrow: 1 - corgiparade: 1 - dapperbuffalo: 1 - dbapostle: 1 - deeana00: 1 - doughtless: 1 - dunbar1138: 1 - echodown: 1 - ffjosh: 1 - foyle: 1 - gemlocker: 1 - goddessnoob: 1 - gongfutiger: 1 - gordonrox24: 1 - gorroth: 1 - grossinger: 1 - groundcontroll2: 1 - hawkeyebandit: 1 - hawkington: 1 - ibanez2189: 1 - iltalumi: 1 - inventx: 1 - jackssmirkingrevenge: 1 - jeditkacheff: assetid .. "134032333" - kbux: 1 - keith: 1 - limon: 1 - loopylens: 1 - lordrugdumph: 1 - majortom4321: 1 - malcomso: 1 - maxvee: 1 - midwinterfires: 1 - mistersquirrel: 1 - morganic: 1 - motornerve: 1 - mrdoombringer: 1 - mse6: 1 - newtrat: 1 - niquemonster: 1 - nobledragon: 1 - noob007: 1 - nrawat1: 1 - olive71: 1 - onlytwentycharacters: 1 - orcasparkles: 1 - ostrichsized: 1 - phaedre: 1 - phil: 1 - pulmoesflor: 1 - raeglyn: 1 - rbadam: 1 - reesemcblox: 1 - robliu: 1 - roblowilson: 1 - robloxsai: 1 - roboyz: 1 - saurauss: 1 - screenme: 1 - scubasomething: 1 - seanthornton: 1 - shedletsky: assetid .. "105897927" - sickenedmonkey: 1 - slingshotjunkie: 1 - smeaferblox: 1 - soggoth: 1 - solarcrane: 1 - sooraya: 1 - sorcus: assetid .. "113059239" - squidcod: 1 - stickmasterluke: 1 - stuball: 1 - tabemono: 1 - tarabyte: 1 - thelorekt: 1 - thorasaur: 1 - timobius: 1 - tobotrobot: 1 - tone: 1 - totallynothere: 1 - totbl: 1 - twberg: 1 - vaiobot: 1 - varia: 1 - vladthefirst: 1 - wonderboy76: 1 - xerolayne: 1 - yesth: 1 - yumyumcheerios: 1 - zeuxcg: 1 - zodiaczak: 1 - ['erik.cassel']: 1 - ['david.baszucki']: 1 - ['matt dusek']: 1 ---]] - -ADMINS = - taskmanager: 1 - Heliodex: 1 - multako: assetid .. "6923328292" - mercury: 1 - pizzaboxer: assetid .. "6917566633" - -Images = - bottomDark: "94691904" - bottomLight: "94691940" - midDark: "94691980" - midLight: "94692025" - LargeDark: "96098866" - LargeLight: "96098920" - LargeHeader: "96097470" - NormalHeader: "94692054" - LargeBottom: "96397271" - NormalBottom: "94754966" - DarkBluePopupMid: "97114905" - LightBluePopupMid: "97114905" - DarkPopupMid: "97112126" - LightPopupMid: "97109338" - DarkBluePopupTop: "97114838" - DarkBluePopupBottom: "97114758" - DarkPopupBottom: "100869219" - LightPopupBottom: "97109175" - -BASE_TWEEN = 0.25 -MOUSE_DRAG_DISTANCE = 15 - -local MakeBackgroundGuiObj, Color3I, getMembershipTypeIcon, \ - getFriendStatusIcon, MakePopupButton, WaitForChild, debugprint - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - ---[[ - makes a full sized background for a guiobject - @Args: - imgName asset name of image to fill background - @Return: background gui object ---]] -MakeBackgroundGuiObj = (imgName) -> - New "ImageLabel", "Background" - BackgroundTransparency: 1 - Image: imgName - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - ---[[ turns 255 integer color value to a color3 --]] -Color3I = (r, g, b) -> - Color3.new r / 255, g / 255, b / 255 - - ---[[ - Gets correct icon for builder's club status to display by name - @Args: - membershipType Enum of membership status - @Return: string of image asset ---]] -getMembershipTypeIcon = (membershipType, playerName) -> - if ADMINS[string.lower playerName]? - if ADMINS[string.lower playerName] == 1 - assetid .. "6923330951" - else - ADMINS[string.lower playerName] - - elseif membershipType == Enum.MembershipType.None - "" - elseif membershipType == Enum.MembershipType.BuildersClub - "rbxasset://textures/ui/TinyBcIcon.png" - elseif membershipType == Enum.MembershipType.TurboBuildersClub - "rbxasset://textures/ui/TinyTbcIcon.png" - elseif membershipType == Enum.MembershipType.OutrageousBuildersClub - "rbxasset://textures/ui/TinyObcIcon.png" - else - error "Unknown membershipType #{membershipType}" - - -getFriendStatusIcon = (friendStatus) -> - if friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend - "" - elseif friendStatus == Enum.FriendStatus.Friend - assetid .. "99749771" - elseif friendStatus == Enum.FriendStatus.FriendRequestSent - assetid .. "99776888" - elseif friendStatus == Enum.FriendStatus.FriendRequestReceived - assetid .. "99776838" - else - error "Unknown FriendStatus: #{friendStatus}" - - ---[[ - Utility function to create buttons for the popup menus - @Args: - nparent what to parent this button to - ntext text to put on this button - index number index of this entry in menu - last is this the last element of the popup menu - @Return: a popup menu button ---]] -MakePopupButton = (nparent, ntext, index, last) -> - tobj = New "ImageButton", "ReportButton" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 1 * index, 0 - Size: UDim2.new 1, 0, 1, 0 - ZIndex: 7 - Parent: nparent - - * New "TextLabel", "ButtonText" - BackgroundTransparency: 1 - Position: UDim2.new 0.07, 0, 0.07, 0 - Size: UDim2.new 0.86, 0, 0.86, 0 - Font: "ArialBold" - Text: ntext - FontSize: "Size14" - TextScaled: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeTransparency: 1 - ZIndex: 7 - - if index == 0 - tobj.Image = assetid .. "97108784" - elseif last - if index % 2 == 1 - tobj.Image = assetid .. Images["LightPopupBottom"] - else - tobj.Image = assetid .. Images["DarkPopupBottom"] - - else - if index % 2 == 1 - tobj.Image = assetid .. "97112126" - else - tobj.Image = assetid .. "97109338" - - return tobj - ---[[ - obligatory wait for child function - @Args: - parent Parent object to look for child in - child name of child object to look for - @Return: object waited for ---]] -WaitForChild = (parent, child) -> - while not parent\FindFirstChild child - wait! - debugprint " child " .. parent.Name .. " waiting for " .. child - - return parent[child] - - ---------------------------- --- Workspace Objects ---------------------------- - --- might want to move all this to an init function, wait for localplayer elsewhere -Players = game\GetService "Players" --- make sure this doesn't run on the server (it will if you dont do this) -while not Players.LocalPlayer - Players.Changed\wait! - - -LocalPlayer = Players.LocalPlayer -Mouse = LocalPlayer\GetMouse! - -ScreenGui = New "Frame", "PlayerListScreen" - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - Parent: script.Parent - -MainFrame = New "Frame", "LeaderBoardFrame" - Position: UDim2.new 1, -150, 0.005, 0 - Size: UDim2.new 0, 150, 0, 800 - BackgroundTransparency: 1 - Parent: ScreenGui - - ---frame used for expanding leaderstats when frame is 'focused' -FocusFrame = New "Frame", "FocusFrame" - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0, 100 - BackgroundTransparency: 1 - Active: true - Parent: MainFrame - - --- HEADER -HeaderFrame = New "Frame", "Header" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0.07, 0 - Parent: MainFrame - - * MakeBackgroundGuiObj assetid .. "94692054" - -HeaderFrameHeight = HeaderFrame.Size.Y.Scale -MaximizeButton = New "ImageButton", "MaximizeButton" - Active: true - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - Parent: HeaderFrame - -HeaderName = New "TextLabel", "PlayerName" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.01, 0 - Size: UDim2.new 0.98, 0, 0.38, 0 - Parent: HeaderFrame - Font: "ArialBold" - Text: LocalPlayer.Name - FontSize: "Size24" - --TextScaled: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeColor3: Color3.new 0, 0, 0 - TextStrokeTransparency: 0 - TextXAlignment: "Right" - TextYAlignment: "Center" - -HeaderScore = New "TextLabel", "PlayerScore" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.4, 0 - Size: UDim2.new 0.98, 0, 0, 30 - Parent: HeaderFrame - Font: "ArialBold" - Text: "" - FontSize: "Size24" - TextYAlignment: "Top" - -- TextScaled: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeTransparency: 1 - TextXAlignment: "Right" - --- BOTTOM ---used for shifting bottom frame for mouse over effects -BottomShiftFrame = New "Frame", "BottomShiftFrame" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, HeaderFrameHeight, 0 - Size: UDim2.new 1, 0, 1, 0 - Parent: MainFrame - -BottomFrame = New "Frame", "Bottom" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.07, 0 - Size: UDim2.new 1, 0, 0.03, 0 - Parent: BottomShiftFrame - - * MakeBackgroundGuiObj assetid .. "94754966" - -ExtendButton = New "ImageButton", "bigbutton" - Active: true - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1.5, 0 - ZIndex: 3 - Parent: BottomFrame - -ExtendTab = New "ImageButton", "extendTab" - Active: true - BackgroundTransparency: 1 - Image: assetid .. "94692731" - Position: UDim2.new 0.608, 0, 0.3, 0 - Size: UDim2.new 0.3, 0, 0.7, 0 - Parent: BottomFrame - -TopClipFrame = New "Frame", "ListFrame" - BackgroundTransparency: 1 - Position: UDim2.new -1, 0, 0.07, 0 - Size: UDim2.new 2, 0, 1, 0 - Parent: MainFrame - ClipsDescendants: true - -BottomClipFrame = New "Frame", "BottomFrame" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, -0.8, 0 - Size: UDim2.new 1, 0, 1, 0 - Parent: TopClipFrame - ClipsDescendants: true - -ScrollBarFrame = New "Frame", "ScrollBarFrame" - BackgroundTransparency: 1 - Position: UDim2.new 0.987, 0, 0.8, 0 - Size: UDim2.new 0.01, 0, 0.2, 0 - Parent: BottomClipFrame - -ScrollBar = New "Frame", "ScrollBar" - BackgroundTransparency: 0 - BackgroundColor3: Color3.new 0.2, 0.2, 0.2 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0.5, 0 - ZIndex: 5 - Parent: ScrollBarFrame - -ListFrame = New "Frame", "SubFrame" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.8, 0 - Size: UDim2.new 1, 0, 1, 0 - Parent: BottomClipFrame - -PopUpClipFrame = New "Frame", "PopUpFrame" - BackgroundTransparency: 1 - SizeConstraint: "RelativeXX" - Position: MainFrame.Position + UDim2.new 0, -150, 0, 0 - Size: UDim2.new 0, 150, 0, 800 - Parent: MainFrame - ClipsDescendants: true - ZIndex: 7 - -PopUpPanel = nil -PopUpPanelTemplate = New "Frame", "Panel" - BackgroundTransparency: 1 - Position: UDim2.new 1, 0, 0, 0 - Size: UDim2.new 1, 0, 0.032, 0 - Parent: PopUpClipFrame - - -StatTitles = New "Frame", "StatTitles" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 1, -10 - Size: UDim2.new 1, 0, 0, 0 - Parent: HeaderFrame - - -IsMinimized = Instance.new "BoolValue" -IsMaximized = Instance.new "BoolValue" -IsTabified = Instance.new "BoolValue" -AreNamesExpanded = Instance.new "BoolValue" - -MiddleTemplate = New "Frame", "MidTemplate" - BackgroundTransparency: 1 - Position: UDim2.new 100, 0, 0.07, 0 - Size: UDim2.new 0.5, 0, 0.025, 0, --UDim2.new 1, 0, 0.03, 0 - - * New "ImageLabel", "BCLabel" - Active: true - BackgroundTransparency: 1 - Position: UDim2.new 0.005, 5, 0.20, 0 - Size: UDim2.new 0, 16, 0, 16 - SizeConstraint: "RelativeYY" - Image: "" - ZIndex: 3 - - * New "ImageLabel", "FriendLabel" - Active: true - BackgroundTransparency: 1 - Position: UDim2.new 0.005, 5, 0.15, 0 - Size: UDim2.new 0, 16, 0, 16 - SizeConstraint: "RelativeYY" - Image: "" - ZIndex: 3 - - * New "ImageButton", "ClickListener" - Active: true - BackgroundTransparency: 1 - Position: UDim2.new 0.005, 1, 0, 0 - Size: UDim2.new 0.96, 0, 1, 0 - ZIndex: 3 - - * New "Frame", "TitleFrame" - BackgroundTransparency: 1 - Position: UDim2.new 0.01, 0, 0, 0 - Size: UDim2.new 0, 140, 1, 0 - ClipsDescendants: true - - * New "TextLabel", "Title" - BackgroundTransparency: 1 - Position: UDim2.new 0, 5, 0, 0 - Size: UDim2.new 100, 0, 1, 0 - Font: "Arial" - FontSize: "Size14" - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: "Left" - TextYAlignment: "Center" - ZIndex: 3 - - - * New "TextLabel", "PlayerScore" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - Font: "ArialBold" - Text: "" - FontSize: "Size14" - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: "Right" - TextYAlignment: "Center" - ZIndex: 3 - - --Create'IntValue'{Name = 'ID'}, - --Create'ObjectValue'{Name = 'Player'}, - --Create'IntValue'{Name = 'Score'}, - ZIndex: 3 - -MiddleBGTemplate = New "Frame", "MidBGTemplate" - BackgroundTransparency: 1 - Position: UDim2.new 100, 0, 0.07, 0 - Size: UDim2.new 0.5, 0, 0.025, 0 --UDim2.new 1, 0, 0.03, 0 - - * MakeBackgroundGuiObj assetid .. "94692025" - - --- REPORT ABUSE OBJECTS - -ReportAbuseShield = New "TextButton", "ReportAbuseShield" - Text: "" - AutoButtonColor: false - Active: true - Visible: true - Size: UDim2.new 1, 0, 1, 0 - BackgroundColor3: Color3I 51, 51, 51 - BorderColor3: Color3I 27, 42, 53 - BackgroundTransparency: 1 - -ReportAbuseFrame = New "Frame", "Settings" - Position: UDim2.new 0.5, -250, 0.5, -200 - Size: UDim2.new 0, 500, 0, 400 - BackgroundTransparency: 1 - Active: true - Parent: ReportAbuseShield - -AbuseSettingsFrame = New "Frame", "ReportAbuseStyle" - Size: UDim2.new 1, 0, 1, 0 - Active: true - BackgroundTransparency: 1 - - * MakeBackgroundGuiObj assetid .. "96488767" -- 96480351" - - * New "TextLabel", "Title" - Text: "Report Abuse" - TextColor3: Color3I 221, 221, 221 - Position: UDim2.new 0.5, 0, 0, 30 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - - * New "TextLabel", "Description" - Text: "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action." - TextColor3: Color3I 221, 221, 221 - Position: UDim2.new 0.01, 0, 0, 55 - Size: UDim2.new 0.99, 0, 0, 40 - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - TextWrap: true - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - - * New "TextLabel", "AbuseLabel" - Text: "What did they do?" - Font: Enum.Font.Arial - BackgroundTransparency: 1 - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 140 - Size: UDim2.new 0.4, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - - * New "TextLabel", "ShortDescriptionLabel" - Text: "Short Description: (optional)" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 180 - Size: UDim2.new 0.95, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - BackgroundTransparency: 1 - - * New "TextLabel", "ReportingPlayerLabel" - Text: "Reporting Player" - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 100 - Size: UDim2.new 0.95, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - - - Parent: ReportAbuseFrame - -AbusePlayerLabel = New "TextLabel", "PlayerLabel" - Text: "" - BackgroundTransparency: 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0.025, 0, 0, 100 - Size: UDim2.new 0.95, 0, 0, 36 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Right - Parent: AbuseSettingsFrame - - -SubmitReportButton = New "ImageButton", "SubmitReportBtn" - Active: false - BackgroundTransparency: 1 - Position: UDim2.new 0.5, -200, 1, -80 - Size: UDim2.new 0, 150, 0, 50 - AutoButtonColor: false - Image: assetid .. "96502438" -- 96501119" - Parent: AbuseSettingsFrame - - -CancelReportButton = New "ImageButton", "CancelBtn" - BackgroundTransparency: 1 - Position: UDim2.new 0.5, 50, 1, -80 - Size: UDim2.new 0, 150, 0, 50 - AutoButtonColor: true - Image: assetid .. "96500683" - Parent: AbuseSettingsFrame - - -AbuseDescriptionWrapper = New "Frame", "AbuseDescriptionWrapper" - Position: UDim2.new 0.025, 0, 0, 220 - Size: UDim2.new 0.95, 0, 1, -310 - BackgroundColor3: Color3I 0, 0, 0 - BorderSizePixel: 0 - Parent: AbuseSettingsFrame - - -local AbuseDescriptionBox - -OriginalAbuseDescriptionBox = New "TextBox" - Text: "" - ClearTextOnFocus: false - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, 3, 0, 3 - Size: UDim2.new 1, -6, 1, -6 - TextColor3: Color3I 255, 255, 255 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - TextWrap: true - BackgroundColor3: Color3I 0, 0, 0 - BorderSizePixel: 0 - - -CalmingAbuseBox = New "Frame", "AbuseFeedbackBox" - BackgroundTransparency: 1 - Position: UDim2.new 0.25, 0, 0.3, 0 - Size: UDim2.new 0.5, 0, 0.37, 0 - - * MakeBackgroundGuiObj assetid .. "96506233" - - * New "TextLabel", "Header" - Position: UDim2.new 0, 10, 0.05, 0 - Size: UDim2.new 1, -30, 0.15, 0 - TextScaled: true - BackgroundTransparency: 1 - TextXAlignment: Enum.TextXAlignment.Center - TextYAlignment: Enum.TextYAlignment.Top - Text: "Thanks for your report!" - TextColor3: Color3.new 1, 1, 1 - FontSize: Enum.FontSize.Size48 - Font: "ArialBold" - - * New "TextLabel", "content" - Position: UDim2.new 0, 10, 0.20, 0 - Size: UDim2.new 1, -30, 0.40, 0 - TextScaled: true - BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - Text: "Our moderators will review the chat logs and determine what happened. The other user is probably just trying to make you mad.\n\nIf anyone used swear words, inappropriate language, or threatened you in real life, please report them for Bad Words or Threats" - TextWrapped: true - TextYAlignment: Enum.TextYAlignment.Top - FontSize: Enum.FontSize.Size24 - Font: "Arial" - - * New "ImageButton", "OkButton" - BackgroundTransparency: 1 - Position: UDim2.new 0.5, -75, 1, -80 - Size: UDim2.new 0, 150, 0, 50 - AutoButtonColor: true - Image: assetid .. "96507959" - -NormalAbuseBox = New "Frame", "AbuseFeedbackBox" - BackgroundTransparency: 1 - Position: UDim2.new 0.25, 0, 0.3, 0 - Size: UDim2.new 0.5, 0, 0.37, 0 - - * MakeBackgroundGuiObj assetid .. "96506233" - - * New "TextLabel", "Header" - Position: UDim2.new 0, 10, 0.05, 0 - Size: UDim2.new 1, -30, 0.15, 0 - TextScaled: true - BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: Enum.TextXAlignment.Center - TextYAlignment: Enum.TextYAlignment.Top - Text: "Thanks for your report!" - FontSize: Enum.FontSize.Size48 - Font: "ArialBold" - - * New "TextLabel", "content" - Position: UDim2.new 0, 10, 0.20, 0 - Size: UDim2.new 1, -30, 0.15, 0 - TextScaled: true - BackgroundTransparency: 1 - TextColor3: Color3.new 1, 1, 1 - Text: "Our moderators will review the chat logs and determine what happened." - TextWrapped: true - TextYAlignment: Enum.TextYAlignment.Top - FontSize: Enum.FontSize.Size24 - Font: "Arial" - - * New "ImageButton", "OkButton" - BackgroundTransparency: 1 - Position: UDim2.new 0.5, -75, 1, -80 - Size: UDim2.new 0, 150, 0, 50 - AutoButtonColor: true - Image: assetid .. "96507959" - -BigButton = New "ImageButton" - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - ZIndex: 8 - Visible: false - --Active: false - Parent: ScreenGui - -debugFrame = New "Frame", "debugframe" - --Position: UDim2.new(0, 0, 0, 0) - --Size: UDim2.new(0, 150, 0, 800)--0.99000001 - --BackgroundTransparency: 1 - BackgroundTransparency: 1 - Position: UDim2.new 0.25, 0, 0.3, 0 - Size: UDim2.new 0.5, 0, 0.37, 0 - - * MakeBackgroundGuiObj assetid .. "96506233" - -debugplayers = New "TextLabel" - BackgroundTransparency: 0.8 - Position: UDim2.new 0, 0, 0.01, 0 - Size: UDim2.new 1, 0, 0.5, 0 - Parent: debugFrame - Font: "ArialBold" - Text: "--" - FontSize: "Size14" - TextWrapped: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeColor3: Color3.new 0, 0, 0 - TextStrokeTransparency: 0 - TextXAlignment: "Right" - TextYAlignment: "Center" - -debugOutput = New "TextLabel" - BackgroundTransparency: 0.8 - Position: UDim2.new 0, 0, 0.5, 0 - Size: UDim2.new 1, 0, 0.5, 0 - Parent: debugFrame - Font: "ArialBold" - Text: "--" - FontSize: "Size14" - TextWrapped: true - TextColor3: Color3.new 1, 1, 1 - TextStrokeColor3: Color3.new 0, 0, 0 - TextStrokeTransparency: 0 - TextXAlignment: "Right" - TextYAlignment: "Center" - ---[[ - simple function to toggle the display of debug output ---]] -DebugPrintEnabled = true -debugprint = (str) -> - --print str - if DebugPrintEnabled - debugOutput.Text = str - -------------------------- --- Script objects -------------------------- -RbxGui = assert LoadLibrary "RbxGui" - --- number of entries to show if you click minimize -DefaultEntriesOnScreen = 8 - -for _, i in pairs Images - Game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=#{i}" - - --- ordered array of 'score data', each entry has: --- Name String --- Priority number --- IsPrimary (bool, should it be shown in upper right) --- MaxLength (integer, of the length of the longest element for this column) -ScoreNames = {} --- prevents flipping in playerlist panels -AddId = 0 --- intermediate table form of all player entries in format of: --- Frame --- Player --- Score --- ID --- MyTeam (team ENRTY(not actual team) I am currently on) -PlayerFrames = {} --- intermediate ordered frame array, composed of Entrys of --- Frame --- MyTeam (my team object) --- MyPlayers ( an ordered array of all player frames in team ) --- AutoHide (bool saying whether it should be hidden) --- IsHidden (bool) --- ID (int to prevent flipping out of leaderboard, fun times) -TeamFrames = {} --- one special entry from teamFrames, for unaffiliated players, only shown if players non - empty -local NeutralTeam - --- final 'to be displayed' list of frames -MiddleFrames = {} -MiddleFrameBackgrounds = {} --- time of last click -LastClick = 0 -ButtonCooldown = 0.25 - -OnIos = false -try - OnIos = Game\GetService"UserInputService".TouchEnabled - - --- you get 200 of x screen space per stat added, start width 16% -BaseScreenXSize = 150 -SpacingPerStat = 10 --spacing between stats - -MaximizedBounds = UDim2.new 0.5, 0, 1, 0 -MaximizedPosition = UDim2.new 0.25, 0, 0.1, 0 -NormalBounds = UDim2.new 0, BaseScreenXSize, 0, 800 -NormalPosition = UDim2.new 1, -BaseScreenXSize, 0.005, 0 - ---free space to give last stat on the right -RightEdgeSpace = -0.04 - --- where the scroll par currently is positioned - -DefaultBottomClipPos = BottomClipFrame.Position.Y.Scale - -local SelectedPlayerEntry -local SelectedPlayer - --- locks(semaphores) for stopping race conditions -AddingFrameLock = \ -AddingStatLock = \ -BaseUpdateLock = \ -WaitForClickLock = \ -InPopupWaitForClick = \ -PlayerChangedLock = \ -NeutralTeamLock = false - -ScrollWheelConnections = {} - -DefaultListSize = 8 -if not OnIos - DefaultListSize = 12 - -DidMinimizeDrag = false - ---local PlaceCreatorId=game.CreatorId - --- report abuse objects -local AbuseName -Abuses = - * "Bad Words or Threats" - * "Bad Username" - * "Talking about Dating" - * "Account Trading or Sharing" - * "Asking Personal Questions" - * "Rude or Mean Behavior" - * "False Reporting Me" - -local UpdateAbuseFunction -local AbuseDropDown - -PrivilegeLevel = - Owner: 255 - Admin: 240 - Member: 128 - Visitor: 10 - Banned: 0 - -IsPersonalServer = not not game.Workspace\FindFirstChild "PSVariable" - -game.Workspace.ChildAdded\connect (nchild) -> - if nchild.Name == "PSVariable" and nchild\IsA "BoolValue" - IsPersonalServer = true - --- let's local ALL (most of) the functions -local HighlightMyRank, CloseAbuseDialog, Tabify, UnTabify, BaseUpdate, \ - UpdateHeaderNameSize, UpdateMaximize, UpdateMinimize, UpdateStatNames, \ - UpdateScrollPosition, UpdateScrollBarSize, AddPlayerToTeam, \ - AddNeutralTeam, PlayerChanged, RemovePlayerFromTeam, RemoveNeutralTeam, \ - RemoveTeamFrame, debugPlayerAdd, --[[]] AreAllEntriesOnScreen, GetMaxScroll, \ - GetMinScroll, AbsoluteToPercent, TweenProperty, WaitForClick, \ - SetPrivilegeRank, OnPrivilegeLevelSelect, OnSubmitAbuse, ClosePopUpPanel, \ - OpenAbuseDialog, InitReportAbuse, GetFriendStatus, OnFriendButtonSelect, \ - OnFriendRefuseButtonSelect, PlayerSortFunction, BlowThisPopsicleStand, \ - StatSort, StatChanged, CreateStatTitle, StatAdded, MakeScoreEntry, \ - RecreateScoreColumns, ToggleMinimize, ToggleMaximize, \ - ActivatePlayerEntryPanel, StartDrag, StartMinimizeDrag, AddMiddleBGFrame, \ - RemoveMiddleBGFrame, ChangeHeaderName, LeaderstatsAdded, \ - LeaderstatsRemoved, OnPlayerEntrySelect, PlayerListModeUpdate, \ - InsertPlayerFrame, RemovePlayerFrame, UnrollTeams, TeamSortFunc, \ - AddTeamScores, SortTeams, TeamListModeUpdate, FindRemovePlayerFromTeam, \ - SetPlayerToTeam, OnFriendshipChanged, TeamScoreChanged, TeamChildAdded, \ - TeamChildRemoved, TeamAdded, TeamRemoved, PlayersChildAdded, \ - coreGuiChanged, TeamsChildAdded, TeamsChildRemoved, TeamChanged, \ - InsertTeamFrame, InitMovingPanel, UpdateScrollBarVisibility, \ - OnScrollWheelMove, AttachScrollWheel, CloseNames, ExpandNames, \ - RemoveAllStats, GetScoreValue, StatRemoved, DoesStatExist, DetachScrollWheel --- holy fuck i'm sorry - Heliodex - - -------------------------------- --- Static Functions -------------------------------- --- GetTotalEntries = -> --- return math.min #MiddleFrameBackgrounds, DefaultEntriesOnScreen - --- GetEntryListLength = -> --- numEnts = #PlayerFrames + #TeamFrames --- if NeutralTeam --- numEnts += 1 --- numEnts - -AreAllEntriesOnScreen = -> - #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale <= 1 + DefaultBottomClipPos - - --- GetLengthOfVisbleScroll = -> --- return 1 + DefaultBottomClipPos --- -GetMaxScroll = -> - DefaultBottomClipPos * -1 - --- can be optimized by caching when this varible changes -GetMinScroll = -> - if AreAllEntriesOnScreen! - GetMaxScroll! - else - (GetMaxScroll! - (#MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale)) + (1 + DefaultBottomClipPos) - - -AbsoluteToPercent = (x, y) -> - Vector2.new(x, y) / ScreenGui.AbsoluteSize - ---[[ - tweens property of element from starta to enda over length of time - Warning: should be put in a Spawn call - @Args: - element textobject to tween transparency on - propName - starta alpha to start tweening - enda alpha to end tweening on - length how many seconds to spend tweening ---]] -TweenProperty = (obj, propName, inita, enda, length) -> - startTime = tick! - while tick! - startTime < length - obj[propName] = ((enda - inita) * ((tick! - startTime) / length)) + inita - wait 1 / 30 - - obj[propName] = enda - ---[[ - UGLY UGLY HACK FUNCTION - replace with some sort of global input catching A.S.A. FREAKING P. - creates a fullsize gui element to catch next mouse up event (completeing a click) - @Args: - frameParent Object to parent fullscreen gui to - polledFunction function to call on mouse moved events in this gui - exitFunction function to call when click event is fired ---]] -WaitForClick = (frameParent, polledFunction, exitFunction) -> - return if WaitForClickLock - - WaitForClickLock = true - local connection, connection2 - connection = BigButton.MouseButton1Up\connect (nx, ny) -> - exitFunction nx, ny - BigButton.Visible = false - connection\disconnect! - if connection2 - connection2\disconnect! - - --debugprint "mouse up!" - - connection2 = BigButton.MouseMoved\connect (nx, ny) -> - polledFunction nx, ny - - - --debugprint "waiting for click!" - BigButton.Visible = true - BigButton.Active = true - BigButton.Parent = frameParent - frameParent.AncestryChanged\connect (child, nparent) -> - if child == frameParent and nparent == nil - exitFunction nx, ny - BigButton.Visible = false - connection\disconnect! - connection2\disconnect! - debugprint "forced out of wait for click" - - WaitForClickLock = false - - ---------------------------- ---Personal Server Handling ---------------------------- ---[[ - returns privlage level based on integer rank - Note: these privilege levels seem completely arbitrary, but no documentation exists - this is all from the old player list, really weird - @Args: - rank Integer rank value for player - @Return Normalized integer value for rank? ---]] --- GetPrivilegeType = (rank) -> --- if rank <= PrivilegeLevel["Banned"] --- PrivilegeLevel["Banned"] --- elseif rank <= PrivilegeLevel["Visitor"] --- PrivilegeLevel["Visitor"] --- elseif rank <= PrivilegeLevel["Member"] --- PrivilegeLevel["Member"] --- elseif rank <= PrivilegeLevel["Admin"] --- PrivilegeLevel["Admin"] --- else --- PrivilegeLevel["Owner"] - ---[[ - gives a player a new privilage rank - Note: Very odd that I have to use loops with this instead of directly setting the rank - but no documentation for personal server service exists - @Args: - player player to change rank of - nrank new integer rank to give player ---]] -SetPrivilegeRank = (player, nrank) -> - while player.PersonalServerRank < nrank - game\GetService"PersonalServerService"\Promote player - - while player.PersonalServerRank > nrank - game\GetService"PersonalServerService"\Demote player - ---[[ - called when player selects new privilege level from popup menu - @Args: - player player to set privileges on - nlevel new privilege level for this player ---]] -OnPrivilegeLevelSelect = (player, nlevel, BanPlayerButton, VisitorButton, MemberButton, AdminButton) -> - debugprint "setting privilege level" - SetPrivilegeRank player, nlevel - HighlightMyRank player, BanPlayerButton, VisitorButton, MemberButton, AdminButton - - ---[[ - Highlights current rank of this player in the popup menu - @Args: - player Player to check for rank on ---]] -HighlightMyRank = (player, BanPlayerButton, VisitorButton, MemberButton, AdminButton) -> - BanPlayerButton.Image = assetid .. Images["LightPopupMid"] - VisitorButton.Image = assetid .. Images["DarkPopupMid"] - MemberButton.Image = assetid .. Images["LightPopupMid"] - AdminButton.Image = assetid .. Images["DarkPopupBottom"] - - rank = player.PersonalServerRank - if rank <= PrivilegeLevel["Banned"] - BanPlayerButton.Image = assetid .. Images["LightBluePopupMid"] - elseif rank <= PrivilegeLevel["Visitor"] - VisitorButton.Image = assetid .. Images["DarkBluePopupMid"] - elseif rank <= PrivilegeLevel["Member"] - MemberButton.Image = assetid .. Images["LightBluePopupMid"] - elseif rank <= PrivilegeLevel["Admin"] - AdminButton.Image = assetid .. Images["DarkBluePopupBottom"] - - --------------------------- --- Report abuse handling --------------------------- ---[[ - does final reporting of abuse on selected player, calls closeAbuseDialog ---]] -OnSubmitAbuse = -> - if SubmitReportButton.Active - if AbuseName and SelectedPlayer - AbuseSettingsFrame.Visible = false - game.Players\ReportAbuse SelectedPlayer, AbuseName, AbuseDescriptionBox.Text - if AbuseName == "Rude or Mean Behavior" or AbuseName == "False Reporting Me" - CalmingAbuseBox.Parent = ReportAbuseShield - else - debugprint "opening abuse box" - NormalAbuseBox.Parent = ReportAbuseShield - - else - CloseAbuseDialog! - - -ClosePopUpPanel = -> - if SelectedPlayerEntry - tframe = SelectedPlayerEntry["Frame"] - Spawn -> - TweenProperty tframe, "BackgroundTransparency", 0.5, 1, BASE_TWEEN - - PopUpPanel\TweenPosition UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true - wait 0.1 - InPopupWaitForClick = false - SelectedPlayerEntry = nil - - ---[[ - opens the abuse dialog, initialises text to display selectedplayer ---]] -OpenAbuseDialog = -> - debugprint "adding report dialog" - AbusePlayerLabel.Text = SelectedPlayer.Name - --AbuseDescriptionBox.Text = "" - PopUpPanel\TweenPosition UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true - AbuseDescriptionBox = OriginalAbuseDescriptionBox\Clone! - AbuseDescriptionBox.Parent = AbuseDescriptionWrapper - ReportAbuseShield.Parent = ScreenGui - ClosePopUpPanel! - ---[[ - resets and closes abuse dialog ---]] -CloseAbuseDialog = -> - AbuseName = nil - SubmitReportButton.Active = false - SubmitReportButton.Image = assetid .. "96502438" -- 96501119', - AbuseDescriptionBox\Destroy! - CalmingAbuseBox.Parent = nil - NormalAbuseBox.Parent = nil - ReportAbuseShield.Parent = nil - AbuseSettingsFrame.Visible = true - - ---[[ - creates dropdownbox, registers all listeners for abuse dialog ---]] -InitReportAbuse = -> - UpdateAbuseFunction = (abuseText) -> - AbuseName = abuseText - if AbuseName and SelectedPlayer - SubmitReportButton.Active = true - SubmitReportButton.Image = assetid .. "96501119" - - - AbuseDropDown, _ = RbxGui.CreateDropDownMenu Abuses, UpdateAbuseFunction, true - AbuseDropDown.Name = "AbuseComboBox" - AbuseDropDown.Position = UDim2.new 0.425, 0, 0, 142 - AbuseDropDown.Size = UDim2.new 0.55, 0, 0, 32 - AbuseDropDown.Parent = AbuseSettingsFrame - - CancelReportButton.MouseButton1Click\connect CloseAbuseDialog - SubmitReportButton.MouseButton1Click\connect OnSubmitAbuse - - CalmingAbuseBox\FindFirstChild"OkButton".MouseButton1Down\connect CloseAbuseDialog - NormalAbuseBox\FindFirstChild"OkButton".MouseButton1Down\connect CloseAbuseDialog - - -------------------------------------- --- Friend/unfriending -------------------------------------- ---[[ - gets enum val of friend status, uses pcall for some reason?(from old playerlist) - @Args: - player player object to check if friends with - @Return: enum of friend status ---]] -GetFriendStatus = (player) -> - if player == game.Players.LocalPlayer - Enum.FriendStatus.NotFriend - else - success, result = try - game.Players.LocalPlayer\GetFriendStatus player - - if success - result - else - Enum.FriendStatus.NotFriend - - ---[[ - when friend button is clicked, tries to take appropriate action, - based on current friend status with SelectedPlayer ---]] -OnFriendButtonSelect = -> - friendStatus = GetFriendStatus SelectedPlayer - if friendStatus == Enum.FriendStatus.Friend - LocalPlayer\RevokeFriendship SelectedPlayer - elseif friendStatus == Enum.FriendStatus.Unknown or - friendStatus == Enum.FriendStatus.NotFriend or - friendStatus == Enum.FriendStatus.FriendRequestSent or - friendStatus == Enum.FriendStatus.FriendRequestReceived - - LocalPlayer\RequestFriendship SelectedPlayer - - --PersonalServerPanel\TweenPosition UDim2.new(1,0,0,0), "Out", "Quad", 0.5,true - ClosePopUpPanel! - --PopUpPanel\TweenPosition UDim2.new(1,0,0,0), "Out", "Linear", BASE_TWEEN,true - - -OnFriendRefuseButtonSelect = -> - LocalPlayer\RevokeFriendship SelectedPlayer - ClosePopUpPanel! - PopUpPanel\TweenPosition UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true - ------------------------------------- --- Player Entry Handling ------------------------------------- ---[[ - used by lua's table.sort to sort player entries ---]] -PlayerSortFunction = (a, b) -> - -- prevents flipping out leaderboard - if a["Score"] == b["Score"] - a["Player"].Name\upper! < b["Player"].Name\upper! - elseif not a["Score"] - false - elseif not b["Score"] - true - else - a["Score"] < b["Score"] - ---------------------------------- --- Stat Handling ---------------------------------- --- removes and closes all leaderboard stuffs -BlowThisPopsicleStand = -> - --ScreenGui\Destroy! - --script\Destroy! - --time to make the fanboys rage... - Tabify! - - ---[[ - used by lua's table.sort to prioritize score entries ---]] -StatSort = (a, b) -> - -- primary stats should be shown before all others - if a.IsPrimary ~= b.IsPrimary - return a.IsPrimary - - -- if priorities are equal, then return the first added one - if a.Priority == b.Priority - return a.AddId < b.AddId - - return a.Priority < b.Priority - - ---[[ - doing WAAY too much here, for optimization update only your team - @Args: - playerEntry Entry of player who had a stat change - property Name of stat changed ---]] -StatChanged = (_, _) -> --playerEntry, property) - -- if playerEntry['MyTeam'] - -- UpdateSingleTeam playerEntry['MyTeam'] - -- else - BaseUpdate! - -CreateStatTitle = (statName) -> - with MiddleTemplate\FindFirstChild"PlayerScore"\Clone! - .Name = statName - .Text = statName - -- ntitle - .TextTransparency = if IsMaximized.Value - 0 - else - 1 - - .Parent = StatTitles - - ---[[ - Called when stat is added - if playerEntry is localplayer, will add to score names and re-sort the stats, and resize the width of the leaderboard - for all players, will add a listener for if this stat changes - if stat is a string value, crashes the leaderboard - Note: change crash to a 'tabify' leaderboard later - @Args: - nchild new child value to leaderstats - playerEntry entry this stat was added to ---]] -StatAdded = (nchild, playerEntry) -> - -- dont re - add a leaderstat I alreday have - while AddingStatLock - debugprint "in stat added function lock" - wait 1 / 30 - - AddingStatLock = true - if not ( - nchild\IsA"StringValue" or - nchild\IsA"IntValue" or - nchild\IsA"BoolValue" or - nchild\IsA"NumberValue" or - nchild\IsA"DoubleConstrainedValue" or - nchild\IsA"IntConstrainedValue" - ) - - BlowThisPopsicleStand! - else - haveScore = false - for _, i in pairs ScoreNames - if i["Name"] == nchild.Name - haveScore = true - - - if not haveScore - nstat = {} - nstat["Name"] = nchild.Name - nstat["Priority"] = 0 - if nchild\FindFirstChild "Priority" - nstat["Priority"] = nchild.Priority - - nstat["IsPrimary"] = false - if nchild\FindFirstChild "IsPrimary" - nstat["IsPrimary"] = true - - nstat.AddId = AddId - AddId += 1 - table.insert ScoreNames, nstat - table.sort ScoreNames, StatSort - if not StatTitles\FindFirstChild nstat["Name"] - CreateStatTitle nstat["Name"] - - UpdateMaximize! - - AddingStatLock = false - StatChanged playerEntry - nchild.Changed\connect (property) -> - StatChanged playerEntry, property - - ---returns whether any of the existing players has this stat -DoesStatExist = (statName, exception) -> - for _, playerf in pairs PlayerFrames - if playerf["Player"] ~= exception and - playerf["Player"]\FindFirstChild"leaderstats" and - playerf["Player"].leaderstats\FindFirstChild statName - - --print 'player:' .. playerf['Player'].Name ..' has stat' - return true - - false - - ---[[ - Called when stat is removed from player - for all players, destroys the stat frame associated with this value, - then calls statchanged (to resize frame) - if playerEntry==localplayer, will remove from scorenames - @Args: - nchild ___value to be removed - playerEntry entry of player value is being removed from ---]] -StatRemoved = (nchild, playerEntry) -> - while AddingStatLock - debugprint "In Adding Stat Lock1" - wait 1 / 30 - - AddingStatLock = true - if playerEntry["Frame"]\FindFirstChild nchild.Name - debugprint "Destroyed frame!" - playerEntry["Frame"][nchild.Name].Parent = nil - - if not DoesStatExist nchild.Name, playerEntry["Player"] - for i, val in ipairs ScoreNames - if val["Name"] == nchild.Name - table.remove ScoreNames, i - if StatTitles\FindFirstChild nchild.Name - StatTitles[nchild.Name]\Destroy! - - for _, teamf in pairs TeamFrames - if teamf["Frame"]\FindFirstChild nchild.Name - teamf["Frame"][nchild.Name]\Destroy! - - AddingStatLock = false - StatChanged playerEntry - ---[[ - clears all stats from a given playerEntry - used when leaderstats are removed, or when new leaderstats are added(for weird edge case)+ ---]] -RemoveAllStats = (playerEntry) -> - for _, val in ipairs ScoreNames - StatRemoved val, playerEntry - -GetScoreValue = (score) -> - if score\IsA"DoubleConstrainedValue" or score\IsA "IntConstrainedValue" - score.ConstrainedValue - elseif score\IsA "BoolValue" - if score.Value - 1 - else - 0 - else - score.Value - ---[[ - ---]] -MakeScoreEntry = (entry, scoreval, panel) -> - return if not panel\FindFirstChild "PlayerScore" - - nscoretxt = panel\FindFirstChild"PlayerScore"\Clone! - local thisScore - --here lies the resting place of a once great and terrible bug - --may its treachery never be forgoten, lest its survivors fall for it again - --RIP the leaderstat bug, oct 2012-nov 2012 - wait! - if entry["Player"]\FindFirstChild"leaderstats" and entry["Player"].leaderstats\FindFirstChild scoreval["Name"] - thisScore = entry["Player"]\FindFirstChild"leaderstats"\FindFirstChild scoreval["Name"] - else - return - - return if not entry["Player"].Parent - - nscoretxt.Name = scoreval["Name"] - nscoretxt.Text = "#{GetScoreValue thisScore}" - if scoreval["Name"] == ScoreNames[1]["Name"] - debugprint "changing score" - entry["Score"] = GetScoreValue thisScore - if entry["Player"] == LocalPlayer - HeaderScore.Text = "#{GetScoreValue thisScore}" - - - thisScore.Changed\connect -> - return if not thisScore.Parent - - if scoreval["Name"] == ScoreNames[1]["Name"] - entry["Score"] = GetScoreValue thisScore - if entry["Player"] == LocalPlayer - HeaderScore.Text = "#{GetScoreValue thisScore}" - - nscoretxt.Text = "#{GetScoreValue thisScore}" - BaseUpdate! - - nscoretxt - - -RecreateScoreColumns = (ptable) -> - while AddingStatLock - debugprint "In Adding Stat Lock2" - wait 1 / 30 - - AddingStatLock = true - Xoffset = 5 --15 --current offset from Right - maxXOffset = Xoffset - MaxSizeColumn = 0 --max size for this column - - -- foreach known leaderstat - for j = #ScoreNames, 1, -1 - scoreval = ScoreNames[j] - - MaxSizeColumn = 0 - -- for each entry in this player table - for _, entry in ipairs ptable - panel = entry["Frame"] - -- tplayer = entry["Player"] - -- if this panel does not have an element named after this stat - if not panel\FindFirstChild scoreval["Name"] - -- make an entry for this object - nentry = MakeScoreEntry entry, scoreval, panel - if nentry - debugprint "adding #{nentry.Name} to #{entry["Player"].Name}" - nentry.Parent = panel - -- add score to team - if entry["MyTeam"] and - entry["MyTeam"] ~= NeutralTeam and - not entry["MyTeam"]["Frame"]\FindFirstChild scoreval["Name"] - - ntitle = nentry\Clone! - --ntitle.TextXAlignment = "Right" - ntitle.Parent = entry["MyTeam"]["Frame"] - - - scoreval["XOffset"] = Xoffset - - if panel\FindFirstChild scoreval["Name"] - MaxSizeColumn = math.max MaxSizeColumn, panel[scoreval["Name"]].TextBounds.X - - - if AreNamesExpanded.Value - MaxSizeColumn = math.max MaxSizeColumn, StatTitles[scoreval["Name"]].TextBounds.X - StatTitles[scoreval["Name"]]\TweenPosition( - UDim2.new(RightEdgeSpace, -Xoffset, 0, 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - else - StatTitles[scoreval["Name"]]\TweenPosition( - UDim2.new((0.4 + ((0.6 / #ScoreNames) * (j - 1))) - 1, 0, 0, 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - - scoreval["ColumnSize"] = MaxSizeColumn - Xoffset += SpacingPerStat + MaxSizeColumn - maxXOffset = math.max Xoffset, maxXOffset - - NormalBounds = UDim2.new 0, BaseScreenXSize + maxXOffset - SpacingPerStat, 0, 800 - NormalPosition = UDim2.new 1, -NormalBounds.X.Offset, NormalPosition.Y.Scale, 0 - UpdateHeaderNameSize! - UpdateMaximize! - - AddingStatLock = false - ---------------------------- --- Minimizing and maximizing ---------------------------- - -ToggleMinimize = -> - IsMinimized.Value = not IsMinimized.Value - UpdateStatNames! - - -ToggleMaximize = -> - IsMaximized.Value = not IsMaximized.Value - RecreateScoreColumns PlayerFrames --done to re-position stat names NOTE: optimize-able - - -Tabify = -> - IsTabified.Value = true - IsMaximized.Value = false - IsMinimized.Value = true - UpdateMinimize! - IsTabified.Value = true - ScreenGui\TweenPosition( - UDim2.new(NormalBounds.X.Scale, NormalBounds.X.Offset - 10, 0, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - - -UnTabify = -> - if IsTabified.Value - IsTabified.Value = false - ScreenGui\TweenPosition UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - - ---[[ - Does more than it looks like - monitors positions of the clipping frames and bottom frames - called from EVERYWHERE, too much probably ---]] -UpdateMinimize = -> - if IsMinimized.Value - if IsMaximized.Value - ToggleMaximize! - - if not IsTabified.Value - MainFrame\TweenSizeAndPosition( - UDim2.new(0.010, HeaderName.TextBounds.X, NormalBounds.Y.Scale, NormalBounds.Y.Offset), - UDim2.new(0.990, -HeaderName.TextBounds.X, NormalPosition.Y.Scale, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - else - MainFrame\TweenSizeAndPosition NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true - - --(#MiddleFrameBackgrounds*MiddleBGTemplate.Size.Y.Scale) - BottomClipFrame\TweenPosition UDim2.new(0, 0, -1, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - BottomFrame\TweenPosition UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - FocusFrame.Size = UDim2.new 1, 0, HeaderFrameHeight, 0 - ExtendTab.Image = assetid .. "94692731" - else - if not IsMaximized.Value - MainFrame\TweenSizeAndPosition NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true - - --do limiting - DefaultBottomClipPos = math.min math.max(DefaultBottomClipPos, -1), -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) - UpdateScrollPosition! - - BottomClipFrame.Position = UDim2.new 0, 0, DefaultBottomClipPos, 0 - bottomPositon = DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale - BottomFrame.Position = UDim2.new 0, 0, bottomPositon, 0 - FocusFrame.Size = UDim2.new 1, 0, bottomPositon + HeaderFrameHeight, 0 - ExtendTab.Image = assetid .. "94825585" - - ---[[ - Manages the position/size of the mainFrame, swaps out different resolution images for the frame - fades in and out the stat names, moves position of headername and header score ---]] -UpdateMaximize = -> - if IsMaximized.Value - for j = 1, #ScoreNames, 1 - scoreval = ScoreNames[j] - StatTitles[scoreval["Name"]]\TweenPosition( - UDim2.new(0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, 0, 0, 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - - if IsMinimized.Value - ToggleMinimize! - else - UpdateMinimize! - - - MainFrame\TweenSizeAndPosition MaximizedBounds, MaximizedPosition, "Out", "Linear", BASE_TWEEN * 1.2, true - HeaderScore\TweenPosition( - UDim2.new(0, 0, HeaderName.Position.Y.Scale, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - HeaderName\TweenPosition( - UDim2.new(-0.1, -HeaderScore.TextBounds.x, HeaderName.Position.Y.Scale, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - HeaderFrame.Background.Image = assetid .. Images["LargeHeader"] - BottomFrame.Background.Image = assetid .. Images["LargeBottom"] - for index, i in ipairs MiddleFrameBackgrounds - i.Background.Image = assetid .. if index % 2 ~= 1 - Images["LargeDark"] - else - Images["LargeLight"] - - for _, i in ipairs MiddleFrames - if i\FindFirstChild "ClickListener" - i.ClickListener.Size = UDim2.new 0.974, 0, i.ClickListener.Size.Y.Scale, 0 - - for j = 1, #ScoreNames, 1 - scoreval = ScoreNames[j] - if i\FindFirstChild scoreval["Name"] - i[scoreval["Name"]]\TweenPosition( - UDim2.new(0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, 0, 0, 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - - - for _, entry in ipairs PlayerFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0.38, - 0, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) - - - for _, entry in ipairs TeamFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0.38, - 0, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) - - else - if not IsMinimized.Value - MainFrame\TweenSizeAndPosition NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true - - HeaderScore\TweenPosition UDim2.new(0, 0, 0.4, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - HeaderName\TweenPosition( - UDim2.new(0, 0, HeaderName.Position.Y.Scale, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - HeaderFrame.Background.Image = assetid .. Images["NormalHeader"] - BottomFrame.Background.Image = assetid .. Images["NormalBottom"] - for index, i in ipairs MiddleFrameBackgrounds - i.Background.Image = "http://banland.xyz/asset/?id=" .. if index % 2 ~= 1 - Images["midDark"] - else - Images["midLight"] - - - for _, i in ipairs MiddleFrames - if i\FindFirstChild "ClickListener" - i.ClickListener.Size = UDim2.new 0.96, 0, i.ClickListener.Size.Y.Scale, 0 - for scoreval in *ScoreNames - if i\FindFirstChild(scoreval["Name"]) and scoreval["XOffset"] - -- print "updateing stat position: #{scoreval["Name"]}" - i[scoreval["Name"]]\TweenPosition( - UDim2.new(RightEdgeSpace, -scoreval["XOffset"], 0, 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - - - for _, entry in ipairs TeamFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0, - BaseScreenXSize * 0.9, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) - - for _, entry in ipairs PlayerFrames - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( - 0, - BaseScreenXSize * 0.9, - entry["Frame"].TitleFrame.Size.Y.Scale, - 0 - ) - - -ExpandNames = -> - if #ScoreNames ~= 0 - for _, i in pairs StatTitles\GetChildren! - Spawn -> - TweenProperty i, "TextTransparency", i.TextTransparency, 0, BASE_TWEEN - - HeaderFrameHeight = 0.09 - --as of writing, this and 'CloseNames' are the only places headerframe is resized - HeaderFrame\TweenSizeAndPosition( - UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), - HeaderFrame.Position, - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - TopClipFrame\TweenPosition( - UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - BottomShiftFrame\TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) - - -CloseNames = -> - if #ScoreNames ~= 0 - HeaderFrameHeight = 0.07 - if not IsMaximized.Value - for _, i in pairs StatTitles\GetChildren! - Spawn -> - TweenProperty i, "TextTransparency", i.TextTransparency, 1, BASE_TWEEN - - - BottomShiftFrame\TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) - HeaderFrame\TweenSizeAndPosition( - UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), - HeaderFrame.Position, - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - TopClipFrame\TweenPosition( - UDim2.new(TopClipFrame.Position.X.Scale, 0, HeaderFrameHeight, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - - -UpdateStatNames = -> - if not AreNamesExpanded.Value or IsMinimized.Value - CloseNames! - else - ExpandNames! - - -OnScrollWheelMove = (direction) -> - if not (IsTabified.Value or IsMinimized.Value or InPopupWaitForClick) - StartFrame = ListFrame.Position - newFrameY = math.max math.min(StartFrame.Y.Scale + direction, GetMaxScroll!), GetMinScroll! - - ListFrame.Position = UDim2.new StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset - UpdateScrollPosition! - - -AttachScrollWheel = -> - return if ScrollWheelConnections - - ScrollWheelConnections = {} - table.insert( - ScrollWheelConnections, - Mouse.WheelForward\connect -> - OnScrollWheelMove 0.05 - ) - table.insert( - ScrollWheelConnections, - Mouse.WheelBackward\connect -> - OnScrollWheelMove -0.05 - ) - - -DetachScrollWheel = -> - if ScrollWheelConnections - for _, i in pairs ScrollWheelConnections - i\disconnect! - - ScrollWheelConnections = nil - - -FocusFrame.MouseEnter\connect -> - if not (IsMinimized.Value or IsTabified.Value) - AttachScrollWheel! - -FocusFrame.MouseLeave\connect -> - --if not (IsMaximized.Value or IsMinimized.Value) - DetachScrollWheel! - ------------------------- --- Scroll Bar functions ------------------------- ---[[ - updates whether the scroll bar should be showing, if it is showing, updates - the size of it ---]] -UpdateScrollBarVisibility = -> - if AreAllEntriesOnScreen! - ScrollBar.BackgroundTransparency = 1 - else - ScrollBar.BackgroundTransparency = 0 - UpdateScrollBarSize! - ---[[ - updates size of scrollbar depending on how many entries exist ---]] -UpdateScrollBarSize = -> - entryListSize = #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale - shownAreaSize = BottomClipFrame.Position.Y.Scale + 1 - ScrollBar.Size = UDim2.new 1, 0, shownAreaSize / entryListSize, 0 - ---[[ - updates position of listframe so that no gaps at the bottom or top of the list are visible - updates position of scrollbar to match what parts of the list are visible ---]] -UpdateScrollPosition = -> - minPos = GetMinScroll! - maxPos = GetMaxScroll! - scrollLength = maxPos - minPos - - yscrollpos = math.max math.min(ListFrame.Position.Y.Scale, maxPos), minPos - ListFrame.Position = UDim2.new ListFrame.Position.X.Scale, ListFrame.Position.X.Offset, yscrollpos, ListFrame.Position.Y.Offset - - adjustedLength = 1 - ScrollBar.Size.Y.Scale - ScrollBar.Position = UDim2.new 0, 0, adjustedLength - (adjustedLength * ((ListFrame.Position.Y.Scale - minPos) / scrollLength)), 0 - - ---[[ - prepares the needed popup to be tweened on screen, and updates the position of the popup clip - frame to match the selected player frame's position ---]] -InitMovingPanel = (entry, player) -> - PopUpClipFrame.Parent = ScreenGui - - if PopUpPanel - PopUpPanel\Destroy! - - PopUpPanel = PopUpPanelTemplate\Clone! - PopUpPanel.Parent = PopUpClipFrame - - nextIndex = 2 - friendStatus = GetFriendStatus player - debugprint "#{friendStatus}" - showRankMenu = IsPersonalServer and - LocalPlayer.PersonalServerRank >= PrivilegeLevel["Admin"] and - LocalPlayer.PersonalServerRank > SelectedPlayer.PersonalServerRank - - ReportPlayerButton = MakePopupButton PopUpPanel, "Report Player", 0 - ReportPlayerButton.MouseButton1Click\connect -> - OpenAbuseDialog! - - FriendPlayerButton = MakePopupButton( - PopUpPanel, - "Friend", - 1, - not showRankMenu and friendStatus ~= Enum.FriendStatus.FriendRequestReceived - ) - FriendPlayerButton.MouseButton1Click\connect OnFriendButtonSelect - - if friendStatus == Enum.FriendStatus.Friend - FriendPlayerButton\FindFirstChild"ButtonText".Text = "UnFriend Player" - elseif friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend - FriendPlayerButton\FindFirstChild"ButtonText".Text = "Send Request" - elseif friendStatus == Enum.FriendStatus.FriendRequestSent - FriendPlayerButton\FindFirstChild"ButtonText".Text = "Revoke Request" - elseif friendStatus == Enum.FriendStatus.FriendRequestReceived - FriendPlayerButton\FindFirstChild"ButtonText".Text = "Accept Friend" - FriendRefuseButton = MakePopupButton PopUpPanel, "Decline Friend", 2, not showRankMenu - FriendRefuseButton.MouseButton1Click\connect OnFriendRefuseButtonSelect - nextIndex += 1 - - - if showRankMenu - BanPlayerButton = MakePopupButton PopUpPanel, "Ban", nextIndex - VisitorButton = MakePopupButton PopUpPanel, "Visitor", nextIndex + 1 - MemberButton = MakePopupButton PopUpPanel, "Member", nextIndex + 2 - AdminButton = MakePopupButton PopUpPanel, "Admin", nextIndex + 3, true - - BanPlayerButton.MouseButton1Click\connect -> - OnPrivilegeLevelSelect( - player, - PrivilegeLevel["Banned"], - BanPlayerButton, - VisitorButton, - MemberButton, - AdminButton - ) - - VisitorButton.MouseButton1Click\connect -> - OnPrivilegeLevelSelect( - player, - PrivilegeLevel["Visitor"], - BanPlayerButton, - VisitorButton, - MemberButton, - AdminButton - ) - - MemberButton.MouseButton1Click\connect -> - OnPrivilegeLevelSelect( - player, - PrivilegeLevel["Member"], - BanPlayerButton, - VisitorButton, - MemberButton, - AdminButton - ) - - AdminButton.MouseButton1Click\connect -> - OnPrivilegeLevelSelect( - player, - PrivilegeLevel["Admin"], - BanPlayerButton, - VisitorButton, - MemberButton, - AdminButton - ) - - - HighlightMyRank SelectedPlayer, BanPlayerButton, VisitorButton, MemberButton, AdminButton - - - PopUpPanel\TweenPosition UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true - Delay 0, -> - tconnection = Mouse.Button1Down\connect -> - tconnection\disconnect! - ClosePopUpPanel! - - - myFrame = entry["Frame"] - -- THIS IS GARBAGE. - -- if I parent to frame to auto update position, it gets clipped - -- sometimes garbage is the only option. - Spawn -> - while InPopupWaitForClick - PopUpClipFrame.Position = UDim2.new( - 0, myFrame.AbsolutePosition.X - PopUpClipFrame.Size.X.Offset, - 0, myFrame.AbsolutePosition.Y - ) - wait! - - - -ActivatePlayerEntryPanel = (entry) -> - entry["Frame"].BackgroundColor3 = Color3.new 0, 1, 1 - Spawn -> - TweenProperty entry["Frame"], "BackgroundTransparency", 1, 0.5, 0.5 - - InPopupWaitForClick = true - InitMovingPanel entry, entry["Player"] - - ---[[ - WARNING: this is in a working state, but uses massive hacks - revize when global input is available - Manages scrolling of the playerlist on mouse drag ---]] -StartDrag = (entry, startx, starty) -> - openPanel = true - --[[draggedFrame = ]] - WaitForChild entry["Frame"], "ClickListener" - - dragExit = -> - -- stopDrag = true - - if entry["Player"] and - SelectedPlayer and - openPanel and - entry["Player"] ~= LocalPlayer and - SelectedPlayer.userId > 1 and - LocalPlayer.userId > 1 - - ActivatePlayerEntryPanel entry - - local startY - StartFrame = ListFrame.Position - dragpoll = (nx, ny) -> - if not startY - startY = AbsoluteToPercent(nx, ny).Y - - nowY = AbsoluteToPercent(nx, ny).Y - debugprint "drag dist: #{Vector2.new(startx - nx, starty - ny).magnitude}" - if Vector2.new(startx - nx, starty - ny).magnitude > MOUSE_DRAG_DISTANCE - openPanel = false - - - newFrameY = math.max math.min(StartFrame.Y.Scale + (nowY - startY), GetMaxScroll!), GetMinScroll! - ListFrame.Position = UDim2.new StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset - UpdateScrollPosition! - - WaitForClick ScreenGui, dragpoll, dragExit - - -StartMinimizeDrag = -> - Delay 0, -> - startTime = tick! - debugprint "Got Click2" - dragExit = -> - --debugprint "undone click2" - if tick! - startTime < 0.25 --was click - ToggleMinimize! - else --was drag - DidMinimizeDrag = true - if IsMinimized.Value - ToggleMinimize! - - -- stopDrag = true - - local startY - StartFrame = DefaultBottomClipPos - dragpoll = (nx, ny) -> - if not IsMinimized.Value - if not startY - startY = AbsoluteToPercent(nx, ny).Y - - nowY = AbsoluteToPercent(nx, ny).Y - newFrameY = math.min( - math.max(StartFrame + (nowY - startY), -1), - -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) - ) - DefaultBottomClipPos = newFrameY - UpdateMinimize! - ScrollBarFrame.Size = UDim2.new ScrollBarFrame.Size.X.Scale, 0, (DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale), 0 - ScrollBarFrame.Position = UDim2.new ScrollBarFrame.Position.X.Scale, 0, 1 - ScrollBarFrame.Size.Y.Scale, 0 - UpdateScrollBarSize! - UpdateScrollPosition! - UpdateScrollBarVisibility! - - Spawn -> - WaitForClick ScreenGui, dragpoll, dragExit - - - -------------------------------- --- Input Callback functions -------------------------------- -IsMaximized.Value = false -IsMinimized.Value = false -IsMaximized.Changed\connect UpdateMaximize -IsMinimized.Changed\connect UpdateMinimize - -ExtendButton.MouseButton1Down\connect -> - return if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick - - LastClick = time! - if IsTabified.Value - UnTabify! - else - StartMinimizeDrag! - - -MaximizeButton.MouseButton1Click\connect -> - return if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick - - LastClick = time! - if IsTabified.Value - UnTabify! - elseif not AreNamesExpanded.Value - AreNamesExpanded.Value = true - BaseUpdate! - else - ToggleMaximize! - - -MaximizeButton.MouseButton2Click\connect -> - return if (time! - LastClick < ButtonCooldown) or InPopupWaitForClick - - LastClick = time! - if IsTabified.Value - UnTabify! - elseif IsMaximized.Value - ToggleMaximize! - elseif AreNamesExpanded.Value - AreNamesExpanded.Value = false - BaseUpdate! - else - Tabify! - - -------------------------------- --- MiddleFrames management -------------------------------- ---[[ - adds a background frame to the listframe ---]] -AddMiddleBGFrame = -> - nBGFrame = MiddleBGTemplate\Clone! - nBGFrame.Position = UDim2.new 0.5, 0, (#MiddleFrameBackgrounds * nBGFrame.Size.Y.Scale), 0 - nBGFrame.Background.Image = assetid .. if (#MiddleFrameBackgrounds + 1) % 2 ~= 1 - if IsMaximized.Value - Images["LargeDark"] - else - Images["midDark"] - - else - if IsMaximized.Value - Images["LargeLight"] - else - Images["midLight"] - - - nBGFrame.Parent = ListFrame - table.insert MiddleFrameBackgrounds, nBGFrame - - if #MiddleFrameBackgrounds < DefaultListSize and not DidMinimizeDrag - --print 'readjusting bottom clip' - DefaultBottomClipPos = -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) - - - if not IsMinimized.Value - UpdateMinimize! - ---[[ - removes a background from from the listframe ---]] -RemoveMiddleBGFrame = -> - MiddleFrameBackgrounds[#MiddleFrameBackgrounds]\Destroy! - table.remove MiddleFrameBackgrounds, #MiddleFrameBackgrounds - if not IsMinimized.Value - UpdateMinimize! - -------------------------------- --- Player Callback functions -------------------------------- -FONT_SIZES = { "Size8", "Size9", "Size10", "Size11", "Size12", "Size14", "Size24", "Size36", "Size48" } ---[[ - Note: should probably set to something other than mainFrame.AbsoluteSize, should work for now - if textbounds ever works on textscaled, switch to that :( ---]] -ChangeHeaderName = (nname) -> - HeaderName.Text = nname - UpdateHeaderNameSize! - - ---[[ - Will fit the player's name to the bounds of the header - called on resize of the window and playedr name change events - HACK: cannot use 'Textscaled' due to unable to find text bounds when scaled ---]] -UpdateHeaderNameSize = -> - tHeader = HeaderName\Clone! - tHeader.Position = UDim2.new 2, 0, 2, 0 - tHeader.Parent = ScreenGui - fSize = 7 --Size24 in table - tHeader.FontSize = FONT_SIZES[fSize] - Delay 0.2, -> - while tHeader.TextBounds.x == 0 - wait 1 / 30 - - while tHeader.TextBounds.x - NormalBounds.X.Offset > 1 - fSize -= 1 - tHeader.FontSize = FONT_SIZES[fSize] - wait 0.2 - - HeaderName.FontSize = tHeader.FontSize - tHeader\Destroy! - -ScreenGui.Changed\connect UpdateHeaderNameSize - ---[[ - called only when the leaderstats object is added to a given player entry - removes old stats, adds any existing stats, and sets up listeners for new stats - @Args: - playerEntry A reference to the ENTRY(table) of the player who had leaderstats added ---]] -LeaderstatsAdded = (playerEntry) -> - --RemoveAllStats playerEntry - nplayer = playerEntry["Player"] - for _, i in pairs nplayer.leaderstats\GetChildren! - StatAdded i, playerEntry - - nplayer.leaderstats.ChildAdded\connect (nchild) -> - StatAdded nchild, playerEntry - - nplayer.leaderstats.ChildRemoved\connect (nchild) -> - StatRemoved nchild, playerEntry - ---[[ - called when leaderstats object is removed from play in player entry - Note: may not be needed, might be able to just rely on leaderstats added - @Args: - oldLeaderstats leaderstats object to be removed - playerEntry A reference to the ENTRY(table) of the player ---]] -LeaderstatsRemoved = (_, playerEntry) -> - while AddingFrameLock - debugprint "waiting to insert #{playerEntry["Player"].Name}" - wait 1 / 30 - - AddingFrameLock = true - RemoveAllStats playerEntry - AddingFrameLock = false - - ---[[ - Called when a player entry in the leaderboard is clicked - either will highlight entry and start the drag event, or open a popup menu - @Args: - entry the player entry clicked ---]] -OnPlayerEntrySelect = (entry, startx, starty) -> - if not InPopupWaitForClick - SelectedPlayerEntry = entry - SelectedPlayer = entry["Player"] - - StartDrag entry, startx, starty - - ---[[ - the basic update for the playerlist mode's state, - assures the order and length of the player frames ---]] -PlayerListModeUpdate = -> - RecreateScoreColumns PlayerFrames - table.sort PlayerFrames, PlayerSortFunction - for i, val in ipairs PlayerFrames - MiddleFrames[i] = val["Frame"] - - for i = #PlayerFrames + 1, #MiddleFrames, 1 - MiddleFrames[i] = nil - - UpdateMinimize! - ---[[ - this one's a doozie, happens when a player is added to the game - inits their player frame and player entry, assigns them to a team if possible, - and hooks up their leaderstats - @Args: - nplayer new player object to insert ---]] -InsertPlayerFrame = (nplayer) -> - while AddingFrameLock - debugprint "waiting to insert #{nplayer.Name}" - wait 1 / 30 - - AddingFrameLock = true - - nFrame = MiddleTemplate\Clone! - WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = nplayer.Name - - nFrame.Position = UDim2.new 1, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0 - - nfriendstatus = GetFriendStatus nplayer - - nFrame\FindFirstChild"BCLabel".Image = getMembershipTypeIcon nplayer.MembershipType, nplayer.Name - nFrame\FindFirstChild"FriendLabel".Image = getFriendStatusIcon nfriendstatus - nFrame.Name = nplayer.Name - WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = nplayer.Name - - --move for bc label - nFrame.FriendLabel.Position = nFrame.FriendLabel.Position + UDim2.new 0, 17, 0, 0 - nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + UDim2.new 0, 17, 0, 0 - - if nFrame\FindFirstChild"FriendLabel".Image ~= "" - nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + UDim2.new 0, 17, 0, 0 - - - if nplayer.Name == LocalPlayer.Name - nFrame.TitleFrame.Title.Font = "ArialBold" - nFrame.PlayerScore.Font = "ArialBold" - ChangeHeaderName nplayer.Name - with nFrame.TitleFrame.Title\Clone! - .TextColor3 = Color3.new 0, 0, 0 - .TextTransparency = 0 - .ZIndex = 2 - .Position = nFrame.TitleFrame.Title.Position + UDim2.new 0, 1, 0, 1 - .Name = "DropShadow" - .Parent = nFrame.TitleFrame - -- else - -- Delay 2, -> OnFriendshipChanged nplayer,LocalPlayer\GetFriendStatus nplayer - nFrame.TitleFrame.Title.Font = "ArialBold" - - nFrame.Parent = ListFrame - nFrame\TweenPosition UDim2.new(0.5, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0), "Out", "Linear", BASE_TWEEN, true - UpdateMinimize! - nentry = {} - nentry["Frame"] = nFrame - nentry["Player"] = nplayer - nentry["ID"] = AddId - AddId += 1 - table.insert PlayerFrames, nentry - if #TeamFrames ~= 0 - if nplayer.Neutral - nentry["MyTeam"] = nil - if not NeutralTeam - AddNeutralTeam! - else - AddPlayerToTeam NeutralTeam, nentry - - else - addedToTeam = false - for _, tval in ipairs TeamFrames - if tval["MyTeam"].TeamColor == nplayer.TeamColor - AddPlayerToTeam tval, nentry - nentry["MyTeam"] = tval - addedToTeam = true - - if not addedToTeam - nentry["MyTeam"] = nil - if not NeutralTeam - AddNeutralTeam! - else - AddPlayerToTeam NeutralTeam, nentry - - nentry["MyTeam"] = NeutralTeam - - - - if nplayer\FindFirstChild "leaderstats" - LeaderstatsAdded nentry - - - nplayer.ChildAdded\connect (nchild) -> - if nchild.Name == "leaderstats" - while AddingFrameLock - debugprint "in adding leaderstats lock" - wait 1 / 30 - - AddingFrameLock = true - LeaderstatsAdded nentry - AddingFrameLock = false - - - nplayer.ChildRemoved\connect (nchild) -> - if nplayer == LocalPlayer and nchild.Name == "leaderstats" - LeaderstatsRemoved nchild, nentry - - nplayer.Changed\connect (prop) -> - PlayerChanged nentry, prop - - - listener = WaitForChild nFrame, "ClickListener" - listener.Active = true - listener.MouseButton1Down\connect (nx, ny) -> - OnPlayerEntrySelect nentry, nx, ny - - - AddMiddleBGFrame! - BaseUpdate! - AddingFrameLock = false - - ---[[ - Note: major optimization can be done here - removes this player's frame if it exists, calls base update ---]] -RemovePlayerFrame = (tplayer) -> - while AddingFrameLock - debugprint "in removing player frame lock" - wait 1 / 30 - - AddingFrameLock = true - - local tteam - for i, key in ipairs PlayerFrames - if tplayer == key["Player"] - if PopUpClipFrame.Parent == key["Frame"] - PopUpClipFrame.Parent = nil - - key["Frame"]\Destroy! - tteam = key["MyTeam"] - table.remove PlayerFrames, i - - if tteam - for j, tentry in ipairs tteam["MyPlayers"] - if tentry["Player"] == tplayer - RemovePlayerFromTeam tteam, j - - - RemoveMiddleBGFrame! - UpdateMinimize! - BaseUpdate! - AddingFrameLock = false - - -Players.ChildRemoved\connect RemovePlayerFrame - ----------------------------- --- Team Callback Functions ----------------------------- - ---[[ - turns a list of team entries with sub lists of players into a single ordered - list, in the correct order,and of the correct length - @Args: - tframes the team entries to unroll - outframes the list to unroll these entries into ---]] -UnrollTeams = (tframes, outframes) -> - numEntries = 0 - if NeutralTeam and not NeutralTeam["IsHidden"] - for _, val in ipairs NeutralTeam["MyPlayers"] - numEntries += 1 - outframes[numEntries] = val["Frame"] - - numEntries += 1 - outframes[numEntries] = NeutralTeam["Frame"] - - for _, val in ipairs tframes - if not val["IsHidden"] - for _, pval in ipairs val.MyPlayers - numEntries += 1 - outframes[numEntries] = pval["Frame"] - - numEntries += 1 - outframes[numEntries] = val["Frame"] - - -- clear any additional entries from outframes - for i = numEntries + 1, #outframes, 1 - outframes[i] = nil - - ---[[ - uses lua's table.sort to sort the teams ---]] -TeamSortFunc = (a, b) -> - if a["TeamScore"] == b["TeamScore"] - return a["ID"] < b["ID"] - - if not a["TeamScore"] - return false - - if not b["TeamScore"] - return true - - a["TeamScore"] < b["TeamScore"] - - ---[[ - adds up all the score of this team's players to form the team score - @Args: - team team entry to sum the scores of ---]] -AddTeamScores = (team) -> - for i in *ScoreNames - tscore = 0 - for _, j in ipairs team["MyPlayers"] - tval = j["Player"]\FindFirstChild"leaderstats" and j["Player"].leaderstats\FindFirstChild i["Name"] - if tval and not tval\IsA "StringValue" - tscore += GetScoreValue j["Player"].leaderstats[i["Name"]] - - if team["Frame"]\FindFirstChild i["Name"] - --team['Frame'][i['Name'] ].Size = UDim2.new(1 - (ScrollBarFrame.Size.X.Scale * 2),- ((j-1) * SpacingPerStat),1,0) - team["Frame"][i["Name"]].Text = "#{tscore}" - - UpdateMinimize! - - ---[[ - consider adding lock with wait for performance - sorts each of the team's player lists induvidually, adds up the team scores. - @Args: - tentries table of team entries ---]] -SortTeams = (tentries) -> - for _, val in ipairs tentries - table.sort val["MyPlayers"], PlayerSortFunction - AddTeamScores val - - table.sort tentries, TeamSortFunc - - ---[[ - base update for team mode, adds up the scores of all teams, sorts them, - then unrolls them into middleframes ---]] -TeamListModeUpdate = -> - RecreateScoreColumns PlayerFrames - SortTeams TeamFrames - if NeutralTeam - AddTeamScores NeutralTeam - --RecreateScoreColumns NeutralTeam['MyPlayers'] - - UnrollTeams TeamFrames, MiddleFrames - - ---[[ - finds previous team this player was on, and if it exists calls removeplayerfromteam - @Args - entry Player entry ---]] -FindRemovePlayerFromTeam = (entry) -> - if entry["MyTeam"] - for j, oldEntry in ipairs entry["MyTeam"]["MyPlayers"] - if oldEntry["Player"] == entry["Player"] - RemovePlayerFromTeam entry["MyTeam"], j - return - - elseif NeutralTeam - for j, oldEntry in ipairs NeutralTeam["MyPlayers"] - if oldEntry["Player"] == entry["Player"] - RemovePlayerFromTeam NeutralTeam, j - return - - - ---[[ - removes a single player from a given team (not usually called directly) - @Args: - teamEntry team entry to remove player from - index index of player in 'MyPlayers' list to remove ---]] -RemovePlayerFromTeam = (teamEntry, index) -> - table.remove teamEntry["MyPlayers"], index - --if teamEntry['AutoHide'] and #teamEntry['MyPlayers'] == 0 - if teamEntry == NeutralTeam and #teamEntry["MyPlayers"] == 0 - RemoveNeutralTeam! - - ---[[ - adds player entry entry to teamentry - removes them from any previous team - @Args: - teamEntry entry of team to add player to - entry player entry to add to this team ---]] -AddPlayerToTeam = (teamEntry, entry) -> - FindRemovePlayerFromTeam entry - table.insert teamEntry["MyPlayers"], entry - entry["MyTeam"] = teamEntry - if teamEntry["IsHidden"] - teamEntry["Frame"].Parent = ListFrame - AddMiddleBGFrame! - - teamEntry["IsHidden"] = false - - -SetPlayerToTeam = (entry) -> - FindRemovePlayerFromTeam entry - -- check to see if team exists, if it does add to that team - setToTeam = false - for _, tframe in ipairs TeamFrames - -- add my entry on the new team - if tframe["MyTeam"].TeamColor == entry["Player"].TeamColor - AddPlayerToTeam tframe, entry - setToTeam = true - - -- if player was set to an invalid team, then set it back to neutral - if not setToTeam and #(game.Teams\GetTeams!) > 0 - debugprint entry["Player"].Name .. "could not find team" - entry["MyTeam"] = nil - if not NeutralTeam - AddNeutralTeam! - else - AddPlayerToTeam NeutralTeam, entry - - - ---[[ - Note: another big one, consiter breaking up - called when any children of player changes - handles 'Neutral', teamColor, Name and MembershipType changes - @Args - entry Player entry changed - property name of property changed ---]] -PlayerChanged = (entry, property) -> - while PlayerChangedLock - debugprint "in playerchanged lock" - wait 1 / 30 - - PlayerChangedLock = true - if property == "Neutral" - -- if player changing to neutral - if entry["Player"].Neutral and #(game.Teams\GetTeams!) > 0 - debugprint entry["Player"].Name .. "setting to neutral" - FindRemovePlayerFromTeam entry - entry["MyTeam"] = nil - if not NeutralTeam - debugprint entry["Player"].Name .. "creating neutral team" - AddNeutralTeam! - else - debugprint entry["Player"].Name .. "adding to neutral team" - AddPlayerToTeam NeutralTeam, entry - - elseif #(game.Teams\GetTeams!) > 0 then -- else player switching to a team, or a weird edgecase - debugprint entry["Player"].Name .. "has been set non-neutral" - SetPlayerToTeam entry - - BaseUpdate! - elseif property == "TeamColor" and not entry["Player"].Neutral and entry["Player"] ~= entry["MyTeam"] - debugprint entry["Player"].Name .. "setting to new team" - SetPlayerToTeam entry - BaseUpdate! - elseif property == "Name" or property == "MembershipType" - entry["Frame"]\FindFirstChild"BCLabel".Image = getMembershipTypeIcon entry["Player"].MembershipType, entry["Player"].Name - entry["Frame"].Name = entry["Player"].Name - entry["Frame"].TitleFrame.Title.Text = entry["Player"].Name - if entry["Frame"].BCLabel.Image ~= "" - entry["Frame"].TitleFrame.Title.Position = UDim2.new 0.01, 30, 0.1, 0 - - if entry["Player"] == LocalPlayer - entry["Frame"].TitleFrame.DropShadow.Text = entry["Player"].Name - ChangeHeaderName entry["Player"].Name - - BaseUpdate! - - PlayerChangedLock = false - - -OnFriendshipChanged = (player, friendStatus) -> - Delay 0.5, -> - debugprint "friend status changed for: #{player.Name} #{friendStatus} vs #{GetFriendStatus player}" - - for _, entry in ipairs PlayerFrames - if entry["Player"] == player - nicon = getFriendStatusIcon friendStatus - if nicon == "" and entry["Frame"].FriendLabel.Image ~= "" - entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position - - UDim2.new 0, 17, 0, 0 - elseif nicon ~= "" and entry["Frame"].FriendLabel.Image == "" - entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + - UDim2.new 0, 17, 0, 0 - debugprint "confirmed status: #{player.Name}" - - entry["Frame"].FriendLabel.Image = nicon - return - -LocalPlayer.FriendStatusChanged\connect OnFriendshipChanged - ---[[ - adds a neutral team if nessisary - Note: a lot of redundant code here, might want to refactor to share a function with insertteamframe ---]] -AddNeutralTeam = -> - while NeutralTeamLock - debugprint "in neutral team 2 lock" - wait! - - NeutralTeamLock = true - - defaultTeam = Instance.new "Team" - defaultTeam.TeamColor = BrickColor.new "White" - defaultTeam.Name = "Neutral" - nentry = {} - nentry["MyTeam"] = defaultTeam - nentry["MyPlayers"] = {} - nentry["Frame"] = MiddleTemplate\Clone! - with n = nentry["Frame"] - WaitForChild(WaitForChild(n, "TitleFrame"), "Title").Text = defaultTeam.Name - .TitleFrame.Position = UDim2.new n.TitleFrame.Position.X.Scale, n.TitleFrame.Position.X.Offset, 0.1, 0 - .TitleFrame.Size = UDim2.new n.TitleFrame.Size.X.Scale, n.TitleFrame.Size.X.Offset, 0.8, 0 - .TitleFrame.Title.Font = "ArialBold" - .Position = UDim2.new(1, 0, (#MiddleFrames * n.Size.Y.Scale), 0) - WaitForChild(n, "ClickListener").MouseButton1Down\connect (nx, ny) -> - StartDrag nentry, nx, ny - - .ClickListener.BackgroundColor3 = Color3.new 1, 1, 1 - .ClickListener.BackgroundTransparency = 0.7 - .ClickListener.AutoButtonColor = false - - nentry["AutoHide"] = true - nentry["IsHidden"] = true - for _, i in pairs PlayerFrames - if i["Player"].Neutral or not i["MyTeam"] - AddPlayerToTeam nentry, i - - if #nentry["MyPlayers"] > 0 - NeutralTeam = nentry - UpdateMinimize! - BaseUpdate! - - NeutralTeamLock = false - - -RemoveNeutralTeam = -> - while NeutralTeamLock - debugprint "in neutral team lock" - wait! - - NeutralTeamLock = true - NeutralTeam["Frame"]\Destroy! - NeutralTeam = nil - RemoveMiddleBGFrame! - NeutralTeamLock = false - - ---[[ - ---]] -TeamScoreChanged = (entry, nscore) -> - WaitForChild(entry["Frame"], "PlayerScore").Text = "#{nscore}" - entry["TeamScore"] = nscore - ---[[ - called when child added to a team, used for autohide functionality - Note: still has teamscore, consiter removing ---]] -TeamChildAdded = (entry, nchild) -> - if nchild.Name == "AutoHide" - entry["AutoHide"] = true - elseif nchild.Name == "TeamScore" - WaitForChild(entry["Frame"], "PlayerScore").Text = "#{nchild.Value}" - entry["TeamScore"] = nchild.Value - nchild.Changed\connect -> - TeamScoreChanged entry, nchild.Value - - ---[[ - called when child added to a team, used for autohide functionality - Note: still has teamscore, consiter removing ---]] -TeamChildRemoved = (entry, nchild) -> - if nchild.Name == "AutoHide" - entry["AutoHide"] = false - elseif nchild.Name == "TeamScore" - WaitForChild(entry["Frame"], "PlayerScore").Text = "" - entry["TeamScore"] = nil - - -TeamChanged = (entry, property) -> - if property == "Name" - WaitForChild(WaitForChild(entry["Frame"], "TitleFrame"), "Title").Text = entry["MyTeam"].Name - elseif property == "TeamColor" - entry["Frame"].ClickListener.BackgroundColor3 = entry["MyTeam"].TeamColor.Color - - for _, i in pairs TeamFrames - if i["MyTeam"].TeamColor == entry["MyTeam"] - RemoveTeamFrame entry["MyTeam"] --NO DUPLICATE TEAMS! - - entry["MyPlayers"] = {} - - for _, i in pairs PlayerFrames - SetPlayerToTeam i - - BaseUpdate! - ---[[ - creates team entry and frame for this team, sets up listeners for this team - adds any players intended for this team,Creates neutral team if this is the first team added - Note: might be best to break this into multiple functions to simplify - @Args: - nteam new team object added ---]] -InsertTeamFrame = (nteam) -> - while AddingFrameLock - debugprint "in adding team frame lock" - wait 1 / 30 - - AddingFrameLock = true - --for _,i in pairs TeamFrames - - nentry = {} - with n = nentry["Frame"] - nentry["MyTeam"] = nteam - nentry["MyPlayers"] = {} - nentry["Frame"] = MiddleTemplate\Clone! - WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = nteam.Name - .TitleFrame.Title.Font = "ArialBold" - .TitleFrame.Title.FontSize = "Size18" - .TitleFrame.Position = UDim2.new( - .TitleFrame.Position.X.Scale, - .TitleFrame.Position.X.Offset, - 0.1, - 0 - ) - .TitleFrame.Size = UDim2.new( - .TitleFrame.Size.X.Scale, - .TitleFrame.Size.X.Offset, - 0.8, - 0 - ) - .Position = UDim2.new(1, 0, (#MiddleFrames * .Size.Y.Scale), 0) - WaitForChild(n, "ClickListener").MouseButton1Down\connect (nx, ny) -> - StartDrag nentry, nx, ny - - .ClickListener.BackgroundColor3 = nteam.TeamColor.Color - .ClickListener.BackgroundTransparency = 0.7 - .ClickListener.AutoButtonColor = false - AddId += 1 - nentry["ID"] = AddId - nentry["AutoHide"] = false - - if nteam\FindFirstChild "AutoHide" - nentry["AutoHide"] = true - - if nteam\FindFirstChild "TeamScore" - TeamChildAdded nentry, nteam.TeamScore - - nteam.ChildAdded\connect (nchild) -> TeamChildAdded nentry, nchild - nteam.ChildRemoved\connect (nchild) -> TeamChildRemoved nentry, nchild - nteam.Changed\connect (prop) -> TeamChanged nentry, prop - - for _, i in pairs PlayerFrames - if not i["Player"].Neutral and i["Player"].TeamColor == nteam.TeamColor - AddPlayerToTeam nentry, i - - nentry["IsHidden"] = false - if not nentry["AutoHide"] or #nentry["MyPlayers"] > 0 - .Parent = ListFrame - n\TweenPosition( - UDim2.new(0.5, 0, (#MiddleFrames * .Size.Y.Scale), 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - AddMiddleBGFrame! - else - nentry["IsHidden"] = true - .Parent = nil - - table.insert TeamFrames, nentry - UpdateMinimize! - BaseUpdate! - if #TeamFrames == 1 and not NeutralTeam - AddNeutralTeam! - - AddingFrameLock = false - ---[[ - removes team from team list - @Args: - nteam Teamobject to remove ---]] -RemoveTeamFrame = (nteam) -> - while AddingFrameLock - debugprint "in removing team frame lock" - wait 1 / 30 - - AddingFrameLock = true - -- if IsMinimized.Value - local myEntry - for i, key in ipairs TeamFrames - if nteam == key["MyTeam"] - myEntry = key - key["Frame"]\Destroy! - table.remove TeamFrames, i - - if #TeamFrames == 0 - debugprint "removeteamframe, remove neutral" - if NeutralTeam - RemoveNeutralTeam! - - for i, key in ipairs myEntry["MyPlayers"] - RemovePlayerFromTeam myEntry, i - PlayerChanged key, "TeamColor" - - RemoveMiddleBGFrame! - BaseUpdate! - AddingFrameLock = false - - -TeamAdded = (nteam) -> - InsertTeamFrame nteam - - -TeamRemoved = (nteam) -> - RemoveTeamFrame nteam - ---------------------------------- ---[[ - called when ANYTHING changes the state of the playerlist - re-sorts everything,assures correct positions of all elements ---]] -BaseUpdate = -> - while BaseUpdateLock - debugprint "in baseupdate lock" - wait 1 / 30 - - BaseUpdateLock = true - --print ('baseupdate') - UpdateStatNames! - - if #TeamFrames == 0 and not NeutralTeam - PlayerListModeUpdate! - else - TeamListModeUpdate! - - for i, key in ipairs MiddleFrames - if key.Parent? - key\TweenPosition( - UDim2.new(0.5, 0, ((#MiddleFrames - i) * key.Size.Y.Scale), 0), - "Out", - "Linear", - BASE_TWEEN, - true - ) - - if not IsMinimized.Value and #MiddleFrames > DefaultEntriesOnScreen - UpdateScrollPosition! - - UpdateMinimize! - - UpdateScrollBarSize! - UpdateScrollPosition! - - UpdateScrollBarVisibility! - --debugprint 'EndBaseUpdate' - BaseUpdateLock = false - - ---[[ - code for attaching tab key to maximizing player list ---]] -game.GuiService\AddKey "\t" -LastTabTime = time! -game.GuiService.KeyPressed\connect (key) -> - if key == "\t" - debugprint "caught tab key" - modalCheck, isModal = try - return game.GuiService.IsModalDialog - - if modalCheck == false or (modalCheck and isModal == false) - if time! - LastTabTime > 0.4 - LastTabTime = time! - if IsTabified.Value - if not IsMaximized.Value - ScreenGui\TweenPosition UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true - IsMaximized.Value = true - else - ScreenGui\TweenPosition( - UDim2.new(NormalBounds.X.Scale, NormalBounds.X.Offset - 10, 0, 0), - "Out", - "Linear", - BASE_TWEEN * 1.2, - true - ) - IsMaximized.Value = false - IsMinimized.Value = true - else - ToggleMaximize! - - -PlayersChildAdded = (tplayer) -> - if tplayer\IsA "Player" - Spawn -> - debugPlayerAdd tplayer - - else - BlowThisPopsicleStand! - - -coreGuiChanged = (coreGuiType, enabled) -> - if coreGuiType == Enum.CoreGuiType.All or coreGuiType == Enum.CoreGuiType.PlayerList - MainFrame.Visible = enabled - - -TeamsChildAdded = (nteam) -> - if nteam\IsA "Team" - TeamAdded nteam - else - BlowThisPopsicleStand! - - -TeamsChildRemoved = (nteam) -> - if nteam\IsA "Team" - TeamRemoved nteam - else - BlowThisPopsicleStand! - - ----------------------------- --- Hookups and initialization ----------------------------- -debugPlayerAdd = (p) -> - InsertPlayerFrame p - - -try - coreGuiChanged Enum.CoreGuiType.PlayerList, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.PlayerList - Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged - - -while not game\GetService "Teams" - wait 1 / 30 - debugprint "Waiting For Teams" - -for _, i in pairs game.Teams\GetTeams! - TeamAdded i - -for _, i in pairs Players\GetPlayers! - Spawn -> - debugPlayerAdd i - - -game.Teams.ChildAdded\connect TeamsChildAdded -game.Teams.ChildRemoved\connect TeamsChildRemoved -Players.ChildAdded\connect PlayersChildAdded - -InitReportAbuse! -AreNamesExpanded.Value = true -BaseUpdate! - ---UGGGLY,find a better way later -wait 2 -IsPersonalServer = not not game.Workspace\FindFirstChild "PSVariable" - ----------------------------- --- Running Logic ----------------------------- - ---debug stuffs, will only run for 'newplayerlistisbad' -if LocalPlayer.Name == "newplayerlistisbad" or LocalPlayer.Name == "imtotallyadmin" - debugFrame.Parent = ScreenGui - Spawn -> - while true - str_players = "" - for _, i in pairs game.Players\GetPlayers! - str_players ..= " #{i.Name}" - - debugplayers.Text = str_players - wait 0.5 diff --git a/yue/48488398.yue b/yue/48488398.yue deleted file mode 100644 index 04b2471..0000000 --- a/yue/48488398.yue +++ /dev/null @@ -1,295 +0,0 @@ -import "macros" as { $ } -$load $FILE - -waitForProperty = (instance, property) -> - until instance[property] - instance.Changed\wait! - -waitForChild = (instance, name) -> - until instance\FindFirstChild name - instance.ChildAdded\wait! - -waitForProperty game.Players, "LocalPlayer" -waitForChild script.Parent, "Popup" -waitForChild script.Parent.Popup, "AcceptButton" -script.Parent.Popup.AcceptButton.Modal = true - -localPlayer = game.Players.LocalPlayer -local teleportUI - -friendRequestBlacklist = {} - -teleportEnabled = true - -showOneButton = -> - with popup = script.Parent\FindFirstChild "Popup" - if popup - .OKButton.Visible = true - .DeclineButton.Visible = false - .AcceptButton.Visible = false - -showTwoButtons = -> - with popup = script.Parent\FindFirstChild "Popup" - if popup - .OKButton.Visible = false - .DeclineButton.Visible = true - .AcceptButton.Visible = true - -makePopupInvisible = -> - if script.Parent.Popup - script.Parent.Popup.Visible = false - -makeFriend = (fromPlayer, toPlayer) -> - popup = script.Parent\FindFirstChild "Popup" - return if popup == nil -- there is no popup! - return if popup.Visible -- currently popping something, abort! - return if friendRequestBlacklist[fromPlayer] -- previously cancelled friend request, we don't want it! - - with popup - .PopupText.Text = "Accept Friend Request from #{fromPlayer.Name}?" - .PopupImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?userId=#{fromPlayer.userId}&x=352&y=352" - - showTwoButtons! - .Visible = true - .AcceptButton.Text = "Accept" - .DeclineButton.Text = "Decline" - \TweenSize UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true - - local yesCon, noCon - - yesCon = popup.AcceptButton.MouseButton1Click\connect -> - popup.Visible = false - toPlayer\RequestFriendship fromPlayer - - yesCon?\disconnect! - noCon?\disconnect! - - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - - noCon = popup.DeclineButton.MouseButton1Click\connect -> - popup.Visible = false - toPlayer\RevokeFriendship fromPlayer - friendRequestBlacklist[fromPlayer] = true - print "pop up blacklist" - - yesCon?\disconnect! - noCon?\disconnect! - - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - -game.Players.FriendRequestEvent\connect (fromPlayer, toPlayer, event) -> - -- if this doesn't involve me, then do nothing - return if fromPlayer ~= localPlayer and toPlayer ~= localPlayer - - if fromPlayer == localPlayer - if event == Enum.FriendRequestEvent.Accept - game\GetService"GuiService"\SendNotification( - "You are Friends", - "With #{toPlayer.Name}!", - "http://www.roblox.com/thumbs/avatar.ashx?userId=#{toPlayer.userId}&x=48&y=48", - 5, - -> - ) - elseif toPlayer == localPlayer - if event == Enum.FriendRequestEvent.Issue - return if friendRequestBlacklist[fromPlayer] - -- previously cancelled friend request, we don't want it! - game\GetService"GuiService"\SendNotification( - "Friend Request", - "From #{fromPlayer.Name}", - "http://www.roblox.com/thumbs/avatar.ashx?userId=#{fromPlayer.userId}&x=48&y=48", - 8, - -> makeFriend fromPlayer, toPlayer - ) - elseif event == Enum.FriendRequestEvent.Accept - game\GetService"GuiService"\SendNotification( - "You are Friends", - "With #{fromPlayer.Name}!", - "http://www.roblox.com/thumbs/avatar.ashx?userId=#{fromPlayer.userId}&x=48&y=48", - 5, - -> - ) - -showTeleportUI = (message, timer) -> - - teleportUI?\Remove! - waitForChild localPlayer, "PlayerGui" - - with Instance.new "Message" - .Text = message - .Parent = localPlayer.PlayerGui - if timer > 0 - wait timer - \Remove! - -onTeleport = (teleportState, _, _) -> - if game\GetService"TeleportService".CustomizedTeleportUI == false - showTeleportUI switch teleportState - when Enum.TeleportState.Started - "Teleport started...", 0 - when Enum.TeleportState.WaitingForServer - "Requesting server...", 0 - when Enum.TeleportState.InProgress - "Teleporting...", 0 - when Enum.TeleportState.Failed - "Teleport failed. Insufficient privileges or target place does not exist.", 3 - -if teleportEnabled - localPlayer.OnTeleport\connect onTeleport - - game\GetService"TeleportService".ErrorCallback = (message) -> - popup = script.Parent\FindFirstChild "Popup" - showOneButton! - popup.PopupText.Text = message - local clickCon - clickCon = popup.OKButton.MouseButton1Click\connect -> - game\GetService"TeleportService"\TeleportCancel! - clickCon?\disconnect! - game.GuiService\RemoveCenterDialog script.Parent\FindFirstChild "Popup" - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - game.GuiService\AddCenterDialog( - script.Parent\FindFirstChild "Popup", - Enum.CenterDialogType.QuitDialog, - --ShowFunction - -> - showOneButton! - script.Parent\FindFirstChild"Popup".Visible = true - popup\TweenSize UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true - --HideFunction - -> - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - ) - game\GetService"TeleportService".ConfirmationCallback = (message, placeId, spawnName) -> - popup = script.Parent\FindFirstChild "Popup" - popup.PopupText.Text = message - popup.PopupImage.Image = "" - - local yesCon, noCon - - killCons = -> - yesCon?\disconnect! - noCon?\disconnect! - - game.GuiService\RemoveCenterDialog script.Parent\FindFirstChild "Popup" - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - - yesCon = popup.AcceptButton.MouseButton1Click\connect -> - killCons! - success, err = try - game\GetService"TeleportService"\TeleportImpl placeId, spawnName - if not success - showOneButton! - popup.PopupText.Text = err - clickCon = popup.OKButton.MouseButton1Click\connect -> - clickCon?\disconnect! - game.GuiService\RemoveCenterDialog script.Parent\FindFirstChild "Popup" - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - game.GuiService\AddCenterDialog( - script.Parent\FindFirstChild "Popup", - Enum.CenterDialogType.QuitDialog, - --ShowFunction - -> - showOneButton! - script.Parent\FindFirstChild"Popup".Visible = true - popup\TweenSize( - UDim2.new(0, 330, 0, 350), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true - ) - --HideFunction - -> - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - ) - - noCon = popup.DeclineButton.MouseButton1Click\connect -> - killCons! - try - game\GetService"TeleportService"\TeleportCancel! - - centerDialogSuccess = try - game.GuiService\AddCenterDialog( - script.Parent\FindFirstChild "Popup", - Enum.CenterDialogType.QuitDialog, - --ShowFunction - -> - showTwoButtons! - popup.AcceptButton.Text = "Leave" - popup.DeclineButton.Text = "Stay" - script.Parent\FindFirstChild"Popup".Visible = true - popup\TweenSize( - UDim2.new(0, 330, 0, 350), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true - ) - --HideFunction - -> - popup\TweenSize( - UDim2.new(0, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quart, - 1, - true, - makePopupInvisible! - ) - ) - - if centerDialogSuccess == false - script.Parent\FindFirstChild"Popup".Visible = true - popup.AcceptButton.Text = "Leave" - popup.DeclineButton.Text = "Stay" - popup\TweenSize UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true - - true diff --git a/yue/48488451.yue b/yue/48488451.yue deleted file mode 100644 index 1cc22fa..0000000 --- a/yue/48488451.yue +++ /dev/null @@ -1,90 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -popupFrame = New "Frame", "Popup" - Position: UDim2.new 0.5, -165, 0.5, -175 - Size: UDim2.new 0, 330, 0, 350 - Style: Enum.FrameStyle.RobloxRound - ZIndex: 4 - Visible: false - Parent: script.Parent - - * New "TextLabel", "PopupText" - Size: UDim2.new 1, 0, 0.8, 0 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size36 - BackgroundTransparency: 1 - Text: "Hello I'm a popup" - TextColor3: Color3.new 248 / 255, 248 / 255, 248 / 255 - TextWrap: true - ZIndex: 5 - - * New "TextButton", "AcceptButton" - Position: UDim2.new 0, 20, 0, 270 - Size: UDim2.new 0, 100, 0, 50 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size24 - Style: Enum.ButtonStyle.RobloxButton - TextColor3: Color3.new 248 / 255, 248 / 255, 248 / 255 - Text: "Yes" - ZIndex: 5 - - * New "ImageLabel", "PopupImage" - BackgroundTransparency: 1 - Position: UDim2.new 0.5, -140, 0, 0 - Size: UDim2.new 0, 280, 0, 280 - ZIndex: 3 - - * New "ImageLabel", "Backing" - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - Image: "http://banland.xyz/asset/?id=47574181" - ZIndex: 2 - -:AcceptButton = popupFrame - -with popupFrame\clone! - .Name = "Darken" - .Size = UDim2.new 1, 16, 1, 16 - .Position = UDim2.new 0, -8, 0, -8 - .ZIndex = 1 - .Parent = popupFrame - -with AcceptButton\clone! - .Name = "DeclineButton" - .Position = UDim2.new 1, -120, 0, 270 - .Text = "No" - .Parent = popupFrame - -with AcceptButton\clone! - .Name = "OKButton" - .Text = "OK" - .Position = UDim2.new 0.5, -50, 0, 270 - .Visible = false - .Parent = popupFrame - -script\remove! diff --git a/yue/53878047.yue b/yue/53878047.yue deleted file mode 100644 index 7a74345..0000000 --- a/yue/53878047.yue +++ /dev/null @@ -1,859 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- This script creates almost all gui elements found in the backpack (warning: there are a lot!) --- TODO: automate this process - -return if game.CoreGui.Version < 3 --- peace out if we aren't using the right client - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -gui = script.Parent - --- A couple of necessary functions -waitForChild = (instance, name) -> - until instance\FindFirstChild name - instance.ChildAdded\wait! - -waitForProperty = (instance, property) -> - until instance[property] - instance.Changed\wait! - -IsTouchDevice = -> - touchEnabled = false - try - touchEnabled = Game\GetService"UserInputService".TouchEnabled - touchEnabled - -IsPhone = -> - if gui.AbsoluteSize.Y <= 320 - true - else false - -waitForChild game, "Players" -waitForProperty game.Players, "LocalPlayer" - --- First up is the current loadout -CurrentLoadout = New "Frame", "CurrentLoadout" - Position: UDim2.new 0.5, -300, 1, -85 - Size: UDim2.new 0, 600, 0, 54 - BackgroundTransparency: 1 - RobloxLocked: true - Parent: gui - - * New "BoolValue", "Debounce" - RobloxLocked: true - - * New "ImageLabel", "Background" - Size: UDim2.new 1.2, 0, 1.2, 0 - Image: "http://banland.xyz/asset/?id=96536002" - BackgroundTransparency: 1 - Position: UDim2.new -0.1, 0, -0.1, 0 - ZIndex: 0.0 - Visible: false - - * New "ImageLabel" - Size: UDim2.new 1, 0, 0.025, 1 - Position: UDim2.new 0, 0, 0, 0 - Image: "http://banland.xyz/asset/?id=97662207" - BackgroundTransparency: 1 - -waitForChild gui, "ControlFrame" -New "ImageButton", "BackpackButton" - RobloxLocked: true - Visible: false - BackgroundTransparency: 1 - Image: "http://banland.xyz/asset/?id=97617958" - Position: UDim2.new 0.5, -60, 1, -108 - Size: UDim2.new 0, 120, 0, 18 - Parent: gui.ControlFrame - -NumSlots = 9 - -if IsPhone! - NumSlots = 3 - CurrentLoadout.Size = UDim2.new 0, 180, 0, 54 - CurrentLoadout.Position = UDim2.new 0.5, -90, 1, -85 - -for i = 0, NumSlots - slotFrame = New "Frame", "Slot#{i}" - RobloxLocked: true - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 1 - BorderColor3: Color3.new 1, 1, 1 - ZIndex: 4.0 - Position: UDim2.new if i == 0 - 0.9, 0, 0, 0 - else - (i - 1) * 0.1, (i - 1) * 6, 0, 0 - Size: UDim2.new 0, 54, 1, 0 - Parent: CurrentLoadout - - if gui.AbsoluteSize.Y <= 320 - slotFrame.Position = UDim2.new 0, (i - 1) * 60, 0, -50 - print "Well got here", slotFrame, slotFrame.Position.X.Scale, slotFrame.Position.X.Offset - - if i == 0 - slotFrame\Destroy! - -TempSlot = New "ImageButton", "TempSlot" - Active: true - Size: UDim2.new 1, 0, 1, 0 - BackgroundTransparency: 1 - Style: "Custom" - Visible: false - RobloxLocked: true - ZIndex: 3.0 - Parent: CurrentLoadout - - * New "ImageLabel", "Background" - BackgroundTransparency: 1 - Image: "http://banland.xyz/asset/?id=97613075" - Size: UDim2.new 1, 0, 1, 0 - - * New "ObjectValue", "GearReference" - RobloxLocked: true - - -- * New "ImageLabel", "Highlight" - -- BackgroundTransparency: 1 - -- Image: "http://banland.xyz/asset/?id=97643886" - -- Size: UDim2.new 1, 0, 1, 0 - -- Visible: false - - * New "TextLabel", "ToolTipLabel" - RobloxLocked: true - Text: "" - BackgroundTransparency: 0.5 - BorderSizePixel: 0 - Visible: false - TextColor3: Color3.new 1, 1, 1 - BackgroundColor3: Color3.new 0, 0, 0 - TextStrokeTransparency: 0 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size14 - Size: UDim2.new 1, 60, 0, 20 - Position: UDim2.new 0, -30, 0, -30 - --TextWrap: true - - * New "BoolValue", "Kill" - RobloxLocked: true - - * New "TextLabel", "GearText" - RobloxLocked: true - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size14 - Position: UDim2.new 0, -8, 0, -8 - Size: UDim2.new 1, 16, 1, 16 - Text: "" - TextColor3: Color3.new 1, 1, 1 - TextWrap: true - ZIndex: 5.0 - - * New "ImageLabel", "GearImage" - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 1, 0 - ZIndex: 5.0 - RobloxLocked: true - -SlotNumber = New "TextLabel", "SlotNumber" - BackgroundTransparency: 1 - BorderSizePixel: 0 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 0, 10, 0, 15 - TextColor3: Color3.new 1, 1, 1 - TextTransparency: 0 - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Bottom - RobloxLocked: true - Parent: TempSlot - ZIndex: 5 - -if IsTouchDevice! - SlotNumber.Visible = false - -SlotNumberDownShadow = with SlotNumber\Clone! - .Name = "SlotNumberDownShadow" - .TextColor3 = Color3.new 0, 0, 0 - .Position = UDim2.new 0, 1, 0, -1 - .Parent = TempSlot - .ZIndex = 2 - -with SlotNumberDownShadow\Clone! - .Name = "SlotNumberUpShadow" - .Position = UDim2.new 0, -1, 0, -1 - .Parent = TempSlot - ---- Great, now lets make the inventory! - -Backpack = New "Frame", "Backpack" - RobloxLocked: true - Visible: false - Position: UDim2.new 0.5, 0, 0.5, 0 - BackgroundColor3: Color3.new 32 / 255, 32 / 255, 32 / 255 - BackgroundTransparency: 0.0 - BorderSizePixel: 0 - Parent: gui - Active: true - - * New "BoolValue", "SwapSlot" - RobloxLocked: true - - * New "IntValue", "Slot" - RobloxLocked: true - - * New "ObjectValue", "GearButton" - RobloxLocked: true - - -- Generic Search gui used across backpack - * New "Frame", "SearchFrame" - RobloxLocked: true - BackgroundTransparency: 1 - Position: UDim2.new 1, -220, 0, 2 - Size: UDim2.new 0, 220, 0, 24 - - * New "ImageButton", "SearchButton" - RobloxLocked: true - Size: UDim2.new 0, 25, 0, 25 - BackgroundTransparency: 1 - Image: "rbxasset://textures/ui/SearchIcon.png" - - * New "TextButton", "ResetButton" - RobloxLocked: true - Visible: false - Position: UDim2.new 1, -26, 0, 3 - Size: UDim2.new 0, 20, 0, 20 - Style: Enum.ButtonStyle.RobloxButtonDefault - Text: "X" - TextColor3: Color3.new 1, 1, 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - ZIndex: 3 - - * New "TextButton", "SearchBoxFrame" - RobloxLocked: true - Position: UDim2.new 0, 25, 0, 0 - Size: UDim2.new 1, -28, 0, 26 - Text: "" - Style: Enum.ButtonStyle.RobloxButton - - * New "TextBox", "SearchBox" - RobloxLocked: true - BackgroundTransparency: 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size12 - Position: UDim2.new 0, -5, 0, -5 - Size: UDim2.new 1, 10, 1, 10 - TextColor3: Color3.new 1, 1, 1 - TextXAlignment: Enum.TextXAlignment.Left - ZIndex: 2 - TextWrap: true - Text: "Search..." - -Tabs = New "Frame", "Tabs" - Visible: false - Active: false - RobloxLocked: true - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.08 - BorderSizePixel: 0 - Position: UDim2.new 0, 0, -0.1, -4 - Size: UDim2.new 1, 0, 0.1, 4 - Parent: Backpack - - * New "Frame", "TabLine" - RobloxLocked: true - BackgroundColor3: Color3.new 53 / 255, 53 / 255, 53 / 255 - BorderSizePixel: 0 - Position: UDim2.new 0, 5, 1, -4 - Size: UDim2.new 1, -10, 0, 4 - ZIndex: 2 - - * New "TextButton", "InventoryButton" - RobloxLocked: true - Size: UDim2.new 0, 60, 0, 30 - Position: UDim2.new 0, 7, 1, -31 - BackgroundColor3: Color3.new 1, 1, 1 - BorderColor3: Color3.new 1, 1, 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Text: "Gear" - AutoButtonColor: false - TextColor3: Color3.new 0, 0, 0 - Selected: true - Active: true - ZIndex: 3 - - * New "TextButton", "CloseButton" - RobloxLocked: true - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size24 - Position: UDim2.new 1, -33, 0, 4 - Size: UDim2.new 0, 30, 0, 30 - Style: Enum.ButtonStyle.RobloxButton - Text: "" - TextColor3: Color3.new 1, 1, 1 - Modal: true - - * New "ImageLabel", "XImage" - RobloxLocked: true - Image: (-> - game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=75547445" - "http://banland.xyz/asset/?id=75547445" - )! --TODO: move to rbxasset - BackgroundTransparency: 1 - Position: UDim2.new -0.25, -1, -0.25, -1 - Size: UDim2.new 1.5, 2, 1.5, 2 - ZIndex: 2 - -if game.CoreGui.Version >= 8 - New "TextButton", "WardrobeButton" - RobloxLocked: true - Size: UDim2.new 0, 90, 0, 30 - Position: UDim2.new 0, 77, 1, -31 - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 1, 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Text: "Wardrobe" - AutoButtonColor: false - TextColor3: Color3.new 1, 1, 1 - Selected: false - Active: true - Parent: Tabs - -------------------------------- GEAR ------------------------------------------------------- -Gear = New "Frame", "Gear" - RobloxLocked: true - BackgroundTransparency: 1 - Size: UDim2.new 1, 0, 1, 0 - ClipsDescendants: true - Parent: Backpack - - * New "Frame", "AssetsList" - RobloxLocked: true - BackgroundTransparency: 1 - Size: UDim2.new 0.2, 0, 1, 0 - Style: Enum.FrameStyle.RobloxSquare - Visible: false - - * New "Frame", "GearGrid" - RobloxLocked: true - Size: UDim2.new 0.95, 0, 1, 0 - BackgroundTransparency: 1 - - * New "ImageButton", "GearButton" - RobloxLocked: true - Visible: false - Size: UDim2.new 0, 54, 0, 54 - Style: "Custom" - BackgroundTransparency: 1 - - * New "ImageLabel", "Background" - BackgroundTransparency: 1 - Image: "http://banland.xyz/asset/?id=97613075" - Size: UDim2.new 1, 0, 1, 0 - - * New "ObjectValue", "GearReference" - RobloxLocked: true - - * New "Frame", "GreyOutButton" - RobloxLocked: true - BackgroundTransparency: 0.5 - Size: UDim2.new 1, 0, 1, 0 - Active: true - Visible: false - ZIndex: 3 - - * New "TextLabel", "GearText" - RobloxLocked: true - BackgroundTransparency: 1 - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size14 - Position: UDim2.new 0, -8, 0, -8 - Size: UDim2.new 1, 16, 1, 16 - Text: "" - ZIndex: 2 - TextColor3: Color3.new 1, 1, 1 - TextWrap: true - -GearGridScrollingArea = New "Frame", "GearGridScrollingArea" - RobloxLocked: true - Position: UDim2.new 1, -19, 0, 35 - Size: UDim2.new 0, 17, 1, -45 - BackgroundTransparency: 1 - Parent: Gear - -GearLoadouts = New "Frame", "GearLoadouts" - RobloxLocked: true - BackgroundTransparency: 1 - Position: UDim2.new 0.7, 23, 0.5, 1 - Size: UDim2.new 0.3, -23, 0.5, -1 - Parent: Gear - Visible: false - - * New "Frame", "LoadoutsList" - RobloxLocked: true - Position: UDim2.new 0, 0, 0.15, 2 - Size: UDim2.new 1, -17, 0.85, -2 - Style: Enum.FrameStyle.RobloxSquare - - * New "Frame", "GearLoadoutsHeader" - RobloxLocked: true - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.2 - BorderColor3: Color3.new 1, 0, 0 - Size: UDim2.new 1, 2, 0.15, -1 - - * New "TextLabel", "LoadoutsHeaderText" - RobloxLocked: true - BackgroundTransparency: 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Size: UDim2.new 1, 0, 1, 0 - Text: "Loadouts" - TextColor3: Color3.new 1, 1, 1 - - -with GearGridScrollingArea\Clone! - .Name = "GearLoadoutsScrollingArea" - .RobloxLocked = true - .Position = UDim2.new 1, -15, 0.15, 2 - .Size = UDim2.new 0, 17, 0.85, -2 - .Parent = GearLoadouts - - -GearPreview = New "Frame", "GearPreview" - RobloxLocked: true - Position: UDim2.new 0.7, 23, 0, 0 - Size: UDim2.new 0.3, -28, 0.5, -1 - BackgroundTransparency: 1 - ZIndex: 7 - Parent: Gear - - * New "Frame", "GearStats" - RobloxLocked: true - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 0.75, 0 - Size: UDim2.new 1, 0, 0.25, 0 - ZIndex: 8 - - * New "TextLabel", "GearName" - RobloxLocked: true - BackgroundTransparency: 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, -3, 0, 0 - Size: UDim2.new 1, 6, 1, 5 - Text: "" - TextColor3: Color3.new 1, 1, 1 - TextWrap: true - ZIndex: 9 - - * New "ImageLabel", "GearImage" - RobloxLocked: true - Image: "" - BackgroundTransparency: 1 - Position: UDim2.new 0.125, 0, 0, 0 - Size: UDim2.new 0.75, 0, 0.75, 0 - ZIndex: 8 - - * New "Frame", "GearIcons" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - BorderSizePixel: 0 - RobloxLocked: true - Position: UDim2.new 0.4, 2, 0.85, -2 - Size: UDim2.new 0.6, 0, 0.15, 0 - Visible: false - ZIndex: 9 - - * New "ImageLabel", "GenreImage" - RobloxLocked: true - BackgroundColor3: Color3.new 102 / 255, 153 / 255, 1 - BackgroundTransparency: 0.5 - BorderSizePixel: 0 - Size: UDim2.new 0.25, 0, 1, 0 - -{ -- Destructure - :GearIcons - GearIcons: - :GenreImage -} = GearPreview.GearImage - -with GenreImage\Clone! - .Name = "AttributeOneImage" - .RobloxLocked = true - .BackgroundColor3 = Color3.new 1, 51 / 255, 0 - .Position = UDim2.new 0.25, 0, 0, 0 - .Parent = GearIcons - -with GenreImage\Clone! - .Name = "AttributeTwoImage" - .RobloxLocked = true - .BackgroundColor3 = Color3.new 153 / 255, 1, 153 / 255 - .Position = UDim2.new 0.5, 0, 0, 0 - .Parent = GearIcons - -with GenreImage\Clone! - .Name = "AttributeThreeImage" - .RobloxLocked = true - .BackgroundColor3 = Color3.new 0, 0.5, 0.5 - .Position = UDim2.new 0.75, 0, 0, 0 - .Parent = GearIcons - -------------------------------- WARDROBE ------------------------------------------------------- -if game.CoreGui.Version < 8 - -- no need for this to stick around, we aren't ready for wardrobe - script\remove! - return - -makeCharFrame = (frameName, parent) -> - New "Frame", "#{frameName}" - RobloxLocked: true - Size: UDim2.new 1, 0, 1, -70 - Position: UDim2.new 0, 0, 0, 20 - BackgroundTransparency: 1 - Parent: parent - Visible: false - -makeZone = (zoneName, image, size, position, parent) -> - New "ImageLabel", "#{zoneName}" - RobloxLocked: true - Image: image - Size: size - BackgroundTransparency: 1 - Position: position - Parent: parent - -makeStyledButton = (buttonName, size, position, parent, buttonStyle) -> - button = New "ImageButton", "#{buttonName}" - RobloxLocked: true - Size: size - Position: position - if buttonStyle - button.Style = buttonStyle - else - button.BackgroundColor3 = Color3.new 0, 0, 0 - button.BorderColor3 = Color3.new 1, 1, 1 - - button.Parent = parent - button - -makeTextLabel = (TextLabelName, text, position, parent) -> - New "TextLabel", TextLabelName, - RobloxLocked: true - BackgroundTransparency: 1 - Size: UDim2.new 0, 32, 0, 14 - Font: Enum.Font.Arial - TextColor3: Color3.new 1, 1, 1 - FontSize: Enum.FontSize.Size14 - Text: text - Position: position - Parent: parent - -Wardrobe = New "Frame", "Wardrobe" - RobloxLocked: true - BackgroundTransparency: 1 - Visible: false - Size: UDim2.new 1, 0, 1, 0 - Parent: Backpack - - * New "Frame", "AssetList" - RobloxLocked: true - Position: UDim2.new 0, 4, 0, 5 - Size: UDim2.new 0, 85, 1, -5 - BackgroundTransparency: 1 - Visible: true - - * New "TextButton", "PreviewButton" - RobloxLocked: true - Text: "Rotate" - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.5 - BorderColor3: Color3.new 1, 1, 1 - Position: UDim2.new 1.2, -62, 1, -50 - Size: UDim2.new 0, 125, 0, 50 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size24 - TextColor3: Color3.new 1, 1, 1 - TextWrapped: true - TextStrokeTransparency: 0 - -PreviewAssetFrame = New "Frame", "PreviewAssetFrame" - RobloxLocked: true - BackgroundTransparency: 1 - Position: UDim2.new 1, -240, 0, 30 - Size: UDim2.new 0, 250, 0, 250 - Parent: Wardrobe - -PreviewAssetBacking = New "TextButton", "PreviewAssetBacking" - RobloxLocked: true - Active: false - Text: "" - AutoButtonColor: false - Size: UDim2.new 1, 0, 1, 0 - Style: Enum.ButtonStyle.RobloxButton - Visible: false - ZIndex: 9 - Parent: PreviewAssetFrame - - * New "ImageLabel", "PreviewAssetImage" - RobloxLocked: true - BackgroundTransparency: 0.8 - Position: UDim2.new 0.5, -100, 0, 0 - Size: UDim2.new 0, 200, 0, 200 - BorderSizePixel: 0 - ZIndex: 10 - -AssetNameLabel = New "TextLabel", "AssetNameLabel" - RobloxLocked: true - BackgroundTransparency: 1 - Position: UDim2.new 0, 0, 1, -20 - Size: UDim2.new 0.5, 0, 0, 24 - ZIndex: 10 - Font: Enum.Font.Arial - Text: "" - TextColor3: Color3.new 1, 1, 1 - TextScaled: true - Parent: PreviewAssetBacking - -with AssetNameLabel\Clone! - .Name = "AssetTypeLabel" - .RobloxLocked = true - .TextScaled = false - .FontSize = Enum.FontSize.Size18 - .Position = UDim2.new 0.5, 3, 1, -20 - .Parent = PreviewAssetBacking - -CharacterPane = New "Frame", "CharacterPane" - RobloxLocked: true - Position: UDim2.new 1, -220, 0, 32 - Size: UDim2.new 0, 220, 1, -40 - BackgroundTransparency: 1 - Visible: true - Parent: Wardrobe - - -- Character Panel label (shows what category we are currently browsing) - * New "TextLabel", "CategoryLabel" - RobloxLocked: true - BackgroundTransparency: 1 - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Position: UDim2.new 0, 0, 0, -7 - Size: UDim2.new 1, 0, 0, 20 - TextXAlignment: Enum.TextXAlignment.Center - Text: "All" - TextColor3: Color3.new 1, 1, 1 - - --Save Button - * New "TextButton", "SaveButton" - RobloxLocked: true - Size: UDim2.new 0.6, 0, 0, 50 - Position: UDim2.new 0.2, 0, 1, -50 - Style: Enum.ButtonStyle.RobloxButton - Selected: false - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size18 - Text: "Save" - TextColor3: Color3.new 1, 1, 1 - ---CharacterPane Children -FaceFrame = makeCharFrame "FacesFrame", CharacterPane -game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=75460621" -makeZone( - "FaceZone", - "http://banland.xyz/asset/?id=75460621", - UDim2.new(0, 157, 0, 137), - UDim2.new(0.5, -78, 0.5, -68), - FaceFrame -) -makeStyledButton "Face", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -135), FaceFrame - -HeadFrame = makeCharFrame "HeadsFrame", CharacterPane -makeZone( - "FaceZone", - "http://banland.xyz/asset/?id=75460621", - UDim2.new(0, 157, 0, 137), - UDim2.new(0.5, -78, 0.5, -68), - HeadFrame -) -makeStyledButton "Head", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -135), HeadFrame - -HatsFrame = makeCharFrame "HatsFrame", CharacterPane -game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=75457888" -HatsZone = makeZone( - "HatsZone", - "http://banland.xyz/asset/?id=75457888", - UDim2.new(0, 186, 0, 184), - UDim2.new(0.5, -93, 0.5, -100), - HatsFrame -) -makeStyledButton( - "Hat1Button", - UDim2.new(0, 64, 0, 64), - UDim2.new(0, -1, 0, -1), - HatsZone, - Enum.ButtonStyle.RobloxButton -) -makeStyledButton( - "Hat2Button", - UDim2.new(0, 64, 0, 64), - UDim2.new(0, 63, 0, -1), - HatsZone, - Enum.ButtonStyle.RobloxButton -) -makeStyledButton( - "Hat3Button", - UDim2.new(0, 64, 0, 64), - UDim2.new(0, 127, 0, -1), - HatsZone, - Enum.ButtonStyle.RobloxButton -) - -PantsFrame = makeCharFrame "PantsFrame", CharacterPane -game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=75457920" -makeZone( - "PantsZone", - "http://banland.xyz/asset/?id=75457920", - UDim2.new(0, 121, 0, 99), - UDim2.new(0.5, -60, 0.5, -100), - PantsFrame -) - -pantFrame = New "Frame", "PantFrame" - RobloxLocked: true - Size: UDim2.new 0, 25, 0, 56 - Position: UDim2.new 0.5, -26, 0.5, 0 - BackgroundColor3: Color3.new 0, 0, 0 - BorderColor3: Color3.new 1, 1, 1 - Parent: PantsFrame - -with pantFrame\Clone! - .Position = UDim2.new 0.5, 3, 0.5, 0 - .RobloxLocked = true - .Parent = PantsFrame - -New "ImageButton", "CurrentPants" - RobloxLocked: true - BackgroundTransparency: 1 - ZIndex: 2 - Position: UDim2.new 0.5, -31, 0.5, -4 - Size: UDim2.new 0, 54, 0, 59 - Parent: PantsFrame - -MeshFrame = makeCharFrame "PackagesFrame", CharacterPane -torsoButton = makeStyledButton( - "TorsoMeshButton", - UDim2.new(0, 64, 0, 64), - UDim2.new(0.5, -32, 0.5, -110), - MeshFrame, - Enum.ButtonStyle.RobloxButton -) -makeTextLabel "TorsoLabel", "Torso", UDim2.new(0.5, -16, 0, -25), torsoButton -leftLegButton = makeStyledButton( - "LeftLegMeshButton", - UDim2.new(0, 64, 0, 64), - UDim2.new(0.5, 0, 0.5, -25), - MeshFrame, - Enum.ButtonStyle.RobloxButton -) -makeTextLabel "LeftLegLabel", "Left Leg", UDim2.new(0.5, -16, 0, -25), leftLegButton -rightLegButton = makeStyledButton( - "RightLegMeshButton", - UDim2.new(0, 64, 0, 64), - UDim2.new(0.5, -64, 0.5, -25), - MeshFrame, - Enum.ButtonStyle.RobloxButton -) -makeTextLabel "RightLegLabel", "Right Leg", UDim2.new(0.5, -16, 0, -25), rightLegButton -rightArmButton = makeStyledButton( - "RightArmMeshButton", - UDim2.new(0, 64, 0, 64), - UDim2.new(0.5, -96, 0.5, -110), - MeshFrame, - Enum.ButtonStyle.RobloxButton -) -makeTextLabel "RightArmLabel", "Right Arm", UDim2.new(0.5, -16, 0, -25), rightArmButton -leftArmButton = makeStyledButton( - "LeftArmMeshButton", - UDim2.new(0, 64, 0, 64), - UDim2.new(0.5, 32, 0.5, -110), - MeshFrame, - Enum.ButtonStyle.RobloxButton -) -makeTextLabel "LeftArmLabel", "Left Arm", UDim2.new(0.5, -16, 0, -25), leftArmButton - -TShirtFrame = makeCharFrame "T-ShirtsFrame", CharacterPane -game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=75460642" -makeZone( - "TShirtZone", - "http://banland.xyz/asset/?id=75460642", - UDim2.new(0, 121, 0, 154), - UDim2.new(0.5, -60, 0.5, -100), - TShirtFrame -) -makeStyledButton "TShirtButton", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -64), TShirtFrame - -ShirtFrame = makeCharFrame "ShirtsFrame", CharacterPane -makeZone( - "ShirtZone", - "http://banland.xyz/asset/?id=75460642", - UDim2.new(0, 121, 0, 154), - UDim2.new(0.5, -60, 0.5, -100), - ShirtFrame -) -makeStyledButton "ShirtButton", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -64), ShirtFrame - -ColorFrame = makeCharFrame "ColorFrame", CharacterPane -game\GetService"ContentProvider"\Preload "http://banland.xyz/asset/?id=76049888" -ColorZone = makeZone( - "ColorZone", - "http://banland.xyz/asset/?id=76049888", - UDim2.new(0, 120, 0, 150), - UDim2.new(0.5, -60, 0.5, -100), - ColorFrame -) -makeStyledButton("Head", UDim2.new(0.26, 0, 0.19, 0), UDim2.new(0.37, 0, 0.02, 0), ColorZone).AutoButtonColor \ -= makeStyledButton("LeftArm", UDim2.new(0.19, 0, 0.36, 0), UDim2.new(0.78, 0, 0.26, 0), ColorZone).AutoButtonColor \ -= makeStyledButton("RightArm", UDim2.new(0.19, 0, 0.36, 0), UDim2.new(0.025, 0, 0.26, 0), ColorZone).AutoButtonColor \ -= makeStyledButton("Torso", UDim2.new(0.43, 0, 0.36, 0), UDim2.new(0.28, 0, 0.26, 0), ColorZone).AutoButtonColor \ -= makeStyledButton("RightLeg", UDim2.new(0.19, 0, 0.31, 0), UDim2.new(0.275, 0, 0.67, 0), ColorZone).AutoButtonColor \ -= makeStyledButton("LeftLeg", UDim2.new(0.19, 0, 0.31, 0), UDim2.new(0.525, 0, 0.67, 0), ColorZone).AutoButtonColor \ -= false - --- no need for this to stick around - -script\Destroy! - --- I could probably make this entire thing into one massive --- fuckoff instance tree like the Typing Tester codebase, --- but it would probably break a lot of things - --- Heliodex diff --git a/yue/53878057.yue b/yue/53878057.yue deleted file mode 100644 index 01ab501..0000000 --- a/yue/53878057.yue +++ /dev/null @@ -1,1068 +0,0 @@ -import "macros" as { $ } -$load $FILE - -return if game.CoreGui.Version < 3 --- peace out if we aren't using the right client - --- A couple of necessary functions -waitForChild = (instance, name) -> - until instance\FindFirstChild name - instance.ChildAdded\wait! - instance\FindFirstChild name - -waitForProperty = (instance, property) -> - until instance[property] - instance.Changed\wait! - -currentLoadout = script.Parent -StaticTabName = "gear" -backpackEnabled = true - -robloxGui = game\GetService"CoreGui"\FindFirstChild "RobloxGui" -assert robloxGui -controlFrame = waitForChild robloxGui, "ControlFrame" -backpackButton = waitForChild controlFrame, "BackpackButton" -backpack = waitForChild robloxGui, "Backpack" -waitForChild robloxGui, "CurrentLoadout" -waitForChild robloxGui.CurrentLoadout, "TempSlot" -waitForChild robloxGui.CurrentLoadout.TempSlot, "SlotNumber" - -waitForChild currentLoadout, "Background" -clBackground = currentLoadout.Background - -IsTouchDevice = -> - touchEnabled = false - try - touchEnabled = Game\GetService"UserInputService".TouchEnabled - touchEnabled - - -moveHealthBar = (pGui) -> - waitForChild pGui, "HealthGUI" - waitForChild pGui["HealthGUI"], "tray" - tray = pGui["HealthGUI"]["tray"] - tray.Position = UDim2.new 0.5, -85, 1, -26 - - -setHealthBarVisible = (pGui, visible) -> - waitForChild pGui, "HealthGUI" - waitForChild pGui["HealthGUI"], "tray" - tray = pGui["HealthGUI"]["tray"] - tray.Visible = visible - - ---- Begin Locals -waitForChild game, "Players" -waitForProperty game.Players, "LocalPlayer" -player = game.Players.LocalPlayer - -waitForChild player, "PlayerGui" -Spawn -> - moveHealthBar player.PlayerGui - - -until player.Character? - wait 0.03 - -humanoid = waitForChild player.Character, "Humanoid" -humanoid.Died\connect -> - backpackButton.Visible = false - - -waitForChild game, "LocalBackpack" -game.LocalBackpack\SetOldSchoolBackpack false - -waitForChild currentLoadout.Parent, "Backpack" -guiBackpack = currentLoadout.Parent.Backpack - -backpackManager = waitForChild guiBackpack, "CoreScripts/BackpackScripts/BackpackManager" -backpackOpenEvent = waitForChild backpackManager, "BackpackOpenEvent" -backpackCloseEvent = waitForChild backpackManager, "BackpackCloseEvent" -tabClickedEvent = waitForChild backpackManager, "TabClickedEvent" --- resizeEvent = waitForChild backpackManager, "ResizeEvent") - -inGearTab = true - -maxNumLoadoutItems = 10 -if robloxGui.AbsoluteSize.Y <= 320 - maxNumLoadoutItems = 4 - -local characterChildAddedCon, backpackChildCon - -debounce = false - -enlargeFactor = 1.18 -buttonSizeEnlarge = UDim2.new 1 * enlargeFactor, 0, 1 * enlargeFactor, 0 -buttonSizeNormal = UDim2.new 1, 0, 1, 0 -enlargeOverride = true -guiTweenSpeed = 0.5 - -firstInstanceOfLoadout = false - -inventory = {} - -gearSlots = ["empty" for _ = 1, maxNumLoadoutItems] - -backpackWasOpened = false ---- End Locals - --- Begin Functions -backpackIsOpen = -> - if guiBackpack - return guiBackpack.Visible - false - -local reorganizeLoadout -kill = (prop, con, gear) -> - con?\disconnect! - - if prop == true and gear - reorganizeLoadout gear, false - - -registerNumberKeys = -> - for i = 0, 9 - game\GetService"GuiService"\AddKey "#{i}" - -unregisterNumberKeys = -> - try - for i = 0, 9 - game\GetService"GuiService"\RemoveKey "#{i}" - - -characterInWorkspace = -> - if game.Players["LocalPlayer"] and - game.Players.LocalPlayer["Character"] and - game.Players.LocalPlayer.Character? and - game.Players.LocalPlayer.Character.Parent? - - return true - false - - -removeGear = (gear) -> - local emptySlot - for i = 1, #gearSlots - if gearSlots[i] == gear and gear.Parent? - emptySlot = i - break - - - if emptySlot - with g = gearSlots[emptySlot].GearReference.Value - if g - if .Parent == game.Players.LocalPlayer.Character -- if we currently have this equipped, unequip it - .Parent = game.Players.LocalPlayer.Backpack - - - if \IsA"HopperBin" and - .Active - -- this is an active hopperbin - \Disable! - .Active = false - - gearSlots[emptySlot] = "empty" - - -- centerizeX = gear.Size.X.Scale / 2 - -- centerizeY = gear.Size.Y.Scale / 2 - --[[gear\TweenSizeAndPosition(UDim2.new 0,0,0,0, - UDim2.new(gear.Position.X.Scale + centerizeX,gear.Position.X.Offset,gear.Position.Y.Scale + centerizeY,gear.Position.Y.Offset), - Enum.EasingDirection.Out, Enum.EasingStyle.Quad,guiTweenSpeed/4,true)]] - delay 0, -> gear\remove! - - Spawn -> - while backpackIsOpen! - wait 0.03 - - waitForChild player, "Backpack" - allEmpty = true - for i in *gearSlots - if i ~= "empty" - allEmpty = false - break - - if allEmpty - if #player.Backpack\GetChildren! < 1 - backpackButton.Visible = false - else - backpackButton.Position = UDim2.new 0.5, -60, 1, -44 - - clBackground.Visible = false - - -insertGear = (gear, addToSlot) -> - local pos - if not addToSlot - for i = 1, #gearSlots - if gearSlots[i] == "empty" - pos = i - break - - if pos == 1 and gearSlots[1] ~= "empty" - gear\remove! - return - -- we are currently full, can't add in - else - pos = addToSlot - -- push all gear down one slot - start = 1 - for i = 1, #gearSlots - if gearSlots[i] == "empty" - start = i - break - - - for i = start, pos + 1, -1 - gearSlots[i] = gearSlots[i - 1] - gearSlots[i].SlotNumber.Text = \ - gearSlots[i].SlotNumberDownShadow.Text = \ - gearSlots[i].SlotNumberUpShadow.Text = if i == 10 - "0" - else - i - - - gearSlots[pos] = gear - if pos ~= maxNumLoadoutItems - if type"#{pos}" == "string" - posString = "#{pos}" - gear.SlotNumber.Text = \ - gear.SlotNumberDownShadow.Text = \ - gear.SlotNumberUpShadow.Text = posString - - else -- tenth gear doesn't follow mathematical pattern :( - gear.SlotNumber.Text = \ - gear.SlotNumberDownShadow.Text = \ - gear.SlotNumberUpShadow.Text = "0" - - gear.Visible = true - - con = gear.Kill.Changed\connect (prop) -> - kill prop, con, gear - - -reorganizeLoadout = (gear, inserting, _, addToSlot) -> - if inserting -- add in gear - insertGear gear, addToSlot - else - removeGear gear - - if gear ~= "empty" - gear.ZIndex = 1 - - -checkToolAncestry = (child, parent) -> - return if child\FindFirstChild "RobloxBuildTool" - -- don't show roblox build tools - if child\IsA"Tool" or child\IsA "HopperBin" - for i in *gearSlots - if i ~= "empty" and i.GearReference.Value == child - if parent == nil - i.Kill.Value = true - return false - elseif child.Parent == player.Character - i.Selected = true - return true - elseif child.Parent == player.Backpack - if child\IsA"Tool" or child\IsA "HopperBin" - i.Selected = false - - return true - - i.Kill.Value = true - return false - - -removeAllEquippedGear = (physGear) -> - stuff = player.Character\GetChildren! - for i in *stuff - if (i\IsA"Tool" or i\IsA"HopperBin") and i ~= physGear - if i\IsA "Tool" - i.Parent = player.Backpack - - if i\IsA "HopperBin" - i\Disable! - -normalizeButton = (button, speed) -> - return if not button - return if button.Size.Y.Scale <= 1 - return if button.Selected - return if not button.Parent - - moveSpeed = speed - if moveSpeed == nil or type(moveSpeed) ~= "number" - moveSpeed = guiTweenSpeed / 5 - - if button\FindFirstChild "Highlight" - button.Highlight.Visible = false - - if button\IsA"ImageButton" or button\IsA "TextButton" - button.ZIndex = 1 - centerizeX = -(buttonSizeNormal.X.Scale - button.Size.X.Scale) / 2 - centerizeY = -(buttonSizeNormal.Y.Scale - button.Size.Y.Scale) / 2 - button\TweenSizeAndPosition( - buttonSizeNormal, - UDim2.new( - button.Position.X.Scale + centerizeX, - button.Position.X.Offset, - button.Position.Y.Scale + centerizeY, - button.Position.Y.Offset - ), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - moveSpeed, - enlargeOverride - ) - -enlargeButton = (button) -> - return if button.Size.Y.Scale > 1 - return if not button.Parent - return if not button.Selected - - for i in *gearSlots - break if i == "empty" - - if i ~= button - normalizeButton i - - return if not enlargeOverride - - - if button\FindFirstChild "Highlight" - button.Highlight.Visible = true - - - if button\IsA"ImageButton" or button\IsA "TextButton" - button.ZIndex = 5 - centerizeX = -(buttonSizeEnlarge.X.Scale - button.Size.X.Scale) / 2 - centerizeY = -(buttonSizeEnlarge.Y.Scale - button.Size.Y.Scale) / 2 - button\TweenSizeAndPosition( - buttonSizeEnlarge, - UDim2.new( - button.Position.X.Scale + centerizeX, - button.Position.X.Offset, - button.Position.Y.Scale + centerizeY, - button.Position.Y.Offset - ), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - guiTweenSpeed / 5, - enlargeOverride - ) - -hopperBinSwitcher = (numKey, physGear) -> - return if not physGear - - physGear\ToggleSelect! - - return if gearSlots[numKey] == "empty" - - if not physGear.Active - gearSlots[numKey].Selected = false - normalizeButton gearSlots[numKey] - else - gearSlots[numKey].Selected = true - enlargeButton gearSlots[numKey] - - -toolSwitcher = (numKey) -> - return if not gearSlots[numKey] - - physGear = gearSlots[numKey].GearReference.Value - return if physGear == nil - - removeAllEquippedGear physGear -- we don't remove this gear, as then we get a double switcheroo - - key = numKey - if numKey == 0 - key = 10 - - - for i = 1, #gearSlots - if gearSlots[i] and gearSlots[i] ~= "empty" and i ~= key - normalizeButton gearSlots[i] - with gearSlots[i] - .Selected = false - if .GearReference and - .GearReference.Value and - .GearReference.Value\IsA"HopperBin" and - .GearReference.Value.Active - - .GearReference.Value\ToggleSelect! - - - if physGear\IsA "HopperBin" - hopperBinSwitcher numKey, physGear - else - if physGear.Parent == player.Character - physGear.Parent = player.Backpack - - if gearSlots[numKey] ~= "empty" - gearSlots[numKey].Selected = false - normalizeButton gearSlots[numKey] - - else - --player.Character.Humanoid\EquipTool physGear - - physGear.Parent = player.Character - gearSlots[numKey].Selected = true - - enlargeButton gearSlots[numKey] - - -activateGear = (num) -> - local numKey - numKey = if num == "0" - 10 -- why do lua indexes have to start at 1? :( - else - tonumber num - - return if numKey == nil - - if gearSlots[numKey] ~= "empty" - toolSwitcher numKey - - -normalizeAllButtons = -> - for i in *gearSlots - break if i == "empty" - if i ~= button - normalizeButton i, 0.1 - - -waitForDebounce = -> - while debounce - wait! - -pointInRectangle = (point, rectTopLeft, rectSize) -> - if (point.x > rectTopLeft.x and point.x < (rectTopLeft.x + rectSize.x)) or - (point.y > rectTopLeft.y and point.y < (rectTopLeft.y + rectSize.y)) - return true - false - -swapGear = (gearClone, toFrame) -> - toFrameChildren = toFrame\GetChildren! - if #toFrameChildren == 1 - if toFrameChildren[1]\FindFirstChild "SlotNumber" - toSlot = tonumber toFrameChildren[1].SlotNumber.Text - gearCloneSlot = tonumber gearClone.SlotNumber.Text - if toSlot == 0 - toSlot = 10 - - if gearCloneSlot == 0 - gearCloneSlot = 10 - - - gearSlots[toSlot] = gearClone - gearSlots[gearCloneSlot] = toFrameChildren[1] - - toFrameChildren[1].SlotNumber.Text = gearClone.SlotNumber.Text - toFrameChildren[1].SlotNumberDownShadow.Text = gearClone.SlotNumber.Text - toFrameChildren[1].SlotNumberUpShadow.Text = gearClone.SlotNumber.Text - - subString = string.sub toFrame.Name, 5 - gearClone.SlotNumber.Text = subString - gearClone.SlotNumberDownShadow.Text = subString - gearClone.SlotNumberUpShadow.Text = subString - - gearClone.Position = UDim2.new gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0 - toFrameChildren[1].Position = UDim2.new( - toFrameChildren[1].Position.X.Scale, 0, - toFrameChildren[1].Position.Y.Scale, 0 - ) - - toFrameChildren[1].Parent = gearClone.Parent - gearClone.Parent = toFrame - - else - slotNum = tonumber gearClone.SlotNumber.Text - if slotNum == 0 - slotNum = 10 - - gearSlots[slotNum] = "empty" -- reset this gear slot - - subString = string.sub toFrame.Name, 5 - gearClone.SlotNumber.Text = subString - gearClone.SlotNumberDownShadow.Text = subString - gearClone.SlotNumberUpShadow.Text = subString - - toSlotNum = tonumber gearClone.SlotNumber.Text - if toSlotNum == 0 - toSlotNum = 10 - - gearSlots[toSlotNum] = gearClone - gearClone.Position = UDim2.new gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0 - gearClone.Parent = toFrame - - -resolveDrag = (gearClone, x, y) -> - mousePoint = Vector2.new x, y - - frame = gearClone.Parent - frames = frame.Parent\GetChildren! - - for i in *frames - if i\IsA"Frame" and - pointInRectangle mousePoint, i.AbsolutePosition, i.AbsoluteSize - - swapGear gearClone, i - return true - - if (x < frame.AbsolutePosition.x or x > (frame.AbsolutePosition.x + frame.AbsoluteSize.x)) or - (y < frame.AbsolutePosition.y or y > (frame.AbsolutePosition.y + frame.AbsoluteSize.y)) - - reorganizeLoadout gearClone, false - return false - else - if dragBeginPos - gearClone.Position = dragBeginPos - - return -1 - - -unequipAllItems = (dontEquipThis) -> - for i in *gearSlots - break if i == "empty" - - if i.GearReference.Value and i.GearReference.Value ~= dontEquipThis - if i.GearReference.Value\IsA "HopperBin" - i.GearReference.Value\Disable! - elseif i.GearReference.Value\IsA "Tool" - i.GearReference.Value.Parent = game.Players.LocalPlayer.Backpack - - i.Selected = false - - -showToolTip = (button, tip) -> - if button and - button\FindFirstChild"ToolTipLabel" and - button.ToolTipLabel\IsA"TextLabel" and - not IsTouchDevice! - - button.ToolTipLabel.Text = "#{tip}" - xSize = button.ToolTipLabel.TextBounds.X + 6 - button.ToolTipLabel.Size = UDim2.new 0, xSize, 0, 20 - button.ToolTipLabel.Position = UDim2.new 0.5, -xSize / 2, 0, -30 - button.ToolTipLabel.Visible = true - - -hideToolTip = (button, _) -> - if button and button\FindFirstChild"ToolTipLabel" and button.ToolTipLabel\IsA "TextLabel" - button.ToolTipLabel.Visible = false - -removeFromInventory = (child) -> - for i = 1, #inventory - if inventory[i] == child - table.remove inventory, i - inventory[i] = nil - -addingPlayerChild = (child, equipped, addToSlot, inventoryGearButton) -> - waitForDebounce! - debounce = true - - if child\FindFirstChild"RobloxBuildTool" - debounce = false - return - -- don't show roblox build tools - if not child\IsA"Tool" and - not child\IsA "HopperBin" - - debounce = false - return -- we don't care about anything besides tools (sigh...) - - - if not addToSlot - for i in *gearSlots - if i ~= "empty" and i.GearReference.Value == child -- we already have gear, do nothing - debounce = false - return - - - gearClone = currentLoadout.TempSlot\clone! - gearClone.Name = child.Name - gearClone.GearImage.Image = child.TextureId - if gearClone.GearImage.Image == "" - gearClone.GearText.Text = child.Name - - gearClone.GearReference.Value = child - - gearClone.MouseEnter\connect -> - if gearClone.GearReference and - gearClone.GearReference.Value["ToolTip"] and - gearClone.GearReference.Value.ToolTip ~= "" - - showToolTip gearClone, gearClone.GearReference.Value.ToolTip - - - gearClone.MouseLeave\connect -> - if gearClone.GearReference and - gearClone.GearReference.Value["ToolTip"] and - gearClone.GearReference.Value.ToolTip ~= "" - - hideToolTip gearClone, gearClone.GearReference.Value.ToolTip - - - gearClone.RobloxLocked = true - - slotToMod = -1 - - if not addToSlot - for i = 1, #gearSlots - if gearSlots[i] == "empty" - slotToMod = i - break - - else - slotToMod = addToSlot - - - if slotToMod == -1 -- No available slot to add in! - debounce = false - return - - - slotNum = slotToMod % 10 - parent = currentLoadout\FindFirstChild "Slot#{slotNum}" - gearClone.Parent = parent - - if inventoryGearButton - absolutePositionFinal = inventoryGearButton.AbsolutePosition - currentAbsolutePosition = gearClone.AbsolutePosition - diff = absolutePositionFinal - currentAbsolutePosition - gearClone.Position = UDim2.new gearClone.Position.X.Scale, diff.x, gearClone.Position.Y.Scale, diff.y - gearClone.ZIndex = 4 - - - reorganizeLoadout gearClone, if addToSlot - true, equipped, addToSlot - else - true - - - if not gearClone.Parent? - debounce = false - return - -- couldn't fit in (hopper is full!) - - if equipped - gearClone.Selected = true - unequipAllItems child - delay guiTweenSpeed + 0.01, -> -- if our gear is equipped, we will want to enlarge it when done moving - if gearClone\FindFirstChild"GearReference" and ( - (gearClone.GearReference.Value\IsA"Tool" and gearClone.GearReference.Value.Parent == player.Character) or - (gearClone.GearReference.Value\IsA"HopperBin" and gearClone.GearReference.Value.Active == true) - ) - - enlargeButton gearClone - - - local dragBeginPos - local clickCon, buttonDeleteCon, mouseEnterCon, mouseLeaveCon, dragStop, dragBegin - clickCon = gearClone.MouseButton1Click\connect -> - if characterInWorkspace! - if not gearClone.Draggable - activateGear gearClone.SlotNumber.Text - - - mouseEnterCon = gearClone.MouseEnter\connect -> - if guiBackpack.Visible - gearClone.Draggable = true - - - dragBegin = gearClone.DragBegin\connect (pos) -> - dragBeginPos = pos - gearClone.ZIndex = 7 - children = gearClone\GetChildren! - for i in *children - if i\IsA "TextLabel" - i.ZIndex = if string.find i.Name, "Shadow" - 8 - else - 9 - - elseif i\IsA"Frame" or i\IsA "ImageLabel" - i.ZIndex = 7 - - - dragStop = gearClone.DragStopped\connect (x, y) -> - gearClone.ZIndex = if gearClone.Selected - 4 - else - 3 - - children = gearClone\GetChildren! - for i in *children - if i\IsA "TextLabel" - i.ZIndex = if string.find i.Name, "Shadow" - 3 - else - 4 - - elseif i\IsA"Frame" or i\IsA "ImageLabel" - i.ZIndex = 2 - - resolveDrag gearClone, x, y - - mouseLeaveCon = gearClone.MouseLeave\connect -> - gearClone.Draggable = false - - buttonDeleteCon = gearClone.AncestryChanged\connect -> - return if gearClone.Parent and gearClone.Parent.Parent == currentLoadout - - clickCon?\disconnect! - buttonDeleteCon?\disconnect! - mouseEnterCon?\disconnect! - mouseLeaveCon?\disconnect! - dragStop?\disconnect! - dragBegin?\disconnect! - -- this probably isn't necessary since objects are being deleted (probably), but this might still leak just in case - - local childCon - local childChangeCon - childCon = child.AncestryChanged\connect (newChild, parent) -> - if not checkToolAncestry newChild, parent - - childCon?\disconnect! - childChangeCon?\disconnect! - - removeFromInventory child - elseif parent == game.Players.LocalPlayer.Backpack - normalizeButton gearClone - - - childChangeCon = child.Changed\connect (prop) -> - if prop == "Name" - if gearClone and gearClone.GearImage.Image == "" - gearClone.GearText.Text = child.Name - - elseif prop == "Active" - if child and child\IsA "HopperBin" - if not child.Active - gearClone.Selected = false - normalizeButton gearClone - - - elseif prop == "TextureId" - gearClone.GearImage.Image = child.TextureId - - - debounce = false - - Spawn -> - while backpackIsOpen! - wait 0.03 - - for i in *gearSlots - if i ~= "empty" - backpackButton.Position = UDim2.new 0.5, -60, 1, -108 - if backpackEnabled - backpackButton.Visible = true - clBackground.Visible = true - - -addToInventory = (child) -> - return if not child\IsA"Tool" or not child\IsA "HopperBin" - - local slot - for i = 1, #inventory - return if inventory[i] and inventory[i] == child - - if not inventory[i] - slot = i - - if slot - inventory[slot] = child - elseif #inventory < 1 - inventory[1] = child - else - inventory[] = child - - -spreadOutGear = -> - loadoutChildren = currentLoadout\GetChildren! - - for i in *loadoutChildren - if i\IsA "Frame" - i.BackgroundTransparency = 0.5 - slot = tonumber string.sub i.Name, 5 - if slot == 0 - slot = 10 - - if robloxGui.AbsoluteSize.Y <= 320 - i\TweenPosition( - UDim2.new(0, (slot - 1) * 60, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - 0.25, - true - ) - else - i\TweenPosition( - UDim2.new((slot - 1) / 10, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - 0.25, - true - ) - - -centerGear = -> - loadoutChildren = currentLoadout\GetChildren! - gearButtons = {} - local lastSlotAdd - - for i in *loadoutChildren - if i\IsA "Frame" - if #i\GetChildren! > 0 - if i.Name == "Slot0" - lastSlotAdd = i - else - table.insert gearButtons, i - - i.BackgroundTransparency = 1 - - if lastSlotAdd - table.insert gearButtons, lastSlotAdd - - - startPos = (1 - (#gearButtons * 0.1)) / 2 - for i = 1, #gearButtons - if robloxGui.AbsoluteSize.Y <= 320 - startPos = 0.5 - (#gearButtons * 0.333) / 2 - gearButtons[i]\TweenPosition( - UDim2.new(startPos + (i - 1) * 0.33, 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - 0.25, - true - ) - else - gearButtons[i]\TweenPosition( - UDim2.new(startPos + ((i - 1) * 0.1), 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - 0.25, - true - ) - - -editLoadout = -> - backpackWasOpened = true - if inGearTab - spreadOutGear! - - -readonlyLoadout = -> - if not inGearTab - centerGear! - - -setupBackpackListener = -> - backpackChildCon?\disconnect! - backpackChildCon = nil - - backpackChildCon = player.Backpack.ChildAdded\connect (child) -> - if not firstInstanceOfLoadout - firstInstanceOfLoadout = true - if backpackEnabled - backpackButton.Visible = true - clBackground.Visible = true - - addingPlayerChild child - addToInventory child - - -playerCharacterChildAdded = (child) -> - addingPlayerChild child, true - addToInventory child - - -activateLoadout = -> - currentLoadout.Visible = true - - -deactivateLoadout = -> - currentLoadout.Visible = false - - -tabHandler = (inFocus) -> - inGearTab = inFocus - if inFocus - editLoadout! - else - readonlyLoadout! - - -coreGuiChanged = (coreGuiType, enabled) -> - if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All - backpackButton.Visible = enabled - clBackground.Visible = enabled - backpackEnabled = enabled - - if enabled - registerNumberKeys! - else - unregisterNumberKeys! - - - if coreGuiType == Enum.CoreGuiType.Health or coreGuiType == Enum.CoreGuiType.All - setHealthBarVisible game.Players.LocalPlayer.PlayerGui, enabled - - --- End Functions - --- Begin Script -registerNumberKeys! - -try - coreGuiChanged Enum.CoreGuiType.Backpack, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Backpack - coreGuiChanged Enum.CoreGuiType.Health, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Health - Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged - - -wait! -- let stuff initialize incase this is first heartbeat... - -waitForChild player, "Backpack" -waitForProperty player, "Character" - --- not sure why this had no delay but the player.CharacterAdded one had one... this type of error would be easier to avoid with function reusage -delay 1, -> - backpackChildren = player.Backpack\GetChildren! - size = math.min 10, #backpackChildren - for i = 1, size - if backpackEnabled - backpackButton.Visible = true - clBackground.Visible = true - - addingPlayerChild backpackChildren[i], false - - setupBackpackListener! - - -delay 2, -> - --while true - if not backpackWasOpened - if robloxGui.AbsoluteSize.Y <= 320 - for i in *currentLoadout\GetChildren! - slotNum = tonumber string.sub i.Name, 5, string.len i.Name - if type(slotNum) == "number" - i.Position = UDim2.new 0, (slotNum - 1) * 60, 0, 0 - - wait 0.25 - - -player.ChildAdded\connect (child) -> - if child\IsA "PlayerGui" - moveHealthBar child - - -waitForProperty player, "Character" -for _, v in ipairs player.Character\GetChildren! - playerCharacterChildAdded v - -characterChildAddedCon = player.Character.ChildAdded\connect (child) -> - playerCharacterChildAdded child - - -waitForChild player.Character, "Humanoid" -humanoidDiedCon = player.Character.Humanoid.Died\connect -> - humanoidDiedCon?\disconnect! - global humanoidDiedCon = nil - - deactivateLoadout! - backpackChildCon?\disconnect! - backpackChildCon = nil - - backpackWasOpened = false - - -player.CharacterRemoving\connect -> - for i in *gearSlots - if i ~= "empty" - i.Parent = nil - i = "empty" - - -player.CharacterAdded\connect -> - waitForProperty game.Players, "LocalPlayer" - player = game.Players.LocalPlayer -- make sure we are still looking at the correct character - waitForChild player, "Backpack" - - delay 1, -> - backpackChildren = player.Backpack\GetChildren! - size = math.min 10, #backpackChildren - for i = 1, size - if backpackEnabled - backpackButton.Visible = true - clBackground.Visible = true - - addingPlayerChild backpackChildren[i], false - setupBackpackListener! - activateLoadout! - - characterChildAddedCon?\disconnect! - - characterChildAddedCon = player.Character.ChildAdded\connect (child) -> - addingPlayerChild child, true - - - waitForChild player.Character, "Humanoid" - if backpack.Visible - backpackOpenEvent\Fire! - - humanoidDiedCon = player.Character.Humanoid.Died\connect -> - if backpackEnabled - backpackButton.Visible = false - clBackground.Visible = false - - firstInstanceOfLoadout = false - deactivateLoadout! - - humanoidDiedCon?\disconnect! - humanoidDiedCon = nil - - backpackChildCon?\disconnect! - backpackChildCon = nil - - - waitForChild player, "PlayerGui" - moveHealthBar player.PlayerGui - delay 2, -> - --while true - if (not backpackWasOpened) and - (robloxGui.AbsoluteSize.Y <= 320) - - cChildren = currentLoadout\GetChildren! - for i in *cChildren - slotNum = tonumber string.sub i.Name, 5, string.len i.Name - if type(slotNum) == "number" - i.Position = UDim2.new 0, (slotNum - 1) * 60, 0, 0 - - wait 0.25 - -waitForChild guiBackpack, "SwapSlot" -guiBackpack.SwapSlot.Changed\connect -> - if guiBackpack.SwapSlot.Value - swapSlot = guiBackpack.SwapSlot - pos = swapSlot.Slot.Value - if pos == 0 - pos = 10 - - if gearSlots[pos] - reorganizeLoadout gearSlots[pos], false - - if swapSlot.GearButton.Value - addingPlayerChild swapSlot.GearButton.Value.GearReference.Value, false, pos - - guiBackpack.SwapSlot.Value = false - - -game\GetService"GuiService".KeyPressed\connect (key) -> - if characterInWorkspace! - activateGear key - - -backpackOpenEvent.Event\connect editLoadout -backpackCloseEvent.Event\connect centerGear -tabClickedEvent.Event\connect (tabName) -> - tabHandler tabName == StaticTabName diff --git a/yue/59002209.yue b/yue/59002209.yue deleted file mode 100644 index d6be538..0000000 --- a/yue/59002209.yue +++ /dev/null @@ -1,2 +0,0 @@ -import "macros" as { $ } -$load $FILE diff --git a/yue/60595411.yue b/yue/60595411.yue deleted file mode 100644 index c065026..0000000 --- a/yue/60595411.yue +++ /dev/null @@ -1,965 +0,0 @@ -import "macros" as { $ } -$load $FILE - -t = {} - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- if a bit redundant due to the Create function at the bottom - ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------JSON Functions Begin---------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- - ---JSON Encoder and Parser for Lua 5.1 --- ---2007 Shaun Brown (http://www.chipmunkav.com) - -assert = assert -Null = -> Null - -StringBuilder = - buffer: {} - -StringBuilder.New ==> - o = <>: @ - @__index = @ - o.buffer = {} - o - - -StringBuilder.Append = (s) => - @buffer[] = s - - -StringBuilder.ToString ==> table.concat @buffer - - -JsonWriter = - backslashes: - ["\b"]: "\\b", - ["\t"]: "\\t", - ["\n"]: "\\n", - ["\f"]: "\\f", - ["\r"]: "\\r", - ['"']: '\\"', - ["\\"]: "\\\\", - ["/"]: "\\/", - -JsonWriter.New ==> - o = <>: @ - o.writer = StringBuilder\New! - @__index = @ - o - - -JsonWriter.Append = (s) => - @writer\Append s - - -JsonWriter.ToString ==> @writer\ToString! - - -JsonWriter.Write = (o) => - switch type o - when "nil" - @\WriteNil! - when "boolean", "number" - @\WriteString o - when "string" - @\ParseString o - when "table" - @\WriteTable o - when "function" - @\WriteFunction o - when "thread", "userdata" - @\WriteError o - -JsonWriter.WriteNil ==> @\Append "null" -JsonWriter.WriteString = (o) => @\Append "#{o}" - - -JsonWriter.ParseString = (s) => - @\Append '"' - @\Append string.gsub s, '[%z%c\\"/]', (n) -> - if c = @backslashes[n] - return c - - string.format "\\u%.4X", string.byte n - - @\Append '"' - - -JsonWriter.IsArray = (t) => - count = 0 - isindex = (k) -> - if type(k) == "number" and - k > 0 and - math.floor(k) == k - - return true - false - - for k, _ in pairs t - if not isindex k - return false, "{", "}" - else - count = math.max count, k - - true, "[", "]", count - - -JsonWriter.WriteTable = (t) => - ba, st, et, n = @\IsArray t - @\Append st - if ba - for i = 1, n - @\Write t[i] - if i < n - @\Append "," - - else - first = true - for k, v in pairs t - if not first - @\Append "," - - first = false - @\ParseString k - @\Append ":" - @\Write v - - - @\Append et - - -JsonWriter.WriteError = (o) => - error string.format "Encoding of %s unsupported", "#{o}" - - -JsonWriter.WriteFunction = (o) => - if o == Null - @\WriteNil! - else - @\WriteError o - - -StringReader = - s: "", - i: 0, - -StringReader.New = (s) => - o = <>: @ - @__index = @ - o.s = s or o.s - o - - -StringReader.Peek ==> - i = @i + 1 - if i <= #@s - return string.sub @s, i, i - nil - -StringReader.Next ==> - @i = @i + 1 - if @i <= #@s - return string.sub @s, @i, @i - nil - - -StringReader.All ==> @s - - -JsonReader = - escapes: - ["t"]: "\t", - ["n"]: "\n", - ["f"]: "\f", - ["r"]: "\r", - ["b"]: "\b", - -JsonReader.New = (s) => - o = <>: @ - o.reader = StringReader\New s - @__index = @ - o - - -JsonReader.Read ==> - @\SkipWhiteSpace! - peek = @\Peek! - return if peek == nil - error string.format "Nil string: '%s'", @\All! - elseif peek == "{" - @\ReadObject! - elseif peek == "[" - @\ReadArray! - elseif peek == '"' - @\ReadString! - elseif string.find peek, "[%+%-%d]" - @\ReadNumber! - elseif peek == "t" - @\ReadTrue! - elseif peek == "f" - @\ReadFalse! - elseif peek == "n" - @\ReadNull! - elseif peek == "/" - @\ReadComment! - @\Read! - else - nil - -JsonReader.ReadTrue ==> - @\TestReservedWord { 't', 'r', 'u', 'e' } - true - -JsonReader.ReadFalse ==> - @\TestReservedWord { 'f', 'a', 'l', 's', 'e' } - false - -JsonReader.ReadNull ==> - @\TestReservedWord { 'n', 'u', 'l', 'l' } - nil - -JsonReader.TestReservedWord = (t) => - for _, v in ipairs t - if @\Next! ~= v - error string.format "Error reading '%s': %s", table.concat(t), @\All! - - -JsonReader.ReadNumber ==> - result = @\Next! - peek = @\Peek! - while peek? and string.find peek, "[%+%-%d%.eE]" - result ..= @\Next! - peek = @\Peek! - - result = tonumber result - if result == nil - error string.format "Invalid number: '%s'", result - else - return result - - -JsonReader.ReadString ==> - result = "" - assert @\Next! == '"' - while @\Peek! ~= '"' - ch = @\Next! - if ch == "\\" - ch = @\Next! - if @escapes[ch] - ch = @escapes[ch] - - result ..= ch - - assert @\Next! == '"' - fromunicode = (m) -> string.char tonumber m, 16 - - string.gsub result, "u%x%x(%x%x)", fromunicode - - -JsonReader.ReadComment ==> - assert @\Next! == "/" - second = @\Next! - if second == "/" - @\ReadSingleLineComment! - elseif second == "*" - @\ReadBlockComment! - else - error string.format "Invalid comment: %s", @\All! - - -JsonReader.ReadBlockComment ==> - done = false - until done - ch = @\Next! - if ch == "*" and @\Peek! == "/" - done = true - - if not done and ch == "/" and @\Peek! == "*" - error string.format "Invalid comment: %s, '/*' illegal.", @\All! - - @\Next! - - -JsonReader.ReadSingleLineComment ==> - ch = @\Next! - while ch ~= "\r" and ch ~= "\n" - ch = @\Next! - - -JsonReader.ReadArray ==> - result = {} - assert @\Next! == "[" - done = false - if @\Peek! == "]" - done = true - - until done - item = @\Read! - result[] = item - @\SkipWhiteSpace! - if @\Peek! == "]" - done = true - - if not done - ch = @\Next! - if ch ~= "," - error string.format "Invalid array: '%s' due to: '%s'", @\All!, ch - - assert "]" == @\Next! - result - - -JsonReader.ReadObject ==> - result = {} - assert @\Next! == "{" - done = false - if @\Peek! == "}" - done = true - - until done - key = @\Read! - if type(key) ~= "string" - error string.format "Invalid non-string object key: %s", key - - @\SkipWhiteSpace! - ch = @\Next! - if ch ~= ":" - error string.format "Invalid object: '%s' due to: '%s'", @\All!, ch - - @\SkipWhiteSpace! - val = @\Read! - result[key] = val - @\SkipWhiteSpace! - if @\Peek! == "}" - done = true - - if not done - ch = @\Next! - if ch ~= "," - error string.format "Invalid array: '%s' near: '%s'", @\All!, ch - - - assert @\Next! == "}" - result - - -JsonReader.SkipWhiteSpace ==> - p = @\Peek! - while p? and string.find p, "[%s/]" - if p == "/" - @\ReadComment! - else - @\Next! - - p = @\Peek! - - -JsonReader.Peek ==> @reader\Peek! -JsonReader.Next ==> @reader\Next! -JsonReader.All ==> @reader\All! - -Encode = (o) -> - with JsonWriter\New! - \Write o - \ToString! - - -Decode = (s) -> - with JsonReader\New s - \Read! - --------------------- End JSON Parser ------------------------ - -t.DecodeJSON = (jsonString) -> - try - warn 'RbxUtility.DecodeJSON is deprecated, please use Game:GetService("HttpService"):JSONDecode() instead.' - - if type(jsonString) == "string" - return Decode jsonString - - print "RbxUtil.DecodeJSON expects string argument!" - nil - -t.EncodeJSON = (jsonTable) -> - try - warn 'RbxUtility.EncodeJSON is deprecated, please use Game:GetService("HttpService"):JSONEncode() instead.' - - Encode jsonTable - ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------Terrain Utilities Begin----------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ---makes a wedge at location x, y, z ---sets cell x, y, z to default material if parameter is provided, if not sets cell x, y, z to be whatever material it previously w ---returns true if made a wedge, false if the cell remains a block -t.MakeWedge = (x, y, z, _) -> game\GetService"Terrain"\AutoWedgeCell x, y, z - - -t.SelectTerrainRegion = (regionToSelect, color, selectEmptyCells, selectionParent) -> - terrain = game.Workspace\FindFirstChild "Terrain" - return if not terrain - - assert regionToSelect - assert color - - if not type(regionToSelect) == "Region3" - error "regionToSelect (first arg), should be of type Region3, but is type", type regionToSelect - - if not type(color) == "BrickColor" - error "color (second arg), should be of type BrickColor, but is type", type color - - - -- frequently used terrain calls (speeds up call, no lookup necessary) - GetCell = terrain.GetCell - WorldToCellPreferSolid = terrain.WorldToCellPreferSolid - CellCenterToWorld = terrain.CellCenterToWorld - emptyMaterial = Enum.CellMaterial.Empty - - -- container for all adornments, passed back to user - selectionContainer = New "Model", "SelectionContainer" - Archivable: false - Parent: selectiorParent or game.Workspace - - local updateSelection -- function we return to allow user to update selection - local currentKeepAliveTag -- a tag that determines whether adorns should be destroyed - aliveCounter = 0 -- helper for currentKeepAliveTag - local lastRegion -- used to stop updates that do nothing - adornments = {} -- contains all adornments - reusableAdorns = {} - - selectionPart = New "Part", "SelectionPart" - Transparency: 1 - Anchored: true - Locked: true - CanCollide: false - Size: Vector3.new 4.2, 4.2, 4.2 - - selectionBox = Instance.new "SelectionBox" - - -- srs translation from region3 to region3int16 - -- Region3ToRegion3int16 = (region3) -> - -- theLowVec = region3.CFrame.p - region3.Size / 2 + Vector3.new 2, 2, 2 - -- lowCell = WorldToCellPreferSolid terrain, theLowVec - - -- theHighVec = region3.CFrame.p + region3.Size / 2 - Vector3.new 2, 2, 2 - -- highCell = WorldToCellPreferSolid terrain, theHighVec - - -- highIntVec = Vector3int16.new highCell.x, highCell.y, highCell.z - -- lowIntVec = Vector3int16.new lowCell.x, lowCell.y, lowCell.z - - -- Region3int16.new lowIntVec, highIntVec - - -- helper function that creates the basis for a selection box - createAdornment = (theColor) -> - local selectionPartClone - local selectionBoxClone - - if #reusableAdorns > 0 - selectionPartClone = reusableAdorns[1]["part"] - selectionBoxClone = reusableAdorns[1]["box"] - table.remove reusableAdorns, 1 - - selectionBoxClone.Visible = true - else - selectionPartClone = selectionPart\Clone! - selectionPartClone.Archivable = false - - selectionBoxClone = selectionBox\Clone! - - with selectionBoxClone - .Archivable = false - .Adornee = selectionPartClone - .Parent = selectionContainer - .Adornee = selectionPartClone - .Parent = selectionContainer - - - if theColor - selectionBoxClone.Color = theColor - - selectionPartClone, selectionBoxClone - - -- iterates through all current adornments and deletes any that don't have latest tag - cleanUpAdornments = -> - for cellPos, adornTable in pairs adornments - if adornTable.KeepAlive ~= currentKeepAliveTag -- old news, we should get rid of this - adornTable.SelectionBox.Visible = false - table.insert reusableAdorns, part: adornTable.SelectionPart, box: adornTable.SelectionBox - adornments[cellPos] = nil - - - -- helper function to update tag - incrementAliveCounter = -> - aliveCounter += 1 - if aliveCounter > 1000000 - aliveCounter = 0 - - aliveCounter - - -- finds full cells in region and adorns each cell with a box, with the argument color - adornFullCellsInRegion = (region, color) -> - regionBegin = region.CFrame.p - region.Size / 2 + Vector3.new 2, 2, 2 - regionEnd = region.CFrame.p + region.Size / 2 - Vector3.new 2, 2, 2 - - cellPosBegin = WorldToCellPreferSolid terrain, regionBegin - cellPosEnd = WorldToCellPreferSolid terrain, regionEnd - - currentKeepAliveTag = incrementAliveCounter! - for y = cellPosBegin.y, cellPosEnd.y - for z = cellPosBegin.z, cellPosEnd.z - for x = cellPosBegin.x, cellPosEnd.x - cellMaterial = GetCell terrain, x, y, z - - if cellMaterial ~= emptyMaterial - cframePos = CellCenterToWorld terrain, x, y, z - cellPos = Vector3int16.new x, y, z - - updated = false - for cellPosAdorn, adornTable in pairs adornments - if cellPosAdorn == cellPos - adornTable.KeepAlive = currentKeepAliveTag - if color - adornTable.SelectionBox.Color = color - - updated = true - break - - - if not updated - selectionPart2, selectionBox2 = createAdornment color - selectionPart2.Size = Vector3.new 4, 4, 4 - selectionPart2.CFrame = CFrame.new cframePos - adornTable = - SelectionPart: selectionPart2 - SelectionBox: selectionBox2 - KeepAlive: currentKeepAliveTag - - adornments[cellPos] = adornTable - - cleanUpAdornments! - - - ------------------------------------- setup code ------------------------------ - lastRegion = regionToSelect - - if selectEmptyCells -- use one big selection to represent the area selected - selectionPart, selectionBox = createAdornment color - - selectionPart.Size = regionToSelect.Size - selectionPart.CFrame = regionToSelect.CFrame - - adornments.SelectionPart = selectionPart - adornments.SelectionBox = selectionBox - - updateSelection = (newRegion, color) -> - if newRegion and newRegion ~= lastRegion - lastRegion = newRegion - selectionPart.Size = newRegion.Size - selectionPart.CFrame = newRegion.CFrame - - if color - selectionBox.Color = color - - - else -- use individual cell adorns to represent the area selected - adornFullCellsInRegion regionToSelect, color - updateSelection = (newRegion, color) -> - if newRegion and newRegion ~= lastRegion - lastRegion = newRegion - adornFullCellsInRegion newRegion, color - - - destroyFunc = -> - updateSelection = nil - selectionContainer?\Destroy! - - adornments = nil - - updateSelection, destroyFunc - - ------------------------------Terrain Utilities End----------------------------- - ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------Signal class begin------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ---[[ -A 'Signal' object identical to the internal RBXScriptSignal object in it's public API and semantics. This function -can be used to create "custom events" for user-made code. -API: -Method \connect function handler - Arguments: The function to connect to. - Returns: A new connection object which can be used to disconnect the connection - Description: Connects this signal to the function specified by |handler|. That is, when |fire ...| is called for - the signal the |handler| will be called with the arguments given to |fire ...|. Note, the functions - connected to a signal are called in NO PARTICULAR ORDER, so connecting one function after another does - NOT mean that the first will be called before the second as a result of a call to |fire|. - -Method \disconnect! - Arguments: None - Returns: None - Description: Disconnects all of the functions connected to this signal. - -Method \fire ... - Arguments: Any arguments are accepted - Returns: None - Description: Calls all of the currently connected functions with the given arguments. - -Method \wait! - Arguments: None - Returns: The arguments given to fire - Description: This call blocks until -]] - -t.CreateSignal = -> - this = {} - - mBindableEvent = Instance.new "BindableEvent" - mAllCns = {} --all connection objects returned by mBindableEvent::connect - - --main functions - this.connect = (func) => - if @ ~= this - error "connect must be called with `:`, not `.`", 2 - - if type(func) ~= "function" - error "Argument #1 of connect must be a function, got a #{type func}" , 2 - - cn = mBindableEvent.Event\connect func - mAllCns[cn] = true - pubCn = {} - pubCn.disconnect ==> - cn\disconnect! - mAllCns[cn] = nil - - pubCn.Disconnect = pubCn.disconnect - pubCn - - this.disconnect ==> - if @ ~= this - error "disconnect must be called with `:`, not `.`", 2 - - for cn, _ in pairs mAllCns - cn\disconnect! - mAllCns[cn] = nil - - this.wait ==> - if @ ~= this - error "wait must be called with `:`, not `.`", 2 - - mBindableEvent.Event\wait! - - - this.fire = (...) => - if @ ~= this - error "fire must be called with `:`, not `.`", 2 - - mBindableEvent\Fire ... - - this.Connect = this.connect - this.Disconnect = this.disconnect - this.Wait = this.wait - this.Fire = this.fire - this - - -------------------------------------------------- Signal class End ------------------------------------------------------ - --- this 1s my favourite (heliodex) ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------Create Function Begins--------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ---[[ -A "Create" function for easy creation of Roblox instances. The function accepts a string which is the classname of -the object to be created. The function then returns another function which either accepts accepts no arguments, in -which case it simply creates an object of the given type, or a table argument that may contain several types of data, -in which case it mutates the object in varying ways depending on the nature of the aggregate data. These are the -type of data and what operation each will perform: -1) A string key mapping to some value: - Key-Value pairs in this form will be treated as properties of the object, and will be assigned in NO PARTICULAR - ORDER. If the order in which properties is assigned matter, then they must be assigned somewhere else than the - |Create| call's body. - -2) An integral key mapping to another Instance: - Normal numeric keys mapping to Instances will be treated as children if the object being created, and will be - parented to it. This allows nice recursive calls to Create to create a whole hierarchy of objects without a - need for temporary variables to store references to those objects. - -3) A key which is a value returned from Create.Event( eventname ), and a value which is a function function - The Create.E( string ) function provides a limited way to connect to signals inside of a Create hierarchy - for those who really want such a functionality. The name of the event whose name is passed to - Create.E( string ) - -4) A key which is the Create function itself, and a value which is a function - The function will be run with the argument of the object itself after all other initialization of the object is - done by create. This provides a way to do arbitrary things involving the object from withing the create - hierarchy. - Note: This function is called SYNCHRONOUSLY, that means that you should only so initialization in - it, not stuff which requires waiting, as the Create call will block until it returns. While waiting in the - constructor callback function is possible, it is probably not a good design choice. - Note: Since the constructor function is called after all other initialization, a Create block cannot have two - constructor functions, as it would not be possible to call both of them last, also, this would be unnecessary. - - -Some example usages: - -A simple example which uses the Create function to create a model object and assign two of it's properties. -model = Create'Model'{ - Name = 'A New model', - Parent = game.Workspace, -} - - -An example where a larger hierarchy of object is made. After the call the hierarchy will look like this: -Model_Container - |-ObjectValue - | | - | `-BoolValueChild - `-IntValue - -model = Create'Model'{ - Name = 'Model_Container', - Create'ObjectValue'{ - Create'BoolValue'{ - Name = 'BoolValueChild', - }, - }, - Create'IntValue'{}, -} - - -An example using the event syntax: - -part = Create'Part'{ - [Create.E'Touched'] = function(part) - print("I was touched by "..part.Name) - end, -} - - -An example using the general constructor syntax: - -model = Create'Part'{ - [Create] = function this - print("Constructor running!") - this.Name = GetGlobalFoosAndBars(this) - end, -} - - -Note: It is also perfectly legal to save a reference to the function returned by a call Create, this will not cause - any unexpected behavior. EG: - partCreatingFunction = Create'Part' - part = partCreatingFunction() -]] - ---the Create function need to be created as a functor, not a function, in order to support the Create.E syntax, so it ---will be created in several steps rather than as a single function declaration. -Create_PrivImpl = (objectType) -> - if type(objectType) ~= "string" - error "Argument of Create must be a string", 2 - - --return the proxy function that gives us the nice Create'string'{data} syntax - --The first function call is a function call using Lua's single-string-argument syntax - --The second function call is using Lua's single-table-argument syntax - --Both can be chained together for the nice effect. - (dat) -> - --default to nothing, to handle the no argument given case - dat or= {} - - --make the object to mutate - obj = Instance.new objectType - local parent - - --stored constructor function to be called after other initialization - local ctor - - for k, v in pairs dat - --add property - if type(k) == "string" - if k == "Parent" - -- Parent should always be set last, setting the Parent of a new object - -- immediately makes performance worse for all subsequent property updates. - parent = v - else - obj[k] = v - - --add child - elseif type(k) == "number" - if type(v) ~= "userdata" - error "Bad entry in Create body: Numeric keys must be paired with children, got a: #{type v}", 2 - - v.Parent = obj - - --event connect - elseif type(k) == "table" and k.__eventname - if type(v) ~= "function" - error "Bad entry in Create body: Key `[Create.E'#{k.__eventname}']` must have a function value, got: #{v}", 2 - - obj[k.__eventname]\connect v - - --define constructor function - elseif k == t.Create - if type(v) ~= "function" - error "Bad entry in Create body: Key `[Create]` should be paired with a constructor function, got: #{v}", 2 - - elseif ctor - --ctor already exists, only one allowed - error "Bad entry in Create body: Only one constructor function is allowed", 2 - - ctor = v - else - error "Bad entry (#{k} => #{v}) in Create body", 2 - - - --apply constructor function if it exists - ctor? obj - - if parent - obj.Parent = parent - - --return the completed object - obj - - ---now, create the functor: -t.Create = <"__call">: (_, ...) -> Create_PrivImpl ... - ---and create the "Event.E" syntax stub. Really it's just a stub to construct a table which our Create ---function can recognize as special. -t.Create.E = (eventName) -> __eventname: eventName - --------------------------------------------------Create function End---------------------------------------------------- - ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------Documentation Begin----------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- - -t.Help = (funcNameOrFunc) -> - switch funcNameOrFunc - --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - when "DecodeJSON", t.DecodeJSON - "Function DecodeJSON. " .. - "Arguments: (string). " .. - "Side effect: returns a table with all parsed JSON values" - - when "EncodeJSON", t.EncodeJSON - "Function EncodeJSON. " .. - "Arguments: (table). " .. - "Side effect: returns a string composed of argument table in JSON data format" - - when "MakeWedge", t.MakeWedge - "Function MakeWedge. " .. - "Arguments: (x, y, z, [default material]). " .. - "Description: Makes a wedge at location x, y, z. Sets cell x, y, z to default material if " .. - "parameter is provided, if not sets cell x, y, z to be whatever material it previously was. " .. - "Returns true if made a wedge, false if the cell remains a block " - - when "SelectTerrainRegion", t.SelectTerrainRegion - "Function SelectTerrainRegion. " .. - "Arguments: (regionToSelect, color, selectEmptyCells, selectionParent). " .. - "Description: Selects all terrain via a series of selection boxes within the regionToSelect " .. - "(this should be a region3 value). The selection box color is detemined by the color argument " .. - "(should be a brickcolor value). SelectionParent is the parent that the selection model gets placed to (optional)." .. - "SelectEmptyCells is bool, when true will select all cells in the " .. - "region, otherwise we only select non-empty cells. Returns a function that can update the selection," .. - "arguments to said function are a new region3 to select, and the adornment color (color arg is optional). " .. - "Also returns a second function that takes no arguments and destroys the selection" - - when "CreateSignal", t.CreateSignal - "Function CreateSignal. " .. - "Arguments: None. " .. - "Returns: The newly created Signal object. This object is identical to the RBXScriptSignal class " .. - "used for events in Objects, but is a Lua-side object so it can be used to create custom events in" .. - "Lua code. " .. - "Methods of the Signal object: :connect, :wait, :fire, :disconnect. " .. - "For more info you can pass the method name to the Help function, or view the wiki page " .. - "for this library. EG: Help('Signal:connect')." - - when "Signal:connect" - "Method Signal:connect. " .. - "Arguments: (function handler). " .. - "Return: A connection object which can be used to disconnect the connection to this handler. " .. - "Description: Connectes a handler function to this Signal, so that when |fire| is called the " .. - "handler function will be called with the arguments passed to |fire|." - - when "Signal:wait" - "Method Signal:wait. " .. - "Arguments: None. " .. - "Returns: The arguments passed to the next call to |fire|. " .. - "Description: This call does not return until the next call to |fire| is made, at which point it " .. - "will return the values which were passed as arguments to that |fire| call." - - when "Signal:fire" - "Method Signal:fire. " .. - "Arguments: Any number of arguments of any type. " .. - "Returns: None. " .. - "Description: This call will invoke any connected handler functions, and notify any waiting code " .. - "attached to this Signal to continue, with the arguments passed to this function. Note: The calls " .. - "to handlers are made asynchronously, so this call will return immediately regardless of how long " .. - "it takes the connected handler functions to complete." - - when "Signal:disconnect" - "Method Signal:disconnect. " .. - "Arguments: None. " .. - "Returns: None. " .. - "Description: This call disconnects all handlers attacched to this function, note however, it " .. - "does NOT make waiting code continue, as is the behavior of normal Roblox events. This method " .. - "can also be called on the connection object which is returned from Signal:connect to only " .. - "disconnect a single handler, as opposed to this method, which will disconnect all handlers." - - when "Create" - "Function Create. " .. - "Arguments: A table containing information about how to construct a collection of objects. " .. - "Returns: The constructed objects. " .. - "Descrition: Create is a very powerfull function, whose description is too long to fit here, and " .. - "is best described via example, please see the wiki page for a description of how to use it." - ---------------------------------------------Documentation Ends---------------------------------------------------------- - -t diff --git a/yue/60595695.yue b/yue/60595695.yue deleted file mode 100644 index 9362a40..0000000 --- a/yue/60595695.yue +++ /dev/null @@ -1,29 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Library Registration Script --- This script is used to register RbxLua libraries on game servers, so game scripts have --- access to all of the libraries (otherwise only local scripts do) - -deepakTestingPlace = 3569749 -sc = game\GetService "ScriptContext" -tries = 0 - -until sc or tries > 2 - tries += 1 - sc = game\GetService "ScriptContext" - wait 0.2 - -with sc do if sc - \RegisterLibrary "Libraries/RbxGui", "45284430" - \RegisterLibrary "Libraries/RbxGear", "45374389" - - if game.PlaceId == deepakTestingPlace - \RegisterLibrary "Libraries/RbxStatus", "52177566" - - \RegisterLibrary "Libraries/RbxUtility", "60595411" - \RegisterLibrary "Libraries/RbxStamper", "73157242" - \LibraryRegistrationComplete! - -else - print "failed to find script context, libraries did not load" diff --git a/yue/73157242.yue b/yue/73157242.yue deleted file mode 100644 index 282ad0e..0000000 --- a/yue/73157242.yue +++ /dev/null @@ -1,2338 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - -t = {} - --- waitForChild = (instance, name) -> --- while not instance\FindFirstChild name --- instance.ChildAdded\wait! --- end --- end - --- Do a line/plane intersection. The line starts at the camera. The plane is at y == 0, normal 0, 1, 0 --- --- vectorPos - End point of the line. --- --- Return: --- cellPos - The terrain cell intersection point if there is one, vectorPos if there isn't. --- hit - Whether there was a plane intersection. Value is true if there was, false if not. -PlaneIntersection = (vectorPos) -> - hit = false - currCamera = game.Workspace.CurrentCamera - local startPos - with currCamera.CoordinateFrame.p - startPos = Vector3.new .X, .Y, .Z - - endPos = Vector3.new vectorPos.X, vectorPos.Y, vectorPos.Z - normal = Vector3.new 0, 1, 0 - p3 = Vector3.new 0, 0, 0 - startEndDot = normal\Dot endPos - startPos - cellPos = vectorPos - if startEndDot ~= 0 - t1 = normal\Dot(p3 - startPos) / startEndDot - if t1 >= 0 and t1 <= 1 - intersection = ((endPos - startPos) * t1) + startPos - cellPos = game.Workspace.Terrain\WorldToCell intersection - hit = true - - cellPos, hit - --- Purpose: --- Checks for terrain touched by the mouse hit. --- Will do a plane intersection if no terrain is touched. --- --- mouse - Mouse to check the .hit for. --- --- Return: --- cellPos - Cell position hit. Nil if none. -GetTerrainForMouse = (mouse) -> - -- There was no target, so all it could be is a plane intersection. - -- Check for a plane intersection. If there isn't one then nothing will get hit. - cell = game.Workspace.Terrain\WorldToCellPreferSolid Vector3.new mouse.hit.x, mouse.hit.y, mouse.hit.z - local planeLoc - -- If nothing was hit, do the plane intersection. - if 0 == game.Workspace.Terrain\GetCell(cell.X, cell.Y, cell.Z).Value - cell = nil - planeLoc, hit = PlaneIntersection Vector3.new mouse.hit.x, mouse.hit.y, mouse.hit.z - if hit - cell = planeLoc - cell - --- setup helper functions -insertBoundingBoxOverlapVector = Vector3.new 0.3, 0.3, 0.3 -- we can still stamp if our character extrudes into the target stamping space by 0.3 or fewer units - --- rotates a model by yAngle radians about the global y-axis -rotatePartAndChildren = (part, rotCF, offsetFromOrigin) -> - -- rotate this thing, if it's a part - if part\IsA "BasePart" - part.CFrame = (rotCF * (part.CFrame - offsetFromOrigin)) + offsetFromOrigin - - - -- recursively do the same to all children - partChildren = part\GetChildren! - for c in *partChildren - rotatePartAndChildren c, rotCF, offsetFromOrigin - -modelRotate = (model, yAngle) -> - rotCF = CFrame.Angles 0, yAngle, 0 - offsetFromOrigin = model\GetModelCFrame!.p - - rotatePartAndChildren model, rotCF, offsetFromOrigin - -collectParts = (object, baseParts, scripts, decals) -> - if object\IsA "BasePart" - baseParts[] = object - elseif object\IsA "Script" - scripts[] = object - elseif object\IsA "Decal" - decals[] = object - - for _, child in pairs object\GetChildren! - collectParts child, baseParts, scripts, decals - -clusterPartsInRegion = (startVector, endVector) -> - cluster = game.Workspace\FindFirstChild "Terrain" - - startCell = cluster\WorldToCell startVector - endCell = cluster\WorldToCell endVector - - startX = startCell.X - startY = startCell.Y - startZ = startCell.Z - - endX = endCell.X - endY = endCell.Y - endZ = endCell.Z - - if startX < cluster.MaxExtents.Min.X - startX = cluster.MaxExtents.Min.X - - if startY < cluster.MaxExtents.Min.Y - startY = cluster.MaxExtents.Min.Y - - if startZ < cluster.MaxExtents.Min.Z - startZ = cluster.MaxExtents.Min.Z - - if endX > cluster.MaxExtents.Max.X - endX = cluster.MaxExtents.Max.X - - if endY > cluster.MaxExtents.Max.Y - endY = cluster.MaxExtents.Max.Y - - if endZ > cluster.MaxExtents.Max.Z - endZ = cluster.MaxExtents.Max.Z - - - for x = startX, endX - for y = startY, endY - for z = startZ, endZ - if cluster\GetCell(x, y, z).Value > 0 - return true - false - -findSeatsInModel = (parent, seatTable) -> - return if not parent - - if parent.className == "Seat" or parent.className == "VehicleSeat" - table.insert seatTable, parent - - myChildren = parent\GetChildren! - for j in *myChildren - findSeatsInModel j, seatTable - - -setSeatEnabledStatus = (model, isEnabled) -> - seatList = {} - findSeatsInModel model, seatList - - if isEnabled - -- remove any welds called "SeatWeld" in seats - for i in *seatList - nextSeat = i\FindFirstChild "SeatWeld" - while nextSeat - nextSeat\Remove! - nextSeat = i\FindFirstChild "SeatWeld" - - - else - -- put a weld called "SeatWeld" in every seat - -- this tricks it into thinking there's already someone sitting there, and it won't make you sit XD - for i in *seatList - New "Weld", "SeatWeld" - Parent: i - - -autoAlignToFace = (parts) -> - if aatf = parts\FindFirstChild "AutoAlignToFace" - return aatf.Value - false - - -getClosestAlignedWorldDirection = (aVector3InWorld) -> - xDir = Vector3.new 1, 0, 0 - yDir = Vector3.new 0, 1, 0 - zDir = Vector3.new 0, 0, 1 - xDot = aVector3InWorld.x * xDir.x + aVector3InWorld.y * xDir.y + aVector3InWorld.z * xDir.z - yDot = aVector3InWorld.x * yDir.x + aVector3InWorld.y * yDir.y + aVector3InWorld.z * yDir.z - zDot = aVector3InWorld.x * zDir.x + aVector3InWorld.y * zDir.y + aVector3InWorld.z * zDir.z - - if math.abs(xDot) > math.abs(yDot) and math.abs(xDot) > math.abs zDot - if xDot > 0 - 0 - else - 3 - - elseif math.abs(yDot) > math.abs(xDot) and math.abs(yDot) > math.abs zDot - if yDot > 0 - 1 - else - 4 - - else - if zDot > 0 - 2 - else - 5 - - -positionPartsAtCFrame3 = (aCFrame, currentParts) -> - local insertCFrame - if not currentParts - return currentParts - - if currentParts and (currentParts\IsA"Model" or currentParts\IsA "Tool") - insertCFrame = currentParts\GetModelCFrame! - currentParts\TranslateBy aCFrame.p - insertCFrame.p - else - currentParts.CFrame = aCFrame - - currentParts - - -calcRayHitTime = (rayStart, raySlope, intersectionPlane) -> - if math.abs(raySlope) < 0.01 - return 0 - -- 0 slope --> we just say intersection time is 0, and sidestep this dimension - (intersectionPlane - rayStart) / raySlope - - -modelTargetSurface = (partOrModel, rayStart, rayEnd) -> - if not partOrModel - return 0 - - local modelCFrame, modelSize - if partOrModel\IsA "Model" - modelCFrame = partOrModel\GetModelCFrame! - modelSize = partOrModel\GetModelSize! - else - modelCFrame = partOrModel.CFrame - modelSize = partOrModel.Size - - - mouseRayStart = modelCFrame\pointToObjectSpace rayStart - mouseRayEnd = modelCFrame\pointToObjectSpace rayEnd - mouseSlope = mouseRayEnd - mouseRayStart - - xPositive = 1 - yPositive = 1 - zPositive = 1 - if mouseSlope.X > 0 - xPositive = -1 - - if mouseSlope.Y > 0 - yPositive = -1 - - if mouseSlope.Z > 0 - zPositive = -1 - - - -- find which surface the transformed mouse ray hits (using modelSize): - xHitTime = calcRayHitTime mouseRayStart.X, mouseSlope.X, modelSize.X / 2 * xPositive - yHitTime = calcRayHitTime mouseRayStart.Y, mouseSlope.Y, modelSize.Y / 2 * yPositive - zHitTime = calcRayHitTime mouseRayStart.Z, mouseSlope.Z, modelSize.Z / 2 * zPositive - - hitFace = 0 - - --if xHitTime >= 0 and yHitTime >= 0 and zHitTime >= 0 - hitFace = if xHitTime > yHitTime - if xHitTime > zHitTime - -- xFace is hit - 1 * xPositive - else - -- zFace is hit - 3 * zPositive - - else - if yHitTime > zHitTime - -- yFace is hit - 2 * yPositive - else - -- zFace is hit - 3 * zPositive - - hitFace - - -getBoundingBox2 = (partOrModel) -> - -- for models, the bounding box is defined as the minimum and maximum individual part bounding boxes - -- relative to the first part's coordinate frame. - minVec = Vector3.new math.huge, math.huge, math.huge - maxVec = Vector3.new -math.huge, -math.huge, -math.huge - - if partOrModel\IsA "Terrain" - minVec = Vector3.new -2, -2, -2 - maxVec = Vector3.new 2, 2, 2 - elseif partOrModel\IsA "BasePart" - minVec = -0.5 * partOrModel.Size - maxVec = -minVec - else - maxVec = partOrModel\GetModelSize! * 0.5 - minVec = -maxVec - - - -- Adjust bounding box to reflect what the model or part author wants in terms of justification - justifyValue = partOrModel\FindFirstChild "Justification" - if justifyValue? - -- find the multiple of 4 that contains the model - justify = justifyValue.Value - two = Vector3.new 2, 2, 2 - actualBox = maxVec - minVec - Vector3.new 0.01, 0.01, 0.01 - containingGridBox = Vector3.new( - 4 * math.ceil(actualBox.x / 4), - 4 * math.ceil(actualBox.y / 4), - 4 * math.ceil actualBox.z / 4 - ) - adjustment = containingGridBox - actualBox - minVec -= 0.5 * adjustment * justify - maxVec += 0.5 * adjustment * (two - justify) - - minVec, maxVec - - -getBoundingBoxInWorldCoordinates = (partOrModel) -> - minVec = Vector3.new math.huge, math.huge, math.huge - maxVec = Vector3.new -math.huge, -math.huge, -math.huge - - if partOrModel\IsA"BasePart" and not partOrModel\IsA "Terrain" - vec1 = partOrModel.CFrame\pointToWorldSpace -0.5 * partOrModel.Size - vec2 = partOrModel.CFrame\pointToWorldSpace 0.5 * partOrModel.Size - minVec = Vector3.new math.min(vec1.X, vec2.X), math.min(vec1.Y, vec2.Y), math.min vec1.Z, vec2.Z - maxVec = Vector3.new math.max(vec1.X, vec2.X), math.max(vec1.Y, vec2.Y), math.max vec1.Z, vec2.Z - elseif not partOrModel\IsA "Terrain" - -- we shouldn't have to deal with this case - --minVec = Vector3.new -2, -2, -2 - --maxVec = Vector3.new 2, 2, 2 - -- else - vec1 = partOrModel\GetModelCFrame!\pointToWorldSpace -0.5 * partOrModel\GetModelSize! - vec2 = partOrModel\GetModelCFrame!\pointToWorldSpace 0.5 * partOrModel\GetModelSize! - minVec = Vector3.new math.min(vec1.X, vec2.X), math.min(vec1.Y, vec2.Y), math.min vec1.Z, vec2.Z - maxVec = Vector3.new math.max(vec1.X, vec2.X), math.max(vec1.Y, vec2.Y), math.max vec1.Z, vec2.Z - - minVec, maxVec - -getTargetPartBoundingBox = (targetPart) -> - getBoundingBox2 if targetPart.Parent\FindFirstChild"RobloxModel"? - targetPart.Parent - else - targetPart - -getMouseTargetCFrame = (targetPart) -> with targetPart - return if .Parent\FindFirstChild"RobloxModel"? - if .Parent\IsA "Tool" - .Parent.Handle.CFrame - else - .Parent\GetModelCFrame! - else - .CFrame - - -isBlocker = (part) -> -- returns whether or not we want to cancel the stamp because we're blocked by this part - if (not part) or - (not part.Parent) or - part\FindFirstChild "Humanoid" - - false - elseif part\FindFirstChild"RobloxStamper" or part\FindFirstChild "RobloxModel" - true - elseif (part\IsA"Part" and not part.CanCollide) or part == game.Lighting - false - else - isBlocker part.Parent - --- helper function to determine if a character can be pushed upwards by a certain amount --- character is 5 studs tall, we'll check a 1.5 x 1.5 x 4.5 box around char, with center 0.5 studs below torsocenter -spaceAboveCharacter = (charTorso, newTorsoY, stampData) -> - partsAboveChar = game.Workspace\FindPartsInRegion3( - Region3.new( - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) - Vector3.new(0.75, 2.75, 0.75), - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + Vector3.new 0.75, 1.75, 0.75 - ), - charTorso.Parent, - 100 - ) - - for j in *partsAboveChar - if j.CanCollide and not j\IsDescendantOf stampData.CurrentParts - return false - - if clusterPartsInRegion( - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) - Vector3.new(0.75, 2.75, 0.75), - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + Vector3.new 0.75, 1.75, 0.75 - ) - - return false - - true - - -findConfigAtMouseTarget = (Mouse, stampData) -> - -- *Critical Assumption* : - -- This function assumes the target CF axes are orthogonal with the target bounding box faces - -- And, it assumes the insert CF axes are orthongonal with the insert bounding box faces - -- Therefore, insertion will not work with angled faces on wedges or other "non-block" parts, nor - -- will it work for parts in a model that are not orthogonally aligned with the model's CF. - - return if not Mouse - - -- This can happen sometimes, return if so - if not stampData - return error "findConfigAtMouseTarget: stampData is nil" - - return if not stampData["CurrentParts"] - - grid = 4.0 - admissibleConfig = false - targetConfig = CFrame.new 0, 0, 0 - - minBB, maxBB = getBoundingBox2 stampData.CurrentParts - diagBB = maxBB - minBB - - local insertCFrame - insertCFrame = if stampData.CurrentParts\IsA"Model" or stampData.CurrentParts\IsA "Tool" - stampData.CurrentParts\GetModelCFrame! - else - stampData.CurrentParts.CFrame - - - if Mouse - Mouse.TargetFilter = if stampData.CurrentParts\IsA "Tool" - stampData.CurrentParts.Handle - else - stampData.CurrentParts - - hitPlane = false - local targetPart - success = try - targetPart = Mouse.Target - - - if not success -- or targetPart == nil - return admissibleConfig, targetConfig - - - mouseHitInWorld = Vector3.new if Mouse - Mouse.Hit.x, Mouse.Hit.y, Mouse.Hit.z - else - 0, 0, 0 - - local cellPos - - -- Nothing was hit, so check for the default plane. - if nil == targetPart - cellPos = GetTerrainForMouse Mouse - if nil == cellPos - hitPlane = false - return admissibleConfig, targetConfig - else - targetPart = game.Workspace.Terrain - hitPlane = true - -- Take into account error that will occur. - cellPos = Vector3.new cellPos.X - 1, cellPos.Y, cellPos.Z - mouseHitInWorld = game.Workspace.Terrain\CellCenterToWorld cellPos.x, cellPos.y, cellPos.z - - - -- test mouse hit location - minBBTarget, maxBBTarget = getTargetPartBoundingBox targetPart - diagBBTarget = maxBBTarget - minBBTarget - targetCFrame = getMouseTargetCFrame targetPart - - if targetPart\IsA "Terrain" - if not cluster - global cluster = game.Workspace\FindFirstChild "Terrain" - - cellID = cluster\WorldToCellPreferSolid mouseHitInWorld - if hitPlane - cellID = cellPos - - - targetCFrame = CFrame.new game.Workspace.Terrain\CellCenterToWorld cellID.x, cellID.y, cellID.z - - - mouseHitInTarget = targetCFrame\pointToObjectSpace mouseHitInWorld - targetVectorInWorld = Vector3.new 0, 0, 0 - if Mouse - -- DON'T WANT THIS IN TERMS OF THE MODEL CFRAME! (.TargetSurface is in terms of the part CFrame, so this would break, right? [HotThoth]) - -- (ideally, we would want to make the Mouse.TargetSurface a model-targetsurface instead, but for testing will be using the converse) - --targetVectorInWorld = targetCFrame\vectorToWorldSpace Vector3.FromNormalId Mouse.TargetSurface - targetVectorInWorld = targetPart.CFrame\vectorToWorldSpace Vector3.FromNormalId Mouse.TargetSurface -- better, but model cframe would be best - --[[if targetPart.Parent\IsA "Model" - hitFace = modelTargetSurface(targetPart.Parent, Mouse.Hit.p, game.Workspace.CurrentCamera.CoordinateFrame.p) -- best, if you get it right - WORLD_AXES = { Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1) } - targetVectorInWorld = if hitFace > 0 - targetCFrame\vectorToWorldSpace WORLD_AXES[hitFace] - elseif hitFace < 0 - targetCFrame\vectorToWorldSpace -WORLD_AXES[-hitFace] - - ]] - - - local targetRefPointInTarget, insertRefPointInInsert - local clampToSurface - - if getClosestAlignedWorldDirection(targetVectorInWorld) == 0 - targetRefPointInTarget = targetCFrame\vectorToObjectSpace Vector3.new 1, -1, 1 - insertRefPointInInsert = insertCFrame\vectorToObjectSpace Vector3.new -1, -1, 1 - clampToSurface = Vector3.new 0, 1, 1 - elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 3 - targetRefPointInTarget = targetCFrame\vectorToObjectSpace Vector3.new -1, -1, -1 - insertRefPointInInsert = insertCFrame\vectorToObjectSpace Vector3.new 1, -1, -1 - clampToSurface = Vector3.new 0, 1, 1 - elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 1 - targetRefPointInTarget = targetCFrame\vectorToObjectSpace Vector3.new -1, 1, 1 - insertRefPointInInsert = insertCFrame\vectorToObjectSpace Vector3.new -1, -1, 1 - clampToSurface = Vector3.new 1, 0, 1 - elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 4 - targetRefPointInTarget = targetCFrame\vectorToObjectSpace Vector3.new -1, -1, 1 - insertRefPointInInsert = insertCFrame\vectorToObjectSpace Vector3.new -1, 1, 1 - clampToSurface = Vector3.new 1, 0, 1 - elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 2 - targetRefPointInTarget = targetCFrame\vectorToObjectSpace Vector3.new -1, -1, 1 - insertRefPointInInsert = insertCFrame\vectorToObjectSpace Vector3.new -1, -1, -1 - clampToSurface = Vector3.new 1, 1, 0 - else - targetRefPointInTarget = targetCFrame\vectorToObjectSpace Vector3.new 1, -1, -1 - insertRefPointInInsert = insertCFrame\vectorToObjectSpace Vector3.new 1, -1, 1 - clampToSurface = Vector3.new 1, 1, 0 - - targetRefPointInTarget *= (0.5 * diagBBTarget) + 0.5 * (maxBBTarget + minBBTarget) - insertRefPointInInsert *= (0.5 * diagBB) + 0.5 * (maxBB + minBB) - - -- To Do: For cases that are not aligned to the world grid, account for the minimal rotation - -- needed to bring the Insert part(s) into alignment with the Target Part - -- Apply the rotation here - - delta = mouseHitInTarget - targetRefPointInTarget - deltaClamped = Vector3.new( - grid * math.modf(delta.x / grid), - grid * math.modf(delta.y / grid), - grid * math.modf delta.z / grid - ) - deltaClamped *= clampToSurface - targetTouchInTarget = deltaClamped + targetRefPointInTarget - - TargetTouchRelToWorld = targetCFrame\pointToWorldSpace targetTouchInTarget - InsertTouchInWorld = insertCFrame\vectorToWorldSpace insertRefPointInInsert - posInsertOriginInWorld = TargetTouchRelToWorld - InsertTouchInWorld - - _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = insertCFrame\components! - targetConfig = CFrame.new( - posInsertOriginInWorld.x, - posInsertOriginInWorld.y, - posInsertOriginInWorld.z, - R00, - R01, - R02, - R10, - R11, - R12, - R20, - R21, - R22 - ) - admissibleConfig = true - - admissibleConfig, targetConfig, getClosestAlignedWorldDirection targetVectorInWorld - -truncateToCircleEighth = (bigValue, littleValue) -> - big = math.abs bigValue - little = math.abs littleValue - hypotenuse = math.sqrt big * big + little * little - frac = little / hypotenuse - - bigSign = 1 - littleSign = 1 - if bigValue < 0 - bigSign = -1 - - if littleValue < 0 - littleSign = -1 - - if frac > 0.382683432 - -- between 22.5 and 45 degrees, so truncate to 45-degree tilt - 0.707106781 * hypotenuse * bigSign, 0.707106781 * hypotenuse * littleSign - else - -- between 0 and 22.5 degrees, so truncate to 0-degree tilt - hypotenuse * bigSign, 0 - - -saveTheWelds = (object, manualWeldTable, manualWeldParentTable) -> - if object\IsA"ManualWeld" or object\IsA "Rotate" - table.insert manualWeldTable, object - table.insert manualWeldParentTable, object.Parent - else - children = object\GetChildren! - for i in *children - saveTheWelds i, manualWeldTable, manualWeldParentTable - - -restoreTheWelds = (manualWeldTable, manualWeldParentTable) -> - for i = 1, #manualWeldTable - manualWeldTable[i].Parent = manualWeldParentTable[i] - - -t.CanEditRegion = (partOrModel, EditRegion) -> -- todo: use model and stamper metadata - if not EditRegion - return true, false - - - minBB, maxBB = getBoundingBoxInWorldCoordinates partOrModel - - if minBB.X < EditRegion.CFrame.p.X - EditRegion.Size.X / 2 or - minBB.Y < EditRegion.CFrame.p.Y - EditRegion.Size.Y / 2 or - minBB.Z < EditRegion.CFrame.p.Z - EditRegion.Size.Z / 2 - - return false, false - - - if maxBB.X > EditRegion.CFrame.p.X + EditRegion.Size.X / 2 or - maxBB.Y > EditRegion.CFrame.p.Y + EditRegion.Size.Y / 2 or - maxBB.Z > EditRegion.CFrame.p.Z + EditRegion.Size.Z / 2 - - return false, false - - true, false - -t.GetStampModel = (assetId, terrainShape, useAssetVersionId) -> - if assetId == 0 - return nil, "No Asset" - - if assetId < 0 - return nil, "Negative Asset" - - UnlockInstances = (object) -> - if object\IsA "BasePart" - object.Locked = false - - for _, child in pairs object\GetChildren! - UnlockInstances child - - getClosestColorToTerrainMaterial = (terrainValue) -> - BrickColor.new switch terrainValue - when 1 then "Bright green" - when 2 then "Bright yellow" - when 3 then "Bright red" - when 4 then "Sand red" - when 5 then "Black" - when 6 then "Dark stone grey" - when 7 then "Sand blue" - when 8 then "Deep orange" - when 9 then "Dark orange" - when 10 then "Reddish brown" - when 11 then "Light orange" - when 12 then "Light stone grey" - when 13 then "Sand green" - when 14 then "Medium stone grey" - when 15 then "Really red" - when 16 then "Really blue" - when 17 then "Bright blue" - else "Bright green" - - setupFakeTerrainPart = (cellMat, cellType, cellOrient) -> - local newTerrainPiece - if cellType == 1 or cellType == 4 - newTerrainPiece = Instance.new "WedgePart" - newTerrainPiece.formFactor = "Custom" - elseif cellType == 2 - newTerrainPiece = Instance.new "CornerWedgePart" - else - newTerrainPiece = Instance.new "Part" - newTerrainPiece.formFactor = "Custom" - - newTerrainPiece.Name = "MegaClusterCube" - newTerrainPiece.Size = Vector3.new 4, 4, 4 - newTerrainPiece.BottomSurface = "Smooth" - newTerrainPiece.TopSurface = "Smooth" - - -- can add decals or textures here if feeling particularly adventurous... for now, can make a table of look-up colors - newTerrainPiece.BrickColor = getClosestColorToTerrainMaterial cellMat - - sideways = 0 - flipped = math.pi - if cellType == 4 - sideways = -math.pi / 2 - - if cellType == 2 or cellType == 3 - flipped = 0 - - newTerrainPiece.CFrame = CFrame.Angles 0, math.pi / 2 * cellOrient + flipped, sideways - - if cellType == 3 - New "SpecialMesh" - MeshType: "FileMesh" - MeshId: "http://banland.xyz/asset?id=66832495" - Scale: Vector3.new 2, 2, 2 - Parent: newTerrainPiece - - New "Vector3Value", "ClusterMaterial" - Value: Vector3.new cellMat, cellType, cellOrient - Parent: newTerrainPiece - - newTerrainPiece - - - -- This call will cause a "wait" until the data comes back - -- below we wait a max of 8 seconds before deciding to bail out on loading - local root, loader - loading = true - if useAssetVersionId - loader = coroutine.create -> - root = game\GetService"InsertService"\LoadAssetVersion assetId - loading = false - - coroutine.resume loader - else - loader = coroutine.create -> - root = game\GetService"InsertService"\LoadAsset assetId - loading = false - - coroutine.resume loader - - - lastGameTime = 0 - totalTime = 0 - maxWait = 8 - while loading and totalTime < maxWait - lastGameTime = tick! - wait 1 - totalTime += tick! - lastGameTime - - loading = false - - if totalTime >= maxWait - return nil, "Load Time Fail" - - - if root == nil - return nil, "Load Asset Fail" - - - if not root\IsA "Model" - return nil, "Load Type Fail" - - - instances = root\GetChildren! - if #instances == 0 - return nil, "Empty Model Fail" - - - --Unlock all parts that are inserted, to make sure they are editable - UnlockInstances root - - --Continue the insert process - root = root\GetChildren![1] - - --Examine the contents and decide what it looks like - for _, instance in pairs instances - if instance\IsA "Team" - instance.Parent = game\GetService "Teams" - elseif instance\IsA "Sky" - lightingService = game\GetService "Lighting" - for _, child in pairs lightingService\GetChildren! - if child\IsA "Sky" - child\Remove! - - - instance.Parent = lightingService - return - - - -- ...and tag all inserted models for subsequent origin identification - -- if no RobloxModel tag already exists, then add it. - if root\FindFirstChild"RobloxModel" == nil - New "BoolValue", "RobloxModel" - Parent: root - - if root\FindFirstChild"RobloxStamper" == nil - New "BoolValue", "RobloxStamper" - Parent: root - - - if terrainShape and - root.Name == "MegaClusterCube" - - if terrainShape == 6 -- insert an autowedging tag - New "BoolValue", "AutoWedge" - Parent: root - else - clusterTag = root\FindFirstChild "ClusterMaterial" - root = if clusterTag - if clusterTag\IsA "Vector3Value" - setupFakeTerrainPart clusterTag.Value.X, terrainShape, clusterTag.Value.Z - else - setupFakeTerrainPart clusterTag.Value, terrainShape, 0 - - else - setupFakeTerrainPart 1, terrainShape, 0 - - root - - -t.SetupStamperDragger = (modelToStamp, Mouse, StampInModel, AllowedStampRegion, StampFailedFunc) -> - if not modelToStamp - error "SetupStamperDragger: modelToStamp (first arg) is nil! Should be a stamper model" - return nil - - if not modelToStamp\IsA"Model" and not modelToStamp\IsA "BasePart" - error "SetupStamperDragger: modelToStamp (first arg) is neither a Model or Part!" - return nil - - if not Mouse - error "SetupStamperDragger: Mouse (second arg) is nil! Should be a mouse object" - return nil - - if not Mouse\IsA "Mouse" - error "SetupStamperDragger: Mouse (second arg) is not of type Mouse!" - return nil - - - local stampInModel - local allowedStampRegion - local stampFailedFunc - if StampInModel - if not StampInModel\IsA "Model" - error "SetupStamperDragger: StampInModel (optional third arg) is not of type 'Model'" - return nil - - if not AllowedStampRegion - error "SetupStamperDragger: AllowedStampRegion (optional fourth arg) is nil when StampInModel (optional third arg) is defined" - return nil - - stampFailedFunc = StampFailedFunc - stampInModel = StampInModel - allowedStampRegion = AllowedStampRegion - - - -- Init all state variables - gInitial90DegreeRotations = 0 - local stampData - local mouseTarget - - errorBox = New "SelectionBox" - Color: BrickColor.new "Bright red" - Transparency: 0 - Archivable: false - - -- for megacluster MEGA STAMPING - adornPart = New "Part" - Parent: nil - formFactor: "Custom" - Size: Vector3.new 4, 4, 4 - CFrame: CFrame.new! - Archivable: false - - adorn = New "SelectionBox", "HighScalabilityStamperLine" - Color: BrickColor.new "Toothpaste" - Adornee: adornPart - Visible: true - Transparency: 0 - Archivable: false - - HighScalabilityLine = {} - with HighScalabilityLine - .Start = nil - .End = nil - .Adorn = adorn - .AdornPart = adornPart - .InternalLine = nil - .NewHint = true - .MorePoints = { nil, nil } - .MoreLines = { nil, nil } - .Dimensions = 1 - - control = {} - movingLock = false - stampUpLock = false - unstampableSurface = false - mouseCons = {} - local keyCon - - stamped = New "BoolValue" - Archivable: false - Value: false - - lastTarget = {} - lastTarget.TerrainOrientation = 0 - lastTarget.CFrame = 0 - - cellInfo = {} - cellInfo.Material = 1 - cellInfo.clusterType = 0 - cellInfo.clusterOrientation = 0 - - isMegaClusterPart = -> - if not stampData - return false - - if not stampData.CurrentParts - return false - - stampData.CurrentParts\FindFirstChild("ClusterMaterial", true) or - (stampData.CurrentParts.Name == "MegaClusterCube") - - DoHighScalabilityRegionSelect = -> - megaCube = stampData.CurrentParts\FindFirstChild "MegaClusterCube" - if not megaCube - if not stampData.CurrentParts.Name == "MegaClusterCube" - return - else - megaCube = stampData.CurrentParts - - - HighScalabilityLine.End = megaCube.CFrame.p - local line - line2 = Vector3.new 0, 0, 0 - line3 = Vector3.new 0, 0, 0 - - if HighScalabilityLine.Dimensions == 1 - -- extract the line from these positions and limit to a 2D plane made from 2 of the world axes - -- then use dominating axis to limit line to be at 45-degree intervals - -- will use this internal representation of the line for the actual stamping - line = HighScalabilityLine.End - HighScalabilityLine.Start - - if math.abs(line.X) < math.abs line.Y - if math.abs(line.X) < math.abs line.Z - -- limit to Y/Z plane, domination unknown - local newY, newZ - if math.abs(line.Y) > math.abs line.Z - newY, newZ = truncateToCircleEighth line.Y, line.Z - else - newZ, newY = truncateToCircleEighth line.Z, line.Y - - line = Vector3.new 0, newY, newZ - else - -- limit to X/Y plane, with Y dominating - newY, newX = truncateToCircleEighth line.Y, line.X - line = Vector3.new newX, newY, 0 - - else - if math.abs(line.Y) < math.abs line.Z - -- limit to X/Z plane, domination unknown - local newX, newZ - if math.abs(line.X) > math.abs line.Z - newX, newZ = truncateToCircleEighth line.X, line.Z - else - newZ, newX = truncateToCircleEighth line.Z, line.X - - line = Vector3.new newX, 0, newZ - else - -- limit to X/Y plane, with X dominating - newX, newY = truncateToCircleEighth line.X, line.Y - line = Vector3.new newX, newY, 0 - - - HighScalabilityLine.InternalLine = line - elseif HighScalabilityLine.Dimensions == 2 - line = HighScalabilityLine.MoreLines[1] - line2 = HighScalabilityLine.End - HighScalabilityLine.MorePoints[1] - - -- take out any component of line2 along line1, so you get perpendicular to line1 component - line2 -= line.unit * line.unit\Dot line2 - - tempCFrame = CFrame.new HighScalabilityLine.Start, HighScalabilityLine.Start + line - - -- then zero out whichever is the smaller component - yAxis = tempCFrame\vectorToWorldSpace Vector3.new 0, 1, 0 - xAxis = tempCFrame\vectorToWorldSpace Vector3.new 1, 0, 0 - - xComp = xAxis\Dot line2 - yComp = yAxis\Dot line2 - - line2 -= if math.abs(yComp) > math.abs xComp - xAxis * xComp - else - yAxis * yComp - - - HighScalabilityLine.InternalLine = line2 - elseif HighScalabilityLine.Dimensions == 3 - line = HighScalabilityLine.MoreLines[1] - line2 = HighScalabilityLine.MoreLines[2] - line3 = HighScalabilityLine.End - HighScalabilityLine.MorePoints[2] - - -- zero out all components of previous lines - line3 -= line.unit * line.unit\Dot line3 - line3 -= line2.unit * line2.unit\Dot line3 - - HighScalabilityLine.InternalLine = line3 - - - -- resize the "line" graphic to be the correct size and orientation - tempCFrame = CFrame.new HighScalabilityLine.Start, HighScalabilityLine.Start + line - - if HighScalabilityLine.Dimensions == 1 -- faster calculation for line - HighScalabilityLine.AdornPart.Size = Vector3.new 4, 4, line.magnitude + 4 - HighScalabilityLine.AdornPart.CFrame = tempCFrame + - tempCFrame\vectorToWorldSpace Vector3.new(2, 2, 2) - HighScalabilityLine.AdornPart.Size / 2 - else - boxSize = tempCFrame\vectorToObjectSpace line + line2 + line3 - HighScalabilityLine.AdornPart.Size = Vector3.new(4, 4, 4) + - Vector3.new(math.abs(boxSize.X), math.abs(boxSize.Y), math.abs boxSize.Z) - HighScalabilityLine.AdornPart.CFrame = tempCFrame + tempCFrame\vectorToWorldSpace boxSize / 2 - - - -- make player able to see this ish - - local gui - if game.Players["LocalPlayer"] - gui = game.Players.LocalPlayer\FindFirstChild "PlayerGui" - if gui and gui\IsA "PlayerGui" - if (HighScalabilityLine.Dimensions == 1 and line.magnitude > 3) or - HighScalabilityLine.Dimensions > 1 - - -- don't show if mouse hasn't moved enough - HighScalabilityLine.Adorn.Parent = gui - - - if gui == nil -- we are in studio - gui = game\GetService "CoreGui" - if (HighScalabilityLine.Dimensions == 1 and line.magnitude > 3) or HighScalabilityLine.Dimensions > 1 -- don't show if mouse hasn't moved enough - HighScalabilityLine.Adorn.Parent = gui - - - DoStamperMouseMove = (Mouse) -> - if not Mouse - error "Error: RbxStamper.DoStamperMouseMove: Mouse is nil" - return - - if not Mouse\IsA "Mouse" - error "Error: RbxStamper.DoStamperMouseMove: Mouse is of type", Mouse.className, "should be of type Mouse" - return - - - -- There wasn't a target (no part or terrain), so check for plane intersection. - if not Mouse.Target - cellPos = GetTerrainForMouse Mouse - return if nil == cellPos - - return if not stampData - - -- don't move with dragger - will move in one step on mouse down - -- draw ghost at acceptable positions - configFound, targetCFrame, targetSurface = findConfigAtMouseTarget Mouse, stampData - if not configFound - error "RbxStamper.DoStamperMouseMove No configFound, returning" - return - - - numRotations = 0 -- update this according to how many rotations you need to get it to target surface - if autoAlignToFace(stampData.CurrentParts) and targetSurface ~= 1 and targetSurface ~= 4 -- pre-rotate the flag or portrait so it's aligned correctly - numRotations = ( - switch targetSurface - when 3 then 0 - when 0 then 2 - when 5 then 3 - when 2 then 1 - ) - gInitial90DegreeRotations + autoAlignToFace stampData.CurrentParts - - - ry = math.pi / 2 - gInitial90DegreeRotations += numRotations - if stampData.CurrentParts\IsA"Model" or stampData.CurrentParts\IsA "Tool" - --stampData.CurrentParts\Rotate 0, ry*numRotations, 0 - modelRotate stampData.CurrentParts, ry * numRotations - else - stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ 0, ry * numRotations, 0 - * stampData.CurrentParts.CFrame - - - -- CODE TO CHECK FOR DRAGGING GHOST PART INTO A COLLIDING STATE - minBB, maxBB = getBoundingBoxInWorldCoordinates stampData.CurrentParts - - -- need to offset by distance to be dragged - local currModelCFrame - currModelCFrame = if stampData.CurrentParts\IsA "Model" - stampData.CurrentParts\GetModelCFrame! - else - stampData.CurrentParts.CFrame - - - minBB += targetCFrame.p - currModelCFrame.p - maxBB += targetCFrame.p - currModelCFrame.p - - -- don't drag into terrain - if clusterPartsInRegion minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector - if lastTarget.CFrame and - stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - - theClusterMaterial = stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - if theClusterMaterial\IsA "Vector3Value" - stampClusterMaterial = stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - if stampClusterMaterial - stampClusterMaterial = clusterMat - - return - - - -- if we are stamping a terrain part, make sure it goes on the grid! Otherwise preview block could be placed off grid, but stamped on grid - if isMegaClusterPart! - cellToStamp = game.Workspace.Terrain\WorldToCell targetCFrame.p - newCFramePosition = game.Workspace.Terrain\CellCenterToWorld cellToStamp.X, cellToStamp.Y, cellToStamp.Z - _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = targetCFrame\components! - targetCFrame = CFrame.new( - newCFramePosition.X, - newCFramePosition.Y, - newCFramePosition.Z, - R00, - R01, - R02, - R10, - R11, - R12, - R20, - R21, - R22 - ) - - - positionPartsAtCFrame3 targetCFrame, stampData.CurrentParts - lastTarget.CFrame = targetCFrame -- successful positioning, so update 'dat cframe - if stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - clusterMat = stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - if clusterMat\IsA "Vector3Value" - lastTarget.TerrainOrientation = clusterMat.Value.Z - - - -- auto break joints code - if Mouse and Mouse.Target and Mouse.Target.Parent - modelInfo = Mouse.Target\FindFirstChild "RobloxModel" - if not modelInfo - modelInfo = Mouse.Target.Parent\FindFirstChild "RobloxModel" - - - myModelInfo = stampData.CurrentParts\FindFirstChild "UnstampableFaces" - - --if (modelInfo and modelInfo.Parent\FindFirstChild"UnstampableFaces") or (modelInfo and myModelInfo) -- need better targetSurface calcs - if true - breakingFaces = "" - myBreakingFaces = "" - if modelInfo and modelInfo.Parent\FindFirstChild "UnstampableFaces" - breakingFaces = modelInfo.Parent.UnstampableFaces.Value - - if myModelInfo - myBreakingFaces = myModelInfo.Value - - hitFace = 0 - - if modelInfo - hitFace = modelTargetSurface( - modelInfo.Parent, - game.Workspace.CurrentCamera.CoordinateFrame.p, - Mouse.Hit.p - ) - - -- are we stamping TO an unstampable surface? - for bf in string.gmatch breakingFaces, "[^,]+" - if hitFace == tonumber bf - -- return before we hit the JointsService code below! - unstampableSurface = true - game.JointsService\ClearJoinAfterMoveJoints! -- clear the JointsService cache - return - - -- now we have to cast the ray back in the other direction to find the surface we're stamping FROM - hitFace = modelTargetSurface( - stampData.CurrentParts, - Mouse.Hit.p, - game.Workspace.CurrentCamera.CoordinateFrame.p - ) - - -- are we stamping WITH an unstampable surface? - for bf in string.gmatch myBreakingFaces, "[^,]+" - if hitFace == tonumber bf - unstampableSurface = true - game.JointsService\ClearJoinAfterMoveJoints! -- clear the JointsService cache - return - - -- just need to match breakingFace against targetSurface using rotation supplied by modelCFrame - -- targetSurface: 1 is top, 4 is bottom, - - -- to show joints during the mouse move - unstampableSurface = false - game.JointsService\SetJoinAfterMoveInstance stampData.CurrentParts - - -- most common mouse inactive error occurs here, so check mouse active one more time in a pcall - if (not try - -- if Mouse and Mouse.Target and not Mouse.Target.Parent\FindFirstChild"RobloxModel"? - -- return - -- else - -- return - return - ) - error "Error: RbxStamper.DoStamperMouseMove Mouse is nil on second check" - game.JointsService\ClearJoinAfterMoveJoints! - Mouse = nil - return - - - if Mouse and Mouse.Target and not Mouse.Target.Parent\FindFirstChild"RobloxModel"? - game.JointsService\SetJoinAfterMoveTarget Mouse.Target - else - game.JointsService\SetJoinAfterMoveTarget nil - - game.JointsService\ShowPermissibleJoints! - - -- here we allow for a line of high-scalability parts - if isMegaClusterPart! and HighScalabilityLine and HighScalabilityLine.Start - DoHighScalabilityRegionSelect! - - - setupKeyListener = (key, Mouse) -> - return if control and control["Paused"] - -- don't do this if we have no stamp - - key = string.lower key - if key == "r" and not autoAlignToFace(stampData.CurrentParts) -- rotate the model - gInitial90DegreeRotations += 1 - - -- Update orientation value if this is a fake terrain part - clusterValues = stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - if clusterValues and clusterValues\IsA "Vector3Value" - clusterValues.Value = Vector3.new( - clusterValues.Value.X, - clusterValues.Value.Y, - (clusterValues.Value.Z + 1) % 4 - ) - - - -- Rotate the parts or all the parts in the model - ry = math.pi / 2 - if stampData.CurrentParts\IsA"Model" or stampData.CurrentParts\IsA "Tool" - --stampData.CurrentParts\Rotate 0, ry, 0 - modelRotate stampData.CurrentParts, ry - else - stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry, 0) * stampData.CurrentParts.CFrame - - - -- After rotating, update the position - configFound, targetCFrame = findConfigAtMouseTarget Mouse, stampData - if configFound - positionPartsAtCFrame3 targetCFrame, stampData.CurrentParts - - -- update everything else in MouseMove - DoStamperMouseMove Mouse - - elseif key == "c" -- try to expand our high scalability dragger dimension - with HighScalabilityLine - if .InternalLine and - .InternalLine.magnitude > 0 and - .Dimensions < 3 - .MorePoints[.Dimensions] = .End - .MoreLines[.Dimensions] = .InternalLine - .Dimensions = .Dimensions + 1 - .NewHint = true - - keyCon = Mouse.KeyDown\connect (key) -> -- init key connection (keeping code close to func) - setupKeyListener key, Mouse - - resetHighScalabilityLine = -> - if HighScalabilityLine - HighScalabilityLine.Start = \ - HighScalabilityLine.End = \ - HighScalabilityLine.InternalLine = nil - HighScalabilityLine.NewHint = true - - flashRedBox = -> - gui = game.CoreGui - if game\FindFirstChild"Players" and - game.Players["LocalPlayer"] and - game.Players.LocalPlayer\FindFirstChild "PlayerGui" - - gui = game.Players.LocalPlayer.PlayerGui - - return if not stampData["ErrorBox"] - - stampData.ErrorBox.Parent = gui - if stampData.CurrentParts\IsA "Tool" - stampData.ErrorBox.Adornee = stampData.CurrentParts.Handle - else - stampData.ErrorBox.Adornee = stampData.CurrentParts - - delay 0, -> - for _ = 1, 3 - if stampData["ErrorBox"] - stampData.ErrorBox.Visible = true - - wait 0.13 - if stampData["ErrorBox"] - stampData.ErrorBox.Visible = false - - wait 0.13 - - if stampData["ErrorBox"] - stampData.ErrorBox.Adornee = nil - stampData.ErrorBox.Parent = Tool - - DoStamperMouseDown = (Mouse) -> - if not Mouse - error "Error: RbxStamper.DoStamperMouseDown: Mouse is nil" - return - - if not Mouse\IsA "Mouse" - error "Error: RbxStamper.DoStamperMouseDown: Mouse is of type", Mouse.className, "should be of type Mouse" - return - - return if not stampData - - if isMegaClusterPart! - if Mouse and HighScalabilityLine - megaCube = stampData.CurrentParts\FindFirstChild "MegaClusterCube", true - terrain = game.Workspace.Terrain - if megaCube - HighScalabilityLine.Dimensions = 1 - tempCell = terrain\WorldToCell megaCube.CFrame.p - HighScalabilityLine.Start = terrain\CellCenterToWorld tempCell.X, tempCell.Y, tempCell.Z - return - else - HighScalabilityLine.Dimensions = 1 - tempCell = terrain\WorldToCell stampData.CurrentParts.CFrame.p - HighScalabilityLine.Start = terrain\CellCenterToWorld tempCell.X, tempCell.Y, tempCell.Z - return - - loadSurfaceTypes = (part, surfaces) -> - with part - .TopSurface = surfaces[1] - .BottomSurface = surfaces[2] - .LeftSurface = surfaces[3] - .RightSurface = surfaces[4] - .FrontSurface = surfaces[5] - .BackSurface = surfaces[6] - - - saveSurfaceTypes = (part, myTable) -> - tempTable = {} - tempTable[1] = part.TopSurface - tempTable[2] = part.BottomSurface - tempTable[3] = part.LeftSurface - tempTable[4] = part.RightSurface - tempTable[5] = part.FrontSurface - tempTable[6] = part.BackSurface - - myTable[part] = tempTable - - - -- makeSurfaceUnjoinable = (part, surface) -> - -- -- TODO: FILL OUT! - -- end - - prepareModel = (model) -> - if not model - return nil - - - gDesiredTrans = 0.7 - gStaticTrans = 1 - - clone = model\Clone! - scripts = {} - parts = {} - decals = {} - - stampData = {} - with stampData - .DisabledScripts = {} - .TransparencyTable = {} - .MaterialTable = {} - .CanCollideTable = {} - .AnchoredTable = {} - .ArchivableTable = {} - .DecalTransparencyTable = {} - .SurfaceTypeTable = {} - - collectParts clone, parts, scripts, decals - - if #parts <= 0 - return nil, "no parts found in modelToStamp" - - - for _, script in pairs scripts - if not script.Disabled - script.Disabled = true - stampData.DisabledScripts[] = script - - - for _, part in pairs parts - stampData.TransparencyTable[part] = part.Transparency - part.Transparency = gStaticTrans + (1 - gStaticTrans) * part.Transparency - stampData.MaterialTable[part] = part.Material - part.Material = Enum.Material.Plastic - stampData.CanCollideTable[part] = part.CanCollide - part.CanCollide = false - stampData.AnchoredTable[part] = part.Anchored - part.Anchored = true - stampData.ArchivableTable[part] = part.Archivable - part.Archivable = false - - saveSurfaceTypes part, stampData.SurfaceTypeTable - - fadeInDelayTime = 0.5 - transFadeInTime = 0.5 - delay 0, -> - wait fadeInDelayTime -- give it some time to be completely transparent - - begTime = tick! - currTime = begTime - while (currTime - begTime) < transFadeInTime and - part and - part\IsA"BasePart" and - part.Transparency > gDesiredTrans - - newTrans = 1 - (((currTime - begTime) / transFadeInTime) * (gStaticTrans - gDesiredTrans)) - if stampData["TransparencyTable"] and stampData.TransparencyTable[part] - part.Transparency = newTrans + (1 - newTrans) * stampData.TransparencyTable[part] - - wait 0.03 - currTime = tick! - - if part and part\IsA "BasePart" - if stampData["TransparencyTable"] and stampData.TransparencyTable[part] - part.Transparency = gDesiredTrans + (1 - gDesiredTrans) * stampData.TransparencyTable[part] - - for _, decal in pairs decals - stampData.DecalTransparencyTable[decal] = decal.Transparency - decal.Transparency = gDesiredTrans + (1 - gDesiredTrans) * decal.Transparency - - - -- disable all seats - setSeatEnabledStatus clone, true - setSeatEnabledStatus clone, false - - stampData.CurrentParts = clone - - -- if auto-alignable, we enforce a pre-rotation to the canonical "0-frame" - if autoAlignToFace clone - stampData.CurrentParts\ResetOrientationToIdentity! - gInitial90DegreeRotations = 0 - else -- pre-rotate if necessary - ry = gInitial90DegreeRotations * math.pi / 2 - if stampData.CurrentParts\IsA"Model" or stampData.CurrentParts\IsA "Tool" - --stampData.CurrentParts\Rotate 0, ry, 0 - modelRotate stampData.CurrentParts, ry - else - stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry, 0) * stampData.CurrentParts.CFrame - - - -- since we're cloning the old model instead of the new one, we will need to update the orientation based on the original value AND how many more - -- rotations we expect since then [either that or we need to store the just-stamped clusterMaterial.Value.Z somewhere]. This should fix the terrain rotation - -- issue (fingers crossed) [HotThoth] - - clusterMaterial = stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - if clusterMaterial and clusterMaterial\IsA"Vector3Value" - clusterMaterial.Value = Vector3.new( - clusterMaterial.Value.X, - clusterMaterial.Value.Y, - (clusterMaterial.Value.Z + gInitial90DegreeRotations) % 4 - ) - - - -- After rotating, update the position - configFound, targetCFrame = findConfigAtMouseTarget Mouse, stampData - if configFound - stampData.CurrentParts = positionPartsAtCFrame3 targetCFrame, stampData.CurrentParts - - - -- to show joints during the mouse move - game.JointsService\SetJoinAfterMoveInstance stampData.CurrentParts - - return clone, parts - - - checkTerrainBlockCollisions = (cellPos, checkHighScalabilityStamp) -> - cellCenterToWorld = game.Workspace.Terrain.CellCenterToWorld - cellCenter = cellCenterToWorld game.Workspace.Terrain, cellPos.X, cellPos.Y, cellPos.Z - cellBlockingParts = game.Workspace\FindPartsInRegion3( - Region3.new( - cellCenter - Vector3.new(2, 2, 2) + insertBoundingBoxOverlapVector, - cellCenter + Vector3.new(2, 2, 2) - insertBoundingBoxOverlapVector - ), - stampData.CurrentParts, - 100 - ) - - skipThisCell = false - - for b in *cellBlockingParts - if isBlocker b - skipThisCell = true - break - - - if not skipThisCell - -- pop players up above any set cells - alreadyPushedUp = {} - -- if no blocking model below, then see if stamping on top of a character - for b in *cellBlockingParts - if b.Parent and - not alreadyPushedUp[b.Parent] and - b.Parent\FindFirstChild "Humanoid" and - b.Parent\FindFirstChild"Humanoid"\IsA "Humanoid" - - ----------------------------------------------------------------------------------- - blockingPersonTorso = b.Parent\FindFirstChild "Torso" - alreadyPushedUp[b.Parent] = true - - if blockingPersonTorso - -- if so, let's push the person upwards so they pop on top of the stamped model/part (but only if there's space above them) - newY = cellCenter.Y + 5 - if spaceAboveCharacter blockingPersonTorso, newY, stampData - blockingPersonTorso.CFrame = blockingPersonTorso.CFrame + - Vector3.new 0, newY - blockingPersonTorso.CFrame.p.Y, 0 - else - -- if no space, we just skip this one - skipThisCell = true - break - - - ----------------------------------------------------------------------------------- - - - if not skipThisCell -- if we STILL aren't skipping... then we're good to go! - canSetCell = true - - if checkHighScalabilityStamp -- check to see if cell is in region, if not we'll skip set - if allowedStampRegion - cellPos = cellCenterToWorld game.Workspace.Terrain, cellPos.X, cellPos.Y, cellPos.Z - with allowedStampRegion - if (cellPos.X + 2 > .CFrame.p.X + .Size.X / 2) or - (cellPos.X - 2 < .CFrame.p.X - .Size.X / 2) or - (cellPos.Y + 2 > .CFrame.p.Y + .Size.Y / 2) or - (cellPos.Y - 2 < .CFrame.p.Y - .Size.Y / 2) or - (cellPos.Z + 2 > .CFrame.p.Z + .Size.Z / 2) or - (cellPos.Z - 2 < .CFrame.p.Z - .Size.Z / 2) - - canSetCell = false - - return canSetCell - - false - - ResolveMegaClusterStamp = (checkHighScalabilityStamp) -> - cellSet = false - - cluster = game.Workspace.Terrain - - line = HighScalabilityLine.InternalLine - cMax = game.Workspace.Terrain.MaxExtents.Max - cMin = game.Workspace.Terrain.MaxExtents.Min - - clusterMaterial = 1 -- default is grass - clusterType = 0 -- default is brick - clusterOrientation = 0 -- default is 0 rotation - - autoWedgeClusterParts = false - if stampData.CurrentParts\FindFirstChild "AutoWedge" - autoWedgeClusterParts = true - - - if stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - clusterMaterial = stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - if clusterMaterial\IsA "Vector3Value" - clusterType = clusterMaterial.Value.Y - clusterOrientation = clusterMaterial.Value.Z - clusterMaterial = clusterMaterial.Value.X - elseif clusterMaterial\IsA "IntValue" - clusterMaterial = clusterMaterial.Value - - - if HighScalabilityLine.Adorn.Parent and - HighScalabilityLine.Start and - ((HighScalabilityLine.Dimensions > 1) or (line and line.magnitude > 0)) - - startCell = game.Workspace.Terrain\WorldToCell HighScalabilityLine.Start - xInc = { 0, 0, 0 } - yInc = { 0, 0, 0 } - zInc = { 0, 0, 0 } - - incrementVect = { nil, nil, nil } - stepVect = - * Vector3.new 0, 0, 0 - * Vector3.new 0, 0, 0 - * Vector3.new 0, 0, 0 - - worldAxes = - * Vector3.new 1, 0, 0 - * Vector3.new 0, 1, 0 - * Vector3.new 0, 0, 1 - - lines = {} - if HighScalabilityLine.Dimensions > 1 - table.insert lines, HighScalabilityLine.MoreLines[1] - - if line and line.magnitude > 0 - table.insert lines, line - - if HighScalabilityLine.Dimensions > 2 - table.insert lines, HighScalabilityLine.MoreLines[2] - - - for i = 1, #lines - lines[i] = Vector3.new( - math.floor(lines[i].X + 0.5), - math.floor(lines[i].Y + 0.5), - math.floor lines[i].Z + 0.5 - ) -- round to integers - - xInc[i] = if lines[i].X > 0 - 1 - elseif lines[i].X < 0 - -1 - - yInc[i] = if lines[i].Y > 0 - 1 - elseif lines[i].Y < 0 - -1 - - zInc[i] = if lines[i].Z > 0 - 1 - elseif lines[i].Z < 0 - -1 - - - incrementVect[i] = Vector3.new xInc[i], yInc[i], zInc[i] - if incrementVect[i].magnitude < 0.9 - incrementVect[i] = nil - - - if not lines[2] - lines[2] = Vector3.new 0, 0, 0 - - if not lines[3] - lines[3] = Vector3.new 0, 0, 0 - - - waterForceTag = stampData.CurrentParts\FindFirstChild "WaterForceTag", true - waterForceDirectionTag = stampData.CurrentParts\FindFirstChild "WaterForceDirectionTag", true - - while stepVect[3].magnitude * 4 <= lines[3].magnitude - outerStepVectIndex = 1 - while outerStepVectIndex < 4 - stepVect[2] = Vector3.new 0, 0, 0 - while stepVect[2].magnitude * 4 <= lines[2].magnitude - innerStepVectIndex = 1 - while innerStepVectIndex < 4 - stepVect[1] = Vector3.new 0, 0, 0 - while stepVect[1].magnitude * 4 <= lines[1].magnitude - stepVectSum = stepVect[1] + stepVect[2] + stepVect[3] - cellPos = Vector3int16.new( - startCell.X + stepVectSum.X, - startCell.Y + stepVectSum.Y, - startCell.Z + stepVectSum.Z - ) - if cellPos.X >= cMin.X and - cellPos.Y >= cMin.Y and - cellPos.Z >= cMin.Z and - cellPos.X < cMax.X and - cellPos.Y < cMax.Y and - cellPos.Z < cMax.Z - - -- check if overlaps player or part - okToStampTerrainBlock = checkTerrainBlockCollisions cellPos, checkHighScalabilityStamp - - if okToStampTerrainBlock - if waterForceTag - cluster\SetWaterCell( - cellPos.X, - cellPos.Y, - cellPos.Z, - Enum.WaterForce[waterForceTag.Value], - Enum.WaterDirection[waterForceDirectionTag.Value] - ) - else - cluster\SetCell( - cellPos.X, - cellPos.Y, - cellPos.Z, - clusterMaterial, - clusterType, - clusterOrientation - ) - - cellSet = true - - -- auto-wedge it? - if autoWedgeClusterParts - game.Workspace.Terrain\AutowedgeCells( - Region3int16.new( - Vector3int16.new(cellPos.x - 1, cellPos.y - 1, cellPos.z - 1), - Vector3int16.new cellPos.x + 1, cellPos.y + 1, cellPos.z + 1 - ) - ) - - stepVect[1] = stepVect[1] + incrementVect[1] - - if incrementVect[2] - while innerStepVectIndex < 4 and - worldAxes[innerStepVectIndex]\Dot(incrementVect[2]) == 0 - - innerStepVectIndex += 1 - - if innerStepVectIndex < 4 - stepVect[2] = stepVect[2] + - worldAxes[innerStepVectIndex] * - worldAxes[innerStepVectIndex]\Dot incrementVect[2] - - innerStepVectIndex += 1 - else - stepVect[2] = Vector3.new 1, 0, 0 - innerStepVectIndex = 4 -- skip all remaining loops - - if stepVect[2].magnitude * 4 > lines[2].magnitude - innerStepVectIndex = 4 - - if incrementVect[3] - while outerStepVectIndex < 4 and worldAxes[outerStepVectIndex]\Dot(incrementVect[3]) == 0 - outerStepVectIndex += 1 - - if outerStepVectIndex < 4 - stepVect[3] = stepVect[3] + - worldAxes[outerStepVectIndex] * - worldAxes[outerStepVectIndex]\Dot incrementVect[3] - - outerStepVectIndex += 1 - else -- skip all remaining loops - stepVect[3] = Vector3.new 1, 0, 0 - outerStepVectIndex = 4 - - if stepVect[3].magnitude * 4 > lines[3].magnitude - outerStepVectIndex = 4 - - - -- and also get rid of any HighScalabilityLine stuff if it's there - HighScalabilityLine.Start = nil - HighScalabilityLine.Adorn.Parent = nil - - -- Mark for undo. - if cellSet - stampData.CurrentParts.Parent = nil - try - game\GetService"ChangeHistoryService"\SetWaypoint "StamperMulti" - - cellSet - - DoStamperMouseUp = (Mouse) -> - if not Mouse - error "Error: RbxStamper.DoStamperMouseUp: Mouse is nil" - return false - - if not Mouse\IsA "Mouse" - error "Error: RbxStamper.DoStamperMouseUp: Mouse is of type", Mouse.className, "should be of type Mouse" - return false - - if not stampData.Dragger - error "Error: RbxStamper.DoStamperMouseUp: stampData.Dragger is nil" - return false - - if not HighScalabilityLine - return false - - local checkHighScalabilityStamp - if stampInModel - local canStamp - isHSLPart = isMegaClusterPart! - - if isHSLPart and - HighScalabilityLine and - HighScalabilityLine.Start and - HighScalabilityLine.InternalLine and - HighScalabilityLine.InternalLine.magnitude > 0 - - -- we have an HSL line, test later - canStamp = true - checkHighScalabilityStamp = true - else - canStamp, checkHighScalabilityStamp = t.CanEditRegion stampData.CurrentParts, allowedStampRegion - - - if not canStamp - stampFailedFunc?! - return false - - - -- if unstampable face, then don't let us stamp there! - if unstampableSurface - flashRedBox! - return false - - - -- recheck if we can stamp, as we just moved part - canStamp, checkHighScalabilityStamp = t.CanEditRegion stampData.CurrentParts, allowedStampRegion - if not canStamp - stampFailedFunc?! - return false - - - -- Prevent part from being stamped on top of a player - - minBB, maxBB = getBoundingBoxInWorldCoordinates stampData.CurrentParts - - -- HotThoth's note: Now that above CurrentParts positioning has been commented out, to be truly correct, we would need to use the - -- value of configFound from the previous onStamperMouseMove call which moved the CurrentParts - -- Shouldn't this be true when lastTargetCFrame has been set and false otherwise? - configFound, targetCFrame = findConfigAtMouseTarget Mouse, stampData - - if configFound and not HighScalabilityLine.Adorn.Parent - if clusterPartsInRegion minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector - flashRedBox! - return false - - - blockingParts = game.Workspace\FindPartsInRegion3( - Region3.new(minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector), - stampData.CurrentParts, - 100 - ) - - for b in *blockingParts - if isBlocker b - flashRedBox! - return false - - - alreadyPushedUp = {} - -- if no blocking model below, then see if stamping on top of a character - for b in *blockingParts - if b.Parent and - not alreadyPushedUp[b.Parent] and - b.Parent\FindFirstChild"Humanoid" and - b.Parent\FindFirstChild"Humanoid"\IsA "Humanoid" - - --------------------------------------------------------------------------- - blockingPersonTorso = b.Parent\FindFirstChild "Torso" - alreadyPushedUp[b.Parent] = true - - if blockingPersonTorso - -- if so, let's push the person upwards so they pop on top of the stamped model/part (but only if there's space above them) - newY = maxBB.Y + 3 - if spaceAboveCharacter blockingPersonTorso, newY, stampData - blockingPersonTorso.CFrame = blockingPersonTorso.CFrame + - Vector3.new 0, newY - blockingPersonTorso.CFrame.p.Y, 0 - else - -- if no space, we just error - flashRedBox! - return false - - - --------------------------------------------------------------------------- - - - elseif (not configFound) and not (HighScalabilityLine.Start and HighScalabilityLine.Adorn.Parent) -- if no config then only stamp if it's a real HSL! - resetHighScalabilityLine! - return false - - - -- something will be stamped! so set the "StampedSomething" toggle to true - if game\FindFirstChild"Players" and - game.Players["LocalPlayer"] and - game.Players.LocalPlayer["Character"] - - localChar = game.Players.LocalPlayer.Character - stampTracker = localChar\FindFirstChild "StampTracker" - if stampTracker and not stampTracker.Value - stampTracker.Value = true - - - -- if we drew a line of mega parts, stamp them out - if HighScalabilityLine.Start and HighScalabilityLine.Adorn.Parent and isMegaClusterPart! - if ResolveMegaClusterStamp(checkHighScalabilityStamp) or checkHighScalabilityStamp - -- kill the ghost part - stampData.CurrentParts.Parent = nil - return true - - - -- not High-Scalability-Line-Based, so behave normally [and get rid of any HSL stuff] - HighScalabilityLine.Start = nil - HighScalabilityLine.Adorn.Parent = nil - - cluster = game.Workspace.Terrain - - -- if target point is in cluster, just use cluster\SetCell - if isMegaClusterPart! - -- if targetCFrame is inside cluster, just set that cell to 1 and return - --cellPos = cluster\WorldToCell targetCFrame.p - - local cellPos - cellPos = if stampData.CurrentParts\IsA "Model" - cluster\WorldToCell stampData.CurrentParts\GetModelCFrame!.p - else - cluster\WorldToCell stampData.CurrentParts.CFrame.p - - - cMax = game.Workspace.Terrain.MaxExtents.Max - cMin = game.Workspace.Terrain.MaxExtents.Min - - if checkTerrainBlockCollisions cellPos, false - clusterValues = stampData.CurrentParts\FindFirstChild "ClusterMaterial", true - waterForceTag = stampData.CurrentParts\FindFirstChild "WaterForceTag", true - waterForceDirectionTag = stampData.CurrentParts\FindFirstChild "WaterForceDirectionTag", true - - if cellPos.X >= cMin.X and - cellPos.Y >= cMin.Y and - cellPos.Z >= cMin.Z and - cellPos.X < cMax.X and - cellPos.Y < cMax.Y and - cellPos.Z < cMax.Z - - if waterForceTag - cluster\SetWaterCell( - cellPos.X, - cellPos.Y, - cellPos.Z, - Enum.WaterForce[waterForceTag.Value], - Enum.WaterDirection[waterForceDirectionTag.Value] - ) - elseif not clusterValues - cluster\SetCell( - cellPos.X, - cellPos.Y, - cellPos.Z, - cellInfo.Material, - cellInfo.clusterType, - gInitial90DegreeRotations % 4 - ) - elseif clusterValues\IsA "Vector3Value" - cluster\SetCell( - cellPos.X, - cellPos.Y, - cellPos.Z, - clusterValues.Value.X, - clusterValues.Value.Y, - clusterValues.Value.Z - ) - else - cluster\SetCell cellPos.X, cellPos.Y, cellPos.Z, clusterValues.Value, 0, 0 - - - autoWedgeClusterParts = false - if stampData.CurrentParts\FindFirstChild "AutoWedge" - autoWedgeClusterParts = true - - - -- auto-wedge it - if autoWedgeClusterParts - game.Workspace.Terrain\AutowedgeCells( - Region3int16.new( - Vector3int16.new(cellPos.x - 1, cellPos.y - 1, cellPos.z - 1), - Vector3int16.new cellPos.x + 1, cellPos.y + 1, cellPos.z + 1 - ) - ) - - - -- kill the ghost part - stampData.CurrentParts.Parent = nil - - -- Mark for undo. It has to happen here or the selection display will come back also. - try - game\GetService"ChangeHistoryService"\SetWaypoint "StamperSingle" - - return true - - else - -- you tried to stamp a HSL-single part where one does not belong! - flashRedBox! - return false - - - getPlayer = -> - if game\FindFirstChild"Players" and - game.Players["LocalPlayer"] - - return game.Players.LocalPlayer - - - -- Post process: after positioning the part or model, restore transparency, material, anchored and collide states and create joints - if stampData.CurrentParts\IsA"Model" or stampData.CurrentParts\IsA "Tool" - if stampData.CurrentParts\IsA "Model" - -- Tyler's magical hack-code for allowing/preserving clones of both Surface and Manual Welds... just don't ask X< - manualWeldTable = {} - manualWeldParentTable = {} - saveTheWelds stampData.CurrentParts, manualWeldTable, manualWeldParentTable - stampData.CurrentParts\BreakJoints! - stampData.CurrentParts\MakeJoints! - restoreTheWelds manualWeldTable, manualWeldParentTable - - - -- if it's a model, we also want to fill in the playerID and playerName tags, if it has those (e.g. for the friend-only door) - playerIdTag = stampData.CurrentParts\FindFirstChild "PlayerIdTag" - playerNameTag = stampData.CurrentParts\FindFirstChild "PlayerNameTag" - if playerIdTag? - tempPlayerValue = getPlayer! - if tempPlayerValue? - playerIdTag.Value = tempPlayerValue.userId - - - if playerNameTag? - if game\FindFirstChild "Players" and game.Players["LocalPlayer"] - tempPlayerValue = game.Players.LocalPlayer - if tempPlayerValue? - playerNameTag.Value = tempPlayerValue.Name - - - -- ...and tag all inserted models for subsequent origin identification - -- if no RobloxModel tag already exists, then add it. - if not stampData.CurrentParts\FindFirstChild"RobloxModel"? - New "BoolValue", "RobloxModel" - Parent: stampData.CurrentParts - - if not stampData.CurrentParts\FindFirstChild"RobloxStamper"? - New "BoolValue", "RobloxStamper" - Parent: stampData.CurrentParts - - - else - stampData.CurrentParts\BreakJoints! - if not stampData.CurrentParts\FindFirstChild"RobloxStamper"? - New "BoolValue", "RobloxStamper" - Parent: stampData.CurrentParts - - - -- make sure all the joints are activated before restoring anchor states - if not createJoints - game.JointsService\CreateJoinAfterMoveJoints! - - - -- Restore the original properties for all parts being stamped - for part, transparency in pairs stampData.TransparencyTable - part.Transparency = transparency - - for part, archivable in pairs stampData.ArchivableTable - part.Archivable = archivable - - for part, material in pairs stampData.MaterialTable - part.Material = material - - for part, collide in pairs stampData.CanCollideTable - part.CanCollide = collide - - for part, anchored in pairs stampData.AnchoredTable - part.Anchored = anchored - - for decal, transparency in pairs stampData.DecalTransparencyTable - decal.Transparency = transparency - - - for part, surfaces in pairs stampData.SurfaceTypeTable - loadSurfaceTypes part, surfaces - - - if isMegaClusterPart! - stampData.CurrentParts.Transparency = 0 - - - -- re-enable all seats - setSeatEnabledStatus stampData.CurrentParts, true - - with stampData - .TransparencyTable = \ - .ArchivableTable = \ - .MaterialTable = \ - .CanCollideTable = \ - .AnchoredTable = \ - .SurfaceTypeTable = nil - - -- ...and tag all inserted models for subsequent origin identification - -- if no RobloxModel tag already exists, then add it. - if not stampData.CurrentParts\FindFirstChild"RobloxModel"? - New "BoolValue", "RobloxModel" - Parent: stampData.CurrentParts - - - -- and make sure we don't delete it, now that it's not a ghost part - if ghostRemovalScript - ghostRemovalScript.Parent = nil - - - --Re-enable the scripts - for _, script in pairs stampData.DisabledScripts - script.Disabled = false - - - --Now that they are all marked enabled, reinsert them into the world so they start running - for _, script in pairs stampData.DisabledScripts - oldParent = script.Parent - script.Parent = nil - script\Clone!.Parent = oldParent - - - -- clear out more data - stampData.DisabledScripts = \ - stampData.Dragger = \ - stampData.CurrentParts = nil - - try - game\GetService"ChangeHistoryService"\SetWaypoint "StampedObject" - - true - - pauseStamper = -> - for i = 1, #mouseCons -- stop the mouse from doing anything - mouseCons[i]\disconnect! - mouseCons[i] = nil - - mouseCons = {} - - if stampData and stampData.CurrentParts -- remove our ghost part - stampData.CurrentParts.Parent = nil - stampData.CurrentParts\Remove! - - - resetHighScalabilityLine! - - game.JointsService\ClearJoinAfterMoveJoints! - - prepareUnjoinableSurfaces = (modelCFrame, parts, whichSurface) -> - AXIS_VECTORS = - * Vector3.new 1, 0, 0 - * Vector3.new 0, 1, 0 - * Vector3.new 0, 0, 1 - - -- maybe last one is negative? TODO: check this! - isPositive = 1 - if whichSurface < 0 - isPositive *= -1 - whichSurface *= -1 - - surfaceNormal = isPositive * modelCFrame\vectorToWorldSpace AXIS_VECTORS[whichSurface] - - for currPart in *parts - -- now just need to find which surface of currPart most closely match surfaceNormal and then set that to Unjoinable - surfaceNormalInLocalCoords = currPart.CFrame\vectorToObjectSpace surfaceNormal - if math.abs(surfaceNormalInLocalCoords.X) > math.abs surfaceNormalInLocalCoords.Y - if math.abs(surfaceNormalInLocalCoords.X) > math.abs surfaceNormalInLocalCoords.Z - if surfaceNormalInLocalCoords.X > 0 - currPart.RightSurface = "Unjoinable" - else - currPart.LeftSurface = "Unjoinable" - - else - if surfaceNormalInLocalCoords.Z > 0 - currPart.BackSurface = "Unjoinable" - else - currPart.FrontSurface = "Unjoinable" - - else - if math.abs(surfaceNormalInLocalCoords.Y) > math.abs surfaceNormalInLocalCoords.Z - if surfaceNormalInLocalCoords.Y > 0 - currPart.TopSurface = "Unjoinable" - else - currPart.BottomSurface = "Unjoinable" - - else - if surfaceNormalInLocalCoords.Z > 0 - currPart.BackSurface = "Unjoinable" - else - currPart.FrontSurface = "Unjoinable" - - - resumeStamper = -> - clone, parts = prepareModel modelToStamp - - return if not clone or not parts - - -- if we have unjoinable faces, then we want to change those surfaces to be Unjoinable - unjoinableTag = clone\FindFirstChild "UnjoinableFaces", true - if unjoinableTag - for unjoinableSurface in string.gmatch unjoinableTag.Value, "[^,]*" - if tonumber unjoinableSurface - prepareUnjoinableSurfaces if clone\IsA "Model" - clone\GetModelCFrame!, parts, tonumber unjoinableSurface - else - clone.CFrame, parts, tonumber unjoinableSurface - - - stampData.ErrorBox = errorBox - clone.Parent = stampInModel or game.Workspace - - if clone\FindFirstChild "ClusterMaterial", true -- extract all info from vector - clusterMaterial = clone\FindFirstChild "ClusterMaterial", true - if clusterMaterial\IsA "Vector3Value" - cellInfo.Material = clusterMaterial.Value.X - cellInfo.clusterType = clusterMaterial.Value.Y - cellInfo.clusterOrientation = clusterMaterial.Value.Z - elseif clusterMaterial\IsA "IntValue" - cellInfo.Material = clusterMaterial.Value - - try - mouseTarget = Mouse.Target - - - game.JointsService\SetJoinAfterMoveTarget if mouseTarget and not mouseTarget.Parent\FindFirstChild"RobloxModel"? - mouseTarget - else - nil - - game.JointsService\ShowPermissibleJoints! - - for _, object in pairs stampData.DisabledScripts - if object.Name == "GhostRemovalScript" - object.Parent = stampData.CurrentParts - - stampData.Dragger = Instance.new "Dragger" - - --Begin a movement by faking a MouseDown signal - stampData.Dragger\MouseDown parts[1], Vector3.new(0, 0, 0), parts - stampData.Dragger\MouseUp! - - DoStamperMouseMove Mouse - - table.insert( - mouseCons, - Mouse.Move\connect -> - return if movingLock or stampUpLock - - movingLock = true - DoStamperMouseMove Mouse - movingLock = false - - ) - - table.insert( - mouseCons, - Mouse.Button1Down\connect -> - DoStamperMouseDown Mouse - - ) - - table.insert( - mouseCons, - Mouse.Button1Up\connect -> - stampUpLock = true - while movingLock - wait! - - stamped.Value = DoStamperMouseUp Mouse - resetHighScalabilityLine! - stampUpLock = false - - ) - - stamped.Value = false - - - resetStamperState = (newModelToStamp) -> - -- if we have a new model, swap it out - if newModelToStamp - if not newModelToStamp\IsA"Model" and not newModelToStamp\IsA "BasePart" - error "resetStamperState: newModelToStamp (first arg) is not nil, but not a model or part!" - - modelToStamp = newModelToStamp - - - -- first clear our state - pauseStamper! - -- now lets load in the new model - resumeStamper! - - - -- load the model initially - resetStamperState! - - -- setup the control table we pass back to the user - control.Stamped = stamped -- BoolValue that fires when user stamps - control.Paused = false - - control.LoadNewModel = (newStampModel) -> - -- allows us to specify a new stamper model to be used with this stamper - if newStampModel and not newStampModel\IsA"Model" and not newStampModel\IsA "BasePart" - error "Control.LoadNewModel: newStampModel (first arg) is not a Model or Part!" - return nil - - resetStamperState newStampModel - - control.ReloadModel = -> - -- will automatically set stamper to get a new model of current model and start stamping with new model - resetStamperState! - - control.Pause = -> -- temporarily stops stamping, use resume to start up again - if not control.Paused - pauseStamper! - control.Paused = true - else - print "RbxStamper Warning: Tried to call Control.Pause! when already paused" - - control.Resume = -> -- resumes stamping, if currently paused - if control.Paused - resumeStamper! - control.Paused = false - else - print "RbxStamper Warning: Tried to call Control.Resume! without Pausing First" - - control.ResetRotation = -> -- resets the model rotation so new models are at default orientation - -- gInitial90DegreeRotations = 0 - -- Note: This function will not always work quite the way we want it to; we will have to build this out further so it works with - -- High-Scalability and with the new model orientation setting methods (model\ResetOrientationToIdentity!) [HotThoth] - - control.Destroy = -> -- Stops current Stamp operation and destroys control construct - for i = 1, #mouseCons - mouseCons[i]\disconnect! - mouseCons[i] = nil - - keyCon?\disconnect! - - game.JointsService\ClearJoinAfterMoveJoints! - - adorn?\Destroy! - adornPart?\Destroy! - errorBox?\Destroy! - - stampData?.Dragger?\Destroy! - stampData?.CurrentParts?\Destroy! - - if control and control["Stamped"] - control.Stamped\Destroy! - - control = nil - control - - -t.Help = (funcNameOrFunc) -> - --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - switch funcNameOrFunc - when "GetStampModel", t.GetStampModel - "Function GetStampModel. Arguments: assetId, useAssetVersionId. assetId is the asset to load in, define useAssetVersionId as true if assetId is a version id instead of a relative assetId. Side effect: returns a model of the assetId, or a string with error message if something fails" - - when "SetupStamperDragger", t.SetupStamperDragger - "Function SetupStamperDragger. Side Effect: Creates 4x4 stamping mechanism for building out parts quickly. Arguments: ModelToStamp, Mouse, LegalStampCheckFunction. ModelToStamp should be a Model or Part, preferrably loaded from RbxStamper.GetStampModel and should have extents that are multiples of 4. Mouse should be a mouse object (obtained from things such as Tool.OnEquipped), used to drag parts around 'stamp' them out. LegalStampCheckFunction is optional, used as a callback with a table argument (table is full of instances about to be stamped). Function should return either true or false, false stopping the stamp action." - -t diff --git a/yue/89449008.yue b/yue/89449008.yue deleted file mode 100644 index aec4666..0000000 --- a/yue/89449008.yue +++ /dev/null @@ -1,821 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - --- A couple of necessary functions -waitForChild = (instance, name) -> - assert instance - assert name - while not instance\FindFirstChild name - print "Waiting for ...", instance, name - instance.ChildAdded\wait! - - instance\FindFirstChild name - -waitForProperty = (instance, property) -> - assert instance - assert property - while not instance[property] - instance.Changed\wait! - - -IsTouchDevice = -> - touchEnabled = false - try - touchEnabled = Game\GetService"UserInputService".TouchEnabled - touchEnabled - - -waitForChild game, "Players" -waitForProperty game.Players, "LocalPlayer" -player = game.Players.LocalPlayer - -RbxGui, _ = LoadLibrary "RbxGui" -if not RbxGui - print "could not find RbxGui!" - return - ---- Begin Locals -StaticTabName = "gear" - -backpack = script.Parent - -backpackItems = {} -buttons = {} - -debounce = false -browsingMenu = false - -mouseEnterCons = {} -mouseClickCons = {} - -local characterChildAddedCon -local characterChildRemovedCon -local backpackAddCon - -playerBackpack = waitForChild player, "Backpack" - -waitForChild backpack, "Tabs" - -waitForChild backpack, "Gear" -gearPreview = waitForChild backpack.Gear, "GearPreview" - -scroller = waitForChild backpack.Gear, "GearGridScrollingArea" - -currentLoadout = waitForChild backpack.Parent, "CurrentLoadout" - -grid = waitForChild backpack.Gear, "GearGrid" -gearButton = waitForChild grid, "GearButton" - -swapSlot = waitForChild script.Parent, "SwapSlot" - -backpackManager = waitForChild script.Parent, "CoreScripts/BackpackScripts/BackpackManager" -backpackOpenEvent = waitForChild backpackManager, "BackpackOpenEvent" -backpackCloseEvent = waitForChild backpackManager, "BackpackCloseEvent" -tabClickedEvent = waitForChild backpackManager, "TabClickedEvent" -resizeEvent = waitForChild backpackManager, "ResizeEvent" -searchRequestedEvent = waitForChild backpackManager, "SearchRequestedEvent" -tellBackpackReadyFunc = waitForChild backpackManager, "BackpackReady" - --- creating scroll bar early as to make sure items get placed correctly -scrollFrame, scrollUp, scrollDown, recalculateScroll = RbxGui.CreateScrollingFrame nil, "grid", Vector2.new 6, 6 - -scrollFrame.Position = UDim2.new 0, 0, 0, 30 -scrollFrame.Size = UDim2.new 1, 0, 1, -30 -scrollFrame.Parent = backpack.Gear.GearGrid - -scrollBar = New "Frame", "ScrollBar" - BackgroundTransparency: 0.9 - BackgroundColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - Size: UDim2.new 0, 17, 1, -36 - Position: UDim2.new 0, 0, 0, 18 - Parent: scroller - -scrollDown.Position = UDim2.new 0, 0, 1, -17 - -scrollUp.Parent = scroller -scrollDown.Parent = scroller - -scrollFrameLoadout, scrollUpLoadout, scrollDownLoadout, recalculateScrollLoadout = RbxGui.CreateScrollingFrame! - -scrollFrameLoadout.Position = UDim2.new 0, 0, 0, 0 -scrollFrameLoadout.Size = UDim2.new 1, 0, 1, 0 -scrollFrameLoadout.Parent = backpack.Gear.GearLoadouts.LoadoutsList - -LoadoutButton = New "TextButton", "LoadoutButton" - RobloxLocked: true - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size14 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 1, 0, 0, 32 - Style: Enum.ButtonStyle.RobloxButton - Text: "Loadout #1" - TextColor3: Color3.new 1, 1, 1 - Parent: scrollFrameLoadout - -with LoadoutButton\clone! - .Text = "Loadout #2" - .Parent = scrollFrameLoadout - -with LoadoutButton\clone! - .Text = "Loadout #3" - .Parent = scrollFrameLoadout - -with LoadoutButton\clone! - .Text = "Loadout #4" - .Parent = scrollFrameLoadout - -New "Frame", "ScrollBarLoadout" - BackgroundTransparency: 0.9 - BackgroundColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - Size: UDim2.new 0, 17, 1, -36 - Position: UDim2.new 0, 0, 0, 18 - Parent: backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea - -scrollDownLoadout.Position = UDim2.new 0, 0, 1, -17 - -scrollUpLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea -scrollDownLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea - --- Begin Functions -removeFromMap = (map, object) -> - for i = 1, #map - if map[i] == object - table.remove map, i - break - -robloxLock = (instance) -> - instance.RobloxLocked = true - children = instance\GetChildren! - if children - for _, child in ipairs children - robloxLock child - - -clearPreview = -> - gearPreview.GearImage.Image = "" - gearPreview.GearStats.GearName.Text = "" - -clearHighlight = (button) -> - button.TextColor3 = Color3.new 1, 1, 1 - button.BackgroundColor3 = Color3.new 0, 0, 0 - -inLoadout = (gear) -> - children = currentLoadout\GetChildren! - for i in *children - if i\IsA "Frame" - button = i\GetChildren! - if #button > 0 and - button[1].GearReference.Value and - button[1].GearReference.Value == gear - - return true - - false - -updateGridActive = -> - for _, v in pairs backpackItems - if buttons[v] - gearRef = buttons[v]\FindFirstChild "GearReference" - - gear = gearRef?.Value - - buttons[v].Active = if (not gear) or inLoadout gear - false - else - true - -swapGearSlot = (slot, gearButton) -> - if not swapSlot.Value -- signal loadout to swap a gear out - swapSlot.Slot.Value = slot - swapSlot.GearButton.Value = gearButton - swapSlot.Value = true - updateGridActive! - -unequipGear = (physGear) -> - physGear.Parent = playerBackpack - updateGridActive! - -UnequipGearMenuClick = (element, menu) -> - return if type(element.Action) ~= "number" - - num = element.Action - if num == 1 -- remove from loadout - unequipGear menu.Parent.GearReference.Value - inventoryButton = menu.Parent - gearToUnequip = inventoryButton.GearReference.Value - loadoutChildren = currentLoadout\GetChildren! - slot = -1 - for i in *loadoutChildren - if i\IsA "Frame" - button = i\GetChildren! - if button[1] and button[1].GearReference.Value == gearToUnequip - slot = button[1].SlotNumber.Text - break - - swapGearSlot slot, nil - - -highlight = (button) -> - button.TextColor3 = Color3.new 0, 0, 0 - button.BackgroundColor3 = Color3.new 0.8, 0.8, 0.8 - -getGearContextMenu = -> - gearContextMenu = New "Frame", "UnequipContextMenu" - Active: true - Size: UDim2.new 0, 115, 0, 70 - Position: UDim2.new 0, -16, 0, -16 - BackgroundTransparency: 1 - Visible: false - - gearContextMenuButton = New "TextButton", "UnequipContextMenuButton" - Text: "" - Style: Enum.ButtonStyle.RobloxButtonDefault - ZIndex: 8 - Size: UDim2.new 1, 0, 1, -20 - Visible: true - Parent: gearContextMenu - - elementHeight = 12 - - contextMenuElements = {} - contextMenuElementsName = { "Remove Hotkey" } - - for i = 1, #contextMenuElementsName - element = {} - element.Type = "Button" - element.Text = contextMenuElementsName[i] - element.Action = i - element.DoIt = UnequipGearMenuClick - table.insert contextMenuElements, element - - - for i, contextElement in ipairs contextMenuElements - element = contextElement - if element.Type == "Button" - button = New "TextButton", "UnequipContextButton#{i}" - BackgroundColor3: Color3.new 0, 0, 0 - BorderSizePixel: 0 - TextXAlignment: Enum.TextXAlignment.Left - Text: " #{contextElement.Text}" - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size14 - Size: UDim2.new 1, 8, 0, elementHeight - Position: UDim2.new 0, 0, 0, elementHeight * i - TextColor3: Color3.new 1, 1, 1 - ZIndex: 9 - Parent: gearContextMenuButton - - if not IsTouchDevice! - button.MouseButton1Click\connect -> - if button.Active and not gearContextMenu.Parent.Active - try - element.DoIt element, gearContextMenu - - browsingMenu = false - gearContextMenu.Visible = false - clearHighlight button - clearPreview! - - - button.MouseEnter\connect -> - if button.Active and gearContextMenu.Parent.Active - highlight button - - - button.MouseLeave\connect -> - if button.Active and gearContextMenu.Parent.Active - clearHighlight button - - - contextElement.Button = button - contextElement.Element = button - elseif element.Type == "Label" - frame = New "Frame", "ContextLabel#{i}" - BackgroundTransparency: 1 - Size: UDim2.new 1, 8, 0, elementHeight - - * New "TextLabel", "Text1" - BackgroundTransparency: 1 - BackgroundColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - TextXAlignment: Enum.TextXAlignment.Left - Font: Enum.Font.ArialBold - FontSize: Enum.FontSize.Size14 - Position: UDim2.new 0, 0, 0, 0 - Size: UDim2.new 0.5, 0, 1, 0 - TextColor3: Color3.new 1, 1, 1 - ZIndex: 9 - - element.Label1 = frame.Text1 - - if element.GetText2 - element.Label2 = New "TextLabel", "Text2" - BackgroundTransparency: 1 - BackgroundColor3: Color3.new 1, 1, 1 - BorderSizePixel: 0 - TextXAlignment: Enum.TextXAlignment.Right - Font: Enum.Font.Arial - FontSize: Enum.FontSize.Size14 - Position: UDim2.new 0.5, 0, 0, 0 - Size: UDim2.new 0.5, 0, 1, 0 - TextColor3: Color3.new 1, 1, 1 - ZIndex: 9 - Parent: frame - - frame.Parent = gearContextMenuButton - element.Label = frame - element.Element = frame - - - gearContextMenu.ZIndex = 4 - gearContextMenu.MouseLeave\connect -> - browsingMenu = false - gearContextMenu.Visible = false - clearPreview! - - robloxLock gearContextMenu - - gearContextMenu - -findEmptySlot = -> - local smallestNum - loadout = currentLoadout\GetChildren! - for i in *loadout - if i\IsA"Frame" and #i\GetChildren! <= 0 - frameNum = tonumber string.sub i.Name, 5 - if frameNum == 0 - frameNum = 10 - - if not smallestNum or (smallestNum > frameNum) - smallestNum = frameNum - - if smallestNum == 10 - smallestNum = 0 - - smallestNum - -checkForSwap = (button, x, y) -> - loadoutChildren = currentLoadout\GetChildren! - for i in *loadoutChildren - if i\IsA"Frame" and string.find i.Name, "Slot" - if x >= i.AbsolutePosition.x and - x <= (i.AbsolutePosition.x + i.AbsoluteSize.x) - - if y >= i.AbsolutePosition.y and - y <= (i.AbsolutePosition.y + i.AbsoluteSize.y) - - slot = tonumber string.sub i.Name, 5 - swapGearSlot slot, button - return true - false - - -previewGear = (button) -> - if not browsingMenu - gearPreview.Visible = false - gearPreview.GearImage.Image = button.Image - gearPreview.GearStats.GearName.Text = button.GearReference.Value.Name - -buttonClick = (button) -> - if button\FindFirstChild "UnequipContextMenu" and not button.Active - button.UnequipContextMenu.Visible = true - browsingMenu = true - -resizeGrid = -> - for _, v in pairs backpackItems - if not v\FindFirstChild "RobloxBuildTool" - if not buttons[v] - buttonClone = gearButton\clone! - - with buttonClone - .Parent = grid.ScrollingFrame - .Visible = true - .Image = v.TextureId - if .Image == "" - .GearText.Text = v.Name - .GearReference.Value = v - .Draggable = true - buttons[v] = buttonClone - - if not IsTouchDevice! - unequipMenu = getGearContextMenu! - - unequipMenu.Visible = false - unequipMenu.Parent = buttonClone - - - local beginPos - buttonClone.DragBegin\connect (value) -> - waitForChild buttonClone, "Background" - buttonClone["Background"].ZIndex = 10 - buttonClone.ZIndex = 10 - beginPos = value - - buttonClone.DragStopped\connect (x, y) -> - waitForChild buttonClone, "Background" - buttonClone["Background"].ZIndex = 1 - buttonClone.ZIndex = 2 - if beginPos ~= buttonClone.Position - if not checkForSwap buttonClone, x, y - buttonClone\TweenPosition( - beginPos, - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - 0.5, - true - ) - buttonClone.Draggable = false - delay 0.5, -> - buttonClone.Draggable = true - - else - buttonClone.Position = beginPos - - - clickTime = tick! - mouseEnterCons[buttonClone] = buttonClone.MouseEnter\connect -> - previewGear buttonClone - - mouseClickCons[buttonClone] = buttonClone.MouseButton1Click\connect -> - newClickTime = tick! - if buttonClone.Active and (newClickTime - clickTime) < 0.5 - slot = findEmptySlot! - if slot - buttonClone.ZIndex = 1 - swapGearSlot slot, buttonClone - - else - buttonClick buttonClone - - clickTime = newClickTime - - recalculateScroll! - -resize = -> - size = 0.75 * if gearPreview.AbsoluteSize.Y > gearPreview.AbsoluteSize.X - gearPreview.AbsoluteSize.X - else - gearPreview.AbsoluteSize.Y - - - waitForChild gearPreview, "GearImage" - gearPreview.GearImage.Size = UDim2.new 0, size, 0, size - gearPreview.GearImage.Position = UDim2.new 0, gearPreview.AbsoluteSize.X / 2 - size / 2, 0.75, -size - - resizeGrid! - - -addToGrid = (child) -> - return if not child\IsA"Tool" and - not child\IsA "HopperBin" - - return if child\FindFirstChild "RobloxBuildTool" - - - for _, v in pairs backpackItems -- check to see if we already have this gear registered - return if v == child - - table.insert backpackItems, child - - changeCon = child.Changed\connect (prop) -> - if prop == "Name" and - buttons[child] and - buttons[child].Image == "" - - buttons[child].GearText.Text = child.Name - - ancestryCon = child.AncestryChanged\connect (_, _) -> - local thisObject - for _, v in pairs backpackItems - if v == child - thisObject = v - break - - waitForProperty player, "Character" - waitForChild player, "Backpack" - if child.Parent ~= player.Backpack and child.Parent ~= player.Character - - ancestryCon?\disconnect! - changeCon?\disconnect! - - for _, v in pairs backpackItems - if v == thisObject - mouseEnterCons[buttons[v]]?\disconnect! - mouseClickCons[buttons[v]]?\disconnect! - - buttons[v].Parent = nil - buttons[v] = nil - break - - removeFromMap backpackItems, thisObject - - resizeGrid! - else - resizeGrid! - updateGridActive! - resizeGrid! - -showPartialGrid = (subset) -> - for _, v in pairs buttons - v.Parent = nil - - if subset - for _, v in pairs subset - v.Parent = grid.ScrollingFrame - - - recalculateScroll! - - -showEntireGrid = -> - for _, v in pairs buttons - v.Parent = grid.ScrollingFrame - - recalculateScroll! - -centerGear = (loadoutChildren) -> - gearButtons = {} - local lastSlotAdd - for i in *loadoutChildren - if i\IsA"Frame" and #i\GetChildren! > 0 - if i.Name == "Slot0" - lastSlotAdd = i - else - table.insert gearButtons, i - - if lastSlotAdd - table.insert gearButtons, lastSlotAdd - - - startPos = (1 - (#gearButtons * 0.1)) / 2 - for i = 1, #gearButtons - gearButtons[i]\TweenPosition( - UDim2.new(startPos + ((i - 1) * 0.1), 0, 0, 0), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - 0.25, - true - ) - -backpackOpenHandler = (currentTab) -> - if currentTab and currentTab ~= StaticTabName - backpack.Gear.Visible = false - return - - backpack.Gear.Visible = true - updateGridActive! - - resizeGrid! - resize! - tellBackpackReadyFunc\Invoke! - -backpackCloseHandler = (currentTab) -> - if currentTab and currentTab ~= StaticTabName - backpack.Gear.Visible = false - return - - - backpack.Gear.Visible = false - - resizeGrid! - resize! - tellBackpackReadyFunc\Invoke! - -tabClickHandler = (tabName) -> - if tabName == StaticTabName - backpackOpenHandler tabName - else - backpackCloseHandler tabName - -loadoutCheck = (child, selectState) -> - return if not child\IsA "ImageButton" - - for _, v in pairs backpackItems - if buttons[v] - if child\FindFirstChild "GearReference" and buttons[v]\FindFirstChild "GearReference" - if buttons[v].GearReference.Value == child.GearReference.Value - buttons[v].Active = selectState - break - - --- removeAllEquippedGear = (physGear) -> --- stuff = player.Character\GetChildren! --- for i in *stuff --- if (i\IsA"Tool" or stuff[i]\IsA"HopperBin") and i ~= physGear --- i.Parent = playerBackpack - --- equipGear = (physGear) -> --- removeAllEquippedGear physGear --- physGear.Parent = player.Character --- updateGridActive! - -setupCharacterConnections = -> - backpackAddCon?\disconnect! - backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded\connect (child) -> - addToGrid child - - - -- make sure we get all the children - backpackChildren = game.Players.LocalPlayer.Backpack\GetChildren! - for i in *backpackChildren - addToGrid i - - - characterChildAddedCon?\disconnect! - characterChildAddedCon = game.Players.LocalPlayer.Character.ChildAdded\connect (child) -> - addToGrid child - updateGridActive! - - characterChildRemovedCon?\disconnect! - characterChildRemovedCon = game.Players.LocalPlayer.Character.ChildRemoved\connect (_) -> - updateGridActive! - - wait! - centerGear currentLoadout\GetChildren! - -removeCharacterConnections = -> - characterChildAddedCon?\disconnect! - characterChildRemovedCon?\disconnect! - backpackAddCon?\disconnect! - -trim = (s) -> s\gsub "^%s*(.-)%s*$", "%1" - -filterGear = (terms) -> - filteredGear = {} - for _, v in pairs backpackItems - if buttons[v] - gearString = trim string.lower buttons[v].GearReference.Value.Name - for i in *terms - if string.match gearString, i - table.insert filteredGear, buttons[v] - break - - filteredGear - -splitByWhitespace = (text) -> - return if type(text) ~= "string" - - [token for token in string.gmatch text, - "[^%s]+" when string.len(token) > 0] - -showSearchGear = (searchTerms) -> - return if not backpack.Gear.Visible - - -- currently not active tab - - searchTermTable = splitByWhitespace searchTerms - local currSearchTerms - currSearchTerms = if searchTermTable and (#searchTermTable > 0) - searchTermTable - else - nil - - if searchTermTable == nil - showEntireGrid! - return - - filteredButtons = filterGear currSearchTerms - showPartialGrid filteredButtons - - -nukeBackpack = -> - while #buttons > 0 - table.remove buttons - - buttons = {} - while #backpackItems > 0 - table.remove backpackItems - - backpackItems = {} - scrollingFrameChildren = grid.ScrollingFrame\GetChildren! - for i in *scrollingFrameChildren - i\remove! - -coreGuiChanged = (coreGuiType, enabled) -> - if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All - if not enabled - backpack.Gear.Visible = false - - -backpackChildren = player.Backpack\GetChildren! -for i in *backpackChildren - addToGrid i - - -------------------------- Start Lifelong Connections ----------------------- - -resizeEvent.Event\connect (_) -> - return if debounce - - debounce = true - wait! - resize! - resizeGrid! - debounce = false - - -currentLoadout.ChildAdded\connect (child) -> loadoutCheck child, false -currentLoadout.ChildRemoved\connect (child) -> loadoutCheck child, true - - -currentLoadout.DescendantAdded\connect (descendant) -> - if not backpack.Visible and (descendant\IsA"ImageButton" or descendant\IsA "TextButton") - centerGear currentLoadout\GetChildren! - - -currentLoadout.DescendantRemoving\connect (descendant) -> - if not backpack.Visible and (descendant\IsA"ImageButton" or descendant\IsA "TextButton") - wait! - centerGear currentLoadout\GetChildren! - - -grid.MouseEnter\connect -> clearPreview! -grid.MouseLeave\connect -> clearPreview! - - -player.CharacterRemoving\connect -> - removeCharacterConnections! - nukeBackpack! - -player.CharacterAdded\connect -> - setupCharacterConnections! - - -player.ChildAdded\connect (child) -> - if child\IsA "Backpack" - playerBackpack = child - backpackAddCon?\disconnect! - backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded\connect (child) -> - addToGrid child - - -swapSlot.Changed\connect -> - if not swapSlot.Value - updateGridActive! - -loadoutChildren = currentLoadout\GetChildren! -for i in *loadoutChildren - if i\IsA"Frame" and string.find i.Name, "Slot" - i.ChildRemoved\connect -> updateGridActive! - i.ChildAdded\connect -> updateGridActive! - - -------------------------- End Lifelong Connections ----------------------- - -try - coreGuiChanged Enum.CoreGuiType.Backpack, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Backpack - Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged - - -resize! -resizeGrid! - --- make sure any items in the loadout are accounted for in inventory -loadoutChildren = currentLoadout\GetChildren! -for i in *loadoutChildren - loadoutCheck i, false - -if not backpack.Visible - centerGear currentLoadout\GetChildren! - - --- make sure that inventory is listening to gear reparenting -if characterChildAddedCon == nil and game.Players.LocalPlayer["Character"] - setupCharacterConnections! - -if not backpackAddCon - backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded\connect (child) -> - addToGrid child - -backpackOpenEvent.Event\connect backpackOpenHandler -backpackCloseEvent.Event\connect backpackCloseHandler -tabClickedEvent.Event\connect tabClickHandler -searchRequestedEvent.Event\connect showSearchGear - -recalculateScrollLoadout! diff --git a/yue/89449093.yue b/yue/89449093.yue deleted file mode 100644 index 3d25110..0000000 --- a/yue/89449093.yue +++ /dev/null @@ -1,412 +0,0 @@ -import "macros" as { $ } -$load $FILE - --- This script manages context switches in the backpack (Gear to Wardrobe, etc.) and player state changes. Also manages global functions across different tabs (currently only search) -return if game.CoreGui.Version < 7 --- peace out if we aren't using the right client - --- basic functions -waitForChild = (instance, name) -> - until instance\FindFirstChild name - instance.ChildAdded\wait! - - instance\FindFirstChild name - -waitForProperty = (instance, property) -> - until instance[property] - instance.Changed\wait! - --- don't do anything if we are in an empty game -waitForChild game, "Players" -if #game.Players\GetChildren! < 1 - game.Players.ChildAdded\wait! - --- make sure everything is loaded in before we do anything --- get our local player -waitForProperty game.Players, "LocalPlayer" - ------------------------- Locals ------------------------------ -backpack = script.Parent -waitForChild backpack, "Gear" - -screen = script.Parent.Parent -assert screen\IsA "ScreenGui" - -waitForChild backpack, "Tabs" -waitForChild backpack.Tabs, "CloseButton" -closeButton = backpack.Tabs.CloseButton - -waitForChild backpack.Tabs, "InventoryButton" -inventoryButton = backpack.Tabs.InventoryButton - -local wardrobeButton -if game.CoreGui.Version >= 8 - waitForChild backpack.Tabs, "WardrobeButton" - wardrobeButton = backpack.Tabs.WardrobeButton - -waitForChild backpack.Parent, "ControlFrame" -backpackButton = waitForChild backpack.Parent.ControlFrame, "BackpackButton" -currentTab = "gear" - -searchFrame = waitForChild backpack, "SearchFrame" -waitForChild backpack.SearchFrame, "SearchBoxFrame" -searchBox = waitForChild backpack.SearchFrame.SearchBoxFrame, "SearchBox" -searchButton = waitForChild backpack.SearchFrame, "SearchButton" -resetButton = waitForChild backpack.SearchFrame, "ResetButton" - -robloxGui = waitForChild Game.CoreGui, "RobloxGui" -currentLoadout = waitForChild robloxGui, "CurrentLoadout" -loadoutBackground = waitForChild currentLoadout, "Background" - -canToggle = true -readyForNextEvent = true -backpackIsOpen = false -active = true -disabledByDeveloper = false - -local humanoidDiedCon - -guiTweenSpeed = 0.25 -- how quickly we open/close the backpack - -searchDefaultText = "Search..." -tilde = "~" -backquote = "`" - -backpackSize = UDim2.new 0, 600, 0, 400 - -if robloxGui.AbsoluteSize.Y <= 320 - backpackSize = UDim2.new 0, 200, 0, 140 - - ------------------------- End Locals --------------------------- - ----------------------------------------- Public Event Setup ---------------------------------------- - -createPublicEvent = (eventName) -> - assert eventName, "eventName is nil" - assert "#{eventName}", "eventName is not a string" - - with Instance.new "BindableEvent" - .Name = "#{eventName}" - .Parent = script - -createPublicFunction = (funcName, invokeFunc) -> - assert funcName, "funcName is nil" - assert "#{funcName}", "funcName is not a string" - assert invokeFunc, "invokeFunc is nil" - assert type(invokeFunc) == "function", "invokeFunc should be of type 'function'" - - with Instance.new "BindableFunction" - .Name = "#{funcName}" - .OnInvoke = invokeFunc - .Parent = script - --- Events -resizeEvent = createPublicEvent "ResizeEvent" -backpackOpenEvent = createPublicEvent "BackpackOpenEvent" -backpackCloseEvent = createPublicEvent "BackpackCloseEvent" -tabClickedEvent = createPublicEvent "TabClickedEvent" -searchRequestedEvent = createPublicEvent "SearchRequestedEvent" ----------------------------------------- End Public Event Setup ---------------------------------------- - ---------------------------- Internal Functions ---------------------------------------- - -resetSearchBoxGui = -> - resetButton.Visible = false - searchBox.Text = searchDefaultText - -resetSearch = -> - resetSearchBoxGui! - searchRequestedEvent\Fire! - -deactivateBackpack = -> - backpack.Visible = false - active = false - -initHumanoidDiedConnections = -> - humanoidDiedCon?\disconnect! - - waitForProperty game.Players.LocalPlayer, "Character" - waitForChild game.Players.LocalPlayer.Character, "Humanoid" - humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died\connect deactivateBackpack - -hideBackpack = -> - backpackIsOpen = false - readyForNextEvent = false - backpackButton.Selected = false - resetSearch! - backpackCloseEvent\Fire currentTab - backpack.Tabs.Visible = false - searchFrame.Visible = false - backpack\TweenSizeAndPosition( - UDim2.new(0, backpackSize.X.Offset, 0, 0), - UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -85), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - guiTweenSpeed, - true, - -> - game.GuiService\RemoveCenterDialog backpack - backpack.Visible = false - backpackButton.Selected = false - ) - delay guiTweenSpeed, -> - game.GuiService\RemoveCenterDialog backpack - backpack.Visible = false - backpackButton.Selected = false - readyForNextEvent = true - canToggle = true - -showBackpack = -> - game.GuiService\AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, -> - backpack.Visible = true - backpackButton.Selected = true - -> - backpack.Visible = false - backpackButton.Selected = false - ) - backpack.Visible = true - backpackButton.Selected = true - backpack\TweenSizeAndPosition( - backpackSize, - UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -backpackSize.Y.Offset - 88), - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - guiTweenSpeed, - true - ) - delay guiTweenSpeed, -> - backpack.Tabs.Visible = false - searchFrame.Visible = true - backpackOpenEvent\Fire currentTab - canToggle = true - readyForNextEvent = true - backpackButton.Image = "http://banland.xyz/asset/?id=97644093" - backpackButton.Position = UDim2.new 0.5, -60, 1, -backpackSize.Y.Offset - 103 - -toggleBackpack = -> - return if not game.Players.LocalPlayer - return if not game.Players.LocalPlayer["Character"] - return if not canToggle - return if not readyForNextEvent - - readyForNextEvent = false - canToggle = false - - backpackIsOpen = not backpackIsOpen - - if backpackIsOpen - with loadoutBackground - .Image = "http://banland.xyz/asset/?id=97623721" - .Position = UDim2.new -0.03, 0, -0.17, 0 - .Size = UDim2.new 1.05, 0, 1.25, 0 - .ZIndex = 2.0 - .Visible = true - showBackpack! - else - backpackButton.Position = UDim2.new 0.5, -60, 1, -44 - loadoutBackground.Visible = false - backpackButton.Selected = false - backpackButton.Image = "http://banland.xyz/asset/?id=97617958" - loadoutBackground.Image = "http://banland.xyz/asset/?id=96536002" - loadoutBackground.Position = UDim2.new -0.1, 0, -0.1, 0 - loadoutBackground.Size = UDim2.new 1.2, 0, 1.2, 0 - hideBackpack! - - clChildren = currentLoadout\GetChildren! - for i in *clChildren - if i and i\IsA "Frame" - frame = i - if #frame\GetChildren! > 0 - backpackButton.Position = UDim2.new 0.5, -60, 1, -108 - backpackButton.Visible = true - loadoutBackground.Visible = true - if frame\GetChildren![1]\IsA "ImageButton" - with frame\GetChildren![1] - .Active = true - .Draggable = false - - -activateBackpack = -> - initHumanoidDiedConnections! - active = true - backpack.Visible = backpackIsOpen - if backpackIsOpen - toggleBackpack! - -closeBackpack = -> - if backpackIsOpen - toggleBackpack! - -setSelected = (tab) -> - assert tab - with tab - assert \IsA "TextButton" - .BackgroundColor3 = Color3.new 1, 1, 1 - .TextColor3 = Color3.new 0, 0, 0 - .Selected = true - .ZIndex = 3 - -setUnselected = (tab) -> - assert tab - with tab - assert \IsA "TextButton" - .BackgroundColor3 = Color3.new 0, 0, 0 - .TextColor3 = Color3.new 1, 1, 1 - .Selected = false - .ZIndex = 1 - -updateTabGui = (selectedTab) -> - assert selectedTab - - if selectedTab == "gear" - setSelected inventoryButton - setUnselected wardrobeButton - elseif selectedTab == "wardrobe" - setSelected wardrobeButton - setUnselected inventoryButton - -mouseLeaveTab = (button) -> - assert button - assert button\IsA "TextButton" - - return if button.Selected - - button.BackgroundColor3 = Color3.new 0, 0, 0 - -mouseOverTab = (button) -> - assert button - assert button\IsA "TextButton" - - return if button.Selected - - button.BackgroundColor3 = Color3.new 39 / 255, 39 / 255, 39 / 255 - - -newTabClicked = (tabName) -> - assert tabName - tabName = string.lower tabName - currentTab = tabName - - updateTabGui tabName - tabClickedEvent\Fire tabName - resetSearch! - - -trim = (s) -> s\gsub "^%s*(.-)%s*$", "%1" - - --- splitByWhitespace = (text) -> --- return if type(text) ~= "string" - --- terms = {} --- for token in string.gmatch text, "[^%s]+" --- if string.len(token) > 0 --- table.insert terms, token - --- terms - -doSearch = -> - searchText = searchBox.Text - if searchText == "" - resetSearch! - return - - searchText = trim searchText - resetButton.Visible = true - -- termTable = splitByWhitespace searchText - searchRequestedEvent\Fire searchText -- todo: replace this with termtable when table passing is possible - -backpackReady = -> - readyForNextEvent = true - -coreGuiChanged = (coreGuiType, enabled) -> - if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All - active = enabled - disabledByDeveloper = not enabled - - with game\GetService "GuiService" - if disabledByDeveloper - try - \RemoveKey tilde - \RemoveKey backquote - else - \AddKey tilde - \AddKey backquote - - - resetSearch! - searchFrame.Visible = enabled and backpackIsOpen - - currentLoadout.Visible = enabled - backpack.Visible = enabled - backpackButton.Visible = enabled - - ---------------------------- End Internal Functions ------------------------------------- - ------------------------------- Public Functions Setup ------------------------------------- -createPublicFunction "CloseBackpack", hideBackpack -createPublicFunction "BackpackReady", backpackReady ------------------------------- End Public Functions Setup --------------------------------- - ------------------------- Connections/Script Main ------------------------------------------- - -try - coreGuiChanged Enum.CoreGuiType.Backpack, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Backpack - Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged - -with inventoryButton - .MouseButton1Click\connect -> newTabClicked "gear" - .MouseEnter\connect -> mouseOverTab inventoryButton - .MouseLeave\connect -> mouseLeaveTab inventoryButton - -if game.CoreGui.Version >= 8 - with wardrobeButton - .MouseButton1Click\connect -> newTabClicked "wardrobe" - .MouseEnter\connect -> mouseOverTab wardrobeButton - .MouseLeave\connect -> mouseLeaveTab wardrobeButton - -closeButton.MouseButton1Click\connect closeBackpack - -screen.Changed\connect (prop) -> - if prop == "AbsoluteSize" - resizeEvent\Fire screen.AbsoluteSize - - --- GuiService key setup -with game\GetService "GuiService" - \AddKey tilde - \AddKey backquote - .KeyPressed\connect (key) -> - return if not active or disabledByDeveloper - - if key == tilde or key == backquote - toggleBackpack! - - -backpackButton.MouseButton1Click\connect -> - return if not active or disabledByDeveloper - - toggleBackpack! - -if game.Players.LocalPlayer["Character"] - activateBackpack! - - -game.Players.LocalPlayer.CharacterAdded\connect activateBackpack - --- search functions -searchBox.FocusLost\connect (enterPressed) -> - if enterPressed or searchBox.Text ~= "" - doSearch! - elseif searchBox.Text == "" - resetSearch! - - -searchButton.MouseButton1Click\connect doSearch -resetButton.MouseButton1Click\connect resetSearch - -if searchFrame and robloxGui.AbsoluteSize.Y <= 320 - searchFrame.RobloxLocked = false - searchFrame\Destroy! diff --git a/yue/97188756.yue b/yue/97188756.yue deleted file mode 100644 index 4594948..0000000 --- a/yue/97188756.yue +++ /dev/null @@ -1,1690 +0,0 @@ -import "macros" as { $ } -$load $FILE - ---[[ - //FileName: ChatScript.LUA - //Written by: Sorcus - //Description: Code for lua side chat on Mercury. Supports Scrolling. - //NOTE: If you find any bugs or inaccuracies PM Sorcus on Roblox or @Canavus on Twitter -]] - -forceChatGUI = false - --- Utility functions + Globals -WaitForChild = (parent, childName) -> - until parent\FindFirstChild(childName)? - parent.ChildAdded\wait 0.03 - - parent[childName] - -IsPhone = -> - cGui = Game\GetService "CoreGui" - rGui = WaitForChild cGui, "RobloxGui" - if rGui.AbsoluteSize.Y < 600 - return true - false - --- Users can use enough white spaces to spoof chatting as other players --- This function removes trailing and leading white spaces --- AFAIK, there is no reason for spam white spaces -StringTrim = (str) -> - -- %S is whitespaces - -- When we find the first non space character defined by ^%s - -- we yank out anything in between that and the end of the string - -- Everything else is replaced with %1 which is essentially nothing - str\gsub "^%s*(.-)%s*$", "%1" - -until Game.Players.LocalPlayer? - wait 0.03 - -Player = Game.Players.LocalPlayer -until Player.Character? - wait 0.03 - -Camera = Game.Workspace.CurrentCamera - --- Heliodex's basic New function (basically a simplified version of melt) -New = (className, name, props) -> - if props == nil -- no name was provided - props = name - name = nil - - obj = Instance.new className - obj.Name = name if name - local parent - - for k, v in pairs props - if type(k) == "string" - if k == "Parent" - parent = v - else - obj[k] = v - - elseif type(k) == "number" and type(v) == "userdata" - v.Parent = obj - - obj.Parent = parent - obj --- - --- Services -CoreGuiService = Game\GetService "CoreGui" -PlayersService = Game\GetService "Players" -GuiService = Game\GetService "GuiService" - --- Lua Enums -Enums = {} -EnumName = {} -- used as unique key for enum name -CreateEnum = (enumName) -> - (t) -> - e = [EnumName]: enumName - for i, name in pairs t - item = - Name: name - Value: i - Enum: e - [EnumName]: enumName - - : (@, value) -> - value == @ or value == @Name or value == @Value - : (@) -> - "Enum.#{@[EnumName]}.#{@Name}" - - e[i] = e[name] = e[item] = item - - Enums[enumName] = e - setmetatable e, - __call: (@, value) -> - @[value] or @[tonumber value] - - __index: - GetEnumItems: (@) -> - t = {} - for i, item in pairs @ - if type(i) == "number" - t[] = item - - table.sort t, (a, b) -> a.Value < b.Value - t - __tostring: (@) -> - "Enum.#{@[EnumName]}" - ---------------------------------------------------- ------------------- Input class -------------------- -Input = - Mouse: Player\GetMouse! - Speed: 0 - Simulating: false - - Configuration: - DefaultSpeed: 1 - - UserIsScrolling: false - ---------------------------------------------------- ------------------- Chat class -------------------- -Chat = - ChatColors: - * BrickColor.new "Bright red" - * BrickColor.new "Bright blue" - * BrickColor.new "Earth green" - * BrickColor.new "Bright violet" - * BrickColor.new "Bright orange" - * BrickColor.new "Bright yellow" - * BrickColor.new "Light reddish violet" - * BrickColor.new "Brick yellow" - - Gui: nil - Frame: nil - RenderFrame: nil - TapToChatLabel: nil - ClickToChatButton: nil - - ScrollingLock: false - EventListener: nil - - -- This is actually a ring buffer - -- Meaning at hitting the historyLength it wraps around - -- Reuses the text objects, so chat atmost uses 100 text objects - MessageQueue: {} - - -- Stores all the values for configuring chat - Configuration: - FontSize: Enum.FontSize.Size12, -- 10 is good - -- Also change this when you are changing the above, this is suboptimal but so is our interface to find FontSize - NumFontSize: 12 - HistoryLength: 20 -- stores up to 50 of the last chat messages for you to scroll through, - Size: UDim2.new 0.38, 0, 0.20, 0 - MessageColor: Color3.new 1, 1, 1 - AdminMessageColor: Color3.new 1, 215 / 255, 0 - XScale: 0.025 - LifeTime: 45 - Position: UDim2.new 0, 2, 0.05, 0 - DefaultTweenSpeed: 0.15 - - -- This could be redone by just using the previous and next fields of the Queue - -- But the iterators cause issues, will be optimized later - SlotPositions_List: {} - -- To precompute and store all player null strings since its an expensive process - CachedSpaceStrings_List: {} - MouseOnFrame: false - GotFocus: false - - Messages_List: {} - MessageThread: nil - - --[[ Admins_List = {'Sorcus', 'Shedletsky', 'Telamon', 'Tarabyte', 'StickMasterLuke', 'OnlyTwentyCharacters', 'FusRoblox', 'SolarCrane', - 'HotThoth', 'JediTkacheff', 'Builderman', 'Brighteyes', 'ReeseMcblox', 'GemLocker', 'GongfuTiger', 'Erik.Cassel', 'Matt Dusek', 'Keith', - 'Totbl', 'LordRugDump', 'David.Baszucki', 'Dbapostle', 'DaveYorkRBX', 'nJay', 'OstrichSized', 'TobotRobot', 'twberg', 'Mercury', 'RBAdam', 'Doughtless', - 'Anaminus', 'Stravant', 'Cr3470r', 'CodeWriter', 'Games', 'AcesWayUpHigh', 'Phil' - }, --]] - Admins_List: - * "taskmanager" - * "Heliodex" - * "tako" - - SafeChat_List: - "Use the Chat menu to talk to me.": - * "/sc0" - * true - "I can only see menu chats.": - * "/sc1" - * true - Hello: - Hi: - * "/sc2_0" - * true - "Hi there!": true - "Hi everyone": true - - Howdy: - * "/sc2_1" - * true - "Howdy partner!": true - - Greetings: - * "/sc2_2" - * true - "Greetings everyone": true - "Greetings Robloxians!": true - "Seasons greetings!": true - - Welcome: - * "/sc2_3" - * true - "Welcome to my place": true - "Welcome to my barbeque": true - "Welcome to our base": true - - "Hey there!": - * "/sc2_4" - * true - "What's up?": - * "/sc2_5" - * true - "How are you doing?": true - "How's it going?": true - "What's new?": true - - "Good day": - * "/sc2_6" - * true - "Good morning": true - "Good evening": true - "Good afternoon": true - "Good night": true - - Silly: - * "/sc2_7" - * true - "Waaaaaaaz up?!": true - "Hullo!": true - "Behold greatness, mortals!": true - "Pardon me, is this Sparta?": true - "THIS IS SPARTAAAA!": true - - "Happy Holidays!": - * "/sc2_8" - * true - "Happy New Year!": true - "Happy Valentine's Day!": true - "Beware the Ides of March!": true - "Happy St. Patrick's Day!": true - "Happy Easter!": true - "Happy Earth Day!": true - "Happy 4th of July!": true - "Happy Thanksgiving!": true - "Happy Halloween!": true - "Happy Hanukkah!": true - "Merry Christmas!": true - "Happy May Day!": true - "Happy Towel Day!": true - "Happy Mercury Day!": true - "Happy LOL Day!": true - - * "/sc2" - - Goodbye: - "Good Night": - * "/sc3_0" - * true - "Sweet dreams": true - "Go to sleep!": true - "Lights out!": true - Bedtime: true - "Going to bed now": true - - Later: - * "/sc3_1" - * true - "See ya later": true - "Later gator!": true - "See you tomorrow": true - - Bye: - * "/sc3_2" - * true - "Hasta la bye bye!": true - - "I'll be right back": - * "/sc3_3" - * true - "I have to go": - * "/sc3_4" - * true - - Farewell: - * "/sc3_5" - * true - "Take care": true - "Have a nice day": true - "Goodluck!": true - "Ta-ta for now!": true - - Peace: - * "/sc3_6" - * true - "Peace out!": true - "Peace dudes!": true - "Rest in pieces!": true - - Silly: - * "/sc3_7" - * true - "To the batcave!": true - "Over and out!": true - "Happy trails!": true - "I've got to book it!": true - "Tootles!": true - "Smell you later!": true - "GG!": true - "My house is on fire! gtg.": true - - * "/sc3" - - Friend: - "Wanna be friends?": - * "/sc4_0" - * true - "Follow me": - * "/sc4_1" - * true - "Come to my place!": true - "Come to my base!": true - "Follow me, team!": true - "Follow me": true - - "Your place is cool": - * "/sc4_2" - * true - "Your place is fun": true - "Your place is awesome": true - "Your place looks good": true - "This place is awesome!": true - - "Thank you": - * "/sc4_3" - * true - "Thanks for playing": true - "Thanks for visiting": true - "Thanks for everything": true - "No, thank you": true - Thanx: true - - "No problem": - * "/sc4_4" - * true - "Don't worry": true - "That's ok": true - np: true - - "You are ...": - * "/sc4_5" - * true - "You are great!": true - "You are good!": true - "You are cool!": true - "You are funny!": true - "You are silly!": true - "You are awesome!": true - "You are doing something I don't like, please stop": true - - "I like ...": - * "/sc4_6" - * true - "I like your name": true - "I like your shirt": true - "I like your place": true - "I like your style": true - "I like you": true - "I like items": true - "I like money": true - - Sorry: - * "/sc4_7" - * true - "My bad!": true - "I'm sorry": true - "Whoops!": true - "Please forgive me.": true - "I forgive you.": true - "I didn't mean to do that.": true - "Sorry, I'll stop now.": true - - * "/sc4" - - Questions: - "Who?": - * "/sc5_0" - * true - "Who wants to be my friend?": true - "Who wants to be on my team?": true - "Who made this brilliant game?": true - - "What?": - * "/sc5_1" - * true - "What is your favorite animal?": true - "What is your favorite game?": true - "What is your favorite movie?": true - "What is your favorite TV show?": true - "What is your favorite music?": true - "What are your hobbies?": true - "LOLWUT?": true - - "When?": - * "/sc5_2" - * true - "When are you online?": true - "When is the new version coming out?": true - "When can we play again?": true - "When will your place be done?": true - - "Where?": - * "/sc5_3" - * true - "Where do you want to go?": true - "Where are you going?": true - "Where am I?!": true - "Where did you go?": true - - "How?": - * "/sc5_4" - * true - "How are you today?": true - "How did you make this cool place?": true - "LOLHOW?": true - - "Can I...": - * "/sc5_5" - * true - "Can I have a tour?": true - "Can I be on your team?": true - "Can I be your friend?": true - "Can I try something?": true - "Can I have that please?": true - "Can I have that back please?": true - "Can I have borrow your hat?": true - "Can I have borrow your gear?": true - - * "/sc5" - - Answers: - "You need help?": - * "/sc6_0" - * true - "Check out the news section": true - "Check out the help section": true - "Read the wiki!": true - "All the answers are in the wiki!": true - "I will help you with this.": true - - "Some people ...": - * "/sc6_1" - * true - Me: true - "Not me": true - You: true - "All of us": true - "Everyone but you": true - "Builderman!": true - "Telamon!": true - "My team": true - "My group": true - Mom: true - Dad: true - Sister: true - Brother: true - Cousin: true - Grandparent: true - Friend: true - - "Time ...": - * "/sc6_2" - * true - "In the morning": true - "In the afternoon": true - "At night": true - Tomorrow: true - "This week": true - "This month": true - Sometime: true - Sometimes: true - "Whenever you want": true - Never: true - "After this": true - "In 10 minutes": true - "In a couple hours": true - "In a couple days": true - - Animals: - * "/sc6_3" - * true - Cats: - Lion: true - Tiger: true - Leopard: true - Cheetah: true - Dogs: - Wolves: true - Beagle: true - Collie: true - Dalmatian: true - Poodle: true - Spaniel: true - Shepherd: true - Terrier: true - Retriever: true - - Horses: - Ponies: true - Stallions: true - Pwnyz: true - - Reptiles: - Dinosaurs: true - Lizards: true - Snakes: true - "Turtles!": true - - Hamster: true - Monkey: true - Bears: true - Fish: - Goldfish: true - Sharks: true - "Sea Bass": true - Halibut: true - "Tropical Fish": true - - Birds: - Eagles: true - Penguins: true - Parakeets: true - Owls: true - Hawks: true - Pidgeons: true - - Elephants: true - "Mythical Beasts": - Dragons: true - Unicorns: true - "Sea Serpents": true - Sphinx: true - Cyclops: true - Minotaurs: true - Goblins: true - "Honest Politicians": true - Ghosts: true - "Scylla and Charybdis": true - - Games: - * "/sc6_4" - * true - Action: true - Puzzle: true - Strategy: true - Racing: true - RPG: true - "Obstacle Course": true - Tycoon: true - Roblox: - BrickBattle: true - "Community Building": true - "Roblox Minigames": true - "Contest Place": true - - "Board games": - Chess: true - Checkers: true - "Settlers of Catan": true - "Tigris and Euphrates": true - "El Grande": true - Stratego: true - Carcassonne: true - - Sports: - * "/sc6_5" - * true - Hockey: true - Soccer: true - Football: true - Baseball: true - Basketball: true - Volleyball: true - Tennis: true - "Sports team practice": true - Watersports: - Surfing: true - Swimming: true - "Water Polo": true - - "Winter sports": - Skiing: true - Snowboarding: true - Sledding: true - Skating: true - - Adventure: - "Rock climbing": true - Hiking: true - Fishing: true - "Horseback riding": true - - Wacky: - Foosball: true - Calvinball: true - Croquet: true - Cricket: true - Dodgeball: true - Squash: true - Trampoline: true - - - "Movies/TV": - * "/sc6_6" - * true - "Science Fiction": true - Animated: - Anime: true - Comedy: true - Romantic: true - Action: true - Fantasy: true - - Music: - * "/sc6_7" - * true - Country: true - Jazz: true - Rap: true - "Hip-hop": true - Techno: true - Classical: true - Pop: true - Rock: true - - Hobbies: - * "/sc6_8" - * true - Computers: - "Building computers": true - Videogames: true - Coding: true - Hacking: true - - "The Internet": - "lol. teh internets!": true - "Watching vids": true - Dance: true - Gymnastics: true - "Listening to music": true - "Arts and crafts": true - "Martial Arts": - Karate: true - Judo: true - "Taikwon Do": true - Wushu: true - "Street fighting": true - - "Music lessons": - "Playing in my band": true - "Playing piano": true - "Playing guitar": true - "Playing violin": true - "Playing drums": true - "Playing a weird instrument": true - - Location: - * "/sc6_9" - * true - USA: - West: - Alaska: true - Arizona: true - California: true - Colorado: true - Hawaii: true - Idaho: true - Montana: true - Nevada: true - "New Mexico": true - Oregon: true - Utah: true - Washington: true - Wyoming: true - - South: - Alabama: true - Arkansas: true - Florida: true - Georgia: true - Kentucky: true - Louisiana: true - Mississippi: true - "North Carolina": true - Oklahoma: true - "South Carolina": true - Tennessee: true - Texas: true - Virginia: true - "West Virginia": true - - Northeast: - Connecticut: true - Delaware: true - Maine: true - Maryland: true - Massachusetts: true - "New Hampshire": true - "New Jersey": true - "New York": true - Pennsylvania: true - "Rhode Island": true - Vermont: true - - Midwest: - Illinois: true - Indiana: true - Iowa: true - Kansas: true - Michigan: true - Minnesota: true - Missouri: true - Nebraska: true - "North Dakota": true - Ohio: true - "South Dakota": true - Wisconsin: true - - Canada: - Alberta: true - "British Columbia": true - Manitoba: true - "New Brunswick": true - Newfoundland: true - "Northwest Territories": true - "Nova Scotia": true - Nunavut: true - Ontario: true - "Prince Edward Island": true - Quebec: true - Saskatchewan: true - Yukon: true - - Mexico: true - "Central America": true - Europe: - France: true - Germany: true - Spain: true - Italy: true - Poland: true - Switzerland: true - Greece: true - Romania: true - Netherlands: true - "Great Britain": - England: true - Scotland: true - Wales: true - "Northern Ireland": true - - - Asia: - China: true - India: true - Japan: true - Korea: true - Russia: true - Vietnam: true - - "South America": - Argentina: true - Brazil: true - - Africa: - Eygpt: true - Swaziland: true - - Australia: true - "Middle East": true - Antarctica: true - "New Zealand": true - - Age: - * "/sc6_10" - * true - Rugrat: true - Kid: true - Tween: true - Teen: true - Twenties: true - Old: true - Ancient: true - Mesozoic: true - "I don't want to say my age. Don't ask.": true - - Mood: - * "/sc6_11" - * true - Good: true - "Great!": true - "Not bad": true - Sad: true - Hyper: true - Chill: true - Happy: true - "Kind of mad": true - - Boy: - * "/sc6_12" - * true - Girl: - * "/sc6_13" - * true - "I don't want to say boy or girl. Don't ask.": - * "/sc6_14" - * true - - * "/sc6" - - Game: - "Let's build": - * "/sc7_0" - * true - "Let's battle": - * "/sc7_1" - * true - "Nice one!": - * "/sc7_2" - * true - "So far so good": - * "/sc7_3" - * true - "Lucky shot!": - * "/sc7_4" - * true - "Oh man!": - * "/sc7_5" - * true - "I challenge you to a fight!": - * "/sc7_6" - * true - "Help me with this": - * "/sc7_7" - * true - "Let's go to your game": - * "/sc7_8" - * true - "Can you show me how do to that?": - * "/sc7_9" - * true - "Backflip!": - * "/sc7_10" - * true - "Frontflip!": - * "/sc7_11" - * true - "Dance!": - * "/sc7_12" - * true - "I'm on your side!": - * "/sc7_13" - * true - "Game Commands": - * "/sc7_14" - * true - regen: true - reset: true - go: true - fix: true - respawn: true - - * "/sc7" - - Silly: - "Muahahahaha!": true - "all your base are belong to me!": true - "GET OFF MAH LAWN": true - "TEH EPIK DUCK IS COMING!!!": true - ROFL: true - "1337": - * true - "i r teh pwnz0r!": true - "w00t!": true - "z0mg h4x!": true - "ub3rR0xXorzage!": true - - Yes: - "Absolutely!": true - "Rock on!": true - "Totally!": true - "Juice!": true - "Yay!": true - Yesh: true - - No: - "Ummm. No.": true - "...": true - "Stop!": true - "Go away!": true - "Don't do that": true - "Stop breaking the rules": true - "I don't want to": true - - Ok: - "Well... ok": true - Sure: true - - Uncertain: - Maybe: true - "I don't know": true - idk: true - "I can't decide": true - "Hmm...": true - - ":-)": - ":-(": true - ":D": true - ":-O": true - lol: true - "=D": true - "D=": true - XD: true - ";D": true - ";)": true - O_O: true - "=)": true - "@_@": true - ">_<": true - T_T: true - "^_^": true - "<(0_0<) <(0_0)> (>0_0)> KIRBY DANCE": true - ")';": true - ":3": true - - Ratings: - "Rate it!": true - "I give it a 1 out of 10": true - "I give it a 2 out of 10": true - "I give it a 3 out of 10": true - "I give it a 4 out of 10": true - "I give it a 5 out of 10": true - "I give it a 6 out of 10": true - "I give it a 7 out of 10": true - "I give it a 8 out of 10": true - "I give it a 9 out of 10": true - "I give it a 10 out of 10!": true - - * CreateEnum"SafeChat" { "Level1", "Level2", "Level3" } - SafeChatTree: {} - TempSpaceLabel: nil ---------------------------------------------------- - ---------------------------------------------------- - -GetNameValue = (pName) -> - value = 0 - for index = 1, #pName - cValue = string.byte string.sub pName, index, index - reverseIndex = #pName - index + 1 - if #pName % 2 == 1 - reverseIndex -= 1 - if reverseIndex % 4 >= 2 - cValue = -cValue - value += cValue - value % 8 - -Chat.ComputeChatColor = (pName) => - @ChatColors[GetNameValue(pName) + 1].Color - --- This is context based scrolling -Chat.EnableScrolling = (toggle) => - -- Genius idea gone to fail, if we switch the camera type we can effectively lock the - -- camera and do no click scrolling - @MouseOnFrame = false - if @RenderFrame - @RenderFrame.MouseEnter\connect -> - character = Player.Character - torso = WaitForChild character, "Torso" - head = WaitForChild character, "Head" - if toggle - @MouseOnFrame = true - Camera.CameraType = "Scriptable" - -- Get relative position of camera and keep to it - Spawn -> - currentRelativePos = Camera.CoordinateFrame.p - torso.Position - while Chat.MouseOnFrame - Camera.CoordinateFrame = CFrame.new torso.Position + currentRelativePos, head.Position - wait 0.015 - - @RenderFrame.MouseLeave\connect -> - Camera.CameraType = "Custom" - @MouseOnFrame = false - --- TODO: Scrolling using Mouse wheel --- Chat.OnScroll = (speed) => --- if @MouseOnFrame --- -- - --- Check if we are running on a touch device -Chat.IsTouchDevice ==> - touchEnabled = false - try - touchEnabled = Game\GetService"UserInputService".TouchEnabled - touchEnabled - --- Scrolling --- Chat.ScrollQueue = (value) => --- for i in *@MessageQueue --- if i --- for _, label in pairs i --- next = i.Next --- previous = i.Previous --- if label and label\IsA('TextLabel') or label\IsA 'TextButton' --- label.Position = if value > 0 and previous and previous['Message'] --- previous['Message'].Position --- elseif value < 1 and next['Message'] --- previous['Message'].Position - --- Handles the rendering of the text objects in their appropriate places -Chat.UpdateQueue = (field, diff) => - -- Have to do some sort of correction here - for i = #@MessageQueue, 1, -1 - if @MessageQueue[i] - for _, label in pairs @MessageQueue[i] - if (label and type(label) ~= "table" and type(label) ~= "number") and - (label\IsA"TextLabel" or label\IsA "TextButton") - - if diff - label.Position = label.Position - UDim2.new 0, 0, diff, 0 - else - if field == @MessageQueue[i] - label.Position = UDim2.new( - @Configuration.XScale, - 0, - label.Position.Y.Scale - field["Message"].Size.Y.Scale, - 0 - ) - -- Just to show up popping effect for the latest message in chat - Spawn -> - wait 0.05 - while label.TextTransparency >= 0 - label.TextTransparency = label.TextTransparency - 0.2 - wait 0.03 - label.TextStrokeTransparency = if label == field["Message"] - 0.8 - else - 1 - else - label.Position = UDim2.new( - @Configuration.XScale, - 0, - label.Position.Y.Scale - field["Message"].Size.Y.Scale, - 0 - ) - if label.Position.Y.Scale < -0.01 - -- NOTE: Remove this fix when Textbounds is fixed - label.Visible = false - label\Destroy! - -Chat.CreateScrollBar ==> - -- Code for scrolling is in here, partially, but scroll bar drawing isn't drawn - -- TODO: Implement - --- For scrolling, to see if we hit the bounds so that we can stop it from scrolling anymore -Chat.CheckIfInBounds = (value) => - if #Chat.MessageQueue < 3 - return true - - if value > 0 and - Chat.MessageQueue[1] and - Chat.MessageQueue[1]["Player"] and - Chat.MessageQueue[1]["Player"].Position.Y.Scale == 0 - - true - elseif value < 0 and - Chat.MessageQueue[1] and - Chat.MessageQueue[1]["Player"] and - Chat.MessageQueue[1]["Player"].Position.Y.Scale < 0 - - true - else - false - --- This is to precompute all playerName space strings --- This is used to offset the message by exactly this + 2 spacestrings -Chat.ComputeSpaceString = (pLabel) => - nString = " " - if not @TempSpaceLabel - @TempSpaceLabel = New "TextButton", "SpaceButton" - Size: UDim2.new 0, pLabel.AbsoluteSize.X, 0, pLabel.AbsoluteSize.Y - FontSize: @Configuration.FontSize - Parent: @RenderFrame - BackgroundTransparency: 1 - Text: nString - - else - @TempSpaceLabel.Text = nString - - while @TempSpaceLabel.TextBounds.X < pLabel.TextBounds.X - nString ..= " " - @TempSpaceLabel.Text = nString - nString ..= " " - @CachedSpaceStrings_List[pLabel.Text] = nString - @TempSpaceLabel.Text = "" - nString - --- When the playerChatted event fires --- The message is what the player chatted -Chat.UpdateChat = (cPlayer, message) => - messageField = - Player: cPlayer - Message: message - - if coroutine.status(Chat.MessageThread) == "dead" - --Chat.Messages_List = {} - table.insert Chat.Messages_List, messageField - Chat.MessageThread = coroutine.create -> - for field in *Chat.Messages_List - Chat\CreateMessage field["Player"], field["Message"] - Chat.Messages_List = {} - - coroutine.resume Chat.MessageThread - else - table.insert Chat.Messages_List, messageField - --- Chat.RecalculateSpacing ==> - --[[for i in *@MessageQueue - pLabel = i['Player'] - mLabel = i['Message'] - - prevYScale = mLabel.Size.Y.Scale - prevText = mLabel.Text - mLabel.Text = prevText - - heightField = mLabel.TextBounds.Y - - mLabel.Size = UDim2.new 1, 0, heightField/@RenderFrame.AbsoluteSize.Y, 0 - pLabel.Size = mLabel.Size - - diff = mLabel.Size.Y.Scale - prevYScale - - Chat\UpdateQueue i, diff - end ]] - --- Chat.ApplyFilter = (str) => --- --[[for _, word in pair @Filter_List --- if string.find str, word --- str\gsub word, '@#$^' --- ]] - --- NOTE: Temporarily disabled ring buffer to allow for chat to always wrap around -Chat.CreateMessage = (cPlayer, message) => - local pName - pName = if not cPlayer - "" - else - cPlayer.Name - message = StringTrim message - local pLabel - local mLabel - -- Our history stores upto 50 messages that is 100 textlabels - -- If we ever hit the mark, which would be in every popular game btw - -- we wrap around and reuse the labels - if #@MessageQueue > @Configuration.HistoryLength - --[[pLabel = @MessageQueue[#@MessageQueue]['Player'] - mLabel = @MessageQueue[#@MessageQueue]['Message'] - - pLabel.Text = pName .. ":" - pLabel.Name = pName - - local pColor - pLabel.TextColor3 = if cPlayer.Neutral - Chat\ComputeChatColor pName - else - cPlayer.TeamColor.Color - - local nString - - nString = if not @CachedSpaceStrings_List[pName] - Chat\ComputeSpaceString pLabel - else - @CachedSpaceStrings_List[pName] - - mLabel.Text = "" - mLabel.Name = pName .. " - message" - mLabel.Text = nString .. message; - - mLabel.Parent = nil - mLabel.Parent = @RenderFrame - - mLabel.Position = UDim2.new 0, 0, 1, 0; - pLabel.Position = UDim2.new 0, 0, 1, 0;]] - - -- Reinserted at the beginning, ring buffer - @MessageQueue[#@MessageQueue] = nil - --else - -- Haven't hit the mark yet, so keep creating - pLabel = New "TextLabel", pName, - Text: pName .. ":" - -- TextColor3 = pColor - FontSize: Chat.Configuration.FontSize - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - Parent: @RenderFrame - TextWrapped: false - Size: UDim2.new 1, 0, 0.1, 0 - BackgroundTransparency: 1 - TextTransparency: 1 - Position: UDim2.new 0, 0, 1, 0 - BorderSizePixel: 0 - TextStrokeColor3: Color3.new 0.5, 0.5, 0.5 - TextStrokeTransparency: 0.75 - --Active = false - - pLabel.TextColor3 = if cPlayer.Neutral - Chat\ComputeChatColor pName - else - cPlayer.TeamColor.Color - - nString = if not @CachedSpaceStrings_List[pName] - Chat\ComputeSpaceString pLabel - else - @CachedSpaceStrings_List[pName] - - mLabel = New "TextLabel", "#{pName} - message" - -- Max is 3 lines - Size: UDim2.new 1, 0, 0.5, 0 - TextColor3: Chat.Configuration.MessageColor - FontSize: Chat.Configuration.FontSize - TextXAlignment: Enum.TextXAlignment.Left - TextYAlignment: Enum.TextYAlignment.Top - Text: "" -- this is to stop when the engine reverts the swear words to default, which is button, ugh - Parent: @RenderFrame - TextWrapped: true - BackgroundTransparency: 1 - TextTransparency: 1 - Position: UDim2.new 0, 0, 1, 0 - BorderSizePixel: 0 - TextStrokeColor3: Color3.new 0, 0, 0 - --TextStrokeTransparency = 0.8; - --Active = false; - - mLabel.Text = nString .. message - - if not pName - pLabel.Text = "" - mLabel.TextColor3 = Color3.new 0, 0.4, 1.0 - --end - - for _, adminName in pairs @Admins_List - if string.lower(adminName) == string.lower pName - mLabel.TextColor3 = @Configuration.AdminMessageColor - - pLabel.Visible = true - mLabel.Visible = true - - -- This will give beautiful multilines as well - heightField = mLabel.TextBounds.Y - - mLabel.Size = UDim2.new 1, 0, heightField / @RenderFrame.AbsoluteSize.Y, 0 - pLabel.Size = mLabel.Size - - queueField = {} - queueField["Player"] = pLabel - queueField["Message"] = mLabel - queueField["SpawnTime"] = tick! -- Used for identifying when to make the message invisible - - table.insert @MessageQueue, 1, queueField - Chat\UpdateQueue queueField - -Chat.ScreenSizeChanged ==> - wait! - while @Frame.AbsoluteSize.Y > 120 - @Frame.Size = @Frame.Size - UDim2.new 0, 0, 0.005, 0 - -- Chat\RecalculateSpacing! - -Chat.FindButtonTree = (scButton, rootList) => - list = {} - rootList = rootList or @SafeChatTree - for button, _ in pairs rootList - list = if button == scButton - rootList[button] - elseif type(rootList[button]) == "table" - Chat\FindButtonTree scButton, rootList[button] - list - -Chat.ToggleSafeChatMenu = (scButton) => - list = Chat\FindButtonTree scButton, @SafeChatTree - if list - for button, _ in pairs list - if button\IsA"TextButton" or button\IsA "ImageButton" - button.Visible = not button.Visible - return true - false - -Chat.CreateSafeChatOptions = (list, rootButton) => - text_List = {} - count = 0 - text_List[rootButton] = {} - text_List[rootButton][1] = list[1] - rootButton = rootButton or @SafeChatButton - for msg, _ in pairs list - if type(msg) == "string" - chatText = New "TextButton", msg, - Text: msg - Size: UDim2.new 0, 100, 0, 20 - TextXAlignment: Enum.TextXAlignment.Center - TextColor3: Color3.new 0.2, 0.1, 0.1 - BackgroundTransparency: 0.5 - BackgroundColor3: Color3.new 1, 1, 1 - Parent: @SafeChatFrame - Visible: false - Position: UDim2.new( - 0, rootButton.Position.X.Scale + 105, - 0, rootButton.Position.Y.Scale - (count - 3) * 100 - ) - - - count += 1 - - if type(list[msg]) == "table" - text_List[rootButton][chatText] = Chat\CreateSafeChatOptions list[msg], chatText - -- else - -- --table.insert text_List[chatText], true - chatText.MouseEnter\connect -> - Chat\ToggleSafeChatMenu chatText - - chatText.MouseLeave\connect -> - Chat\ToggleSafeChatMenu chatText - - chatText.MouseButton1Click\connect -> - lList = Chat\FindButtonTree chatText - -- if lList - -- for i, v in pairs lList - try - PlayersService\Chat lList[1] - text_List - -Chat.CreateSafeChatGui ==> - @SafeChatFrame = New "Frame", "SafeChatFrame" - Size: UDim2.new 1, 0, 1, 0 - Parent: @Gui - BackgroundTransparency: 1 - - * New "ImageButton", "SafeChatButton" - Size: UDim2.new 0, 44, 0, 31 - Position: UDim2.new 0, 1, 0.35, 0 - BackgroundTransparency: 1 - Image: "http://banland.xyz/asset/?id=97080365" - - @SafeChatButton = @SafeChatFrame.SafeChatButton - -- safe chat button is the root of this tree - @SafeChatTree[@SafeChatButton] = Chat\CreateSafeChatOptions @SafeChat_List, @SafeChatButton - - @SafeChatButton.MouseButton1Click\connect -> - Chat\ToggleSafeChatMenu @SafeChatButton - -Chat.FocusOnChatBar ==> - if @ClickToChatButton - @ClickToChatButton.Visible = false - - @GotFocus = true - if @Frame["Background"] - @Frame.Background.Visible = false - @ChatBar\CaptureFocus! - --- For touch devices we create a button instead -Chat.CreateTouchButton ==> - @ChatTouchFrame = New "Frame", "ChatTouchFrame" - Size: UDim2.new 0, 128, 0, 32 - Position: UDim2.new 0, 88, 0, 0 - BackgroundTransparency: 1 - Parent: @Gui - - * New "ImageButton", "ChatLabel" - Size: UDim2.new 0, 74, 0, 28 - Position: UDim2.new 0, 0, 0, 0 - BackgroundTransparency: 1 - ZIndex: 2.0 - - * New "ImageLabel", "Background" - Size: UDim2.new 1, 0, 1, 0 - Position: UDim2.new 0, 0, 0, 0 - BackgroundTransparency: 1 - Image: "http://banland.xyz/asset/?id=97078724" - - @TapToChatLabel = @ChatTouchFrame.ChatLabel - @TouchLabelBackground = @ChatTouchFrame.Background - - @ChatBar = New "TextBox", "ChatBar" - Size: UDim2.new 1, 0, 0.2, 0 - Position: UDim2.new 0, 0, 0.8, 800 - Text: "" - ZIndex: 1 - BackgroundTransparency: 1 - Parent: @Frame - TextXAlignment: Enum.TextXAlignment.Left - TextColor3: Color3.new 1, 1, 1 - ClearTextOnFocus: false - - @TapToChatLabel.MouseButton1Click\connect -> - @TapToChatLabel.Visible = false - --@ChatBar.Visible = true - --@Frame.Background.Visible = true - @ChatBar\CaptureFocus! - @GotFocus = true - if @TouchLabelBackground - @TouchLabelBackground.Visible = false - --- Non touch devices, create the bottom chat bar -Chat.CreateChatBar ==> - -- okay now we - status, result = try - return GuiService.UseLuaChat - if forceChatGUI or (status and result) - @ClickToChatButton = New "TextButton", "ClickToChat" - Size: UDim2.new 1, 0, 0, 20 - BackgroundTransparency: 1 - ZIndex: 2.0 - Parent: @Gui - Text: 'To chat click here or press "/" key' - TextColor3: Color3.new 1, 1, 0.9 - Position: UDim2.new 0, 0, 1, 0 - TextXAlignment: Enum.TextXAlignment.Left - FontSize: Enum.FontSize.Size12 - - @ChatBar = New "TextBox", "ChatBar" - Size: UDim2.new 1, 0, 0, 20 - Position: UDim2.new 0, 0, 1, 0 - Text: "" - ZIndex: 1 - BackgroundColor3: Color3.new 0, 0, 0 - BackgroundTransparency: 0.25 - Parent: @Gui - TextXAlignment: Enum.TextXAlignment.Left - TextColor3: Color3.new 1, 1, 1 - FontSize: Enum.FontSize.Size12 - ClearTextOnFocus: false - - -- Engine has code to offset the entire world, so if we do it by -20 pixels nothing gets in our chat's way - --GuiService\SetGlobalSizeOffsetPixel 0, -20 - success, error = try - GuiService\SetGlobalGuiInset 0, 0, 0, 20 - if not success - GuiService\SetGlobalSizeOffsetPixel 0, -20 - -- CHatHotKey is '/' - GuiService\AddSpecialKey Enum.SpecialKey.ChatHotkey - GuiService.SpecialKeyPressed\connect (key) -> - if key == Enum.SpecialKey.ChatHotkey - Chat\FocusOnChatBar! - - @ClickToChatButton.MouseButton1Click\connect -> - Chat\FocusOnChatBar! - --- Create the initial Chat stuff --- Done only once -Chat.CreateGui ==> - @Gui = WaitForChild CoreGuiService, "RobloxGui" - @Frame = New "Frame", "ChatFrame" - --Size: @Configuration.Size - Size: UDim2.new 0, 500, 0, 120 - Position: UDim2.new 0, 0, 0, 5 - BackgroundTransparency: 1 - --ClipsDescendants: true - ZIndex: 0 - Parent: @Gui - Active: false - - * New "ImageLabel", "Background" - Image: "http://banland.xyz/asset/?id=97120937" --96551212' - Size: UDim2.new 1.3, 0, 1.64, 0 - Position: UDim2.new 0, 0, 0, 0 - BackgroundTransparency: 1 - ZIndex: 0 - Visible: false - - * New "Frame", "Border" - Size: UDim2.new 1, 0, 0, 1 - Position: UDim2.new 0, 0, 0.8, 0 - BackgroundTransparency: 0 - BackgroundColor3: Color3.new 236 / 255, 236 / 255, 236 / 255 - BorderSizePixel: 0 - Visible: false - - * New "Frame", "ChatRenderFrame" - Size: UDim2.new 1.02, 0, 1.01, 0 - Position: UDim2.new 0, 0, 0, 0 - BackgroundTransparency: 1 - --ClipsDescendants: true - ZIndex: 0 - Active: false - - Spawn -> - wait 0.5 - if IsPhone! - @Frame.Size = UDim2.new 0, 280, 0, 120 - - @RenderFrame = @Frame.ChatRenderFrame - if Chat\IsTouchDevice! - @Frame.Position = @Configuration.Position - @RenderFrame.Size = UDim2.new 1, 0, 1, 0 - elseif @Frame.AbsoluteSize.Y > 120 - Chat\ScreenSizeChanged! - @Gui.Changed\connect (property) -> - if property == "AbsoluteSize" - Chat\ScreenSizeChanged! - - if forceChatGUI or Player.ChatMode == Enum.ChatMode.TextAndMenu - if Chat\IsTouchDevice! - Chat\CreateTouchButton! - else - Chat\CreateChatBar! - --Chat\CreateSafeChatGui! - - if @ChatBar - @ChatBar.FocusLost\connect (enterPressed) -> - Chat.GotFocus = false - if Chat\IsTouchDevice! - @ChatBar.Visible = false - @TapToChatLabel.Visible = true - - if @TouchLabelBackground - @TouchLabelBackground.Visible = true - if enterPressed and @ChatBar.Text ~= "" - cText = @ChatBar.Text - if string.sub(@ChatBar.Text, 1, 1) == "%" - cText = "(TEAM) #{string.sub cText, 2, #cText}" - try - PlayersService\TeamChat cText - else - try - PlayersService\Chat cText - - if @ClickToChatButton - @ClickToChatButton.Visible = true - @ChatBar.Text = "" - Spawn -> - wait 5.0 - if not Chat.GotFocus - Chat.Frame.Background.Visible = false - --- Scrolling function --- Applies a speed(velocity) to have nice scrolling effect -Input.OnMouseScroll = => - Spawn -> - -- How long should the speed last? - while Input.Speed ~= 0 - if Input.Speed > 1 - while Input.Speed > 0 - Input.Speed = Input.Speed - 1 - wait 0.25 - elseif Input.Speed < 0 - while Input.Speed < 0 - Input.Speed = Input.Speed + 1 - wait 0.25 - wait 0.03 - return if Chat\CheckIfInBounds Input.Speed - Chat\ScrollQueue! - -Input.ApplySpeed = (value) => - Input.Speed = Input.Speed + value - if not @Simulating - Input\OnMouseScroll! - -Input.Initialize = => - @Mouse.WheelBackward\connect -> - Input\ApplySpeed @Configuration.DefaultSpeed - - @Mouse.WheelForward\connect -> - Input\ApplySpeed @Configuration.DefaultSpeed - -Chat.FindMessageInSafeChat = (message, list) => - foundMessage = false - for msg, _ in pairs list - if msg == message - return true - if type(list[msg]) == "table" - foundMessage = Chat\FindMessageInSafeChat message, list[msg] - if foundMessage - return true - foundMessage - --- Just a wrapper around our PlayerChatted event -Chat.PlayerChatted = (...) => - args = { ... } - -- argCount = select "#", ... - local player, message - -- This doesn't look very good, but what else to do? - if args[2] - player = args[2] - if args[3] - message = args[3] - if string.sub(message, 1, 1) == "%" - message = "(TEAM) #{string.sub message, 2, #message}" - - if PlayersService.ClassicChat - if not (string.sub(message, 1, 3) == "/e " or string.sub(message, 1, 7) == "/emote ") and - (forceChatGUI or Player.ChatMode == Enum.ChatMode.TextAndMenu) or - (Player.ChatMode == Enum.ChatMode.Menu and string.sub(message, 1, 3) == "/sc") or - Chat\FindMessageInSafeChat message, @SafeChat_List - - Chat\UpdateChat player, message - --- After Chat.Configuration.Lifetime seconds of existence, the labels become invisible --- Runs only every 5 seconds and has to loop through 50 values --- Shouldn't be too expensive -Chat.CullThread ==> - while true - if #@MessageQueue > 0 - for _, field in pairs @MessageQueue - if field["SpawnTime"] and - field["Player"] and - field["Message"] and - tick! - field["SpawnTime"] > @Configuration.LifeTime - - field["Player"].Visible = false - field["Message"].Visible = false - wait 5.0 - --- RobloxLock everything so users can't delete them(?) -Chat.LockAllFields = (gui) => - children = gui\GetChildren! - for i in *children - i.RobloxLocked = true - if #i\GetChildren! > 0 - Chat\LockAllFields i - -Chat.CoreGuiChanged = (coreGuiType, enabled) => - if coreGuiType == Enum.CoreGuiType.Chat or coreGuiType == Enum.CoreGuiType.All - if @Frame - @Frame.Visible = enabled - - if not Chat\IsTouchDevice! and @ChatBar - @ChatBar.Visible = enabled - GuiService\SetGlobalGuiInset 0, 0, 0, if enabled - 20 - else - 0 - --- Constructor --- This function initializes everything -Chat.Initialize ==> - Chat\CreateGui! - - try - Chat\CoreGuiChanged Enum.CoreGuiType.Chat, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Chat - Game.StarterGui.CoreGuiChangedSignal\connect (coreGuiType, enabled) -> - Chat\CoreGuiChanged coreGuiType, enabled - - @EventListener = PlayersService.PlayerChatted\connect (...) -> - -- This event has 4 callback arguments - -- Enum.PlayerChatType.All, chatPlayer, message, targetPlayer - Chat\PlayerChatted ... - - @MessageThread = coroutine.create -> - coroutine.resume @MessageThread - - -- Initialize input for us - Input\Initialize! - -- Eww, everytime a player is added, you have to redo the connection - -- Seems this is not automatic - -- NOTE: PlayerAdded only fires on the server, hence ChildAdded is used here - PlayersService.ChildAdded\connect -> - Chat.EventListener\disconnect! - @EventListener = PlayersService.PlayerChatted\connect (...) -> - -- This event has 4 callback arguments - -- Enum.PlayerChatType.All, chatPlayer, message, targetPlayer - Chat\PlayerChatted ... - - Spawn -> - Chat\CullThread! - - @Frame.RobloxLocked = true - Chat\LockAllFields @Frame - @Frame.DescendantAdded\connect (descendant) -> - Chat\LockAllFields descendant - -Chat\Initialize! diff --git a/yue/host.yue b/yue/host.yue deleted file mode 100644 index 48cbf03..0000000 --- a/yue/host.yue +++ /dev/null @@ -1,221 +0,0 @@ -print "[Mercury]: Loaded Host corescript" --- Start Game Script Arguments -local placeId, sleeptime, access, url, killID, deathID, timeout, injectScriptAssetID, servicesUrl, libraryRegistrationScriptAssetID - --- StartGame -- -try - game\GetService"ScriptContext"\AddStarterScript injectScriptAssetID - -game\GetService"RunService"\Run! - --- REQUIRES: StartGanmeSharedArgs.txt --- REQUIRES: MonitorGameStatus.txt - -------------------- UTILITY FUNCTIONS -------------------------- - -waitForChild = (parent, childName) -> - while true - child = parent\findFirstChild childName - if child - return child - - parent.ChildAdded\wait! - - --- returns the player object that killed this humanoid --- returns nil if the killer is no longer in the game -getKillerOfHumanoidIfStillInGame = (humanoid) -> - -- check for kill tag on humanoid - may be more than one - todo: deal with this - tag = humanoid\findFirstChild "creator" - - -- find player with name on tag - if tag and tag.Value.Parent -- killer still in game - return tag.Value - - --- send kill and death stats when a player dies -onDied = (victim, humanoid) -> - killer = getKillerOfHumanoidIfStillInGame humanoid - victorId = 0 - if killer - victorId = killer.userId - print "STAT: kill by #{victorId} of #{victim.userId}" - game\HttpGet "#{url}/Game/Knockouts.ashx?UserID=#{victorId}&#{access}" - - print "STAT: death of #{victim.userId} by #{victorId}" - game\HttpGet "#{url}/Game/Wipeouts.ashx?UserID=#{victim.userId}&#{access}" - - ------------------------------------END UTILITY FUNCTIONS ------------------------- - ------------------------------------"CUSTOM" SHARED CODE---------------------------------- - -try - settings!.Network.UseInstancePacketCache = true - -try - settings!.Network.UsePhysicsPacketCache = true - ---try settings!["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.FIFO end) -try - settings!["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError - - ---settings!.Network.PhysicsSend = 1 -- 1==RoundRobin -settings!.Network.PhysicsSend = Enum.PhysicsSendMethod.ErrorComputation2 -settings!.Network.ExperimentalPhysicsEnabled = true -settings!.Network.WaitingForCharacterLogRate = 100 -try - settings!.Diagnostics\LegacyScriptMode! - - ------------------------------------START GAME SHARED SCRIPT------------------------------ - -url = "_BASE_URL" --- assetId = placeId -- might be able to remove this now - -scriptContext = game\GetService "ScriptContext" -try - scriptContext\AddStarterScript libraryRegistrationScriptAssetID - -scriptContext.ScriptsDisabled = true - --- game\SetPlaceID nil, false -game\GetService"ChangeHistoryService"\SetEnabled false - --- establish this peer as the Server -ns = game\GetService "NetworkServer" - -if url? - try - game\GetService"Players"\SetAbuseReportUrl "#{url}/Report/Games.ashx" - - try - game\GetService"ScriptInformationProvider"\SetAssetUrl "#{url}/Asset/" - - try - game\GetService"ContentProvider"\SetBaseUrl "#{url}/" - - -- try - -- game\GetService"Players"\SetChatFilterUrl url .. "/Game/ChatFilter.ashx" - - -- game\GetService"BadgeService"\SetPlaceId placeId - if access? - with game\GetService "BadgeService" - \SetAwardBadgeUrl "#{url}/Game/Badge/AwardBadge.ashx?UserID=%d&BadgeID=%d&PlaceID=%d&#{access}" - \SetHasBadgeUrl "#{url}/Game/Badge/HasBadge.ashx?UserID=%d&BadgeID=%d&#{access}" - \SetIsBadgeDisabledUrl "#{url}/Game/Badge/IsBadgeDisabled.ashx?BadgeID=%d&PlaceID=%d&#{access}" - - with game\GetService "FriendService" - \SetMakeFriendUrl "#{servicesUrl}/Friend/CreateFriend?firstUserId=%d&secondUserId=%d&#{access}" - \SetBreakFriendUrl "#{servicesUrl}/Friend/BreakFriend?firstUserId=%d&secondUserId=%d&#{access}" - \SetGetFriendsUrl "#{servicesUrl}/Friend/AreFriends?userId=%d&#{access}" - - game\GetService"BadgeService"\SetIsBadgeLegalUrl "" - - with game\GetService "InsertService" - \SetBaseSetsUrl "#{url}/game/tools/insertasset?nsets=10&type=base" - \SetUserSetsUrl "#{url}/game/tools/insertasset?nsets=20&type=user&userid=%d" - \SetCollectionUrl "#{url}/game/tools/insertasset?sid=%d" - \SetAssetUrl "#{url}/Asset/?id=%d" - \SetAssetVersionUrl "#{url}/Asset/?assetversionid=%d" - - try - loadfile"#{url}/Game/LoadPlaceInfo.ashx?PlaceId=#{placeId}"! - - try - if access - loadfile"#{url}/Game/PlaceSpecificScript.ashx?PlaceId=#{placeId}&#{access}"! - - -try - game\GetService"NetworkServer"\SetIsPlayerAuthenticationRequired true - -settings!.Diagnostics.LuaRamLimit = 0 ---settings!.Network\SetThroughputSensitivity 0.08, 0.01 ---settings!.Network.SendRate = 35 ---settings!.Network.PhysicsSend = 0 -- 1==RoundRobin - ---shared["__time"] = 0 ---game\GetService"RunService".Stepped\connect(function (time) shared["__time"] = time end) - -if placeId? and killID? and deathID? and url? - -- listen for the death of a Player - createDeathMonitor = (player) -> - -- we don't need to clean up old monitors or connections since the Character will be destroyed soon - if player.Character - humanoid = waitForChild player.Character, "Humanoid" - humanoid.Died\connect -> - onDied player, humanoid - - - -- listen to all Players' Characters - game\GetService"Players".ChildAdded\connect (player) -> - createDeathMonitor player - player.Changed\connect (property) -> - if property == "Character" - createDeathMonitor player - - -game\GetService"Players".PlayerAdded\connect (player) -> - print "Player #{player.userId} added" - - if url and access and placeId and player and player.userId - game\HttpGet( - "#{url}/Game/ClientPresence.ashx?action=connect&#{access}" .. - "&PlaceID=#{placeId}" .. - "&UserID=#{player.userId}" - ) - game\HttpGet "#{url}/Game/PlaceVisit.ashx?UserID=#{player.userId}&AssociatedPlaceID=#{placeId}&#{access}" - - -game\GetService"Players".PlayerRemoving\connect (player) -> - print "Player #{player.userId} leaving" - - if url and access and placeId and player and player.userId - game\HttpGet( - "#{url}/Game/ClientPresence.ashx?action=disconnect&" .. - "#{access}&PlaceID=#{placeId}".. - "&UserID=#{player.userId}" - ) - - -if placeId? and url? - -- yield so that file load happens in the heartbeat thread - wait! - - -- load the game - game\Load "#{url}/asset/?id=#{placeId}" - - -if _MAP_LOCATION_EXISTS - -- yield so that file load happens in the heartbeat thread - wait! - - -- load the game - game\Load "_MAP_LOCATION" - - --- Now start the connection -ns\Start _SERVER_PORT, sleeptime - -game\GetService"Visit"\SetPing "_SERVER_PRESENCE_URL", 30 - -if timeout - scriptContext\SetTimeout timeout - -scriptContext.ScriptsDisabled = false - ---delay(1, function! --- loadfile(url .. "/analytics/GamePerfMonitor.ashx")(game.JobId, placeId) ---end) - -reset = ";mc" -game.Players.PlayerAdded\connect (player) -> - player.Chatted\connect (msg) -> - if msg == reset - if player.Character - player.Character.Humanoid.Health = 0 - - -------------------------------END START GAME SHARED SCRIPT-------------------------- diff --git a/yue/join.yue b/yue/join.yue deleted file mode 100644 index 0cbbe42..0000000 --- a/yue/join.yue +++ /dev/null @@ -1,269 +0,0 @@ -print "[Mercury]: Loaded Join corescript" -import "macros" as { $ } - --- functions -------------------------- --- onPlayerAdded = (player) -> --- -- override - -$lua[[-- MultiplayerSharedScript.lua inserted here ------ Prepended to Join.lua --]] - -try - game\SetPlaceID _PLACE_ID, false - - --- if we are on a touch device, no blocking http calls allowed! This can cause a crash on iOS --- In general we need a long term strategy to remove blocking http calls from all platforms -isTouchDevice = Game\GetService"UserInputService".TouchEnabled - -settings!["Game Options"].CollisionSoundEnabled = true -try - settings!.Rendering.EnableFRM = true -try - settings!.Physics.Is30FpsThrottleEnabled = false -try - settings!["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError -try - settings!.Physics.PhysicsEnvironmentalThrottle = Enum.EnviromentalPhysicsThrottle.DefaultAuto - - --- arguments --------------------------------------- -threadSleepTime = ... - -if threadSleepTime == nil - threadSleepTime = 15 - - -test = _IS_STUDIO_JOIN - -print "! Joining game '_PLACE_ID' place _PLACE_ID at _SERVER_ADDRESS" - -game\GetService"ChangeHistoryService"\SetEnabled false -game\GetService"ContentProvider"\SetThreadPool 16 - -with game\GetService "InsertService" - \SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" - \SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" - \SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" - \SetAssetUrl "http://banland.xyz/Asset/?id=%d" - \SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" - -with game\GetService "SocialService" - try - \SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" - try - \SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" - try - \SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" - try - \SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" - try - \SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" - -try - game\GetService"GamePassService"\SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" -try - game\GetService"MarketplaceService"\SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" -try - game\GetService"MarketplaceService"\SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" -try - game\SetCreatorID _CREATOR_ID, Enum.CreatorType.User - --- Bubble chat. This is all-encapsulated to allow us to turn it off with a config setting -try - game\GetService"Players"\SetChatStyle Enum.ChatStyle.ClassicAndBubble - - -waitingForCharacter = false -try - if settings!.Network.MtuOverride == 0 - settings!.Network.MtuOverride = 1400 - - --- globals ----------------------------------------- - -global client = game\GetService "NetworkClient" -global visit = game\GetService "Visit" - --- functions --------------------------------------- -global setMessage = (message) -> - -- todo: animated "..." - game\SetMessage if not false - message - else - -- hack, good enought for now - "Teleporting ..." - - -global showErrorWindow = (message, _, _) -> - game\SetMessage message - - -global reportError = (err, message) -> - print "***ERROR*** #{err}" - if not test - visit\SetUploadUrl "" - - client\disconnect! - wait 4 - showErrorWindow "Error: #{err}", message, "Other" - - --- called when the client connection closes -global onDisconnection = (_, lostConnection) -> - if lostConnection - showErrorWindow "You have lost the connection to the game", "LostConnection", "LostConnection" - else - showErrorWindow "This game has shut down", "Kick", "Kick" - - -global requestCharacter = (replicator) -> - -- prepare code for when the Character appears - local connection - connection = player.Changed\connect (property) -> - if property == "Character" - game\ClearMessage! - waitingForCharacter = false - connection\disconnect! - - - setMessage "Requesting character" - - success, err = try - replicator\RequestCharacter! - setMessage "Waiting for character" - waitingForCharacter = true - - - if not success - reportError err, "W4C" - return - - --- called when the client connection is established -global onConnectionAccepted = (url, replicator) -> - connectResolved = true - - waitingForMarker = true - - success, err = try - if not test - visit\SetPing "_PING_URL", 30 - - - if not false - game\SetMessageBrickCount! - else - setMessage "Teleporting ..." - - - replicator.Disconnection\connect onDisconnection - - -- Wait for a marker to return before creating the Player - marker = replicator\SendMarker! - - marker.Received\connect -> - waitingForMarker = false - requestCharacter replicator - - - if not success - reportError err, "ConnectionAccepted" - return - - - -- TODO: report marker progress - - while waitingForMarker - workspace\ZoomToExtents! - wait 0.5 - - --- called when the client connection fails -global onConnectionFailed = (_, err) -> - showErrorWindow "Failed to connect to the Game. (ID=#{err})", "ID#{err}", "Other" - - --- called when the client connection is rejected -global onConnectionRejected = -> - connectionFailed\disconnect! - showErrorWindow "This game is not available. Please try another", "WrongVersion", "WrongVersion" - - -idled = false -global onPlayerIdled = (time) -> - if time > 20 * 60 - showErrorWindow string.format("You were disconnected for being idle %d minutes", time / 60), "Idle", "Idle" - client\disconnect! - if not idled - idled = true - - --- main ------------------------------------------------------------ - -try - settings!.Diagnostics\LegacyScriptMode! - -success, err = try - game\SetRemoteBuildMode true - - setMessage "Connecting to Server" - client.ConnectionAccepted\connect onConnectionAccepted - client.ConnectionRejected\connect onConnectionRejected - global connectionFailed = client.ConnectionFailed\connect onConnectionFailed - client.Ticket = "" - - global playerConnectSucces, player = try - client\PlayerConnect _USER_ID, "_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime - - if not playerConnectSucces - --Old player connection scheme - player = game\GetService"Players"\CreateLocalPlayer _USER_ID - client\Connect "_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime - - - -- negotiate an auth token - if not test - delay 300, -> - while false - try - game\HttpPost "https://banland.xyz/auth/renew", "renew" - - wait 300 - - with player - \SetSuperSafeChat false - try - \SetUnder13 false - try - \SetMembershipType Enum.MembershipType._MEMBERSHIP_TYPE - try - \SetAccountAge 1 - - player.Idled\connect onPlayerIdled - - -- Overriden - -- onPlayerAdded player - - try - player.Name = [========[_USER_NAME]========] - - player.CharacterAppearance = "_CHAR_APPEARANCE" - if not test - visit\SetUploadUrl "" - - -if not success - reportError err, "CreatePlayer" - - -if not test - -- TODO: Async get? - loadfile""("", -1, 0) - - -try - game\SetScreenshotInfo "" -try - game\SetVideoInfo 'GamesROBLOX, video, free game, online virtual world' - --- use single quotes here because the video info string may have unescaped double quotes diff --git a/yue/macros.yue b/yue/macros.yue deleted file mode 100644 index f842e51..0000000 --- a/yue/macros.yue +++ /dev/null @@ -1,4 +0,0 @@ -export macro load = (file) -> - "print \"[Mercury]: Loaded corescript #{file\sub 8, -6}\"" - -export macro lua = (code) -> :code, type: "lua" diff --git a/yue/studio.yue b/yue/studio.yue deleted file mode 100644 index 1f6e0f3..0000000 --- a/yue/studio.yue +++ /dev/null @@ -1,49 +0,0 @@ -print "[Mercury]: Loaded Studio corescript" --- Setup studio cmd bar & load core scripts - -with game\GetService "InsertService" - try - \SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" - try - \SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" - - game\GetService"ScriptInformationProvider"\SetAssetUrl "http://banland.xyz/Asset/" - \SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" - \SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" - \SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" - \SetAssetUrl "http://banland.xyz/Asset/?id=%d" - \SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" - \SetTrustLevel 0 - -with game\GetService "SocialService" - try - \SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" - try - \SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" - try - \SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" - try - \SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" - try - \SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" - -try - game\GetService"GamePassService"\SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" - -with game\GetService "MarketplaceService" - try - \SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" - try - \SetDevProductInfoUrl "https://banland.xyz/marketplace/productDetails?productId=%d" - try - \SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" - - -result, _ = try - game\GetService"ScriptContext"\AddStarterScript 37801172 - -if not result - try - game\GetService"ScriptContext"\AddCoreScript 37801172, game\GetService "ScriptContext", "StarterScript" - - diff --git a/yue/visit.yue b/yue/visit.yue deleted file mode 100644 index 87172d4..0000000 --- a/yue/visit.yue +++ /dev/null @@ -1,147 +0,0 @@ -print "[Mercury]: Loaded Visit corescript" --- Prepended to Edit.lua and Visit.lua and Studio.lua and PlaySolo.lua-- - -if true - try - game\SetPlaceID _PLACE_ID --- else --- if false --- try --- game\SetPlaceID _PLACE_ID - -visit = game\GetService "Visit" - -message = Instance.new "Message" -message.Parent = workspace -message.archivable = false - -game\GetService"ScriptInformationProvider"\SetAssetUrl "http://banland.xyz/Asset/" -game\GetService"ContentProvider"\SetThreadPool 16 -try - game\GetService"InsertService"\SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" --- Used for free model search (insert tool) -try - game\GetService"InsertService"\SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" --- Used for free decal search (insert tool) - -settings!.Diagnostics\LegacyScriptMode! - -with game\GetService "InsertService" - \SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" - \SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" - \SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" - \SetAssetUrl "http://banland.xyz/Asset/?id=%d" - \SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" - -with game\GetService "SocialService" - try - \SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" - try - \SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" - try - \SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" - try - \SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" - try - \SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" - -try - game\GetService"GamePassService"\SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" -try - game\SetCreatorID 0, Enum.CreatorType.User -try - game\SetScreenshotInfo "" -try - game\SetVideoInfo "" - -try - settings!.Rendering.EnableFRM = true -try - settings!["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError - - -game\GetService"ChangeHistoryService"\SetEnabled false -try - game\GetService"Players"\SetBuildUserPermissionsUrl "http://banland.xyz/Game/BuildActionPermissionCheck.ashx?assetId=0&userId=%d&isSolo=true" - - -workspace\SetPhysicsThrottleEnabled true - -addedBuildTools = false -screenGui = game\GetService"CoreGui"\FindFirstChild "RobloxGui" - -doVisit = -> - message.Text = "Loading Game" - if false - game\Load "" - try - visit\SetUploadUrl "" - else - try - visit\SetUploadUrl "" - - - message.Text = "Running" - game\GetService"RunService"\Run! - - message.Text = "Creating Player" - if false - global player = game\GetService"Players"\CreateLocalPlayer 1 - player.Name = [====[Guest _GUEST_NUMBER]====] - else - global player = game\GetService"Players"\CreateLocalPlayer 0 - - player.CharacterAppearance = "" - propExists = canAutoLoadChar = false - propExists = try - canAutoLoadChar = game.Players.CharacterAutoLoads - - - if (propExists and canAutoLoadChar) or not propExists - player\LoadCharacter! - - - message.Text = "Setting GUI" - player\SetSuperSafeChat true - try - player\SetMembershipType Enum.MembershipType.None - try - player\SetAccountAge 0 - - - if false - message.Text = "Setting Ping" - visit\SetPing "http://banland.xyz/game/clientpresence?version=old&PlaceID=_PLACE_ID", 300 - - message.Text = "Sending Stats" - game\HttpGet "" - - -success, err = pcall doVisit - -if not addedBuildTools - with Instance.new "StringValue" - .Name = "PlayerName" - .Value = player.Name - .RobloxLocked = true - .Parent = screenGui - - try - game\GetService"ScriptContext"\AddCoreScript 59431535, screenGui, "BuildToolsScript" - - addedBuildTools = true - - -if success - message.Parent = nil -else - print err - if false - try - visit\SetUploadUrl "" - - - wait 5 - message.Text = "Error on visit: #{err}" - if false - game\HttpPost "http://banland.xyz/Error/Lua.ashx?", "Visit.lua: #{err}" From a94af6601327f259299db4e4c3de1163dda575df Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Mon, 14 Aug 2023 17:26:17 +0100 Subject: [PATCH 03/14] Improve corescript formatting, add logging for script loading, and replace URLs with banland.xyz --- 20573078.xml | 12 +- 38037265.xml | 10 +- lua/107893730.lua | 330 +++++-- lua/152908679.lua | 85 +- lua/153556783.lua | 326 ++++--- lua/157877000.lua | 162 +++- lua/36868950.lua | 12 +- lua/37801172.lua | 97 +- lua/38037565.lua | 57 +- lua/39250920.lua | 71 +- lua/45284430.lua | 2213 +++++++++++++++++++++++++++------------------ lua/45374389.lua | 1 + lua/46295863.lua | 673 +++++++++----- lua/48488235.lua | 753 +++++++++++---- lua/48488398.lua | 71 +- lua/48488451.lua | 3 +- lua/53878047.lua | 155 +++- lua/53878057.lua | 213 +++-- lua/59002209.lua | 1 + lua/60595411.lua | 115 ++- lua/60595695.lua | 1 + lua/73157242.lua | 888 +++++++++++++----- lua/89449008.lua | 181 ++-- lua/89449093.lua | 62 +- lua/97188756.lua | 145 ++- lua/host.lua | 257 ++++-- lua/join.lua | 281 +++--- lua/studio.lua | 107 +-- lua/visit.lua | 154 ++-- stylua.toml | 2 +- 30 files changed, 5043 insertions(+), 2395 deletions(-) diff --git a/20573078.xml b/20573078.xml index 5fdfe28..f95d2fd 100644 --- a/20573078.xml +++ b/20573078.xml @@ -1,4 +1,6 @@ - + null nil @@ -94,7 +96,9 @@ 2 2 - http://banland.xyz/asset?id=19999424 + + http://banland.xyz/asset?id=19999424 + 5 Mesh @@ -107,7 +111,9 @@ 1.07000005 1.07000005 - http://banland.xyz/asset?id=20571982 + + http://banland.xyz/asset?id=20571982 + 1 1 diff --git a/38037265.xml b/38037265.xml index d2bca69..1e0ed8f 100644 --- a/38037265.xml +++ b/38037265.xml @@ -199,7 +199,7 @@ humanoid.Died:connect(function() HealthChanged(0) end) 4279970357 1 false - http://www.roblox.com/asset/?id=34854607 + http://banland.xyz/asset/?id=34854607 hurtOverlay 2 @@ -254,7 +254,7 @@ humanoid.Died:connect(function() HealthChanged(0) end) 4279970357 1 false - http://www.roblox.com/asset/?id=35238000 + http://banland.xyz/asset/?id=35238000 bkg 0 @@ -282,7 +282,7 @@ humanoid.Died:connect(function() HealthChanged(0) end) 4279970357 1 false - http://www.roblox.com/asset/?id=35238036 + http://banland.xyz/asset/?id=35238036 barRed 0.0189999994 @@ -338,7 +338,7 @@ humanoid.Died:connect(function() HealthChanged(0) end) 4279970357 1 false - http://www.roblox.com/asset/?id=35238053 + http://banland.xyz/asset/?id=35238053 bar 0.0189999994 @@ -366,7 +366,7 @@ humanoid.Died:connect(function() HealthChanged(0) end) 4279970357 0 false - http://www.roblox.com/asset/?id=34816363 + http://banland.xyz/asset/?id=34816363 label 0.680000007 diff --git a/lua/107893730.lua b/lua/107893730.lua index 94c3211..02d066a 100644 --- a/lua/107893730.lua +++ b/lua/107893730.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 107893730" -- this script creates the gui and sends the web requests for in game purchase prompts -- wait for important items to appear @@ -16,31 +17,31 @@ end -------------------------------- Global Variables ---------------------------------------- -- utility variables -local RbxUtility = nil +local RbxUtility local baseUrl = game:GetService("ContentProvider").BaseUrl:lower() -- data variables local currentProductInfo, currentAssetId, currentCurrencyType, currentCurrencyAmount, currentEquipOnPurchase, currentProductId, currentServerResponseTable local checkingPlayerFunds = false -local openBCUpSellWindowConnection = nil +local openBCUpSellWindowConnection local purchasingConsumable = false local enableBrowserWindowClosedEvent = true -- gui variables -local openBuyCurrencyWindowConnection = nil +local openBuyCurrencyWindowConnection local currentlyPrompting = false -local purchaseDialog = nil +local purchaseDialog local tweenTime = 0.3 local showPosition = UDim2.new(0.5, -330, 0.5, -200) local hidePosition = UDim2.new(0.5, -330, 1, 25) -local isSmallScreen = nil +local isSmallScreen local spinning = false -local spinnerIcons = nil +local spinnerIcons local smallScreenThreshold = 450 -- user facing images local assetUrls = {} -local assetUrl = "http://www.roblox.com/Asset/?id=" +local assetUrl = "http://banland.xyz/Asset/?id=" local errorImageUrl = assetUrl .. "42557901" table.insert(assetUrls, errorImageUrl) local buyImageUrl = assetUrl .. "104651457" @@ -77,9 +78,12 @@ local errorPurchasesUnknownText = "Roblox is performing maintenance" local purchaseSucceededText = "Your purchase of itemName succeeded!" local purchaseFailedText = "Your purchase of itemName failed because errorReason. Your account has not been charged. Please try again soon." -local productPurchaseText = "Would you like to buy 'itemName' for currencyType currencyAmount?" -local freeItemPurchaseText = "Would you like to take the assetType 'itemName' for FREE?" -local freeItemBalanceText = "Your balance of Robux or Tix will not be affected by this transaction." +local productPurchaseText = + "Would you like to buy 'itemName' for currencyType currencyAmount?" +local freeItemPurchaseText = + "Would you like to take the assetType 'itemName' for FREE?" +local freeItemBalanceText = + "Your balance of Robux or Tix will not be affected by this transaction." -------------------------------- End Global Variables ---------------------------------------- @@ -138,9 +142,13 @@ function userPurchaseActionsEnded(isSuccess) checkingPlayerFunds = false if isSuccess then -- show the user we bought the item successfully, when they close this dialog we will call signalPromptEnded - local newPurchasedSucceededText = - string.gsub(purchaseSucceededText, "itemName", tostring(currentProductInfo["Name"])) - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText + local newPurchasedSucceededText = string.gsub( + purchaseSucceededText, + "itemName", + tostring(currentProductInfo["Name"]) + ) + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = + newPurchasedSucceededText setButtonsVisible(purchaseDialog.BodyFrame.OkPurchasedButton) hidePurchasing() else -- otherwise we didn't purchase, no need to show anything, just signal and close dialog @@ -152,10 +160,17 @@ function signalPromptEnded(isSuccess) closePurchasePrompt() if purchasingConsumable then game:GetService("MarketplaceService") - :SignalPromptProductPurchaseFinished(game.Players.LocalPlayer.userId, currentProductId, isSuccess) + :SignalPromptProductPurchaseFinished( + game.Players.LocalPlayer.userId, + currentProductId, + isSuccess + ) else - game:GetService("MarketplaceService") - :SignalPromptPurchaseFinished(game.Players.LocalPlayer, currentAssetId, isSuccess) + game:GetService("MarketplaceService"):SignalPromptPurchaseFinished( + game.Players.LocalPlayer, + currentAssetId, + isSuccess + ) end removeCurrentPurchaseInfo() end @@ -170,19 +185,38 @@ function updatePurchasePromptData(_) end if isFreeItem() then - newItemDescription = string.gsub(freeItemPurchaseText, "itemName", tostring(currentProductInfo["Name"])) - newItemDescription = - string.gsub(newItemDescription, "assetType", tostring(assetTypeToString(currentProductInfo["AssetTypeId"]))) + newItemDescription = string.gsub( + freeItemPurchaseText, + "itemName", + tostring(currentProductInfo["Name"]) + ) + newItemDescription = string.gsub( + newItemDescription, + "assetType", + tostring(assetTypeToString(currentProductInfo["AssetTypeId"])) + ) setHeaderText(takeHeaderText) else -- otherwise item costs something, so different prompt - newItemDescription = string.gsub(productPurchaseText, "itemName", tostring(currentProductInfo["Name"])) - newItemDescription = - string.gsub(newItemDescription, "currencyType", tostring(currencyTypeToString(currentCurrencyType))) - newItemDescription = string.gsub(newItemDescription, "currencyAmount", tostring(currentCurrencyAmount)) + newItemDescription = string.gsub( + productPurchaseText, + "itemName", + tostring(currentProductInfo["Name"]) + ) + newItemDescription = string.gsub( + newItemDescription, + "currencyType", + tostring(currencyTypeToString(currentCurrencyType)) + ) + newItemDescription = string.gsub( + newItemDescription, + "currencyAmount", + tostring(currentCurrencyAmount) + ) setHeaderText(buyHeaderText) end - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newItemDescription + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = + newItemDescription if purchasingConsumable then purchaseDialog.BodyFrame.ItemPreview.Image = baseUrl @@ -202,7 +236,12 @@ function doPlayerFundsCheck(checkIndefinitely) local canPurchase, insufficientFunds = canPurchaseItem() -- check again to see if we can buy item if canPurchase and insufficientFunds then -- wait a bit and try a few more times local retries = 1000 - while (retries > 0 or checkIndefinitely) and insufficientFunds and checkingPlayerFunds and canPurchase do + while + (retries > 0 or checkIndefinitely) + and insufficientFunds + and checkingPlayerFunds + and canPurchase + do wait(1 / 10) canPurchase, insufficientFunds = canPurchaseItem() retries = retries - 1 @@ -220,7 +259,8 @@ function doPlayerFundsCheck(checkIndefinitely) end function showPurchasePrompt() - local canPurchase, insufficientFunds, notRightBC, override, descText = canPurchaseItem() + local canPurchase, insufficientFunds, notRightBC, override, descText = + canPurchaseItem() if canPurchase then updatePurchasePromptData() @@ -269,9 +309,15 @@ function showPurchasePrompt() purchaseDialog.BodyFrame.AfterBalanceButton ) elseif override then - setButtonsVisible(purchaseDialog.BodyFrame.BuyDisabledButton, purchaseDialog.BodyFrame.CancelButton) -- , purchaseDialog.BodyFrame.AfterBalanceButton) + setButtonsVisible( + purchaseDialog.BodyFrame.BuyDisabledButton, + purchaseDialog.BodyFrame.CancelButton + ) -- , purchaseDialog.BodyFrame.AfterBalanceButton) else - setButtonsVisible(purchaseDialog.BodyFrame.BuyButton, purchaseDialog.BodyFrame.CancelButton) -- , purchaseDialog.BodyFrame.AfterBalanceButton) + setButtonsVisible( + purchaseDialog.BodyFrame.BuyButton, + purchaseDialog.BodyFrame.CancelButton + ) -- , purchaseDialog.BodyFrame.AfterBalanceButton) end purchaseDialog:TweenPosition( @@ -282,7 +328,11 @@ function showPurchasePrompt() true ) - if canPurchase and insufficientFunds and not enableBrowserWindowClosedEvent then + if + canPurchase + and insufficientFunds + and not enableBrowserWindowClosedEvent + then checkingPlayerFunds = true doPlayerFundsCheck(true) end @@ -325,15 +375,24 @@ function purchaseFailed(inGamePurchasesDisabled) name = currentProductInfo["Name"] end - local newPurchasedFailedText = string.gsub(purchaseFailedText, "itemName", tostring(name)) + local newPurchasedFailedText = + string.gsub(purchaseFailedText, "itemName", tostring(name)) if inGamePurchasesDisabled then - newPurchasedFailedText = - string.gsub(newPurchasedFailedText, "errorReason", tostring(errorPurchasesDisabledText)) + newPurchasedFailedText = string.gsub( + newPurchasedFailedText, + "errorReason", + tostring(errorPurchasesDisabledText) + ) else - newPurchasedFailedText = string.gsub(newPurchasedFailedText, "errorReason", tostring(errorPurchasesUnknownText)) + newPurchasedFailedText = string.gsub( + newPurchasedFailedText, + "errorReason", + tostring(errorPurchasesUnknownText) + ) end - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedFailedText + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = + newPurchasedFailedText purchaseDialog.BodyFrame.ItemPreview.Image = errorImageUrl setButtonsVisible(purchaseDialog.BodyFrame.OkButton) @@ -351,7 +410,7 @@ function doAcceptPurchase(_) -- http call to do the purchase local response = "none" - local url = nil + local url -- consumables need to use a different url if purchasingConsumable then @@ -382,7 +441,12 @@ function doAcceptPurchase(_) end) -- debug output for us (found in the logs from local) - print("doAcceptPurchase success from ypcall is ", success, "reason is", reason) + print( + "doAcceptPurchase success from ypcall is ", + success, + "reason is", + reason + ) if (tick() - startTime) < 1 then wait(1) -- allow the purchasing waiting dialog to at least be readable (otherwise it might flash, looks bad)... @@ -390,7 +454,11 @@ function doAcceptPurchase(_) -- check to make sure purchase actually happened on the web end if response == "none" or response == nil or response == "" then - print("did not get a proper response from web on purchase of", currentAssetId, currentProductId) + print( + "did not get a proper response from web on purchase of", + currentAssetId, + currentProductId + ) purchaseFailed() return end @@ -401,19 +469,31 @@ function doAcceptPurchase(_) if response then if response["success"] == false then if response["status"] ~= "AlreadyOwned" then - print("web return response of fail on purchase of", currentAssetId, currentProductId) + print( + "web return response of fail on purchase of", + currentAssetId, + currentProductId + ) purchaseFailed((response["status"] == "EconomyDisabled")) return end end else - print("web return response of non parsable JSON on purchase of", currentAssetId) + print( + "web return response of non parsable JSON on purchase of", + currentAssetId + ) purchaseFailed() return end -- check to see if this item was bought, and if we want to equip it (also need to make sure the asset type was gear) - if currentEquipOnPurchase and success and currentAssetId and tonumber(currentProductInfo["AssetTypeId"]) == 19 then + if + currentEquipOnPurchase + and success + and currentAssetId + and tonumber(currentProductInfo["AssetTypeId"]) == 19 + then local tool = getToolAssetID(tonumber(currentAssetId)) if tool then tool.Parent = game.Players.LocalPlayer.Backpack @@ -422,16 +502,18 @@ function doAcceptPurchase(_) if purchasingConsumable then if not response["receipt"] then - print("tried to buy productId, but no receipt returned. productId was", currentProductId) + print( + "tried to buy productId, but no receipt returned. productId was", + currentProductId + ) purchaseFailed() return end - Game:GetService("MarketplaceService") - :SignalClientPurchaseSuccess( - tostring(response["receipt"]), - game.Players.LocalPlayer.userId, - currentProductId - ) + Game:GetService("MarketplaceService"):SignalClientPurchaseSuccess( + tostring(response["receipt"]), + game.Players.LocalPlayer.userId, + currentProductId + ) else userPurchaseActionsEnded(success) end @@ -446,7 +528,10 @@ end ---------------------------------------------- Currency Functions --------------------------------------------- -- enums have no implicit conversion to numbers in lua, has to have a function to do this function currencyEnumToInt(currencyEnum) - if currencyEnum == Enum.CurrencyType.Robux or currencyEnum == Enum.CurrencyType.Default then + if + currencyEnum == Enum.CurrencyType.Robux + or currencyEnum == Enum.CurrencyType.Default + then return 1 elseif currencyEnum == Enum.CurrencyType.Tix then return 2 @@ -532,7 +617,10 @@ end -- figure out what currency to use based on the currency you can actually sell the item in and what the script specified function setCurrencyAmountAndType(priceInRobux, priceInTix) - if currentCurrencyType == Enum.CurrencyType.Default or currentCurrencyType == Enum.CurrencyType.Robux then -- sell for default (user doesn't care) or robux + if + currentCurrencyType == Enum.CurrencyType.Default + or currentCurrencyType == Enum.CurrencyType.Robux + then -- sell for default (user doesn't care) or robux if priceInRobux ~= nil and priceInRobux ~= 0 then -- we can sell for robux currentCurrencyAmount = priceInRobux currentCurrencyType = Enum.CurrencyType.Robux @@ -561,9 +649,10 @@ end -- will get the player's balance of robux and tix, return in a table function getPlayerBalance() - local playerBalance = nil + local playerBalance local success, errorCode = ypcall(function() - playerBalance = game:HttpGetAsync(getSecureApiBaseUrl() .. "currency/balance") + playerBalance = + game:HttpGetAsync(getSecureApiBaseUrl() .. "currency/balance") end) if not success then print("Get player balance failed because", errorCode) @@ -582,11 +671,13 @@ end -- should open an external default browser window to this url function openBuyCurrencyWindow() checkingPlayerFunds = true - game:GetService("GuiService"):OpenBrowserWindow(baseUrl .. "Upgrades/Robux.aspx") + game:GetService("GuiService") + :OpenBrowserWindow(baseUrl .. "Upgrades/Robux.aspx") end function openBCUpSellWindow() - Game:GetService("GuiService"):OpenBrowserWindow(baseUrl .. "Upgrades/BuildersClubMemberships.aspx") + Game:GetService("GuiService") + :OpenBrowserWindow(baseUrl .. "Upgrades/BuildersClubMemberships.aspx") end -- set up the gui text at the bottom of the prompt (alerts user to how much money they will have left, or if they need to buy more to buy the item) @@ -596,7 +687,7 @@ function updateAfterBalanceText(playerBalance, notRightBc) return true, false end - local keyWord = nil + local keyWord if currentCurrencyType == Enum.CurrencyType.Robux then keyWord = "robux" elseif currentCurrencyType == Enum.CurrencyType.Tix then @@ -619,7 +710,9 @@ function updateAfterBalanceText(playerBalance, notRightBc) if afterBalanceNumber < 0 and keyWord == "robux" then if openBuyCurrencyWindowConnection == nil then openBuyCurrencyWindowConnection = - purchaseDialog.BodyFrame.AfterBalanceButton.MouseButton1Click:connect(openBuyCurrencyWindow) + purchaseDialog.BodyFrame.AfterBalanceButton.MouseButton1Click:connect( + openBuyCurrencyWindow + ) end purchaseDialog.BodyFrame.AfterBalanceButton.Text = "You need " .. currencyTypeToString(currentCurrencyType) @@ -680,27 +773,32 @@ function canPurchaseItem() -- first we see if player already owns the asset/get the productinfo local playerOwnsAsset = false local notRightBc = false - local descText = nil + local descText local success = false if purchasingConsumable then - local currentProductInfoRaw = nil + local currentProductInfoRaw success = ypcall(function() currentProductInfoRaw = Game:HttpGetAsync( - getSecureApiBaseUrl() .. "marketplace/productDetails?productid=" .. tostring(currentProductId) + getSecureApiBaseUrl() + .. "marketplace/productDetails?productid=" + .. tostring(currentProductId) ) end) if success then - currentProductInfo = getRbxUtility().DecodeJSON(currentProductInfoRaw) + currentProductInfo = + getRbxUtility().DecodeJSON(currentProductInfoRaw) end else success = ypcall(function() - currentProductInfo = game:GetService("MarketplaceService"):GetProductInfo(currentAssetId) + currentProductInfo = game:GetService("MarketplaceService") + :GetProductInfo(currentAssetId) end) end if currentProductInfo == nil or not success then - descText = "In-game sales are temporarily disabled. Please try again later." + descText = + "In-game sales are temporarily disabled. Please try again later." return true, nil, nil, true, descText end @@ -748,7 +846,10 @@ function canPurchaseItem() return true, nil, nil, true, descText end - if currentProductInfo["IsForSale"] == false and currentProductInfo["IsPublicDomain"] == false then + if + currentProductInfo["IsForSale"] == false + and currentProductInfo["IsPublicDomain"] == false + then descText = "This item is no longer for sale." return true, nil, nil, true, descText end @@ -760,7 +861,8 @@ function canPurchaseItem() tonumber(currentProductInfo["PriceInTickets"]) ) then - descText = "We could retrieve the price of the item correctly. Please try again later." + descText = + "We could retrieve the price of the item correctly. Please try again later." return true, nil, nil, true, descText end @@ -777,7 +879,8 @@ function canPurchaseItem() notRightBc = true end - local updatedBalance, insufficientFunds = updateAfterBalanceText(playerBalance, notRightBc) + local updatedBalance, insufficientFunds = + updateAfterBalanceText(playerBalance, notRightBc) if notRightBc then purchaseDialog.BodyFrame.AfterBalanceButton.Active = true @@ -786,25 +889,31 @@ function canPurchaseItem() if currentProductInfo["ContentRatingTypeId"] == 1 then if game.Players.LocalPlayer:GetUnder13() then - descText = "Your account is under 13 so purchase of this item is not allowed." + descText = + "Your account is under 13 so purchase of this item is not allowed." return true, nil, nil, true, descText end end if - (currentProductInfo["IsLimited"] == true or currentProductInfo["IsLimitedUnique"] == true) + ( + currentProductInfo["IsLimited"] == true + or currentProductInfo["IsLimitedUnique"] == true + ) and ( currentProductInfo["Remaining"] == "" or currentProductInfo["Remaining"] == 0 or currentProductInfo["Remaining"] == nil ) then - descText = "All copies of this item have been sold out! Try buying from other users on the website." + descText = + "All copies of this item have been sold out! Try buying from other users on the website." return true, nil, nil, true, descText end if not updatedBalance then - descText = "Could not update your balance. Please check back after some time." + descText = + "Could not update your balance. Please check back after some time." return true, nil, nil, true, descText end @@ -844,9 +953,11 @@ function startSpinner() while pos < 8 do if pos == spinPos or pos == ((spinPos + 1) % 8) then - spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset/?id=45880668" + spinnerIcons[pos + 1].Image = + "http://banland.xyz/Asset/?id=45880668" else - spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset/?id=45880710" + spinnerIcons[pos + 1].Image = + "http://banland.xyz/Asset/?id=45880710" end pos = pos + 1 @@ -904,7 +1015,7 @@ function createSpinner(size, position, parent) ) spinnerImage.BackgroundTransparency = 1 spinnerImage.ZIndex = 10 - spinnerImage.Image = "http://www.roblox.com/Asset/?id=45880710" + spinnerImage.Image = "http://banland.xyz/Asset/?id=45880710" spinnerImage.Parent = spinnerFrame spinnerIcons[spinnerNum] = spinnerImage @@ -919,7 +1030,8 @@ function createPurchasePromptGui() purchaseDialog.Size = UDim2.new(0, 660, 0, 400) purchaseDialog.Position = hidePosition purchaseDialog.Visible = false - purchaseDialog.BackgroundColor3 = Color3.new(141 / 255, 141 / 255, 141 / 255) + purchaseDialog.BackgroundColor3 = + Color3.new(141 / 255, 141 / 255, 141 / 255) purchaseDialog.BorderColor3 = Color3.new(204 / 255, 204 / 255, 204 / 255) purchaseDialog.Parent = game.CoreGui.RobloxGui @@ -932,7 +1044,12 @@ function createPurchasePromptGui() bodyFrame.ZIndex = 8 bodyFrame.Parent = purchaseDialog - local titleLabel = createTextObject("TitleLabel", "Buy Item", "TextLabel", Enum.FontSize.Size48) + local titleLabel = createTextObject( + "TitleLabel", + "Buy Item", + "TextLabel", + Enum.FontSize.Size48 + ) titleLabel.ZIndex = 8 titleLabel.Size = UDim2.new(1, 0, 0, 60) local titleBackdrop = titleLabel:Clone() @@ -948,7 +1065,8 @@ function createPurchasePromptGui() local distanceBetweenButtons = 90 local cancelButton = createImageButton "CancelButton" - cancelButton.Position = UDim2.new(0.5, (distanceBetweenButtons / 2), 1, -120) + cancelButton.Position = + UDim2.new(0.5, (distanceBetweenButtons / 2), 1, -120) cancelButton.BackgroundTransparency = 1 cancelButton.BorderSizePixel = 0 cancelButton.Parent = bodyFrame @@ -967,7 +1085,8 @@ function createPurchasePromptGui() cancelButton.MouseButton1Click:connect(doDeclinePurchase) local buyButton = createImageButton "BuyButton" - buyButton.Position = UDim2.new(0.5, -153 - (distanceBetweenButtons / 2), 1, -120) + buyButton.Position = + UDim2.new(0.5, -153 - (distanceBetweenButtons / 2), 1, -120) buyButton.BackgroundTransparency = 1 buyButton.BorderSizePixel = 0 buyButton.Image = buyImageUrl @@ -1103,12 +1222,21 @@ function createPurchasePromptGui() purchasingFrame.Active = true purchasingFrame.Parent = purchaseDialog - local purchasingLabel = createTextObject("PurchasingLabel", "Purchasing...", "TextLabel", Enum.FontSize.Size48) + local purchasingLabel = createTextObject( + "PurchasingLabel", + "Purchasing...", + "TextLabel", + Enum.FontSize.Size48 + ) purchasingLabel.Size = UDim2.new(1, 0, 1, 0) purchasingLabel.ZIndex = 10 purchasingLabel.Parent = purchasingFrame - createSpinner(UDim2.new(0, 50, 0, 50), UDim2.new(0.5, -25, 0.5, 30), purchasingLabel) + createSpinner( + UDim2.new(0, 50, 0, 50), + UDim2.new(0.5, -25, 0.5, 30), + purchasingLabel + ) end -- next two functions control the "Purchasing..." overlay @@ -1186,7 +1314,13 @@ function changeGuiToScreenSize(smallScreen) end end -function doPurchasePrompt(player, assetId, equipIfPurchased, currencyType, productId) +function doPurchasePrompt( + player, + assetId, + equipIfPurchased, + currencyType, + productId +) if not purchaseDialog then createPurchasePromptGui() end @@ -1216,23 +1350,31 @@ function userPurchaseProductActionsEnded(userIsClosingDialog) closePurchasePrompt() if currentServerResponseTable then local isPurchased = false - if tostring(currentServerResponseTable["isValid"]):lower() == "true" then + if + tostring(currentServerResponseTable["isValid"]):lower() + == "true" + then isPurchased = true end - Game:GetService("MarketplaceService"):SignalPromptProductPurchaseFinished( - tonumber(currentServerResponseTable["playerId"]), - tonumber(currentServerResponseTable["productId"]), - isPurchased - ) + Game:GetService("MarketplaceService") + :SignalPromptProductPurchaseFinished( + tonumber(currentServerResponseTable["playerId"]), + tonumber(currentServerResponseTable["productId"]), + isPurchased + ) else print "Something went wrong, no currentServerResponseTable" end removeCurrentPurchaseInfo() else - local newPurchasedSucceededText = - string.gsub(purchaseSucceededText, "itemName", tostring(currentProductInfo["Name"])) - purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText + local newPurchasedSucceededText = string.gsub( + purchaseSucceededText, + "itemName", + tostring(currentProductInfo["Name"]) + ) + purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = + newPurchasedSucceededText setButtonsVisible(purchaseDialog.BodyFrame.OkPurchasedButton) hidePurchasing() end @@ -1247,7 +1389,8 @@ function doProcessServerPurchaseResponse(serverResponseTable) if serverResponseTable["playerId"] - and tonumber(serverResponseTable["playerId"]) == game.Players.LocalPlayer.userId + and tonumber(serverResponseTable["playerId"]) + == game.Players.LocalPlayer.userId then currentServerResponseTable = serverResponseTable userPurchaseProductActionsEnded(false) @@ -1269,9 +1412,10 @@ Game:GetService("MarketplaceService").PromptPurchaseRequested doPurchasePrompt(player, assetId, equipIfPurchased, currencyType, nil) end) -Game:GetService("MarketplaceService").ServerPurchaseVerification:connect(function(serverResponseTable) - doProcessServerPurchaseResponse(serverResponseTable) -end) +Game:GetService("MarketplaceService").ServerPurchaseVerification + :connect(function(serverResponseTable) + doProcessServerPurchaseResponse(serverResponseTable) + end) if enableBrowserWindowClosedEvent then Game:GetService("GuiService").BrowserWindowClosed:connect(function() @@ -1280,7 +1424,9 @@ if enableBrowserWindowClosedEvent then end Game.CoreGui.RobloxGui.Changed:connect(function() - local nowIsSmallScreen = (game.CoreGui.RobloxGui.AbsoluteSize.Y <= smallScreenThreshold) + local nowIsSmallScreen = ( + game.CoreGui.RobloxGui.AbsoluteSize.Y <= smallScreenThreshold + ) if nowIsSmallScreen and not isSmallScreen then changeGuiToScreenSize(true) elseif not nowIsSmallScreen and isSmallScreen then diff --git a/lua/152908679.lua b/lua/152908679.lua index ee0d5a7..0576cc1 100644 --- a/lua/152908679.lua +++ b/lua/152908679.lua @@ -1,5 +1,6 @@ +print "[Mercury]: Loaded corescript 152908679" + -- ContextActionTouch.lua --- 2014, created by Ben Tkacheff -- this script controls ui and firing of lua functions that are bound in ContextActionService for touch inputs -- Essentially a user can bind a lua function to a key code, input type (mousebutton1 etc.) and this @@ -8,8 +9,8 @@ local contextActionService = Game:GetService "ContextActionService" local isTouchDevice = Game:GetService("UserInputService").TouchEnabled local functionTable = {} local buttonVector = {} -local buttonScreenGui = nil -local buttonFrame = nil +local buttonScreenGui +local buttonFrame local ContextDownImage = "http://www.banland.xyz/asset/?id=97166756" local ContextUpImage = "http://www.banland.xyz/asset/?id=97166444" @@ -72,14 +73,22 @@ end function contextButtonDown(button, inputObject, actionName) if inputObject.UserInputType == Enum.UserInputType.Touch then button.Image = ContextDownImage - contextActionService:CallFunction(actionName, Enum.UserInputState.Begin, inputObject) + contextActionService:CallFunction( + actionName, + Enum.UserInputState.Begin, + inputObject + ) end end function contextButtonMoved(button, inputObject, actionName) if inputObject.UserInputType == Enum.UserInputType.Touch then button.Image = ContextDownImage - contextActionService:CallFunction(actionName, Enum.UserInputState.Change, inputObject) + contextActionService:CallFunction( + actionName, + Enum.UserInputState.Change, + inputObject + ) end end @@ -89,7 +98,11 @@ function contextButtonUp(button, inputObject, actionName) inputObject.UserInputType == Enum.UserInputType.Touch and inputObject.UserInputState == Enum.UserInputState.End then - contextActionService:CallFunction(actionName, Enum.UserInputState.End, inputObject) + contextActionService:CallFunction( + actionName, + Enum.UserInputState.End, + inputObject + ) end end @@ -109,7 +122,7 @@ function createNewButton(actionName, functionInfoTable) contextButton.Image = ContextUpImage contextButton.Parent = buttonFrame - local currentButtonTouch = nil + local currentButtonTouch Game:GetService("UserInputService").InputEnded:connect(function(inputObject) oldTouches[inputObject] = nil @@ -119,7 +132,10 @@ function createNewButton(actionName, functionInfoTable) return end - if inputObject.UserInputState == Enum.UserInputState.Begin and currentButtonTouch == nil then + if + inputObject.UserInputState == Enum.UserInputState.Begin + and currentButtonTouch == nil + then currentButtonTouch = inputObject contextButtonDown(contextButton, inputObject, actionName) end @@ -152,7 +168,10 @@ function createNewButton(actionName, functionInfoTable) actionIcon.Position = UDim2.new(0.175, 0, 0.175, 0) actionIcon.Size = UDim2.new(0.65, 0, 0.65, 0) actionIcon.BackgroundTransparency = 1 - if functionInfoTable["image"] and type(functionInfoTable["image"]) == "string" then + if + functionInfoTable["image"] + and type(functionInfoTable["image"]) == "string" + then actionIcon.Image = functionInfoTable["image"] end actionIcon.Parent = contextButton @@ -167,7 +186,10 @@ function createNewButton(actionName, functionInfoTable) actionTitle.FontSize = Enum.FontSize.Size18 actionTitle.TextWrapped = true actionTitle.Text = "" - if functionInfoTable["title"] and type(functionInfoTable["title"]) == "string" then + if + functionInfoTable["title"] + and type(functionInfoTable["title"]) == "string" + then actionTitle.Text = functionInfoTable["title"] end actionTitle.Parent = contextButton @@ -178,7 +200,7 @@ end function createButton(actionName, functionInfoTable) local button = createNewButton(actionName, functionInfoTable) - local position = nil + local position for i = 1, #buttonVector do if buttonVector[i] == "empty" then position = i @@ -240,26 +262,30 @@ function addAction(actionName, createTouchButton, functionInfoTable) end -- Connections -contextActionService.BoundActionChanged:connect(function(actionName, changeName, changeTable) - if functionTable[actionName] and changeTable then - local button = functionTable[actionName]["button"] - if button then - if changeName == "image" then - button.ActionIcon.Image = changeTable[changeName] - elseif changeName == "title" then - button.ActionTitle.Text = changeTable[changeName] - -- elseif changeName == "description" then - -- -- todo: add description to menu - elseif changeName == "position" then - button.Position = changeTable[changeName] +contextActionService.BoundActionChanged:connect( + function(actionName, changeName, changeTable) + if functionTable[actionName] and changeTable then + local button = functionTable[actionName]["button"] + if button then + if changeName == "image" then + button.ActionIcon.Image = changeTable[changeName] + elseif changeName == "title" then + button.ActionTitle.Text = changeTable[changeName] + -- elseif changeName == "description" then + -- -- todo: add description to menu + elseif changeName == "position" then + button.Position = changeTable[changeName] + end end end end -end) +) -contextActionService.BoundActionAdded:connect(function(actionName, createTouchButton, functionInfoTable) - addAction(actionName, createTouchButton, functionInfoTable) -end) +contextActionService.BoundActionAdded:connect( + function(actionName, createTouchButton, functionInfoTable) + addAction(actionName, createTouchButton, functionInfoTable) + end +) contextActionService.BoundActionRemoved:connect(function(actionName, _) removeAction(actionName) @@ -267,7 +293,10 @@ end) contextActionService.GetActionButtonEvent:connect(function(actionName) if functionTable[actionName] then - contextActionService:FireActionButtonFoundSignal(actionName, functionTable[actionName]["button"]) + contextActionService:FireActionButtonFoundSignal( + actionName, + functionTable[actionName]["button"] + ) end end) diff --git a/lua/153556783.lua b/lua/153556783.lua index 61509bf..9a6ddaf 100644 --- a/lua/153556783.lua +++ b/lua/153556783.lua @@ -1,6 +1,7 @@ +print "[Mercury]: Loaded corescript 153556783" + -- This is responsible for all touch controls we show (as of this writing, only on iOS) -- this includes character move thumbsticks, and buttons for jump, use of items, camera, etc. --- Written by Ben Tkacheff, 2013 -- obligatory stuff to make sure we don't access nil data while not Game do @@ -51,13 +52,13 @@ if isSmallScreenDevice() then jumpButtonSize = 70 end local oldJumpTouches = {} -local currentJumpTouch = nil +local currentJumpTouch local CameraRotateSensitivity = 0.007 local CameraRotateDeadZone = CameraRotateSensitivity * 16 local CameraZoomSensitivity = 0.03 local PinchZoomDelay = 0.2 -local cameraTouch = nil +local cameraTouch -- make sure all of our images are good to go Game:GetService("ContentProvider"):Preload(touchControlsSheet) @@ -88,14 +89,20 @@ function rotatePointAboutLocation(pointToRotate, pointToRotateAbout, radians) local transformedPoint = pointToRotate -- translate point back to origin: - transformedPoint = Vector2.new(transformedPoint.x - pointToRotateAbout.x, transformedPoint.y - pointToRotateAbout.y) + transformedPoint = Vector2.new( + transformedPoint.x - pointToRotateAbout.x, + transformedPoint.y - pointToRotateAbout.y + ) -- rotate point - local xNew = transformedPoint.x * cosAnglePercent - transformedPoint.y * sinAnglePercent - local yNew = transformedPoint.x * sinAnglePercent + transformedPoint.y * cosAnglePercent + local xNew = transformedPoint.x * cosAnglePercent + - transformedPoint.y * sinAnglePercent + local yNew = transformedPoint.x * sinAnglePercent + + transformedPoint.y * cosAnglePercent -- translate point back: - transformedPoint = Vector2.new(xNew + pointToRotateAbout.x, yNew + pointToRotateAbout.y) + transformedPoint = + Vector2.new(xNew + pointToRotateAbout.x, yNew + pointToRotateAbout.y) return transformedPoint end @@ -104,12 +111,17 @@ function dotProduct(v1, v2) return ((v1.x * v2.x) + (v1.y * v2.y)) end -function stationaryThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation) +function stationaryThumbstickTouchMove( + thumbstickFrame, + thumbstickOuter, + touchLocation +) local thumbstickOuterCenterPosition = Vector2.new( thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2 ) - local centerDiff = DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenterPosition) + local centerDiff = + DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenterPosition) -- thumbstick is moving outside our region, need to cap its distance if centerDiff > (thumbstickSize / 2) then @@ -125,10 +137,15 @@ function stationaryThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLo normal = Vector2.new(normal.x, 0) end - local newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize / 2)) - thumbstickFrame.Position = transformFromCenterToTopLeft(newThumbstickInnerPosition, thumbstickFrame) + local newThumbstickInnerPosition = thumbstickOuterCenterPosition + + (normal * (thumbstickSize / 2)) + thumbstickFrame.Position = transformFromCenterToTopLeft( + newThumbstickInnerPosition, + thumbstickFrame + ) else - thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame) + thumbstickFrame.Position = + transformFromCenterToTopLeft(touchLocation, thumbstickFrame) end return Vector2.new( @@ -137,44 +154,69 @@ function stationaryThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLo ) end -function followThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation) +function followThumbstickTouchMove( + thumbstickFrame, + thumbstickOuter, + touchLocation +) local thumbstickOuterCenter = Vector2.new( thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2 ) -- thumbstick is moving outside our region, need to position outer thumbstick texture carefully (to make look and feel like actual joystick controller) - if DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) > thumbstickSize / 2 then + if + DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) + > thumbstickSize / 2 + then local thumbstickInnerCenter = Vector2.new( - thumbstickFrame.Position.X.Offset + thumbstickFrame.AbsoluteSize.x / 2, - thumbstickFrame.Position.Y.Offset + thumbstickFrame.AbsoluteSize.y / 2 + thumbstickFrame.Position.X.Offset + + thumbstickFrame.AbsoluteSize.x / 2, + thumbstickFrame.Position.Y.Offset + + thumbstickFrame.AbsoluteSize.y / 2 ) - local movementVectorUnit = - Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit + local movementVectorUnit = Vector2.new( + touchLocation.x - thumbstickInnerCenter.x, + touchLocation.y - thumbstickInnerCenter.y + ).unit local outerToInnerVectorCurrent = Vector2.new( thumbstickInnerCenter.x - thumbstickOuterCenter.x, thumbstickInnerCenter.y - thumbstickOuterCenter.y ) local outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit - local movementVector = - Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y) + local movementVector = Vector2.new( + touchLocation.x - thumbstickInnerCenter.x, + touchLocation.y - thumbstickInnerCenter.y + ) -- First, find the angle between the new thumbstick movement vector, -- and the vector between thumbstick inner and thumbstick outer. -- We will use this to pivot thumbstick outer around thumbstick inner, gives a nice joystick feel - local crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y) - - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x) - local angle = - math.atan2(crossOuterToInnerWithMovement, dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit)) - local anglePercent = angle * math.min(movementVector.magnitude / outerToInnerVectorCurrent.magnitude, 1.0) + local crossOuterToInnerWithMovement = ( + outerToInnerVectorCurrentUnit.x * movementVectorUnit.y + ) - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x) + local angle = math.atan2( + crossOuterToInnerWithMovement, + dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit) + ) + local anglePercent = angle + * math.min( + movementVector.magnitude / outerToInnerVectorCurrent.magnitude, + 1.0 + ) -- If angle is significant, rotate about the inner thumbsticks current center if math.abs(anglePercent) > 0.00001 then - local outerThumbCenter = - rotatePointAboutLocation(thumbstickOuterCenter, thumbstickInnerCenter, anglePercent) - thumbstickOuter.Position = - transformFromCenterToTopLeft(Vector2.new(outerThumbCenter.x, outerThumbCenter.y), thumbstickOuter) + local outerThumbCenter = rotatePointAboutLocation( + thumbstickOuterCenter, + thumbstickInnerCenter, + anglePercent + ) + thumbstickOuter.Position = transformFromCenterToTopLeft( + Vector2.new(outerThumbCenter.x, outerThumbCenter.y), + thumbstickOuter + ) end -- now just translate outer thumbstick to make sure it stays nears inner thumbstick @@ -186,13 +228,27 @@ function followThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocati ) end - thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame) + thumbstickFrame.Position = + transformFromCenterToTopLeft(touchLocation, thumbstickFrame) -- a bit of error checking to make sure thumbsticks stay close to eachother - local thumbstickFramePosition = Vector2.new(thumbstickFrame.Position.X.Offset, thumbstickFrame.Position.Y.Offset) - local thumbstickOuterPosition = Vector2.new(thumbstickOuter.Position.X.Offset, thumbstickOuter.Position.Y.Offset) - if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize / 2 then - local vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize / 2 + local thumbstickFramePosition = Vector2.new( + thumbstickFrame.Position.X.Offset, + thumbstickFrame.Position.Y.Offset + ) + local thumbstickOuterPosition = Vector2.new( + thumbstickOuter.Position.X.Offset, + thumbstickOuter.Position.Y.Offset + ) + if + DistanceBetweenTwoPoints( + thumbstickFramePosition, + thumbstickOuterPosition + ) > thumbstickSize / 2 + then + local vectorWithLength = ( + thumbstickOuterPosition - thumbstickFramePosition + ).unit * thumbstickSize / 2 thumbstickOuter.Position = UDim2.new( 0, thumbstickFramePosition.x + vectorWithLength.x, @@ -208,10 +264,17 @@ function followThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocati end function movementOutsideDeadZone(movementVector) - return ((math.abs(movementVector.x) > ThumbstickDeadZone) or (math.abs(movementVector.y) > ThumbstickDeadZone)) + return ( + (math.abs(movementVector.x) > ThumbstickDeadZone) + or (math.abs(movementVector.y) > ThumbstickDeadZone) + ) end -function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThumbstick) +function constructThumbstick( + defaultThumbstickPos, + updateFunction, + stationaryThumbstick +) local thumbstickFrame = Instance.new "Frame" thumbstickFrame.Name = "ThumbstickFrame" thumbstickFrame.Active = true @@ -235,7 +298,8 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu innerThumbstick.ImageRectOffset = Vector2.new(220, 0) innerThumbstick.ImageRectSize = Vector2.new(111, 111) innerThumbstick.BackgroundTransparency = 1 - innerThumbstick.Size = UDim2.new(0, thumbstickSize / 2, 0, thumbstickSize / 2) + innerThumbstick.Size = + UDim2.new(0, thumbstickSize / 2, 0, thumbstickSize / 2) innerThumbstick.Position = UDim2.new( 0, thumbstickFrame.Size.X.Offset / 2 - thumbstickSize / 4, @@ -245,9 +309,9 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu innerThumbstick.Parent = thumbstickFrame innerThumbstick.ZIndex = 2 - local thumbstickTouch = nil - local userInputServiceTouchMovedCon = nil - local userInputSeviceTouchEndedCon = nil + local thumbstickTouch + local userInputServiceTouchMovedCon + local userInputSeviceTouchEndedCon local startInputTracking = function(inputObject) if thumbstickTouch then @@ -266,52 +330,68 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu thumbstickTouch = inputObject table.insert(thumbstickTouches, thumbstickTouch) - thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position, thumbstickFrame) + thumbstickFrame.Position = transformFromCenterToTopLeft( + thumbstickTouch.Position, + thumbstickFrame + ) outerThumbstick.Position = thumbstickFrame.Position - userInputServiceTouchMovedCon = userInputService.TouchMoved:connect(function(movedInput) - if movedInput == thumbstickTouch then - local movementVector = nil - if stationaryThumbstick then - movementVector = stationaryThumbstickTouchMove( - thumbstickFrame, - outerThumbstick, - Vector2.new(movedInput.Position.x, movedInput.Position.y) - ) - else - movementVector = followThumbstickTouchMove( - thumbstickFrame, - outerThumbstick, - Vector2.new(movedInput.Position.x, movedInput.Position.y) - ) - end + userInputServiceTouchMovedCon = userInputService.TouchMoved:connect( + function(movedInput) + if movedInput == thumbstickTouch then + local movementVector + if stationaryThumbstick then + movementVector = stationaryThumbstickTouchMove( + thumbstickFrame, + outerThumbstick, + Vector2.new( + movedInput.Position.x, + movedInput.Position.y + ) + ) + else + movementVector = followThumbstickTouchMove( + thumbstickFrame, + outerThumbstick, + Vector2.new( + movedInput.Position.x, + movedInput.Position.y + ) + ) + end - if updateFunction then - updateFunction(movementVector, outerThumbstick.Size.X.Offset / 2) - end - end - end) - userInputSeviceTouchEndedCon = userInputService.TouchEnded:connect(function(endedInput) - if endedInput == thumbstickTouch then - if updateFunction then - updateFunction(Vector2.new(0, 0), 1) - end - - userInputSeviceTouchEndedCon:disconnect() - userInputServiceTouchMovedCon:disconnect() - - thumbstickFrame.Position = defaultThumbstickPos - outerThumbstick.Position = defaultThumbstickPos - - for i, object in pairs(thumbstickTouches) do - if object == thumbstickTouch then - table.remove(thumbstickTouches, i) - break + if updateFunction then + updateFunction( + movementVector, + outerThumbstick.Size.X.Offset / 2 + ) end end - thumbstickTouch = nil end - end) + ) + userInputSeviceTouchEndedCon = userInputService.TouchEnded:connect( + function(endedInput) + if endedInput == thumbstickTouch then + if updateFunction then + updateFunction(Vector2.new(0, 0), 1) + end + + userInputSeviceTouchEndedCon:disconnect() + userInputServiceTouchMovedCon:disconnect() + + thumbstickFrame.Position = defaultThumbstickPos + outerThumbstick.Position = defaultThumbstickPos + + for i, object in pairs(thumbstickTouches) do + if object == thumbstickTouch then + table.remove(thumbstickTouches, i) + break + end + end + thumbstickTouch = nil + end + end + ) end userInputService.Changed:connect(function(prop) @@ -335,28 +415,43 @@ function setupCharacterMovement(parentFrame) lastMaxMovement = maxMovement -- sometimes rounding error will not allow us to go max speed at some -- thumbstick angles, fix this with a bit of fudging near 100% throttle - if movementVector.magnitude / maxMovement > ThumbstickMaxPercentGive then + if + movementVector.magnitude / maxMovement + > ThumbstickMaxPercentGive + then maxMovement = movementVector.magnitude - 1 end moveCharacterFunc(localPlayer, movementVector, maxMovement) else lastMovementVector = Vector2.new(0, 0) lastMaxMovement = 1 - moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement) + moveCharacterFunc( + localPlayer, + lastMovementVector, + lastMaxMovement + ) end end end - local thumbstickPos = UDim2.new(0, thumbstickSize / 2, 1, -thumbstickSize * 1.75) + local thumbstickPos = + UDim2.new(0, thumbstickSize / 2, 1, -thumbstickSize * 1.75) if isSmallScreenDevice() then - thumbstickPos = UDim2.new(0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20) + thumbstickPos = + UDim2.new(0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20) end - local characterThumbstick = constructThumbstick(thumbstickPos, moveCharacterFunction, false) + local characterThumbstick = + constructThumbstick(thumbstickPos, moveCharacterFunction, false) characterThumbstick.Name = "CharacterThumbstick" characterThumbstick.Parent = parentFrame local refreshCharacterMovement = function() - if localPlayer and moveCharacterFunc and lastMovementVector and lastMaxMovement then + if + localPlayer + and moveCharacterFunc + and lastMovementVector + and lastMaxMovement + then moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement) end end @@ -372,9 +467,11 @@ function setupJumpButton(parentFrame) jumpButton.ImageRectSize = Vector2.new(174, 174) jumpButton.Size = UDim2.new(0, jumpButtonSize, 0, jumpButtonSize) if isSmallScreenDevice() then - jumpButton.Position = UDim2.new(1, -(jumpButtonSize * 2.25), 1, -jumpButtonSize - 20) + jumpButton.Position = + UDim2.new(1, -(jumpButtonSize * 2.25), 1, -jumpButtonSize - 20) else - jumpButton.Position = UDim2.new(1, -(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120) + jumpButton.Position = + UDim2.new(1, -(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120) end local playerJumpFunc = localPlayer.JumpCharacter @@ -464,16 +561,16 @@ function isTouchUsedByThumbstick(touch) end function setupCameraControl(parentFrame, refreshCharacterMoveFunc) - local lastPos = nil + local lastPos local hasRotatedCamera = false local rotateCameraFunc = userInputService.RotateCamera local pinchTime = -1 local shouldPinch = false - local lastPinchScale = nil + local lastPinchScale local zoomCameraFunc = userInputService.ZoomCamera local pinchTouches = {} - local pinchFrame = nil + local pinchFrame local resetCameraRotateState = function() cameraTouch = nil @@ -509,35 +606,48 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc) if lastPinchScale == nil then -- first pinch move, just set up scale if inputObject == firstTouch then - lastPinchScale = (inputObject.Position - secondTouch.Position).magnitude + lastPinchScale = ( + inputObject.Position - secondTouch.Position + ).magnitude firstTouch = inputObject elseif inputObject == secondTouch then - lastPinchScale = (inputObject.Position - firstTouch.Position).magnitude + lastPinchScale = ( + inputObject.Position - firstTouch.Position + ).magnitude secondTouch = inputObject end else -- we are now actually pinching, do comparison to last pinch size local newPinchDistance = 0 if inputObject == firstTouch then - newPinchDistance = (inputObject.Position - secondTouch.Position).magnitude + newPinchDistance = ( + inputObject.Position - secondTouch.Position + ).magnitude firstTouch = inputObject elseif inputObject == secondTouch then - newPinchDistance = (inputObject.Position - firstTouch.Position).magnitude + newPinchDistance = ( + inputObject.Position - firstTouch.Position + ).magnitude secondTouch = inputObject end if newPinchDistance ~= 0 then local pinchDiff = newPinchDistance - lastPinchScale if pinchDiff ~= 0 then - zoomCameraFunc(userInputService, (pinchDiff * CameraZoomSensitivity)) + zoomCameraFunc( + userInputService, + (pinchDiff * CameraZoomSensitivity) + ) end lastPinchScale = newPinchDistance end end end) - pinchFrame.InputEnded:connect(function(inputObject) -- pinch is over, destroy all - if inputObject == firstTouch or inputObject == secondTouch then - resetPinchState() + pinchFrame.InputEnded:connect( + function(inputObject) -- pinch is over, destroy all + if inputObject == firstTouch or inputObject == secondTouch then + resetPinchState() + end end - end) + ) end local pinchGestureReceivedTouch = function(inputObject) @@ -572,7 +682,8 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc) if cameraTouch == nil and not usedByThumbstick then cameraTouch = inputObject - lastPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y) + lastPos = + Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y) -- lastTick = tick() end end) @@ -584,11 +695,15 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc) return end - local newPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y) + local newPos = + Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y) local touchDiff = (lastPos - newPos) * CameraRotateSensitivity -- first time rotating outside deadzone, just setup for next changed event - if not hasRotatedCamera and (touchDiff.magnitude > CameraRotateDeadZone) then + if + not hasRotatedCamera + and (touchDiff.magnitude > CameraRotateDeadZone) + then hasRotatedCamera = true lastPos = newPos end @@ -630,7 +745,10 @@ function setupTouchControls() end -- kill camera pan if the touch is used by some user controls - if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin then + if + inputObject == cameraTouch + and inputObject.UserInputState == Enum.UserInputState.Begin + then cameraTouch = nil end end) diff --git a/lua/157877000.lua b/lua/157877000.lua index 0bc6726..92a8c82 100644 --- a/lua/157877000.lua +++ b/lua/157877000.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 157877000" --Include local Create = assert(LoadLibrary "RbxUtility").Create @@ -257,7 +258,7 @@ function initializeDeveloperConsole() Position = UDim2.new(0, 0, 0.5, -8), Rotation = 180, Size = UDim2.new(1, 0, 0, 16), - Image = "http://www.roblox.com/Asset?id=151205881", + Image = "http://banland.xyz/Asset?id=151205881", } local Dev_DownButton = Create "ImageButton" { @@ -276,7 +277,7 @@ function initializeDeveloperConsole() Position = UDim2.new(0, 3, 0, 3), Size = UDim2.new(0, 14, 0, 14), Rotation = 180, - Image = "http://www.roblox.com/Asset?id=151205813", + Image = "http://banland.xyz/Asset?id=151205813", } local Dev_UpButton = Create "ImageButton" { @@ -294,7 +295,7 @@ function initializeDeveloperConsole() BackgroundTransparency = 1, Position = UDim2.new(0, 3, 0, 3), Size = UDim2.new(0, 14, 0, 14), - Image = "http://www.roblox.com/Asset?id=151205813", + Image = "http://banland.xyz/Asset?id=151205813", } local Dev_TextBox = Create "Frame" { @@ -331,7 +332,7 @@ function initializeDeveloperConsole() Position = UDim2.new(0, 0, 0, 0), Size = UDim2.new(1, 0, 1, 0), Rotation = 0, - Image = "http://www.roblox.com/Asset?id=152093917", + Image = "http://banland.xyz/Asset?id=152093917", } local Dev_ResizeButton = Create "ImageButton" { @@ -350,7 +351,7 @@ function initializeDeveloperConsole() Position = UDim2.new(0, 6, 0, 6), Size = UDim2.new(0.8, 0, 0.8, 0), Rotation = 135, - Image = "http://www.roblox.com/Asset?id=151205813", + Image = "http://banland.xyz/Asset?id=151205813", } Create "TextButton" { @@ -405,7 +406,7 @@ function initializeDeveloperConsole() BackgroundTransparency = 1, Position = UDim2.new(0, 3, 0, 3), Size = UDim2.new(0, 14, 0, 14), - Image = "http://www.roblox.com/Asset?id=151205852", + Image = "http://banland.xyz/Asset?id=151205852", } Create "TextButton" { @@ -433,17 +434,17 @@ function initializeDeveloperConsole() } ---Saved Mouse Information - local previousMousePos = nil - local pPos = nil + local previousMousePos + local pPos - local previousMousePosResize = nil - local pSize = nil + local previousMousePosResize + local pSize - local previousMousePosScroll = nil + local previousMousePosScroll - local pScrollHandle = nil + local pScrollHandle - local pOffset = nil + local pOffset local scrollUpIsDown = false local scrollDownIsDown = false @@ -467,7 +468,8 @@ function initializeDeveloperConsole() end local delta = Vector2.new(x, y) - previousMousePos - Dev_Container.Position = UDim2.new(0, pPos.X + delta.X, 0, pPos.Y + delta.Y) + Dev_Container.Position = + UDim2.new(0, pPos.X + delta.X, 0, pPos.Y + delta.Y) end Dev_TitleBar.TextButton.MouseButton1Down:connect(function(x, y) @@ -486,8 +488,12 @@ function initializeDeveloperConsole() end local delta = Vector2.new(x, y) - previousMousePosResize - Dev_Container.Size = - UDim2.new(0, math.max(pSize.X + delta.X, minimumSize.X), 0, math.max(pSize.Y + delta.Y, minimumSize.Y)) + Dev_Container.Size = UDim2.new( + 0, + math.max(pSize.X + delta.X, minimumSize.X), + 0, + math.max(pSize.Y + delta.Y, minimumSize.Y) + ) end Dev_Container.Body.ResizeButton.MouseButton1Down:connect(function(x, y) previousMousePosResize = Vector2.new(x, y) @@ -526,10 +532,14 @@ function initializeDeveloperConsole() local x = frameNumber / 5 local smoothStep = x * x * (3 - (2 * x)) Dev_OptionsButton.ImageLabel.Rotation = smoothStep * 5 * 9 - Dev_OptionsBar.Position = UDim2.new(0, (smoothStep * 5 * 50) - 250, 0, 4) + Dev_OptionsBar.Position = + UDim2.new(0, (smoothStep * 5 * 50) - 250, 0, 4) wait() - if (frameNumber <= 0 and optionsHidden) or (frameNumber >= 5 and not optionsHidden) then + if + (frameNumber <= 0 and optionsHidden) + or (frameNumber >= 5 and not optionsHidden) + then animating = false end until not animating @@ -591,15 +601,23 @@ function initializeDeveloperConsole() end if - (outputToggleOn or messageList[i].Type ~= Enum.MessageType.MessageOutput) + ( + outputToggleOn + or messageList[i].Type ~= Enum.MessageType.MessageOutput + ) and (infoToggleOn or messageList[i].Type ~= Enum.MessageType.MessageInfo) and (warningToggleOn or messageList[i].Type ~= Enum.MessageType.MessageWarning) - and (errorToggleOn or messageList[i].Type ~= Enum.MessageType.MessageError) + and ( + errorToggleOn + or messageList[i].Type ~= Enum.MessageType.MessageError + ) then message.TextWrapped = wordWrapToggleOn message.Size = UDim2.new(0.98, 0, 0, 2000) message.Parent = Dev_Container - message.Text = messageList[i].Time .. " -- " .. messageList[i].Message + message.Text = messageList[i].Time + .. " -- " + .. messageList[i].Message message.Size = UDim2.new(0.98, 0, 0, message.TextBounds.Y) message.Position = UDim2.new(0, 5, 0, posOffset) @@ -609,7 +627,10 @@ function initializeDeveloperConsole() if movePosition then if (currentConsole == LOCAL_CONSOLE and localOffset > 0) - or (currentConsole == SERVER_CONSOLE and serverOffset > 0) + or ( + currentConsole == SERVER_CONSOLE + and serverOffset > 0 + ) then changeOffset(message.TextBounds.Y) end @@ -621,7 +642,9 @@ function initializeDeveloperConsole() message.TextColor3 = Color3.new(1, 0, 0) elseif messageList[i].Type == Enum.MessageType.MessageInfo then message.TextColor3 = Color3.new(0.4, 0.5, 1) - elseif messageList[i].Type == Enum.MessageType.MessageWarning then + elseif + messageList[i].Type == Enum.MessageType.MessageWarning + then message.TextColor3 = Color3.new(1, 0.6, 0.4) else message.TextColor3 = Color3.new(1, 1, 1) @@ -708,10 +731,16 @@ function initializeDeveloperConsole() local delta = (Vector2.new(x, y) - previousMousePosScroll).Y - local backRatio = 1 - (Dev_Container.Body.TextBox.AbsoluteSize.Y / Dev_TextHolder.AbsoluteSize.Y) + local backRatio = 1 + - ( + Dev_Container.Body.TextBox.AbsoluteSize.Y + / Dev_TextHolder.AbsoluteSize.Y + ) - local movementSize = Dev_ScrollArea.AbsoluteSize.Y - Dev_ScrollArea.Handle.AbsoluteSize.Y - local normalDelta = math.max(math.min(delta, movementSize), 0 - movementSize) + local movementSize = Dev_ScrollArea.AbsoluteSize.Y + - Dev_ScrollArea.Handle.AbsoluteSize.Y + local normalDelta = + math.max(math.min(delta, movementSize), 0 - movementSize) local normalRatio = normalDelta / movementSize local textMovementSize = (backRatio * Dev_TextHolder.AbsoluteSize.Y) @@ -741,7 +770,12 @@ function initializeDeveloperConsole() local function existsInsideContainer(container, x, y) local pos = container.AbsolutePosition local size = container.AbsoluteSize - if x < pos.X or x > pos.X + size.X or y < pos.y or y > pos.y + size.y then + if + x < pos.X + or x > pos.X + size.X + or y < pos.y + or y > pos.y + size.y + then return false end return true @@ -750,21 +784,30 @@ function initializeDeveloperConsole() --Refresh Dev-Console Message Positions function repositionList() if currentConsole == LOCAL_CONSOLE then - localOffset = math.min(math.max(localOffset, 0), textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y) + localOffset = math.min( + math.max(localOffset, 0), + textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y + ) Dev_TextHolder.Size = UDim2.new(1, 0, 0, textHolderSize) elseif currentConsole == SERVER_CONSOLE then - serverOffset = - math.min(math.max(serverOffset, 0), textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y) + serverOffset = math.min( + math.max(serverOffset, 0), + textHolderSize - Dev_Container.Body.TextBox.AbsoluteSize.Y + ) Dev_TextHolder.Size = UDim2.new(1, 0, 0, textHolderSize) end - local ratio = Dev_Container.Body.TextBox.AbsoluteSize.Y / Dev_TextHolder.AbsoluteSize.Y + local ratio = Dev_Container.Body.TextBox.AbsoluteSize.Y + / Dev_TextHolder.AbsoluteSize.Y if ratio >= 1 then Dev_Container.Body.ScrollBar.Visible = false Dev_Container.Body.TextBox.Size = UDim2.new(1, -4, 1, -28) - if currentConsole == LOCAL_CONSOLE or currentConsole == SERVER_CONSOLE then + if + currentConsole == LOCAL_CONSOLE + or currentConsole == SERVER_CONSOLE + then Dev_TextHolder.Position = UDim2.new(0, 0, 1, 0 - textHolderSize) end else @@ -782,7 +825,8 @@ function initializeDeveloperConsole() local topRatio = math.max(0, backRatio - offsetRatio) - local scrollHandleSize = math.max(Dev_ScrollArea.AbsoluteSize.Y * ratio, 21) + local scrollHandleSize = + math.max(Dev_ScrollArea.AbsoluteSize.Y * ratio, 21) local scrollRatio = scrollHandleSize / Dev_ScrollArea.AbsoluteSize.Y local ratioConversion = (1 - scrollRatio) / (1 - ratio) @@ -798,9 +842,11 @@ function initializeDeveloperConsole() Dev_ScrollArea.Handle.Position = UDim2.new(0, 0, 0, sPos) if currentConsole == LOCAL_CONSOLE then - Dev_TextHolder.Position = UDim2.new(0, 0, 1, 0 - textHolderSize + localOffset) + Dev_TextHolder.Position = + UDim2.new(0, 0, 1, 0 - textHolderSize + localOffset) elseif currentConsole == SERVER_CONSOLE then - Dev_TextHolder.Position = UDim2.new(0, 0, 1, 0 - textHolderSize + serverOffset) + Dev_TextHolder.Position = + UDim2.new(0, 0, 1, 0 - textHolderSize + serverOffset) end end end @@ -862,15 +908,19 @@ function initializeDeveloperConsole() Dev_OptionsBar.WordWrapToggleButton.MouseButton1Down:connect(function(_, _) wordWrapToggleOn = not wordWrapToggleOn - Dev_OptionsBar.WordWrapToggleButton.CheckFrame.Visible = wordWrapToggleOn + Dev_OptionsBar.WordWrapToggleButton.CheckFrame.Visible = + wordWrapToggleOn refreshTextHolder() repositionList() end) ---Dev-Console Message Functionality function AddLocalMessage(str, messageType, timeStamp) - localMessageList[#localMessageList + 1] = - { Message = str, Time = ConvertTimeStamp(timeStamp), Type = messageType } + localMessageList[#localMessageList + 1] = { + Message = str, + Time = ConvertTimeStamp(timeStamp), + Type = messageType, + } while #localMessageList > MAX_LIST_SIZE do table.remove(localMessageList, 1) end @@ -881,8 +931,11 @@ function initializeDeveloperConsole() end function AddServerMessage(str, messageType, timeStamp) - serverMessageList[#serverMessageList + 1] = - { Message = str, Time = ConvertTimeStamp(timeStamp), Type = messageType } + serverMessageList[#serverMessageList + 1] = { + Message = str, + Time = ConvertTimeStamp(timeStamp), + Type = messageType, + } while #serverMessageList > MAX_LIST_SIZE do table.remove(serverMessageList, 1) end @@ -904,7 +957,9 @@ function initializeDeveloperConsole() localConsole.BackgroundTransparency = 0.6 serverConsole.BackgroundTransparency = 0.8 - if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + if + game:FindFirstChild "Players" and game.Players["LocalPlayer"] + then local mouse = game.Players.LocalPlayer:GetMouse() refreshConsolePosition(mouse.X, mouse.Y) refreshConsoleSize(mouse.X, mouse.Y) @@ -938,7 +993,9 @@ function initializeDeveloperConsole() serverConsole.BackgroundTransparency = 0.6 localConsole.BackgroundTransparency = 0.8 - if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + if + game:FindFirstChild "Players" and game.Players["LocalPlayer"] + then local mouse = game.Players.LocalPlayer:GetMouse() refreshConsolePosition(mouse.X, mouse.Y) refreshConsoleSize(mouse.X, mouse.Y) @@ -978,7 +1035,9 @@ function initializeDeveloperConsole() if not Dev_Container.Visible then return end - if existsInsideContainer(Dev_Container, LocalMouse.X, LocalMouse.Y) then + if + existsInsideContainer(Dev_Container, LocalMouse.X, LocalMouse.Y) + then changeOffset(10) end end) @@ -987,7 +1046,9 @@ function initializeDeveloperConsole() if not Dev_Container.Visible then return end - if existsInsideContainer(Dev_Container, LocalMouse.X, LocalMouse.Y) then + if + existsInsideContainer(Dev_Container, LocalMouse.X, LocalMouse.Y) + then changeOffset(-10) end end) @@ -1002,12 +1063,17 @@ function initializeDeveloperConsole() local history = game:GetService("LogService"):GetLogHistory() for i = 1, #history do - AddLocalMessage(history[i].message, history[i].messageType, history[i].timestamp) + AddLocalMessage( + history[i].message, + history[i].messageType, + history[i].timestamp + ) end - game:GetService("LogService").MessageOut:connect(function(message, messageType) - AddLocalMessage(message, messageType, os.time()) - end) + game:GetService("LogService").MessageOut + :connect(function(message, messageType) + AddLocalMessage(message, messageType, os.time()) + end) game:GetService("LogService").ServerMessageOut:connect(AddServerMessage) end diff --git a/lua/36868950.lua b/lua/36868950.lua index 455d653..1bcd706 100644 --- a/lua/36868950.lua +++ b/lua/36868950.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 36868950" local controlFrame = script.Parent:FindFirstChild "ControlFrame" if not controlFrame then @@ -34,9 +35,14 @@ function setUpListeners(frameToListen) frameToListen.inside.Value = true wait(1.2) if frameToListen.inside.Value then - while frameToListen.inside.Value and frameToListen.BackgroundTransparency > 0 do - frameToListen.BackgroundTransparency = frameToListen.BackgroundTransparency - fadeSpeed - frameToListen.TextTransparency = frameToListen.TextTransparency - fadeSpeed + while + frameToListen.inside.Value + and frameToListen.BackgroundTransparency > 0 + do + frameToListen.BackgroundTransparency = frameToListen.BackgroundTransparency + - fadeSpeed + frameToListen.TextTransparency = frameToListen.TextTransparency + - fadeSpeed wait() end end diff --git a/lua/37801172.lua b/lua/37801172.lua index 79efa68..8f4dcd6 100644 --- a/lua/37801172.lua +++ b/lua/37801172.lua @@ -1,14 +1,20 @@ --- Creates all neccessary scripts for the gui on initial load, everything except build tools --- Created by Ben T. 10/29/10 --- Please note that these are loaded in a specific order to diminish errors/perceived load time by user +print "[Mercury]: Loaded corescript 37801172" local scriptContext = game:GetService "ScriptContext" + +-- Creates all neccessary scripts for the gui on initial load, everything except build tools +-- Please note that these are loaded in a specific order to diminish errors/perceived load time by user + local touchEnabled = false pcall(function() touchEnabled = game:GetService("UserInputService").TouchEnabled end) -- library registration -scriptContext:AddCoreScript(60595695, scriptContext, "/Libraries/LibraryRegistration/LibraryRegistration") +scriptContext:AddCoreScript( + 60595695, + scriptContext, + "/Libraries/LibraryRegistration/LibraryRegistration" +) local function waitForChild(instance, name) while not instance:FindFirstChild(name) do @@ -22,7 +28,6 @@ end -- end -- Responsible for tracking logging items -local scriptContext = game:GetService "ScriptContext" scriptContext:AddCoreScript(59002209, scriptContext, "CoreScripts/Sections") waitForChild(game:GetService "CoreGui", "RobloxGui") @@ -34,36 +39,64 @@ if not touchEnabled then -- SettingsScript scriptContext:AddCoreScript(46295863, screenGui, "CoreScripts/Settings") else - scriptContext:AddCoreScript(153556783, screenGui, "CoreScripts/TouchControls") + scriptContext:AddCoreScript( + 153556783, + screenGui, + "CoreScripts/TouchControls" + ) end -- MainBotChatScript -scriptContext:AddCoreScript(39250920, screenGui, "CoreScripts/MainBotChatScript") +scriptContext:AddCoreScript( + 39250920, + screenGui, + "CoreScripts/MainBotChatScript" +) -- Popup Script scriptContext:AddCoreScript(48488451, screenGui, "CoreScripts/PopupScript") -- Friend Notification Script (probably can use this script to expand out to other notifications) -scriptContext:AddCoreScript(48488398, screenGui, "CoreScripts/NotificationScript") +scriptContext:AddCoreScript( + 48488398, + screenGui, + "CoreScripts/NotificationScript" +) -- Chat script scriptContext:AddCoreScript(97188756, screenGui, "CoreScripts/ChatScript") -- Purchase Prompt Script -scriptContext:AddCoreScript(107893730, screenGui, "CoreScripts/PurchasePromptScript") +scriptContext:AddCoreScript( + 107893730, + screenGui, + "CoreScripts/PurchasePromptScript" +) if not touchEnabled or screenGui.AbsoluteSize.Y > 600 then -- New Player List - scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript") + scriptContext:AddCoreScript( + 48488235, + screenGui, + "CoreScripts/PlayerListScript" + ) else delay(5, function() if screenGui.AbsoluteSize.Y >= 600 then -- New Player List - scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript") + scriptContext:AddCoreScript( + 48488235, + screenGui, + "CoreScripts/PlayerListScript" + ) end end) end if game.CoreGui.Version >= 3 and game.PlaceId ~= 130815926 then --todo: remove placeid hack for halloween -- Backpack Builder, creates most of the backpack gui - scriptContext:AddCoreScript(53878047, screenGui, "CoreScripts/BackpackScripts/BackpackBuilder") + scriptContext:AddCoreScript( + 53878047, + screenGui, + "CoreScripts/BackpackScripts/BackpackBuilder" + ) waitForChild(screenGui, "CurrentLoadout") waitForChild(screenGui, "Backpack") @@ -71,33 +104,59 @@ if game.CoreGui.Version >= 3 and game.PlaceId ~= 130815926 then --todo: remove p -- Manager handles all big backpack state changes, other scripts subscribe to this and do things accordingly if game.CoreGui.Version >= 7 then - scriptContext:AddCoreScript(89449093, Backpack, "CoreScripts/BackpackScripts/BackpackManager") + scriptContext:AddCoreScript( + 89449093, + Backpack, + "CoreScripts/BackpackScripts/BackpackManager" + ) end -- Backpack Gear (handles all backpack gear tab stuff) - game:GetService("ScriptContext"):AddCoreScript(89449008, Backpack, "CoreScripts/BackpackScripts/BackpackGear") + game:GetService("ScriptContext"):AddCoreScript( + 89449008, + Backpack, + "CoreScripts/BackpackScripts/BackpackGear" + ) -- Loadout Script, used for gear hotkeys - scriptContext:AddCoreScript(53878057, screenGui.CurrentLoadout, "CoreScripts/BackpackScripts/LoadoutScript") + scriptContext:AddCoreScript( + 53878057, + screenGui.CurrentLoadout, + "CoreScripts/BackpackScripts/LoadoutScript" + ) if game.CoreGui.Version >= 8 then -- Wardrobe script handles all character dressing operations - scriptContext:AddCoreScript(-1, Backpack, "CoreScripts/BackpackScripts/BackpackWardrobe") + scriptContext:AddCoreScript( + -1, + Backpack, + "CoreScripts/BackpackScripts/BackpackWardrobe" + ) end end local IsPersonalServer = not not game.Workspace:FindFirstChild "PSVariable" if IsPersonalServer then - game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager") + game:GetService("ScriptContext") + :AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager") end game.Workspace.ChildAdded:connect(function(nchild) if nchild.Name == "PSVariable" and nchild:IsA "BoolValue" then IsPersonalServer = true - game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager") + game:GetService("ScriptContext") + :AddCoreScript( + 64164692, + game.Players.LocalPlayer, + "BuildToolManager" + ) end end) if touchEnabled then -- touch devices don't use same control frame -- only used for touch device button generation - scriptContext:AddCoreScript(152908679, screenGui, "CoreScripts/ContextActionTouch") + scriptContext:AddCoreScript( + 152908679, + screenGui, + "CoreScripts/ContextActionTouch" + ) waitForChild(screenGui, "ControlFrame") waitForChild(screenGui.ControlFrame, "BottomLeftControl") diff --git a/lua/38037565.lua b/lua/38037565.lua index ea37dbe..26bddcd 100644 --- a/lua/38037565.lua +++ b/lua/38037565.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 38037565" local damageGuiWidth = 5.0 local damageGuiHeight = 5.0 @@ -133,9 +134,17 @@ while true do if regen then delta = delta + regen.Value.X if regen.Value.Y >= 0 then - regen.Value = Vector3.new(regen.Value.X + regen.Value.Z, regen.Value.Y - s, regen.Value.Z) -- maybe have 3rd parameter be an increaser/decreaser? + regen.Value = Vector3.new( + regen.Value.X + regen.Value.Z, + regen.Value.Y - s, + regen.Value.Z + ) -- maybe have 3rd parameter be an increaser/decreaser? elseif regen.Value.Y == -1 then - regen.Value = Vector3.new(regen.Value.X + regen.Value.Z, -1, regen.Value.Z) + regen.Value = Vector3.new( + regen.Value.X + regen.Value.Z, + -1, + regen.Value.Z + ) else regen:remove() end -- infinity is -1 @@ -143,9 +152,17 @@ while true do if poison then delta = delta - poison.Value.X if poison.Value.Y >= 0 then - poison.Value = Vector3.new(poison.Value.X + poison.Value.Z, poison.Value.Y - s, poison.Value.Z) + poison.Value = Vector3.new( + poison.Value.X + poison.Value.Z, + poison.Value.Y - s, + poison.Value.Z + ) elseif poison.Value.Y == -1 then - poison.Value = Vector3.new(poison.Value.X + poison.Value.Z, -1, poison.Value.Z) + poison.Value = Vector3.new( + poison.Value.X + poison.Value.Z, + -1, + poison.Value.Z + ) else poison:remove() end -- infinity is -1 @@ -155,7 +172,8 @@ while true do --print("IN ICE") delta = delta - ice.Value.X if ice.Value.Y >= 0 then - ice.Value = Vector3.new(ice.Value.X, ice.Value.Y - s, ice.Value.Z) + ice.Value = + Vector3.new(ice.Value.X, ice.Value.Y - s, ice.Value.Z) else ice:remove() end @@ -166,7 +184,11 @@ while true do fireEffect.Parent = Figure.Torso delta = delta - fire.Value.X if fire.Value.Y >= 0 then - fire.Value = Vector3.new(fire.Value.X, fire.Value.Y - s, fire.Value.Z) + fire.Value = Vector3.new( + fire.Value.X, + fire.Value.Y - s, + fire.Value.Z + ) else fire:remove() fireEffect.Enabled = false @@ -178,7 +200,9 @@ while true do if stun.Value > 0 then Torso.Anchored = true currentChildren = script.Parent:GetChildren() - backpackTools = game.Players:GetPlayerFromCharacter(script.Parent).Backpack:GetChildren() + backpackTools = game.Players + :GetPlayerFromCharacter(script.Parent).Backpack + :GetChildren() for i = 1, #currentChildren do if currentChildren[i].className == "Tool" then inCharTag:Clone().Parent = currentChildren[i] @@ -187,20 +211,25 @@ while true do end end for i = 1, #backpackTools do - if backpackTools[i]:FindFirstChild "RobloxBuildTool" == nil then + if + backpackTools[i]:FindFirstChild "RobloxBuildTool" + == nil + then hider:Clone().Parent = backpackTools[i] backpackTools[i].Parent = game.Lighting end end wait(0.2) for i = 1, #backpackTools do - backpackTools[i].Parent = game.Players:GetPlayerFromCharacter(script.Parent).Backpack + backpackTools[i].Parent = + game.Players:GetPlayerFromCharacter(script.Parent).Backpack end stun.Value = stun.Value - s else Torso.Anchored = false for i = 1, #backpackTools do - local rbTool = backpackTools[i]:FindFirstChild "RobloxBuildTool" + local rbTool = + backpackTools[i]:FindFirstChild "RobloxBuildTool" if rbTool then rbTool:Remove() end @@ -208,12 +237,16 @@ while true do end wait(0.2) for i = 1, #backpackTools do - local wasInChar = backpackTools[i]:FindFirstChild "InCharTag" + local wasInChar = + backpackTools[i]:FindFirstChild "InCharTag" if wasInChar then wasInChar:Remove() backpackTools[i].Parent = script.Parent else - backpackTools[i].Parent = game.Players:GetPlayerFromCharacter(script.Parent).Backpack + backpackTools[i].Parent = + game.Players:GetPlayerFromCharacter( + script.Parent + ).Backpack end end stun:Remove() diff --git a/lua/39250920.lua b/lua/39250920.lua index 0f1f30a..787afa9 100644 --- a/lua/39250920.lua +++ b/lua/39250920.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 39250920" function waitForProperty(instance, name) while not instance[name] do instance.Changed:wait() @@ -33,7 +34,7 @@ local reenableDialogScript local dialogMap = {} local dialogConnections = {} -local gui = nil +local gui waitForChild(game, "CoreGui") waitForChild(game.CoreGui, "RobloxGui") if game.CoreGui.RobloxGui:FindFirstChild "ControlFrame" then @@ -102,31 +103,39 @@ end function styleMainFrame(tone) if tone == Enum.DialogTone.Neutral then mainFrame.Style = Enum.FrameStyle.ChatBlue - mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" + mainFrame.Tail.Image = + "rbxasset://textures/chatBubble_botBlue_tailRight.png" elseif tone == Enum.DialogTone.Friendly then mainFrame.Style = Enum.FrameStyle.ChatGreen - mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botGreen_tailRight.png" + mainFrame.Tail.Image = + "rbxasset://textures/chatBubble_botGreen_tailRight.png" elseif tone == Enum.DialogTone.Enemy then mainFrame.Style = Enum.FrameStyle.ChatRed - mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botRed_tailRight.png" + mainFrame.Tail.Image = + "rbxasset://textures/chatBubble_botRed_tailRight.png" end styleChoices(tone) end function setChatNotificationTone(gui, purpose, tone) if tone == Enum.DialogTone.Neutral then - gui.Image.Image = "rbxasset://textures/chatBubble_botBlue_notify_bkg.png" + gui.Image.Image = + "rbxasset://textures/chatBubble_botBlue_notify_bkg.png" elseif tone == Enum.DialogTone.Friendly then - gui.Image.Image = "rbxasset://textures/chatBubble_botGreen_notify_bkg.png" + gui.Image.Image = + "rbxasset://textures/chatBubble_botGreen_notify_bkg.png" elseif tone == Enum.DialogTone.Enemy then gui.Image.Image = "rbxasset://textures/chatBubble_botRed_notify_bkg.png" end if purpose == Enum.DialogPurpose.Quest then - gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_bang.png" + gui.Image.Button.Image = + "rbxasset://textures/chatBubble_bot_notify_bang.png" elseif purpose == Enum.DialogPurpose.Help then - gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_question.png" + gui.Image.Button.Image = + "rbxasset://textures/chatBubble_bot_notify_question.png" elseif purpose == Enum.DialogPurpose.Shop then - gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_money.png" + gui.Image.Button.Image = + "rbxasset://textures/chatBubble_bot_notify_money.png" end end @@ -243,7 +252,11 @@ function selectChoice(choice) --First hide the Gui mainFrame.Visible = false if choice == lastChoice then - game.Chat:Chat(game.Players.LocalPlayer.Character, "Goodbye!", getChatColor(currentTone())) + game.Chat:Chat( + game.Players.LocalPlayer.Character, + "Goodbye!", + getChatColor(currentTone()) + ) normalEndDialog() else @@ -255,7 +268,10 @@ function selectChoice(choice) getChatColor(currentTone()) ) wait(1) - currentConversationDialog:SignalDialogChoiceSelected(player, dialogChoice) + currentConversationDialog:SignalDialogChoiceSelected( + player, + dialogChoice + ) game.Chat:Chat( currentConversationPartner, sanitizeMessage(dialogChoice.ResponseDialog), @@ -263,7 +279,10 @@ function selectChoice(choice) ) variableDelay(dialogChoice.ResponseDialog) - presentDialogChoices(currentConversationPartner, dialogChoice:GetChildren()) + presentDialogChoices( + currentConversationPartner, + dialogChoice:GetChildren() + ) end end @@ -381,7 +400,8 @@ function presentDialogChoices(talkingPart, dialogChoices) --3 lines is the maximum, set it to that temporarily choices[pos].Size = UDim2.new(1, 0, 0, 24 * 3) choices[pos].UserPrompt.Text = obj.UserDialog - local height = math.ceil(choices[pos].UserPrompt.TextBounds.Y / 24) * 24 + local height = math.ceil(choices[pos].UserPrompt.TextBounds.Y / 24) + * 24 choices[pos].Position = UDim2.new(0, 0, 0, yPosition) choices[pos].Size = UDim2.new(1, 0, 0, height) @@ -417,7 +437,11 @@ function doDialog(dialog) end currentConversationDialog = dialog - game.Chat:Chat(dialog.Parent, dialog.InitialPrompt, getChatColor(dialog.Tone)) + game.Chat:Chat( + dialog.Parent, + dialog.InitialPrompt, + getChatColor(dialog.Tone) + ) variableDelay(dialog.InitialPrompt) presentDialogChoices(dialog.Parent, dialog:GetChildren()) @@ -440,8 +464,9 @@ function checkForLeaveArea() if currentConversationDialog.Parent and ( - player:DistanceFromCharacter(currentConversationDialog.Parent.Position) - >= currentConversationDialog.ConversationDistance + player:DistanceFromCharacter( + currentConversationDialog.Parent.Position + ) >= currentConversationDialog.ConversationDistance ) then wanderDialog() @@ -452,7 +477,10 @@ end function startDialog(dialog) if dialog.Parent and dialog.Parent:IsA "BasePart" then - if player:DistanceFromCharacter(dialog.Parent.Position) >= dialog.ConversationDistance then + if + player:DistanceFromCharacter(dialog.Parent.Position) + >= dialog.ConversationDistance + then showMessage(tooFarAwayMessage, tooFarAwaySize) return end @@ -502,12 +530,17 @@ function addDialog(dialog) removeDialog(dialog) addDialog(dialog) elseif prop == "InUse" then - chatGui.Enabled = not currentConversationDialog and not dialog.InUse + chatGui.Enabled = not currentConversationDialog + and not dialog.InUse if dialog == currentConversationDialog then timeoutDialog() end elseif prop == "Tone" or prop == "Purpose" then - setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) + setChatNotificationTone( + chatGui, + dialog.Purpose, + dialog.Tone + ) end end) else -- still need to listen to parent changes even if current parent is not a BasePart diff --git a/lua/45284430.lua b/lua/45284430.lua index 5bf7042..2b2514e 100644 --- a/lua/45284430.lua +++ b/lua/45284430.lua @@ -1,7 +1,15 @@ +print "[Mercury]: Loaded corescript 45284430" local t = {} -local function ScopedConnect(parentInstance, instance, event, signalFunc, syncFunc, removeFunc) - local eventConnection = nil +local function ScopedConnect( + parentInstance, + instance, + event, + signalFunc, + syncFunc, + removeFunc +) + local eventConnection --Connection on parentInstance is scoped by parentInstance (when destroyed, it goes away) local tryConnect = function() @@ -81,9 +89,14 @@ local function CreateButtons(frame, buttons, yPos, ySize) buttonNum = 1 while buttonNum <= numButtons do - buttonObjs[buttonNum].Position = - UDim2.new(spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, yPos.Scale, yPos.Offset) - buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) + buttonObjs[buttonNum].Position = UDim2.new( + spacing * buttonNum + (buttonNum - 1) * buttonSize, + 0, + yPos.Scale, + yPos.Offset + ) + buttonObjs[buttonNum].Size = + UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) buttonNum = buttonNum + 1 end end @@ -91,7 +104,10 @@ end local function setSliderPos(newAbsPosX, slider, sliderPosition, bar, steps) local newStep = steps - 1 --otherwise we really get one more step than we want - local relativePosX = math.min(1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X)) + local relativePosX = math.min( + 1, + math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X) + ) local wholeNum, remainder = math.modf(relativePosX * newStep) if remainder > 0.5 then wholeNum = wholeNum + 1 @@ -101,8 +117,12 @@ local function setSliderPos(newAbsPosX, slider, sliderPosition, bar, steps) local result = math.ceil(relativePosX * newStep) if sliderPosition.Value ~= (result + 1) then --only update if we moved a step sliderPosition.Value = result + 1 - slider.Position = - UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset) + slider.Position = UDim2.new( + relativePosX, + -slider.AbsoluteSize.X / 2, + slider.Position.Y.Scale, + slider.Position.Y.Offset + ) end end @@ -127,13 +147,13 @@ t.CreateStyledMessageDialog = function(title, message, style, buttons) styleImage.Position = UDim2.new(0, 5, 0, 15) if style == "error" or style == "Error" then styleImage.Size = UDim2.new(0, 71, 0, 71) - styleImage.Image = "http://www.roblox.com/asset?id=42565285" + styleImage.Image = "http://banland.xyz/asset?id=42565285" elseif style == "notify" or style == "Notify" then styleImage.Size = UDim2.new(0, 71, 0, 71) - styleImage.Image = "http://www.roblox.com/asset?id=42604978" + styleImage.Image = "http://banland.xyz/asset?id=42604978" elseif style == "confirm" or style == "Confirm" then styleImage.Size = UDim2.new(0, 74, 0, 76) - styleImage.Image = "http://www.roblox.com/asset?id=42557901" + styleImage.Image = "http://banland.xyz/asset?id=42557901" else return t.CreateMessageDialog(title, message, buttons) end @@ -241,7 +261,7 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) local dropDownIcon = Instance.new "ImageLabel" dropDownIcon.Name = "Icon" dropDownIcon.Active = false - dropDownIcon.Image = "http://www.roblox.com/asset/?id=45732894" + dropDownIcon.Image = "http://banland.xyz/asset/?id=45732894" dropDownIcon.BackgroundTransparency = 1 dropDownIcon.Size = UDim2.new(0, 11, 0, 6) dropDownIcon.Position = UDim2.new(1, -11, 0.5, -2) @@ -281,9 +301,11 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) choiceButton.Font = Enum.Font.Arial choiceButton.FontSize = Enum.FontSize.Size18 if useScrollButtons then - choiceButton.Size = UDim2.new(1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) + choiceButton.Size = + UDim2.new(1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) else - choiceButton.Size = UDim2.new(1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) + choiceButton.Size = + UDim2.new(1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0) end choiceButton.TextWrap = true choiceButton.ZIndex = 2 @@ -330,7 +352,8 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) scrollUpButton.Active = scrollBarPosition > 1 end if scrollDownButton then - scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount + scrollDownButton.Active = scrollBarPosition + dropDownItemCount + <= itemCount end local children = droppedDownMenu:GetChildren() @@ -341,11 +364,19 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) local childNum = 1 for _, obj in ipairs(children) do if obj.Name == "ChoiceButton" then - if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount then + if + childNum < scrollBarPosition + or childNum >= scrollBarPosition + dropDownItemCount + then obj.Visible = false else - obj.Position = - UDim2.new(0, 0, ((childNum - scrollBarPosition + 1) * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) + obj.Position = UDim2.new( + 0, + 0, + ((childNum - scrollBarPosition + 1) * 0.8) + / ((dropDownItemCount + 1) * 0.8), + 0 + ) obj.Visible = true end obj.TextColor3 = Color3.new(1, 1, 1) @@ -430,7 +461,8 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) scrollUpButton.BackgroundTransparency = 1 scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" scrollUpButton.Size = UDim2.new(0, 17, 0, 17) - scrollUpButton.Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) + scrollUpButton.Position = + UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) scrollUpButton.MouseButton1Click:connect(function() scrollMouseCount = scrollMouseCount + 1 end) @@ -484,8 +516,18 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) scrollbar.Name = "ScrollBar" scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" scrollbar.BackgroundTransparency = 1 - scrollbar.Size = UDim2.new(0, 18, (dropDownItemCount * 0.8) / ((dropDownItemCount + 1) * 0.8), -17 - 11 - 4) - scrollbar.Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 17 + 2) + scrollbar.Size = UDim2.new( + 0, + 18, + (dropDownItemCount * 0.8) / ((dropDownItemCount + 1) * 0.8), + -17 - 11 - 4 + ) + scrollbar.Position = UDim2.new( + 1, + -11, + (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), + 17 + 2 + ) scrollbar.Parent = droppedDownMenu end @@ -627,13 +669,24 @@ local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) if child:IsA "TextLabel" or child:IsA "TextButton" then local isLabel = child:IsA "TextLabel" if isLabel then - pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] + pixelsRemaining = pixelsRemaining + - settingsTable["TextLabelPositionPadY"] else - pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] + pixelsRemaining = pixelsRemaining + - settingsTable["TextButtonPositionPadY"] end - child.Position = - UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining) + child.Position = UDim2.new( + child.Position.X.Scale, + child.Position.X.Offset, + 0, + totalPixels - pixelsRemaining + ) + child.Size = UDim2.new( + child.Size.X.Scale, + child.Size.X.Offset, + 0, + pixelsRemaining + ) if child.TextFits and child.TextBounds.Y < pixelsRemaining then child.Visible = true @@ -654,14 +707,21 @@ local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) end while not child.TextFits do - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1) + child.Size = UDim2.new( + child.Size.X.Scale, + child.Size.X.Offset, + 0, + child.AbsoluteSize.Y + 1 + ) end pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y if isLabel then - pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] + pixelsRemaining = pixelsRemaining + - settingsTable["TextLabelPositionPadY"] else - pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] + pixelsRemaining = pixelsRemaining + - settingsTable["TextButtonPositionPadY"] end else child.Visible = false @@ -669,8 +729,12 @@ local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) end else --GuiObject - child.Position = - UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + child.Position = UDim2.new( + child.Position.X.Scale, + child.Position.X.Offset, + 0, + totalPixels - pixelsRemaining + ) pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y child.Visible = (pixelsRemaining >= 0) end @@ -798,7 +862,7 @@ t.CreateSlider = function(steps, width, position) slider.ZIndex = 3 slider.Parent = bar - local areaSoakMouseMoveCon = nil + local areaSoakMouseMoveCon areaSoak.MouseLeave:connect(function() if areaSoak.Visible then @@ -826,10 +890,15 @@ t.CreateSlider = function(steps, width, position) end) sliderPosition.Changed:connect(function(_) - sliderPosition.Value = math.min(steps, math.max(1, sliderPosition.Value)) + sliderPosition.Value = + math.min(steps, math.max(1, sliderPosition.Value)) local relativePosX = (sliderPosition.Value - 1) / (steps - 1) - slider.Position = - UDim2.new(relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset) + slider.Position = UDim2.new( + relativePosX, + -slider.AbsoluteSize.X / 2, + slider.Position.Y.Scale, + slider.Position.Y.Offset + ) end) bar.MouseButton1Down:connect(function(x, _) @@ -840,11 +909,11 @@ t.CreateSlider = function(steps, width, position) end t.CreateTrueScrollingFrame = function() - local lowY = nil - local highY = nil + local lowY + local highY - local dragCon = nil - local upCon = nil + local dragCon + local upCon local internalChange = false @@ -995,17 +1064,31 @@ t.CreateTrueScrollingFrame = function() local oldPos = scrollbar.Position if y < scrollTrack.AbsolutePosition.y then - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0) + scrollbar.Position = UDim2.new( + scrollbar.Position.X.Scale, + scrollbar.Position.X.Offset, + 0, + 0 + ) return (oldPos ~= scrollbar.Position) end - local relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y + local relativeSize = scrollbar.AbsoluteSize.Y + / scrollTrack.AbsoluteSize.Y - if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0) + if + y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) + then + scrollbar.Position = UDim2.new( + scrollbar.Position.X.Scale, + scrollbar.Position.X.Offset, + 1 - relativeSize, + 0 + ) return (oldPos ~= scrollbar.Position) end - local newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset) / scrollTrack.AbsoluteSize.y + local newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset) + / scrollTrack.AbsoluteSize.y if newScaleYPos + relativeSize > 1 then newScaleYPos = 1 - relativeSize scrollBottom.Value = true @@ -1018,7 +1101,12 @@ t.CreateTrueScrollingFrame = function() scrollUp.Value = false scrollBottom.Value = false end - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, newScaleYPos, 0) + scrollbar.Position = UDim2.new( + scrollbar.Position.X.Scale, + scrollbar.Position.X.Offset, + newScaleYPos, + 0 + ) return (oldPos ~= scrollbar.Position) end @@ -1040,7 +1128,13 @@ t.CreateTrueScrollingFrame = function() if (lowY and lowY > instance.AbsolutePosition.Y) or not lowY then lowY = instance.AbsolutePosition.Y end - if (highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y)) or not highY then + if + ( + highY + and highY + < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) + ) or not highY + then highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y end local children = instance:GetChildren() @@ -1064,7 +1158,10 @@ t.CreateTrueScrollingFrame = function() if scrollbar.Position.Y.Scale > 0 then if scrollbar.Visible then percentFrame = scrollbar.Position.Y.Scale - / ((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) / scrollTrack.AbsoluteSize.Y) + / ( + (scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) + / scrollTrack.AbsoluteSize.Y + ) else percentFrame = 0 end @@ -1073,7 +1170,8 @@ t.CreateTrueScrollingFrame = function() percentFrame = 1 end - local hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame + local hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) + * percentFrame local guiChildren = scrollingFrame:GetChildren() for i = 1, #guiChildren do @@ -1082,7 +1180,9 @@ t.CreateTrueScrollingFrame = function() guiChildren[i].Position.X.Scale, guiChildren[i].Position.X.Offset, 0, - math.ceil(guiChildren[i].AbsolutePosition.Y) - math.ceil(lowY) + hiddenYAmount + math.ceil(guiChildren[i].AbsolutePosition.Y) + - math.ceil(lowY) + + hiddenYAmount ) end end @@ -1126,10 +1226,16 @@ t.CreateTrueScrollingFrame = function() scrollDownButton.Visible = true scrollUpButton.Visible = true - scrollbar.Size = UDim2.new(scrollbar.Size.X.Scale, scrollbar.Size.X.Offset, percentShown, 0) + scrollbar.Size = UDim2.new( + scrollbar.Size.X.Scale, + scrollbar.Size.X.Offset, + percentShown, + 0 + ) end - local percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY) / totalYSpan + local percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY) + / totalYSpan scrollbar.Position = UDim2.new( scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, @@ -1138,15 +1244,26 @@ t.CreateTrueScrollingFrame = function() ) if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y then - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0) + scrollbar.Position = UDim2.new( + scrollbar.Position.X.Scale, + scrollbar.Position.X.Offset, + 0, + 0 + ) end if (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then - local relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0) + local relativeSize = scrollbar.AbsoluteSize.Y + / scrollTrack.AbsoluteSize.Y + scrollbar.Position = UDim2.new( + scrollbar.Position.X.Scale, + scrollbar.Position.X.Offset, + 1 - relativeSize, + 0 + ) end end @@ -1158,7 +1275,13 @@ t.CreateTrueScrollingFrame = function() end reentrancyGuardScrollUp = true - if positionScrollBar(0, scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels, 0) then + if + positionScrollBar( + 0, + scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels, + 0 + ) + then recalculate() end reentrancyGuardScrollUp = false @@ -1171,7 +1294,13 @@ t.CreateTrueScrollingFrame = function() end reentrancyGuardScrollDown = true - if positionScrollBar(0, scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels, 0) then + if + positionScrollBar( + 0, + scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels, + 0 + ) + then recalculate() end reentrancyGuardScrollDown = false @@ -1227,7 +1356,11 @@ t.CreateTrueScrollingFrame = function() local w = 0.1 while scrollStamp == current do doScrollDown() - if mouseYPos and mouseYPos < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x) then + if + mouseYPos + and mouseYPos + < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x) + then break end if not scrollDownButton.Active then @@ -1339,9 +1472,11 @@ t.CreateTrueScrollingFrame = function() highLowRecheck() end - descendantsChangeConMap[instance] = instance.Changed:connect(function(prop) - descendantChanged(instance, prop) - end) + descendantsChangeConMap[instance] = instance.Changed:connect( + function(prop) + descendantChanged(instance, prop) + end + ) end) scrollingFrame.DescendantRemoving:connect(function(instance) @@ -1397,7 +1532,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local scrollStamp = 0 local scrollDrag = Instance.new "ImageButton" - scrollDrag.Image = "http://www.roblox.com/asset/?id=61367186" + scrollDrag.Image = "http://banland.xyz/asset/?id=61367186" scrollDrag.Size = UDim2.new(1, 0, 0, 16) scrollDrag.BackgroundTransparency = 1 scrollDrag.Name = "ScrollDrag" @@ -1527,7 +1662,9 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) end --Do check last time if pos = 0 - if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) then + if + (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) + then scrollPosition = 1 end @@ -1539,8 +1676,16 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local xOffset, yOffset = 0 if guiObjects[1] then - yOffset = math.ceil(math.floor(math.fmod(totalPixelsY, guiObjects[1].AbsoluteSize.X)) / 2) - xOffset = math.ceil(math.floor(math.fmod(totalPixelsX, guiObjects[1].AbsoluteSize.Y)) / 2) + yOffset = math.ceil( + math.floor( + math.fmod(totalPixelsY, guiObjects[1].AbsoluteSize.X) + ) / 2 + ) + xOffset = math.ceil( + math.floor( + math.fmod(totalPixelsX, guiObjects[1].AbsoluteSize.Y) + ) / 2 + ) end for i, child in ipairs(guiObjects) do @@ -1563,7 +1708,8 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) setRowSize = false end xCounter = 0 - pixelsRemainingY = pixelsRemainingY - child.AbsoluteSize.Y + pixelsRemainingY = pixelsRemainingY + - child.AbsoluteSize.Y end child.Position = UDim2.new( child.Position.X.Scale, @@ -1572,7 +1718,9 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) totalPixelsY - pixelsRemainingY + yOffset ) xCounter = xCounter + child.AbsoluteSize.X - child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) + child.Visible = ( + (pixelsRemainingY - child.AbsoluteSize.Y) >= 0 + ) if child.Visible then howManyDisplayed = howManyDisplayed + 1 end @@ -1630,11 +1778,16 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local pos = #guiObjects while pixelsBelowScrollbar < totalPixels and pos >= 1 do if pos >= scrollPosition then - pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + pixelsBelowScrollbar = pixelsBelowScrollbar + + guiObjects[pos].AbsoluteSize.Y else - if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels then + if + pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + <= totalPixels + then --It fits, so back up our scroll position - pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + pixelsBelowScrollbar = pixelsBelowScrollbar + + guiObjects[pos].AbsoluteSize.Y if scrollPosition <= 1 then scrollPosition = 1 break @@ -1661,8 +1814,12 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) else --print("Laying out " .. child.Name) --GuiObject - child.Position = - UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + child.Position = UDim2.new( + child.Position.X.Scale, + child.Position.X.Offset, + 0, + totalPixels - pixelsRemaining + ) pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y if pixelsRemaining >= 0 then child.Visible = true @@ -1694,14 +1851,20 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) return end - local dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1 / (guiObjects - howManyDisplayed + 1)) + local dragSizeY = scrollDrag.Parent.AbsoluteSize.y + * (1 / (guiObjects - howManyDisplayed + 1)) if dragSizeY < 16 then dragSizeY = 16 end - scrollDrag.Size = - UDim2.new(scrollDrag.Size.X.Scale, scrollDrag.Size.X.Offset, scrollDrag.Size.Y.Scale, dragSizeY) + scrollDrag.Size = UDim2.new( + scrollDrag.Size.X.Scale, + scrollDrag.Size.X.Offset, + scrollDrag.Size.Y.Scale, + dragSizeY + ) - local relativeYPos = (scrollPosition - 1) / (guiObjects - howManyDisplayed) + local relativeYPos = (scrollPosition - 1) + / (guiObjects - howManyDisplayed) if relativeYPos > 1 then relativeYPos = 1 elseif relativeYPos < 0 then @@ -1710,11 +1873,16 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local absYPos = 0 if relativeYPos ~= 0 then - absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) + absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) + - (relativeYPos * scrollDrag.AbsoluteSize.y) end - scrollDrag.Position = - UDim2.new(scrollDrag.Position.X.Scale, scrollDrag.Position.X.Offset, scrollDrag.Position.Y.Scale, absYPos) + scrollDrag.Position = UDim2.new( + scrollDrag.Position.X.Scale, + scrollDrag.Position.X.Offset, + scrollDrag.Position.Y.Scale, + absYPos + ) end local reentrancyGuard = false @@ -1804,7 +1972,11 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local w = 0.1 while scrollStamp == current do doScrollDown() - if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) then + if + mouseYPos + and mouseYPos + < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) + then break end if not scrollDownButton.Active then @@ -1834,7 +2006,9 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local dragAbsSize = scrollDrag.AbsoluteSize.y local barAbsOne = barAbsPos + barAbsSize - dragAbsSize y = y - mouseOffset - y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y + y = y < barAbsPos and barAbsPos + or y > barAbsOne and barAbsOne + or y y = y - barAbsPos local guiObjects = 0 @@ -1850,7 +2024,9 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local doublePercent = y / (barAbsSize - dragAbsSize) local rowDiff = rowSize local totalScrollCount = guiObjects - (howManyDisplayed - 1) - local newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff + local newScrollPosition = math.floor( + (doublePercent * totalScrollCount) + 0.5 + ) + rowDiff if newScrollPosition < scrollPosition then rowDiff = -rowDiff end @@ -1987,9 +2163,9 @@ t.AutoTruncateTextObject = function(textLabel) fullLabel.Visible = false fullLabel.Parent = textLabel - local shortText = nil - local mouseEnterConnection = nil - local mouseLeaveConnection = nil + local shortText + local mouseEnterConnection + local mouseLeaveConnection local checkForResize = function() if getGuiOwner(textLabel) == nil then @@ -2029,10 +2205,14 @@ t.AutoTruncateTextObject = function(textLabel) end --Okay, now try to binary shrink it back down - local fullLabelSize = binaryShrink(textLabel.AbsoluteSize.X, fullLabel.AbsoluteSize.X, function(size) - fullLabel.Size = UDim2.new(0, size, 1, 0) - return fullLabel.TextFits - end) + local fullLabelSize = binaryShrink( + textLabel.AbsoluteSize.X, + fullLabel.AbsoluteSize.X, + function(size) + fullLabel.Size = UDim2.new(0, size, 1, 0) + return fullLabel.TextFits + end + ) fullLabel.Size = UDim2.new(0, fullLabelSize + 6, 1, 0) --Now setup the rollover effects, if they are currently off @@ -2069,7 +2249,12 @@ t.AutoTruncateTextObject = function(textLabel) return textLabel, changeText end -local function TransitionTutorialPages(fromPage, toPage, transitionFrame, currentPageValue) +local function TransitionTutorialPages( + fromPage, + toPage, + transitionFrame, + currentPageValue +) if fromPage then fromPage.Visible = false if transitionFrame.Visible == false then @@ -2149,7 +2334,7 @@ t.CreateTutorial = function(name, tutorialKey, createButtons) pages.Parent = frame local function getVisiblePageAndHideOthers() - local visiblePage = nil + local visiblePage local children = pages:GetChildren() if children then for _, child in ipairs(children) do @@ -2166,13 +2351,22 @@ t.CreateTutorial = function(name, tutorialKey, createButtons) end local showTutorial = function(alwaysShow) - if alwaysShow or UserSettings().GameSettings:GetTutorialState(tutorialKey) == false then + if + alwaysShow + or UserSettings().GameSettings:GetTutorialState(tutorialKey) + == false + then print("Showing tutorial-", tutorialKey) local currentTutorialPage = getVisiblePageAndHideOthers() local firstPage = pages:FindFirstChild "TutorialPage1" if firstPage then - TransitionTutorialPages(currentTutorialPage, firstPage, transitionFrame, currentPageValue) + TransitionTutorialPages( + currentTutorialPage, + firstPage, + transitionFrame, + currentPageValue + ) else error "Could not find TutorialPage1" end @@ -2183,7 +2377,12 @@ t.CreateTutorial = function(name, tutorialKey, createButtons) local currentTutorialPage = getVisiblePageAndHideOthers() if currentTutorialPage then - TransitionTutorialPages(currentTutorialPage, nil, transitionFrame, currentPageValue) + TransitionTutorialPages( + currentTutorialPage, + nil, + transitionFrame, + currentPageValue + ) end UserSettings().GameSettings:SetTutorialState(tutorialKey, true) @@ -2192,13 +2391,23 @@ t.CreateTutorial = function(name, tutorialKey, createButtons) local gotoPage = function(pageNum) local page = pages:FindFirstChild("TutorialPage" .. pageNum) local currentTutorialPage = getVisiblePageAndHideOthers() - TransitionTutorialPages(currentTutorialPage, page, transitionFrame, currentPageValue) + TransitionTutorialPages( + currentTutorialPage, + page, + transitionFrame, + currentPageValue + ) end return frame, showTutorial, dismissTutorial, gotoPage end -local function CreateBasicTutorialPage(name, handleResize, skipTutorial, giveDoneButton) +local function CreateBasicTutorialPage( + name, + handleResize, + skipTutorial, + giveDoneButton +) local frame = Instance.new "Frame" frame.Name = "TutorialPage" frame.Style = Enum.FrameStyle.RobloxRound @@ -2295,11 +2504,14 @@ local function CreateBasicTutorialPage(name, handleResize, skipTutorial, giveDon innerFrame.Size = UDim2.new(1, 0, 1, -22) end - local parentConnection = nil + local parentConnection local function basicHandleResize() if frame.Visible and frame.Parent then - local maxSize = math.min(frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y) + local maxSize = math.min( + frame.Parent.AbsoluteSize.X, + frame.Parent.AbsoluteSize.Y + ) handleResize(200, maxSize) end end @@ -2311,12 +2523,14 @@ local function CreateBasicTutorialPage(name, handleResize, skipTutorial, giveDon parentConnection = nil end if frame.Parent and frame.Parent:IsA "GuiObject" then - parentConnection = frame.Parent.Changed:connect(function(parentProp) - if parentProp == "AbsoluteSize" then - wait() - basicHandleResize() + parentConnection = frame.Parent.Changed:connect( + function(parentProp) + if parentProp == "AbsoluteSize" then + wait() + basicHandleResize() + end end - end) + ) basicHandleResize() end end @@ -2330,8 +2544,8 @@ local function CreateBasicTutorialPage(name, handleResize, skipTutorial, giveDon end t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) - local frame = nil - local contentFrame = nil + local frame + local contentFrame local textLabel = Instance.new "TextLabel" textLabel.BackgroundTransparency = 1 @@ -2353,15 +2567,23 @@ t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) frame.Position = UDim2.new(0.5, -size / 2, 0.5, -size / 2) end - frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) + frame, contentFrame = + CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) textLabel.Parent = contentFrame return frame end -t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) - local frame = nil - local contentFrame = nil +t.CreateImageTutorialPage = function( + name, + imageAsset, + x, + y, + skipTutorialFunc, + giveDoneButton +) + local frame + local contentFrame local imageLabel = Instance.new "ImageLabel" imageLabel.BackgroundTransparency = 1 @@ -2392,7 +2614,12 @@ t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, g frame.Position = UDim2.new(0.5, -size / 2, 0.5, -size / 2) end - frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc, giveDoneButton) + frame, contentFrame = CreateBasicTutorialPage( + name, + handleResize, + skipTutorialFunc, + giveDoneButton + ) imageLabel.Parent = contentFrame return frame @@ -2420,7 +2647,12 @@ t.AddTutorialPage = function(tutorial, tutorialPage) error "NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function" end previousPage.NextButton.MouseButton1Click:connect(function() - TransitionTutorialPages(previousPage, tutorialPage, transitionFrame, currentPageValue) + TransitionTutorialPages( + previousPage, + tutorialPage, + transitionFrame, + currentPageValue + ) end) previousPage.NextButton.Active = true previousPage.NextButton.Visible = true @@ -2429,7 +2661,12 @@ t.AddTutorialPage = function(tutorial, tutorialPage) error "PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function" end tutorialPage.PrevButton.MouseButton1Click:connect(function() - TransitionTutorialPages(tutorialPage, previousPage, transitionFrame, currentPageValue) + TransitionTutorialPages( + tutorialPage, + previousPage, + transitionFrame, + currentPageValue + ) end) tutorialPage.PrevButton.Active = true tutorialPage.PrevButton.Visible = true @@ -2443,845 +2680,943 @@ t.AddTutorialPage = function(tutorial, tutorialPage) end end -t.CreateSetPanel = - function(userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) - if not userIdsForSets then - error "CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids" +t.CreateSetPanel = function( + userIdsForSets, + objectSelected, + dialogClosed, + size, + position, + showAdminCategories, + useAssetVersionId +) + if not userIdsForSets then + error "CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids" + end + if + type(userIdsForSets) ~= "table" + and type(userIdsForSets) ~= "userdata" + then + error( + "CreateSetPanel: userIdsForSets (first arg) is of type " + .. type(userIdsForSets) + .. ", should be of type table or userdata" + ) + end + if not objectSelected then + error "CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!" + end + if type(objectSelected) ~= "function" then + error( + "CreateSetPanel: objectSelected (second arg) is of type " + .. type(objectSelected) + .. ", should be of type function!" + ) + end + if dialogClosed and type(dialogClosed) ~= "function" then + error( + "CreateSetPanel: dialogClosed (third arg) is of type " + .. type(dialogClosed) + .. ", should be of type function!" + ) + end + + if showAdminCategories == nil then -- by default, don't show beta sets + showAdminCategories = false + end + + local arrayPosition = 1 + local insertButtons = {} + local insertButtonCons = {} + local contents + local setGui + + -- used for water selections + local waterForceDirection = "NegX" + local waterForce = "None" + local waterGui, waterTypeChangedEvent = nil + + local Data = {} + Data.CurrentCategory = nil + Data.Category = {} + local SetCache = {} + + local userCategoryButtons + + local buttonWidth = 64 + local buttonHeight = buttonWidth + + local SmallThumbnailUrl + local LargeThumbnailUrl + local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() + + if useAssetVersionId then + LargeThumbnailUrl = BaseUrl + .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=" + SmallThumbnailUrl = BaseUrl + .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" + else + LargeThumbnailUrl = BaseUrl + .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=" + SmallThumbnailUrl = BaseUrl + .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" + end + + local function drillDownSetZIndex(parent, index) + local children = parent:GetChildren() + for i = 1, #children do + if children[i]:IsA "GuiObject" then + children[i].ZIndex = index + end + drillDownSetZIndex(children[i], index) end - if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" then - error( - "CreateSetPanel: userIdsForSets (first arg) is of type " - .. type(userIdsForSets) - .. ", should be of type table or userdata" + end + + -- for terrain stamping + local currTerrainDropDownFrame + local terrainShapes = { + "Block", + "Vertical Ramp", + "Corner Wedge", + "Inverse Corner Wedge", + "Horizontal Ramp", + "Auto-Wedge", + } + local terrainShapeMap = {} + for i = 1, #terrainShapes do + terrainShapeMap[terrainShapes[i]] = i - 1 + end + terrainShapeMap[terrainShapes[#terrainShapes]] = 6 + + local function createWaterGui() + local waterForceDirections = { "NegX", "X", "NegY", "Y", "NegZ", "Z" } + local waterForces = { "None", "Small", "Medium", "Strong", "Max" } + + local waterFrame = Instance.new "Frame" + waterFrame.Name = "WaterFrame" + waterFrame.Style = Enum.FrameStyle.RobloxSquare + waterFrame.Size = UDim2.new(0, 150, 0, 110) + waterFrame.Visible = false + + local waterForceLabel = Instance.new "TextLabel" + waterForceLabel.Name = "WaterForceLabel" + waterForceLabel.BackgroundTransparency = 1 + waterForceLabel.Size = UDim2.new(1, 0, 0, 12) + waterForceLabel.Font = Enum.Font.ArialBold + waterForceLabel.FontSize = Enum.FontSize.Size12 + waterForceLabel.TextColor3 = Color3.new(1, 1, 1) + waterForceLabel.TextXAlignment = Enum.TextXAlignment.Left + waterForceLabel.Text = "Water Force" + waterForceLabel.Parent = waterFrame + + local waterForceDirLabel = waterForceLabel:Clone() + waterForceDirLabel.Name = "WaterForceDirectionLabel" + waterForceDirLabel.Text = "Water Force Direction" + waterForceDirLabel.Position = UDim2.new(0, 0, 0, 50) + waterForceDirLabel.Parent = waterFrame + + local waterTypeChangedEvent = Instance.new "BindableEvent" + waterTypeChangedEvent.Name = "WaterTypeChangedEvent" + waterTypeChangedEvent.Parent = waterFrame + + local waterForceDirectionSelectedFunc = function(newForceDirection) + waterForceDirection = newForceDirection + waterTypeChangedEvent:Fire { waterForce, waterForceDirection } + end + local waterForceSelectedFunc = function(newForce) + waterForce = newForce + waterTypeChangedEvent:Fire { waterForce, waterForceDirection } + end + + local waterForceDirectionDropDown, forceWaterDirectionSelection = + t.CreateDropDownMenu( + waterForceDirections, + waterForceDirectionSelectedFunc ) - end - if not objectSelected then - error "CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!" - end - if type(objectSelected) ~= "function" then - error( - "CreateSetPanel: objectSelected (second arg) is of type " - .. type(objectSelected) - .. ", should be of type function!" - ) - end - if dialogClosed and type(dialogClosed) ~= "function" then - error( - "CreateSetPanel: dialogClosed (third arg) is of type " - .. type(dialogClosed) - .. ", should be of type function!" - ) - end + waterForceDirectionDropDown.Size = UDim2.new(1, 0, 0, 25) + waterForceDirectionDropDown.Position = UDim2.new(0, 0, 1, 3) + forceWaterDirectionSelection "NegX" + waterForceDirectionDropDown.Parent = waterForceDirLabel - if showAdminCategories == nil then -- by default, don't show beta sets - showAdminCategories = false - end + local waterForceDropDown, forceWaterForceSelection = + t.CreateDropDownMenu(waterForces, waterForceSelectedFunc) + forceWaterForceSelection "None" + waterForceDropDown.Size = UDim2.new(1, 0, 0, 25) + waterForceDropDown.Position = UDim2.new(0, 0, 1, 3) + waterForceDropDown.Parent = waterForceLabel - local arrayPosition = 1 - local insertButtons = {} - local insertButtonCons = {} - local contents = nil - local setGui = nil + return waterFrame, waterTypeChangedEvent + end - -- used for water selections - local waterForceDirection = "NegX" - local waterForce = "None" - local waterGui, waterTypeChangedEvent = nil + -- Helper Function that contructs gui elements + local function createSetGui() + local setGui = Instance.new "ScreenGui" + setGui.Name = "SetGui" - local Data = {} - Data.CurrentCategory = nil - Data.Category = {} - local SetCache = {} - - local userCategoryButtons = nil - - local buttonWidth = 64 - local buttonHeight = buttonWidth - - local SmallThumbnailUrl = nil - local LargeThumbnailUrl = nil - local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() - - if useAssetVersionId then - LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=" - SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" + local setPanel = Instance.new "Frame" + setPanel.Name = "SetPanel" + setPanel.Active = true + setPanel.BackgroundTransparency = 1 + if position then + setPanel.Position = position else - LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=" - SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" + setPanel.Position = UDim2.new(0.2, 29, 0.1, 24) + end + if size then + setPanel.Size = size + else + setPanel.Size = UDim2.new(0.6, -58, 0.64, 0) + end + setPanel.Style = Enum.FrameStyle.RobloxRound + setPanel.ZIndex = 6 + setPanel.Parent = setGui + + -- Children of SetPanel + local itemPreview = Instance.new "Frame" + itemPreview.Name = "ItemPreview" + itemPreview.BackgroundTransparency = 1 + itemPreview.Position = UDim2.new(0.8, 5, 0.085, 0) + itemPreview.Size = UDim2.new(0.21, 0, 0.9, 0) + itemPreview.ZIndex = 6 + itemPreview.Parent = setPanel + + -- Children of ItemPreview + local textPanel = Instance.new "Frame" + textPanel.Name = "TextPanel" + textPanel.BackgroundTransparency = 1 + textPanel.Position = UDim2.new(0, 0, 0.45, 0) + textPanel.Size = UDim2.new(1, 0, 0.55, 0) + textPanel.ZIndex = 6 + textPanel.Parent = itemPreview + + -- Children of TextPanel + local rolloverText = Instance.new "TextLabel" + rolloverText.Name = "RolloverText" + rolloverText.BackgroundTransparency = 1 + rolloverText.Size = UDim2.new(1, 0, 0, 48) + rolloverText.ZIndex = 6 + rolloverText.Font = Enum.Font.ArialBold + rolloverText.FontSize = Enum.FontSize.Size24 + rolloverText.Text = "" + rolloverText.TextColor3 = Color3.new(1, 1, 1) + rolloverText.TextWrap = true + rolloverText.TextXAlignment = Enum.TextXAlignment.Left + rolloverText.TextYAlignment = Enum.TextYAlignment.Top + rolloverText.Parent = textPanel + + local largePreview = Instance.new "ImageLabel" + largePreview.Name = "LargePreview" + largePreview.BackgroundTransparency = 1 + largePreview.Image = "" + largePreview.Size = UDim2.new(1, 0, 0, 170) + largePreview.ZIndex = 6 + largePreview.Parent = itemPreview + + local sets = Instance.new "Frame" + sets.Name = "Sets" + sets.BackgroundTransparency = 1 + sets.Position = UDim2.new(0, 0, 0, 5) + sets.Size = UDim2.new(0.23, 0, 1, -5) + sets.ZIndex = 6 + sets.Parent = setPanel + + -- Children of Sets + local line = Instance.new "Frame" + line.Name = "Line" + line.BackgroundColor3 = Color3.new(1, 1, 1) + line.BackgroundTransparency = 0.7 + line.BorderSizePixel = 0 + line.Position = UDim2.new(1, -3, 0.06, 0) + line.Size = UDim2.new(0, 3, 0.9, 0) + line.ZIndex = 6 + line.Parent = sets + + local setsLists, controlFrame = t.CreateTrueScrollingFrame() + setsLists.Size = UDim2.new(1, -6, 0.94, 0) + setsLists.Position = UDim2.new(0, 0, 0.06, 0) + setsLists.BackgroundTransparency = 1 + setsLists.Name = "SetsLists" + setsLists.ZIndex = 6 + setsLists.Parent = sets + drillDownSetZIndex(controlFrame, 7) + + local setsHeader = Instance.new "TextLabel" + setsHeader.Name = "SetsHeader" + setsHeader.BackgroundTransparency = 1 + setsHeader.Size = UDim2.new(0, 47, 0, 24) + setsHeader.ZIndex = 6 + setsHeader.Font = Enum.Font.ArialBold + setsHeader.FontSize = Enum.FontSize.Size24 + setsHeader.Text = "Sets" + setsHeader.TextColor3 = Color3.new(1, 1, 1) + setsHeader.TextXAlignment = Enum.TextXAlignment.Left + setsHeader.TextYAlignment = Enum.TextYAlignment.Top + setsHeader.Parent = sets + + local cancelButton = Instance.new "TextButton" + cancelButton.Name = "CancelButton" + cancelButton.Position = UDim2.new(1, -32, 0, -2) + cancelButton.Size = UDim2.new(0, 34, 0, 34) + cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault + cancelButton.ZIndex = 6 + cancelButton.Text = "" + cancelButton.Modal = true + cancelButton.Parent = setPanel + + -- Children of Cancel Button + local cancelImage = Instance.new "ImageLabel" + cancelImage.Name = "CancelImage" + cancelImage.BackgroundTransparency = 1 + cancelImage.Image = "http://banland.xyz/asset?id=54135717" + cancelImage.Position = UDim2.new(0, -2, 0, -2) + cancelImage.Size = UDim2.new(0, 16, 0, 16) + cancelImage.ZIndex = 6 + cancelImage.Parent = cancelButton + + return setGui + end + + local function createSetButton(text) + local setButton = Instance.new "TextButton" + + if text then + setButton.Text = text + else + setButton.Text = "" end - local function drillDownSetZIndex(parent, index) - local children = parent:GetChildren() - for i = 1, #children do - if children[i]:IsA "GuiObject" then - children[i].ZIndex = index - end - drillDownSetZIndex(children[i], index) - end - end + setButton.AutoButtonColor = false + setButton.BackgroundTransparency = 1 + setButton.BackgroundColor3 = Color3.new(1, 1, 1) + setButton.BorderSizePixel = 0 + setButton.Size = UDim2.new(1, -5, 0, 18) + setButton.ZIndex = 6 + setButton.Visible = false + setButton.Font = Enum.Font.Arial + setButton.FontSize = Enum.FontSize.Size18 + setButton.TextColor3 = Color3.new(1, 1, 1) + setButton.TextXAlignment = Enum.TextXAlignment.Left - -- for terrain stamping - local currTerrainDropDownFrame = nil - local terrainShapes = - { "Block", "Vertical Ramp", "Corner Wedge", "Inverse Corner Wedge", "Horizontal Ramp", "Auto-Wedge" } - local terrainShapeMap = {} - for i = 1, #terrainShapes do - terrainShapeMap[terrainShapes[i]] = i - 1 - end - terrainShapeMap[terrainShapes[#terrainShapes]] = 6 + return setButton + end - local function createWaterGui() - local waterForceDirections = { "NegX", "X", "NegY", "Y", "NegZ", "Z" } - local waterForces = { "None", "Small", "Medium", "Strong", "Max" } + local function buildSetButton(name, setId, _, _, _) + local button = createSetButton(name) + button.Text = name + button.Name = "SetButton" + button.Visible = true - local waterFrame = Instance.new "Frame" - waterFrame.Name = "WaterFrame" - waterFrame.Style = Enum.FrameStyle.RobloxSquare - waterFrame.Size = UDim2.new(0, 150, 0, 110) - waterFrame.Visible = false + local setValue = Instance.new "IntValue" + setValue.Name = "SetId" + setValue.Value = setId + setValue.Parent = button - local waterForceLabel = Instance.new "TextLabel" - waterForceLabel.Name = "WaterForceLabel" - waterForceLabel.BackgroundTransparency = 1 - waterForceLabel.Size = UDim2.new(1, 0, 0, 12) - waterForceLabel.Font = Enum.Font.ArialBold - waterForceLabel.FontSize = Enum.FontSize.Size12 - waterForceLabel.TextColor3 = Color3.new(1, 1, 1) - waterForceLabel.TextXAlignment = Enum.TextXAlignment.Left - waterForceLabel.Text = "Water Force" - waterForceLabel.Parent = waterFrame + local setName = Instance.new "StringValue" + setName.Name = "SetName" + setName.Value = name + setName.Parent = button - local waterForceDirLabel = waterForceLabel:Clone() - waterForceDirLabel.Name = "WaterForceDirectionLabel" - waterForceDirLabel.Text = "Water Force Direction" - waterForceDirLabel.Position = UDim2.new(0, 0, 0, 50) - waterForceDirLabel.Parent = waterFrame + return button + end - local waterTypeChangedEvent = Instance.new "BindableEvent" - waterTypeChangedEvent.Name = "WaterTypeChangedEvent" - waterTypeChangedEvent.Parent = waterFrame - - local waterForceDirectionSelectedFunc = function(newForceDirection) - waterForceDirection = newForceDirection - waterTypeChangedEvent:Fire { waterForce, waterForceDirection } - end - local waterForceSelectedFunc = function(newForce) - waterForce = newForce - waterTypeChangedEvent:Fire { waterForce, waterForceDirection } - end - - local waterForceDirectionDropDown, forceWaterDirectionSelection = - t.CreateDropDownMenu(waterForceDirections, waterForceDirectionSelectedFunc) - waterForceDirectionDropDown.Size = UDim2.new(1, 0, 0, 25) - waterForceDirectionDropDown.Position = UDim2.new(0, 0, 1, 3) - forceWaterDirectionSelection "NegX" - waterForceDirectionDropDown.Parent = waterForceDirLabel - - local waterForceDropDown, forceWaterForceSelection = - t.CreateDropDownMenu(waterForces, waterForceSelectedFunc) - forceWaterForceSelection "None" - waterForceDropDown.Size = UDim2.new(1, 0, 0, 25) - waterForceDropDown.Position = UDim2.new(0, 0, 1, 3) - waterForceDropDown.Parent = waterForceLabel - - return waterFrame, waterTypeChangedEvent - end - - -- Helper Function that contructs gui elements - local function createSetGui() - local setGui = Instance.new "ScreenGui" - setGui.Name = "SetGui" - - local setPanel = Instance.new "Frame" - setPanel.Name = "SetPanel" - setPanel.Active = true - setPanel.BackgroundTransparency = 1 - if position then - setPanel.Position = position + local function processCategory(sets) + local setButtons = {} + local numSkipped = 0 + for i = 1, #sets do + if not showAdminCategories and sets[i].Name == "Beta" then + numSkipped = numSkipped + 1 else - setPanel.Position = UDim2.new(0.2, 29, 0.1, 24) - end - if size then - setPanel.Size = size - else - setPanel.Size = UDim2.new(0.6, -58, 0.64, 0) - end - setPanel.Style = Enum.FrameStyle.RobloxRound - setPanel.ZIndex = 6 - setPanel.Parent = setGui - - -- Children of SetPanel - local itemPreview = Instance.new "Frame" - itemPreview.Name = "ItemPreview" - itemPreview.BackgroundTransparency = 1 - itemPreview.Position = UDim2.new(0.8, 5, 0.085, 0) - itemPreview.Size = UDim2.new(0.21, 0, 0.9, 0) - itemPreview.ZIndex = 6 - itemPreview.Parent = setPanel - - -- Children of ItemPreview - local textPanel = Instance.new "Frame" - textPanel.Name = "TextPanel" - textPanel.BackgroundTransparency = 1 - textPanel.Position = UDim2.new(0, 0, 0.45, 0) - textPanel.Size = UDim2.new(1, 0, 0.55, 0) - textPanel.ZIndex = 6 - textPanel.Parent = itemPreview - - -- Children of TextPanel - local rolloverText = Instance.new "TextLabel" - rolloverText.Name = "RolloverText" - rolloverText.BackgroundTransparency = 1 - rolloverText.Size = UDim2.new(1, 0, 0, 48) - rolloverText.ZIndex = 6 - rolloverText.Font = Enum.Font.ArialBold - rolloverText.FontSize = Enum.FontSize.Size24 - rolloverText.Text = "" - rolloverText.TextColor3 = Color3.new(1, 1, 1) - rolloverText.TextWrap = true - rolloverText.TextXAlignment = Enum.TextXAlignment.Left - rolloverText.TextYAlignment = Enum.TextYAlignment.Top - rolloverText.Parent = textPanel - - local largePreview = Instance.new "ImageLabel" - largePreview.Name = "LargePreview" - largePreview.BackgroundTransparency = 1 - largePreview.Image = "" - largePreview.Size = UDim2.new(1, 0, 0, 170) - largePreview.ZIndex = 6 - largePreview.Parent = itemPreview - - local sets = Instance.new "Frame" - sets.Name = "Sets" - sets.BackgroundTransparency = 1 - sets.Position = UDim2.new(0, 0, 0, 5) - sets.Size = UDim2.new(0.23, 0, 1, -5) - sets.ZIndex = 6 - sets.Parent = setPanel - - -- Children of Sets - local line = Instance.new "Frame" - line.Name = "Line" - line.BackgroundColor3 = Color3.new(1, 1, 1) - line.BackgroundTransparency = 0.7 - line.BorderSizePixel = 0 - line.Position = UDim2.new(1, -3, 0.06, 0) - line.Size = UDim2.new(0, 3, 0.9, 0) - line.ZIndex = 6 - line.Parent = sets - - local setsLists, controlFrame = t.CreateTrueScrollingFrame() - setsLists.Size = UDim2.new(1, -6, 0.94, 0) - setsLists.Position = UDim2.new(0, 0, 0.06, 0) - setsLists.BackgroundTransparency = 1 - setsLists.Name = "SetsLists" - setsLists.ZIndex = 6 - setsLists.Parent = sets - drillDownSetZIndex(controlFrame, 7) - - local setsHeader = Instance.new "TextLabel" - setsHeader.Name = "SetsHeader" - setsHeader.BackgroundTransparency = 1 - setsHeader.Size = UDim2.new(0, 47, 0, 24) - setsHeader.ZIndex = 6 - setsHeader.Font = Enum.Font.ArialBold - setsHeader.FontSize = Enum.FontSize.Size24 - setsHeader.Text = "Sets" - setsHeader.TextColor3 = Color3.new(1, 1, 1) - setsHeader.TextXAlignment = Enum.TextXAlignment.Left - setsHeader.TextYAlignment = Enum.TextYAlignment.Top - setsHeader.Parent = sets - - local cancelButton = Instance.new "TextButton" - cancelButton.Name = "CancelButton" - cancelButton.Position = UDim2.new(1, -32, 0, -2) - cancelButton.Size = UDim2.new(0, 34, 0, 34) - cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault - cancelButton.ZIndex = 6 - cancelButton.Text = "" - cancelButton.Modal = true - cancelButton.Parent = setPanel - - -- Children of Cancel Button - local cancelImage = Instance.new "ImageLabel" - cancelImage.Name = "CancelImage" - cancelImage.BackgroundTransparency = 1 - cancelImage.Image = "http://www.roblox.com/asset?id=54135717" - cancelImage.Position = UDim2.new(0, -2, 0, -2) - cancelImage.Size = UDim2.new(0, 16, 0, 16) - cancelImage.ZIndex = 6 - cancelImage.Parent = cancelButton - - return setGui - end - - local function createSetButton(text) - local setButton = Instance.new "TextButton" - - if text then - setButton.Text = text - else - setButton.Text = "" - end - - setButton.AutoButtonColor = false - setButton.BackgroundTransparency = 1 - setButton.BackgroundColor3 = Color3.new(1, 1, 1) - setButton.BorderSizePixel = 0 - setButton.Size = UDim2.new(1, -5, 0, 18) - setButton.ZIndex = 6 - setButton.Visible = false - setButton.Font = Enum.Font.Arial - setButton.FontSize = Enum.FontSize.Size18 - setButton.TextColor3 = Color3.new(1, 1, 1) - setButton.TextXAlignment = Enum.TextXAlignment.Left - - return setButton - end - - local function buildSetButton(name, setId, _, _, _) - local button = createSetButton(name) - button.Text = name - button.Name = "SetButton" - button.Visible = true - - local setValue = Instance.new "IntValue" - setValue.Name = "SetId" - setValue.Value = setId - setValue.Parent = button - - local setName = Instance.new "StringValue" - setName.Name = "SetName" - setName.Value = name - setName.Parent = button - - return button - end - - local function processCategory(sets) - local setButtons = {} - local numSkipped = 0 - for i = 1, #sets do - if not showAdminCategories and sets[i].Name == "Beta" then - numSkipped = numSkipped + 1 - else - setButtons[i - numSkipped] = - buildSetButton(sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets) - end - end - return setButtons - end - - local function handleResize() - wait() -- neccessary to insure heartbeat happened - - local itemPreview = setGui.SetPanel.ItemPreview - - itemPreview.LargePreview.Size = UDim2.new(1, 0, 0, itemPreview.AbsoluteSize.X) - itemPreview.LargePreview.Position = UDim2.new(0.5, -itemPreview.LargePreview.AbsoluteSize.X / 2, 0, 0) - itemPreview.TextPanel.Position = UDim2.new(0, 0, 0, itemPreview.LargePreview.AbsoluteSize.Y) - itemPreview.TextPanel.Size = - UDim2.new(1, 0, 0, itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y) - end - - local function makeInsertAssetButton() - local insertAssetButtonExample = Instance.new "Frame" - insertAssetButtonExample.Name = "InsertAssetButtonExample" - insertAssetButtonExample.Position = UDim2.new(0, 128, 0, 64) - insertAssetButtonExample.Size = UDim2.new(0, 64, 0, 64) - insertAssetButtonExample.BackgroundTransparency = 1 - insertAssetButtonExample.ZIndex = 6 - insertAssetButtonExample.Visible = false - - local assetId = Instance.new "IntValue" - assetId.Name = "AssetId" - assetId.Value = 0 - assetId.Parent = insertAssetButtonExample - - local assetName = Instance.new "StringValue" - assetName.Name = "AssetName" - assetName.Value = "" - assetName.Parent = insertAssetButtonExample - - local button = Instance.new "TextButton" - button.Name = "Button" - button.Text = "" - button.Style = Enum.ButtonStyle.RobloxButton - button.Position = UDim2.new(0.025, 0, 0.025, 0) - button.Size = UDim2.new(0.95, 0, 0.95, 0) - button.ZIndex = 6 - button.Parent = insertAssetButtonExample - - local buttonImage = Instance.new "ImageLabel" - buttonImage.Name = "ButtonImage" - buttonImage.Image = "" - buttonImage.Position = UDim2.new(0, -7, 0, -7) - buttonImage.Size = UDim2.new(1, 14, 1, 14) - buttonImage.BackgroundTransparency = 1 - buttonImage.ZIndex = 7 - buttonImage.Parent = button - - local configIcon = buttonImage:clone() - configIcon.Name = "ConfigIcon" - configIcon.Visible = false - configIcon.Position = UDim2.new(1, -23, 1, -24) - configIcon.Size = UDim2.new(0, 16, 0, 16) - configIcon.Image = "" - configIcon.ZIndex = 6 - configIcon.Parent = insertAssetButtonExample - - return insertAssetButtonExample - end - - local function showLargePreview(insertButton) - if insertButton:FindFirstChild "AssetId" then - delay(0, function() - game:GetService("ContentProvider"):Preload( - LargeThumbnailUrl .. tostring(insertButton.AssetId.Value) - ) - setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl - .. tostring(insertButton.AssetId.Value) - end) - end - if insertButton:FindFirstChild "AssetName" then - setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value - end - end - - local function selectTerrainShape(shape) - if currTerrainDropDownFrame then - objectSelected( - tostring(currTerrainDropDownFrame.AssetName.Value), - tonumber(currTerrainDropDownFrame.AssetId.Value), - shape + setButtons[i - numSkipped] = buildSetButton( + sets[i].Name, + sets[i].CategoryId, + sets[i].ImageAssetId, + i - numSkipped, + #sets ) end end + return setButtons + end - local function createTerrainTypeButton(name, parent) - local dropDownTextButton = Instance.new "TextButton" - dropDownTextButton.Name = name .. "Button" - dropDownTextButton.Font = Enum.Font.ArialBold - dropDownTextButton.FontSize = Enum.FontSize.Size14 - dropDownTextButton.BorderSizePixel = 0 - dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) - dropDownTextButton.Text = name - dropDownTextButton.TextXAlignment = Enum.TextXAlignment.Left + local function handleResize() + wait() -- neccessary to insure heartbeat happened + + local itemPreview = setGui.SetPanel.ItemPreview + + itemPreview.LargePreview.Size = + UDim2.new(1, 0, 0, itemPreview.AbsoluteSize.X) + itemPreview.LargePreview.Position = + UDim2.new(0.5, -itemPreview.LargePreview.AbsoluteSize.X / 2, 0, 0) + itemPreview.TextPanel.Position = + UDim2.new(0, 0, 0, itemPreview.LargePreview.AbsoluteSize.Y) + itemPreview.TextPanel.Size = UDim2.new( + 1, + 0, + 0, + itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y + ) + end + + local function makeInsertAssetButton() + local insertAssetButtonExample = Instance.new "Frame" + insertAssetButtonExample.Name = "InsertAssetButtonExample" + insertAssetButtonExample.Position = UDim2.new(0, 128, 0, 64) + insertAssetButtonExample.Size = UDim2.new(0, 64, 0, 64) + insertAssetButtonExample.BackgroundTransparency = 1 + insertAssetButtonExample.ZIndex = 6 + insertAssetButtonExample.Visible = false + + local assetId = Instance.new "IntValue" + assetId.Name = "AssetId" + assetId.Value = 0 + assetId.Parent = insertAssetButtonExample + + local assetName = Instance.new "StringValue" + assetName.Name = "AssetName" + assetName.Value = "" + assetName.Parent = insertAssetButtonExample + + local button = Instance.new "TextButton" + button.Name = "Button" + button.Text = "" + button.Style = Enum.ButtonStyle.RobloxButton + button.Position = UDim2.new(0.025, 0, 0.025, 0) + button.Size = UDim2.new(0.95, 0, 0.95, 0) + button.ZIndex = 6 + button.Parent = insertAssetButtonExample + + local buttonImage = Instance.new "ImageLabel" + buttonImage.Name = "ButtonImage" + buttonImage.Image = "" + buttonImage.Position = UDim2.new(0, -7, 0, -7) + buttonImage.Size = UDim2.new(1, 14, 1, 14) + buttonImage.BackgroundTransparency = 1 + buttonImage.ZIndex = 7 + buttonImage.Parent = button + + local configIcon = buttonImage:clone() + configIcon.Name = "ConfigIcon" + configIcon.Visible = false + configIcon.Position = UDim2.new(1, -23, 1, -24) + configIcon.Size = UDim2.new(0, 16, 0, 16) + configIcon.Image = "" + configIcon.ZIndex = 6 + configIcon.Parent = insertAssetButtonExample + + return insertAssetButtonExample + end + + local function showLargePreview(insertButton) + if insertButton:FindFirstChild "AssetId" then + delay(0, function() + game:GetService("ContentProvider"):Preload( + LargeThumbnailUrl .. tostring(insertButton.AssetId.Value) + ) + setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl + .. tostring(insertButton.AssetId.Value) + end) + end + if insertButton:FindFirstChild "AssetName" then + setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = + insertButton.AssetName.Value + end + end + + local function selectTerrainShape(shape) + if currTerrainDropDownFrame then + objectSelected( + tostring(currTerrainDropDownFrame.AssetName.Value), + tonumber(currTerrainDropDownFrame.AssetId.Value), + shape + ) + end + end + + local function createTerrainTypeButton(name, parent) + local dropDownTextButton = Instance.new "TextButton" + dropDownTextButton.Name = name .. "Button" + dropDownTextButton.Font = Enum.Font.ArialBold + dropDownTextButton.FontSize = Enum.FontSize.Size14 + dropDownTextButton.BorderSizePixel = 0 + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + dropDownTextButton.Text = name + dropDownTextButton.TextXAlignment = Enum.TextXAlignment.Left + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.ZIndex = parent.ZIndex + 1 + dropDownTextButton.Size = UDim2.new(0, parent.Size.X.Offset - 2, 0, 16) + dropDownTextButton.Position = UDim2.new(0, 1, 0, 0) + + dropDownTextButton.MouseEnter:connect(function() + dropDownTextButton.BackgroundTransparency = 0 + dropDownTextButton.TextColor3 = Color3.new(0, 0, 0) + end) + + dropDownTextButton.MouseLeave:connect(function() dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.ZIndex = parent.ZIndex + 1 - dropDownTextButton.Size = UDim2.new(0, parent.Size.X.Offset - 2, 0, 16) - dropDownTextButton.Position = UDim2.new(0, 1, 0, 0) + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + end) - dropDownTextButton.MouseEnter:connect(function() - dropDownTextButton.BackgroundTransparency = 0 - dropDownTextButton.TextColor3 = Color3.new(0, 0, 0) - end) + dropDownTextButton.MouseButton1Click:connect(function() + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) + if + dropDownTextButton.Parent + and dropDownTextButton.Parent:IsA "GuiObject" + then + dropDownTextButton.Parent.Visible = false + end + selectTerrainShape(terrainShapeMap[dropDownTextButton.Text]) + end) - dropDownTextButton.MouseLeave:connect(function() - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) - end) + return dropDownTextButton + end - dropDownTextButton.MouseButton1Click:connect(function() - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new(1, 1, 1) - if dropDownTextButton.Parent and dropDownTextButton.Parent:IsA "GuiObject" then - dropDownTextButton.Parent.Visible = false - end - selectTerrainShape(terrainShapeMap[dropDownTextButton.Text]) - end) + local function createTerrainDropDownMenu(zIndex) + local dropDown = Instance.new "Frame" + dropDown.Name = "TerrainDropDown" + dropDown.BackgroundColor3 = Color3.new(0, 0, 0) + dropDown.BorderColor3 = Color3.new(1, 0, 0) + dropDown.Size = UDim2.new(0, 200, 0, 0) + dropDown.Visible = false + dropDown.ZIndex = zIndex + dropDown.Parent = setGui - return dropDownTextButton + for i = 1, #terrainShapes do + local shapeButton = + createTerrainTypeButton(terrainShapes[i], dropDown) + shapeButton.Position = + UDim2.new(0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset) + shapeButton.Parent = dropDown + dropDown.Size = UDim2.new( + 0, + 200, + 0, + dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset + ) end - local function createTerrainDropDownMenu(zIndex) - local dropDown = Instance.new "Frame" - dropDown.Name = "TerrainDropDown" - dropDown.BackgroundColor3 = Color3.new(0, 0, 0) - dropDown.BorderColor3 = Color3.new(1, 0, 0) - dropDown.Size = UDim2.new(0, 200, 0, 0) + dropDown.MouseLeave:connect(function() dropDown.Visible = false - dropDown.ZIndex = zIndex - dropDown.Parent = setGui + end) + end - for i = 1, #terrainShapes do - local shapeButton = createTerrainTypeButton(terrainShapes[i], dropDown) - shapeButton.Position = UDim2.new(0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset) - shapeButton.Parent = dropDown - dropDown.Size = UDim2.new(0, 200, 0, dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset) - end + local function createDropDownMenuButton(parent) + local dropDownButton = Instance.new "ImageButton" + dropDownButton.Name = "DropDownButton" + dropDownButton.Image = "http://banland.xyz/asset/?id=67581509" + dropDownButton.BackgroundTransparency = 1 + dropDownButton.Size = UDim2.new(0, 16, 0, 16) + dropDownButton.Position = UDim2.new(1, -24, 0, 6) + dropDownButton.ZIndex = parent.ZIndex + 2 + dropDownButton.Parent = parent - dropDown.MouseLeave:connect(function() - dropDown.Visible = false - end) + if not setGui:FindFirstChild "TerrainDropDown" then + createTerrainDropDownMenu(8) end - local function createDropDownMenuButton(parent) - local dropDownButton = Instance.new "ImageButton" - dropDownButton.Name = "DropDownButton" - dropDownButton.Image = "http://www.roblox.com/asset/?id=67581509" - dropDownButton.BackgroundTransparency = 1 - dropDownButton.Size = UDim2.new(0, 16, 0, 16) - dropDownButton.Position = UDim2.new(1, -24, 0, 6) - dropDownButton.ZIndex = parent.ZIndex + 2 - dropDownButton.Parent = parent + dropDownButton.MouseButton1Click:connect(function() + setGui.TerrainDropDown.Visible = true + setGui.TerrainDropDown.Position = UDim2.new( + 0, + parent.AbsolutePosition.X, + 0, + parent.AbsolutePosition.Y + ) + currTerrainDropDownFrame = parent + end) + end - if not setGui:FindFirstChild "TerrainDropDown" then - createTerrainDropDownMenu(8) - end + local function buildInsertButton() + local insertButton = makeInsertAssetButton() + insertButton.Name = "InsertAssetButton" + insertButton.Visible = true - dropDownButton.MouseButton1Click:connect(function() - setGui.TerrainDropDown.Visible = true - setGui.TerrainDropDown.Position = UDim2.new(0, parent.AbsolutePosition.X, 0, parent.AbsolutePosition.Y) - currTerrainDropDownFrame = parent - end) + if + Data.Category[Data.CurrentCategory].SetName == "High Scalability" + then + createDropDownMenuButton(insertButton) end - local function buildInsertButton() - local insertButton = makeInsertAssetButton() - insertButton.Name = "InsertAssetButton" - insertButton.Visible = true + local lastEnter + local mouseEnterCon = insertButton.MouseEnter:connect(function() + lastEnter = insertButton + delay(0.1, function() + if lastEnter == insertButton then + showLargePreview(insertButton) + end + end) + end) + return insertButton, mouseEnterCon + end - if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then - createDropDownMenuButton(insertButton) + local function realignButtonGrid(columns) + local x = 0 + local y = 0 + for i = 1, #insertButtons do + insertButtons[i].Position = + UDim2.new(0, buttonWidth * x, 0, buttonHeight * y) + x = x + 1 + if x >= columns then + x = 0 + y = y + 1 end + end + end - local lastEnter = nil - local mouseEnterCon = insertButton.MouseEnter:connect(function() - lastEnter = insertButton - delay(0.1, function() - if lastEnter == insertButton then - showLargePreview(insertButton) + local function setInsertButtonImageBehavior( + insertFrame, + visible, + name, + assetId + ) + if visible then + insertFrame.AssetName.Value = name + insertFrame.AssetId.Value = assetId + local newImageUrl = SmallThumbnailUrl .. assetId + if newImageUrl ~= insertFrame.Button.ButtonImage.Image then + delay(0, function() + game:GetService("ContentProvider") + :Preload(SmallThumbnailUrl .. assetId) + insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl + .. assetId + end) + end + table.insert( + insertButtonCons, + insertFrame.Button.MouseButton1Click:connect(function() + -- special case for water, show water selection gui + local isWaterSelected = (name == "Water") + and ( + Data.Category[Data.CurrentCategory].SetName + == "High Scalability" + ) + waterGui.Visible = isWaterSelected + if isWaterSelected then + objectSelected(name, tonumber(assetId), nil) + else + objectSelected(name, tonumber(assetId)) end end) - end) - return insertButton, mouseEnterCon + ) + insertFrame.Visible = true + else + insertFrame.Visible = false + end + end + + local function loadSectionOfItems(setGui, rows, columns) + local pageSize = rows * columns + + if arrayPosition > #contents then + return end - local function realignButtonGrid(columns) - local x = 0 - local y = 0 - for i = 1, #insertButtons do - insertButtons[i].Position = UDim2.new(0, buttonWidth * x, 0, buttonHeight * y) - x = x + 1 - if x >= columns then - x = 0 - y = y + 1 - end + local origArrayPos = arrayPosition + + for _ = 1, pageSize + 1 do + if arrayPosition >= #contents + 1 then + break end + + local buttonCon + insertButtons[arrayPosition], buttonCon = buildInsertButton() + table.insert(insertButtonCons, buttonCon) + insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame + arrayPosition = arrayPosition + 1 end + realignButtonGrid(columns) - local function setInsertButtonImageBehavior(insertFrame, visible, name, assetId) - if visible then - insertFrame.AssetName.Value = name - insertFrame.AssetId.Value = assetId - local newImageUrl = SmallThumbnailUrl .. assetId - if newImageUrl ~= insertFrame.Button.ButtonImage.Image then - delay(0, function() - game:GetService("ContentProvider"):Preload(SmallThumbnailUrl .. assetId) - insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId - end) - end - table.insert( - insertButtonCons, - insertFrame.Button.MouseButton1Click:connect(function() - -- special case for water, show water selection gui - local isWaterSelected = (name == "Water") - and (Data.Category[Data.CurrentCategory].SetName == "High Scalability") - waterGui.Visible = isWaterSelected - if isWaterSelected then - objectSelected(name, tonumber(assetId), nil) - else - objectSelected(name, tonumber(assetId)) + -- local indexCopy = origArrayPos + for index = origArrayPos, arrayPosition do + if insertButtons[index] then + if contents[index] then + -- we don't want water to have a drop down button + if contents[index].Name == "Water" then + if + Data.Category[Data.CurrentCategory].SetName + == "High Scalability" + then + insertButtons[index] + :FindFirstChild("DropDownButton", true) + :Destroy() end - end) - ) - insertFrame.Visible = true - else - insertFrame.Visible = false - end - end + end - local function loadSectionOfItems(setGui, rows, columns) - local pageSize = rows * columns - - if arrayPosition > #contents then - return - end - - local origArrayPos = arrayPosition - - for _ = 1, pageSize + 1 do - if arrayPosition >= #contents + 1 then - break - end - - local buttonCon - insertButtons[arrayPosition], buttonCon = buildInsertButton() - table.insert(insertButtonCons, buttonCon) - insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame - arrayPosition = arrayPosition + 1 - end - realignButtonGrid(columns) - - -- local indexCopy = origArrayPos - for index = origArrayPos, arrayPosition do - if insertButtons[index] then - if contents[index] then - -- we don't want water to have a drop down button - if contents[index].Name == "Water" then - if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then - insertButtons[index]:FindFirstChild("DropDownButton", true):Destroy() - end - end - - local assetId - if useAssetVersionId then - assetId = contents[index].AssetVersionId - else - assetId = contents[index].AssetId - end - setInsertButtonImageBehavior(insertButtons[index], true, contents[index].Name, assetId) + local assetId + if useAssetVersionId then + assetId = contents[index].AssetVersionId else - break + assetId = contents[index].AssetId end + setInsertButtonImageBehavior( + insertButtons[index], + true, + contents[index].Name, + assetId + ) else break end - -- indexCopy = index + else + break end + -- indexCopy = index end + end - local function setSetIndex() - Data.Category[Data.CurrentCategory].Index = 0 + local function setSetIndex() + Data.Category[Data.CurrentCategory].Index = 0 - local rows = 7 - local columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) + local rows = 7 + local columns = + math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) - contents = Data.Category[Data.CurrentCategory].Contents - if contents then - -- remove our buttons and their connections - for i = 1, #insertButtons do - insertButtons[i]:remove() - end - for i = 1, #insertButtonCons do - if insertButtonCons[i] then - insertButtonCons[i]:disconnect() - end - end - insertButtonCons = {} - insertButtons = {} - - arrayPosition = 1 - loadSectionOfItems(setGui, rows, columns) + contents = Data.Category[Data.CurrentCategory].Contents + if contents then + -- remove our buttons and their connections + for i = 1, #insertButtons do + insertButtons[i]:remove() end - end - - local function selectSet(button, setName, setId, _) - if button and Data.Category[Data.CurrentCategory] ~= nil then - if button ~= Data.Category[Data.CurrentCategory].Button then - Data.Category[Data.CurrentCategory].Button = button - - if SetCache[setId] == nil then - SetCache[setId] = game:GetService("InsertService"):GetCollection(setId) - end - Data.Category[Data.CurrentCategory].Contents = SetCache[setId] - - Data.Category[Data.CurrentCategory].SetName = setName - Data.Category[Data.CurrentCategory].SetId = setId + for i = 1, #insertButtonCons do + if insertButtonCons[i] then + insertButtonCons[i]:disconnect() end - setSetIndex() end + insertButtonCons = {} + insertButtons = {} + + arrayPosition = 1 + loadSectionOfItems(setGui, rows, columns) end + end - local function selectCategoryPage(buttons, _) - if buttons ~= Data.CurrentCategory then - if Data.CurrentCategory then - for _, button in pairs(Data.CurrentCategory) do - button.Visible = false - end + local function selectSet(button, setName, setId, _) + if button and Data.Category[Data.CurrentCategory] ~= nil then + if button ~= Data.Category[Data.CurrentCategory].Button then + Data.Category[Data.CurrentCategory].Button = button + + if SetCache[setId] == nil then + SetCache[setId] = game:GetService("InsertService") + :GetCollection(setId) end + Data.Category[Data.CurrentCategory].Contents = SetCache[setId] - Data.CurrentCategory = buttons - if Data.Category[Data.CurrentCategory] == nil then - Data.Category[Data.CurrentCategory] = {} - if #buttons > 0 then - selectSet(buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0) - end - else - Data.Category[Data.CurrentCategory].Button = nil + Data.Category[Data.CurrentCategory].SetName = setName + Data.Category[Data.CurrentCategory].SetId = setId + end + setSetIndex() + end + end + + local function selectCategoryPage(buttons, _) + if buttons ~= Data.CurrentCategory then + if Data.CurrentCategory then + for _, button in pairs(Data.CurrentCategory) do + button.Visible = false + end + end + + Data.CurrentCategory = buttons + if Data.Category[Data.CurrentCategory] == nil then + Data.Category[Data.CurrentCategory] = {} + if #buttons > 0 then selectSet( - Data.Category[Data.CurrentCategory].ButtonFrame, - Data.Category[Data.CurrentCategory].SetName, - Data.Category[Data.CurrentCategory].SetId, - Data.Category[Data.CurrentCategory].Index + buttons[1], + buttons[1].SetName.Value, + buttons[1].SetId.Value, + 0 ) end + else + Data.Category[Data.CurrentCategory].Button = nil + selectSet( + Data.Category[Data.CurrentCategory].ButtonFrame, + Data.Category[Data.CurrentCategory].SetName, + Data.Category[Data.CurrentCategory].SetId, + Data.Category[Data.CurrentCategory].Index + ) end end + end - local function selectCategory(category) - selectCategoryPage(category, 0) - end + local function selectCategory(category) + selectCategoryPage(category, 0) + end - local function resetAllSetButtonSelection() - local setButtons = setGui.SetPanel.Sets.SetsLists:GetChildren() - for i = 1, #setButtons do - if setButtons[i]:IsA "TextButton" then - setButtons[i].Selected = false - setButtons[i].BackgroundTransparency = 1 - setButtons[i].TextColor3 = Color3.new(1, 1, 1) - setButtons[i].BackgroundColor3 = Color3.new(1, 1, 1) - end + local function resetAllSetButtonSelection() + local setButtons = setGui.SetPanel.Sets.SetsLists:GetChildren() + for i = 1, #setButtons do + if setButtons[i]:IsA "TextButton" then + setButtons[i].Selected = false + setButtons[i].BackgroundTransparency = 1 + setButtons[i].TextColor3 = Color3.new(1, 1, 1) + setButtons[i].BackgroundColor3 = Color3.new(1, 1, 1) end end + end - local function populateSetsFrame() - local currRow = 0 - for i = 1, #userCategoryButtons do - local button = userCategoryButtons[i] - button.Visible = true - button.Position = UDim2.new(0, 5, 0, currRow * button.Size.Y.Offset) - button.Parent = setGui.SetPanel.Sets.SetsLists + local function populateSetsFrame() + local currRow = 0 + for i = 1, #userCategoryButtons do + local button = userCategoryButtons[i] + button.Visible = true + button.Position = UDim2.new(0, 5, 0, currRow * button.Size.Y.Offset) + button.Parent = setGui.SetPanel.Sets.SetsLists - if i == 1 then -- we will have this selected by default, so show it - button.Selected = true - button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) - button.TextColor3 = Color3.new(0, 0, 0) + if i == 1 then -- we will have this selected by default, so show it + button.Selected = true + button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundTransparency = 0 + end + + button.MouseEnter:connect(function() + if not button.Selected then button.BackgroundTransparency = 0 - end - - button.MouseEnter:connect(function() - if not button.Selected then - button.BackgroundTransparency = 0 - button.TextColor3 = Color3.new(0, 0, 0) - end - end) - button.MouseLeave:connect(function() - if not button.Selected then - button.BackgroundTransparency = 1 - button.TextColor3 = Color3.new(1, 1, 1) - end - end) - button.MouseButton1Click:connect(function() - resetAllSetButtonSelection() - button.Selected = not button.Selected - button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) button.TextColor3 = Color3.new(0, 0, 0) - button.BackgroundTransparency = 0 - selectSet(button, button.Text, userCategoryButtons[i].SetId.Value, 0) - end) + end + end) + button.MouseLeave:connect(function() + if not button.Selected then + button.BackgroundTransparency = 1 + button.TextColor3 = Color3.new(1, 1, 1) + end + end) + button.MouseButton1Click:connect(function() + resetAllSetButtonSelection() + button.Selected = not button.Selected + button.BackgroundColor3 = Color3.new(0, 204 / 255, 0) + button.TextColor3 = Color3.new(0, 0, 0) + button.BackgroundTransparency = 0 + selectSet( + button, + button.Text, + userCategoryButtons[i].SetId.Value, + 0 + ) + end) - currRow = currRow + 1 - end + currRow = currRow + 1 + end - local buttons = setGui.SetPanel.Sets.SetsLists:GetChildren() + local buttons = setGui.SetPanel.Sets.SetsLists:GetChildren() - -- set first category as loaded for default - if buttons then - for i = 1, #buttons do - if buttons[i]:IsA "TextButton" then - selectSet(buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0) - selectCategory(userCategoryButtons) - break - end + -- set first category as loaded for default + if buttons then + for i = 1, #buttons do + if buttons[i]:IsA "TextButton" then + selectSet( + buttons[i], + buttons[i].Text, + userCategoryButtons[i].SetId.Value, + 0 + ) + selectCategory(userCategoryButtons) + break end end end + end - setGui = createSetGui() - waterGui, waterTypeChangedEvent = createWaterGui() - waterGui.Position = UDim2.new(0, 55, 0, 0) - waterGui.Parent = setGui - setGui.Changed:connect(function(prop) -- this resizes the preview image to always be the right size + setGui = createSetGui() + waterGui, waterTypeChangedEvent = createWaterGui() + waterGui.Position = UDim2.new(0, 55, 0, 0) + waterGui.Parent = setGui + setGui.Changed:connect( + function(prop) -- this resizes the preview image to always be the right size if prop == "AbsoluteSize" then handleResize() setSetIndex() end - end) + end + ) - local scrollFrame, controlFrame = t.CreateTrueScrollingFrame() - scrollFrame.Size = UDim2.new(0.54, 0, 0.85, 0) - scrollFrame.Position = UDim2.new(0.24, 0, 0.085, 0) - scrollFrame.Name = "ItemsFrame" - scrollFrame.ZIndex = 6 - scrollFrame.Parent = setGui.SetPanel - scrollFrame.BackgroundTransparency = 1 + local scrollFrame, controlFrame = t.CreateTrueScrollingFrame() + scrollFrame.Size = UDim2.new(0.54, 0, 0.85, 0) + scrollFrame.Position = UDim2.new(0.24, 0, 0.085, 0) + scrollFrame.Name = "ItemsFrame" + scrollFrame.ZIndex = 6 + scrollFrame.Parent = setGui.SetPanel + scrollFrame.BackgroundTransparency = 1 - drillDownSetZIndex(controlFrame, 7) + drillDownSetZIndex(controlFrame, 7) - controlFrame.Parent = setGui.SetPanel - controlFrame.Position = UDim2.new(0.76, 5, 0, 0) + controlFrame.Parent = setGui.SetPanel + controlFrame.Position = UDim2.new(0.76, 5, 0, 0) - local debounce = false - controlFrame.ScrollBottom.Changed:connect(function(_) - if controlFrame.ScrollBottom.Value == true then - if debounce then - return - end - debounce = true - loadSectionOfItems(setGui, rows, columns) - debounce = false + local debounce = false + controlFrame.ScrollBottom.Changed:connect(function(_) + if controlFrame.ScrollBottom.Value == true then + if debounce then + return end - end) + debounce = true + loadSectionOfItems(setGui, rows, columns) + debounce = false + end + end) - local userData = {} - for id = 1, #userIdsForSets do - local newUserData = game:GetService("InsertService"):GetUserSets(userIdsForSets[id]) - if newUserData and #newUserData > 2 then - -- start at #3 to skip over My Decals and My Models for each account - for category = 3, #newUserData do - if newUserData[category].Name == "High Scalability" then -- we want high scalability parts to show first - table.insert(userData, 1, newUserData[category]) - else - table.insert(userData, newUserData[category]) - end + local userData = {} + for id = 1, #userIdsForSets do + local newUserData = game:GetService("InsertService") + :GetUserSets(userIdsForSets[id]) + if newUserData and #newUserData > 2 then + -- start at #3 to skip over My Decals and My Models for each account + for category = 3, #newUserData do + if newUserData[category].Name == "High Scalability" then -- we want high scalability parts to show first + table.insert(userData, 1, newUserData[category]) + else + table.insert(userData, newUserData[category]) end end end - if userData then - userCategoryButtons = processCategory(userData) - end - - rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight) - columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) - - populateSetsFrame() - - --[[local insertPanelCloseCon = ]] - setGui.SetPanel.CancelButton.MouseButton1Click:connect(function() - setGui.SetPanel.Visible = false - if dialogClosed then - dialogClosed() - end - end) - - local setVisibilityFunction = function(visible) - if visible then - setGui.SetPanel.Visible = true - else - setGui.SetPanel.Visible = false - end - end - - local getVisibilityFunction = function() - if setGui then - if setGui:FindFirstChild "SetPanel" then - return setGui.SetPanel.Visible - end - end - - return false - end - - return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent end + if userData then + userCategoryButtons = processCategory(userData) + end + + rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight) + columns = + math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth) + + populateSetsFrame() + + --[[local insertPanelCloseCon = ]] + setGui.SetPanel.CancelButton.MouseButton1Click:connect(function() + setGui.SetPanel.Visible = false + if dialogClosed then + dialogClosed() + end + end) + + local setVisibilityFunction = function(visible) + if visible then + setGui.SetPanel.Visible = true + else + setGui.SetPanel.Visible = false + end + end + + local getVisibilityFunction = function() + if setGui then + if setGui:FindFirstChild "SetPanel" then + return setGui.SetPanel.Visible + end + end + + return false + end + + return setGui, + setVisibilityFunction, + getVisibilityFunction, + waterTypeChangedEvent +end t.CreateTerrainMaterialSelector = function(size, position) local terrainMaterialSelectionChanged = Instance.new "BindableEvent" terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" - local selectedButton = nil + local selectedButton local frame = Instance.new "Frame" frame.Name = "TerrainMaterialSelector" @@ -3435,45 +3770,64 @@ t.CreateTerrainMaterialSelector = function(size, position) for _, v in pairs(materialNames) do materialToImageMap[v] = {} if v == "Grass" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=56563112" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=56563112" elseif v == "Sand" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=62356652" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=62356652" elseif v == "Brick" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=65961537" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=65961537" elseif v == "Granite" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532153" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532153" elseif v == "Asphalt" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532038" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532038" elseif v == "Iron" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532093" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532093" elseif v == "Aluminum" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531995" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67531995" elseif v == "Gold" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532118" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532118" elseif v == "Plastic (red)" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531848" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67531848" elseif v == "Plastic (blue)" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531924" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67531924" elseif v == "Plank" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532015" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532015" elseif v == "Log" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532051" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532051" elseif v == "Gravel" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532206" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532206" elseif v == "Cinder Block" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532103" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532103" elseif v == "Stone Wall" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531804" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67531804" elseif v == "Concrete" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532059" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=67532059" elseif v == "Water" then - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=81407474" + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=81407474" else - materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=66887593" -- fill in the rest here!! + materialToImageMap[v].Regular = + "http://banland.xyz/asset/?id=66887593" -- fill in the rest here!! end end - local scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame(nil, "grid") + local scrollFrame, scrollUp, scrollDown, recalculateScroll = + t.CreateScrollingFrame(nil, "grid") scrollFrame.Size = UDim2.new(0.85, 0, 1, 0) scrollFrame.Position = UDim2.new(0, 0, 0, 0) scrollFrame.Parent = frame @@ -3556,11 +3910,17 @@ t.CreateTerrainMaterialSelector = function(size, position) local matName = getNameFromEnum(newMaterialType) local buttons = scrollFrame:GetChildren() for i = 1, #buttons do - if buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)" then + if + buttons[i].Name == "Plastic (blue)" + and matName == "Plastic (blue)" + then goToNewMaterial(buttons[i], matName) return end - if buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)" then + if + buttons[i].Name == "Plastic (red)" + and matName == "Plastic (red)" + then goToNewMaterial(buttons[i], matName) return end @@ -3582,7 +3942,8 @@ t.CreateTerrainMaterialSelector = function(size, position) end t.CreateLoadingFrame = function(name, size, position) - game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=35238053" + game:GetService("ContentProvider") + :Preload "http://banland.xyz/asset/?id=35238053" local loadingFrame = Instance.new "Frame" loadingFrame.Name = "LoadingFrame" @@ -3609,7 +3970,7 @@ t.CreateLoadingFrame = function(name, size, position) local loadingGreenBar = Instance.new "ImageLabel" loadingGreenBar.Name = "LoadingGreenBar" - loadingGreenBar.Image = "http://www.roblox.com/asset/?id=35238053" + loadingGreenBar.Image = "http://banland.xyz/asset/?id=35238053" loadingGreenBar.Position = UDim2.new(0, 0, 0, 0) loadingGreenBar.Size = UDim2.new(0, 0, 1, 0) loadingGreenBar.Visible = false @@ -3658,10 +4019,14 @@ t.CreateLoadingFrame = function(name, size, position) local updateLoadingGuiPercent = function(percent, tweenAction, tweenLength) if percent and type(percent) ~= "number" then - error("updateLoadingGuiPercent expects number as argument, got", type(percent), "instead") + error( + "updateLoadingGuiPercent expects number as argument, got", + type(percent), + "instead" + ) end - local newSize = nil + local newSize if percent < 0 then newSize = UDim2.new(0, 0, 1, 0) elseif percent > 1 then @@ -3677,7 +4042,13 @@ t.CreateLoadingFrame = function(name, size, position) if newSize.X.Scale > 0 then loadingGreenBar.Visible = true - loadingGreenBar:TweenSize(newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, true) + loadingGreenBar:TweenSize( + newSize, + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + tweenLength, + true + ) else loadingGreenBar:TweenSize( newSize, @@ -3700,7 +4071,9 @@ t.CreateLoadingFrame = function(name, size, position) loadingGreenBar.Changed:connect(function(prop) if prop == "Size" then - loadingPercent.Text = tostring(math.ceil(loadingGreenBar.Size.X.Scale * 100)) .. "%" + loadingPercent.Text = tostring( + math.ceil(loadingGreenBar.Size.X.Scale * 100) + ) .. "%" end end) @@ -3745,7 +4118,8 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) dragBar.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255) dragBar.BorderColor3 = Color3.new(0, 0, 0) if size then - dragBar.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + UDim2.new(0, 20, 0, 0) + dragBar.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + + UDim2.new(0, 20, 0, 0) else dragBar.Size = UDim2.new(0, 183, 0, 20) end @@ -3819,8 +4193,12 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) helpButton.BackgroundTransparency = 0 local screenGui = getScreenGuiAncestor(helpFrame) if screenGui then - if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X then --position on left hand side - helpFrame.Position = UDim2.new(0, -5 - helpFrame.AbsoluteSize.X, 0, 0) + if + helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X + > screenGui.AbsoluteSize.X + then --position on left hand side + helpFrame.Position = + UDim2.new(0, -5 - helpFrame.AbsoluteSize.X, 0, 0) else -- position on right hand side helpFrame.Position = UDim2.new(1, 5, 0, 0) end @@ -3849,7 +4227,8 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) minimizeFrame.BorderColor3 = Color3.new(0, 0, 0) minimizeFrame.Position = UDim2.new(0, 0, 1, 0) if size then - minimizeFrame.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + UDim2.new(0, 20, 0, 0) + minimizeFrame.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + + UDim2.new(0, 20, 0, 0) else minimizeFrame.Size = UDim2.new(0, 183, 0, 50) end @@ -3869,7 +4248,8 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) local separatingLine = Instance.new "Frame" separatingLine.Name = "SeparatingLine" - separatingLine.BackgroundColor3 = Color3.new(115 / 255, 115 / 255, 115 / 255) + separatingLine.BackgroundColor3 = + Color3.new(115 / 255, 115 / 255, 115 / 255) separatingLine.BorderSizePixel = 0 separatingLine.Position = UDim2.new(1, -18, 0.5, -7) separatingLine.Size = UDim2.new(0, 1, 0, 14) @@ -3886,7 +4266,8 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) widgetContainer.BorderColor3 = Color3.new(0, 0, 0) if not scrollable then widgetContainer.BackgroundTransparency = 0 - widgetContainer.BackgroundColor3 = Color3.new(72 / 255, 72 / 255, 72 / 255) + widgetContainer.BackgroundColor3 = + Color3.new(72 / 255, 72 / 255, 72 / 255) end widgetContainer.Parent = dragBar @@ -3894,7 +4275,12 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) if scrollable then widgetContainer.Size = size else - widgetContainer.Size = UDim2.new(0, dragBar.AbsoluteSize.X, size.Y.Scale, size.Y.Offset) + widgetContainer.Size = UDim2.new( + 0, + dragBar.AbsoluteSize.X, + size.Y.Scale, + size.Y.Offset + ) end else if scrollable then @@ -3926,7 +4312,8 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) else control.Size = UDim2.new(0, 21, 0, 400) end - control:FindFirstChild("ScrollDownButton").Position = UDim2.new(0, 0, 1, -20) + control:FindFirstChild("ScrollDownButton").Position = + UDim2.new(0, 0, 1, -20) local fakeLine = Instance.new "Frame" fakeLine.Name = "FakeLine" @@ -3940,7 +4327,8 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) verticalDragger.ZIndex = 2 verticalDragger.AutoButtonColor = false verticalDragger.Name = "VerticalDragger" - verticalDragger.BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255) + verticalDragger.BackgroundColor3 = + Color3.new(50 / 255, 50 / 255, 50 / 255) verticalDragger.BorderColor3 = Color3.new(0, 0, 0) verticalDragger.Size = UDim2.new(1, 20, 0, 20) verticalDragger.Position = UDim2.new(0, 0, 1, 0) @@ -3975,12 +4363,14 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) areaSoak.Parent = getScreenGuiAncestor(parent) local draggingVertical = false - local startYPos = nil + local startYPos verticalDragger.MouseEnter:connect(function() - verticalDragger.BackgroundColor3 = Color3.new(60 / 255, 60 / 255, 60 / 255) + verticalDragger.BackgroundColor3 = + Color3.new(60 / 255, 60 / 255, 60 / 255) end) verticalDragger.MouseLeave:connect(function() - verticalDragger.BackgroundColor3 = Color3.new(50 / 255, 50 / 255, 50 / 255) + verticalDragger.BackgroundColor3 = + Color3.new(50 / 255, 50 / 255, 50 / 255) end) verticalDragger.MouseButton1Down:connect(function(_, y) draggingVertical = true @@ -4021,7 +4411,8 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) widgetContainer.Size.Y.Scale, widgetContainer.Size.Y.Offset + yDelta ) - control.Size = UDim2.new(0, 21, 0, control.Size.Y.Offset + yDelta) + control.Size = + UDim2.new(0, 21, 0, control.Size.Y.Offset + yDelta) end end) end @@ -4060,42 +4451,66 @@ end t.Help = function(funcNameOrFunc) --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu then + if + funcNameOrFunc == "CreatePropertyDropDownMenu" + or funcNameOrFunc == t.CreatePropertyDropDownMenu + then return "Function CreatePropertyDropDownMenu. " .. "Arguments: (instance, propertyName, enumType). " .. "Side effect: returns a container with a drop-down-box that is linked to the 'property' field of 'instance' which is of type 'enumType'" end - if funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu then + if + funcNameOrFunc == "CreateDropDownMenu" + or funcNameOrFunc == t.CreateDropDownMenu + then return "Function CreateDropDownMenu. " .. "Arguments: (items, onItemSelected). " .. "Side effect: Returns 2 results, a container to the gui object and a 'updateSelection' function for external updating. The container is a drop-down-box created around a list of items" end - if funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog then + if + funcNameOrFunc == "CreateMessageDialog" + or funcNameOrFunc == t.CreateMessageDialog + then return "Function CreateMessageDialog. " .. "Arguments: (title, message, buttons). " .. "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button" end - if funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog then + if + funcNameOrFunc == "CreateStyledMessageDialog" + or funcNameOrFunc == t.CreateStyledMessageDialog + then return "Function CreateStyledMessageDialog. " .. "Arguments: (title, message, style, buttons). " .. "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button, 'style' is a string, either Error, Notify or Confirm" end - if funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight then + if + funcNameOrFunc == "GetFontHeight" + or funcNameOrFunc == t.GetFontHeight + then return "Function GetFontHeight. " .. "Arguments: (font, fontSize). " .. "Side effect: returns the size in pixels of the given font + fontSize" end - if funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame then + if + funcNameOrFunc == "CreateScrollingFrame" + or funcNameOrFunc == t.CreateScrollingFrame + then return "Function CreateScrollingFrame. " .. "Arguments: (orderList, style) " .. "Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). 'scrollFrame' can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a 'grid' styling if style is passed 'grid' as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)" end - if funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame then + if + funcNameOrFunc == "CreateTrueScrollingFrame" + or funcNameOrFunc == t.CreateTrueScrollingFrame + then return "Function CreateTrueScrollingFrame. " .. "Arguments: (nil) " .. "Side effect: returns 2 objects, (scrollFrame, controlFrame). 'scrollFrame' can be filled with GuiObjects, and they will be clipped if not inside the frame's bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit." end - if funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject then + if + funcNameOrFunc == "AutoTruncateTextObject" + or funcNameOrFunc == t.AutoTruncateTextObject + then return "Function AutoTruncateTextObject. " .. "Arguments: (textLabel) " .. "Side effect: returns 2 objects, (textLabel, changeText). The 'textLabel' input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. 'changeText' is a function that can be used to change the text, it takes 1 string as an argument" @@ -4105,12 +4520,18 @@ t.Help = function(funcNameOrFunc) .. "Arguments: (steps, width, position) " .. "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." end - if funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame then + if + funcNameOrFunc == "CreateLoadingFrame" + or funcNameOrFunc == t.CreateLoadingFrame + then return "Function CreateLoadingFrame. " .. "Arguments: (name, size, position) " .. "Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that when fired means that someone clicked the cancel button on the dialog." end - if funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector then + if + funcNameOrFunc == "CreateTerrainMaterialSelector" + or funcNameOrFunc == t.CreateTerrainMaterialSelector + then return "Function CreateTerrainMaterialSelector. " .. "Arguments: (size, position) " .. "Side effect: Size and position are UDim2 values that specifies the selector's size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected." diff --git a/lua/45374389.lua b/lua/45374389.lua index a197f9f..1d97400 100644 --- a/lua/45374389.lua +++ b/lua/45374389.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 45374389" local t = {} t.Foo = function() diff --git a/lua/46295863.lua b/lua/46295863.lua index a13a343..c9935a3 100644 --- a/lua/46295863.lua +++ b/lua/46295863.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 46295863" local function waitForChild(instance, name) while not instance:FindFirstChild(name) do instance.ChildAdded:wait() @@ -18,26 +19,26 @@ else gui = script.Parent end -local helpButton = nil -local updateCameraDropDownSelection = nil -local updateVideoCaptureDropDownSelection = nil +local helpButton +local updateCameraDropDownSelection +local updateVideoCaptureDropDownSelection local tweenTime = 0.2 -local mouseLockLookScreenUrl = "http://www.roblox.com/asset?id=54071825" -local classicLookScreenUrl = "http://www.roblox.com/Asset?id=45915798" +local mouseLockLookScreenUrl = "http://banland.xyz/asset?id=54071825" +local classicLookScreenUrl = "http://banland.xyz/Asset?id=45915798" local hasGraphicsSlider = (game:GetService("CoreGui").Version >= 5) local GraphicsQualityLevels = 10 -- how many levels we allow on graphics slider local recordingVideo = false -local currentMenuSelection = nil +local currentMenuSelection local lastMenuSelection = {} -- local defaultPosition = UDim2.new(0, 0, 0, 0) -- local newGuiPlaces = { 0, 41324860 } local centerDialogs = {} -local mainShield = nil +local mainShield local inStudioMode = UserSettings().GameSettings:InStudioMode() @@ -96,8 +97,12 @@ function goToMenu(container, menuName, moveDirection, size, position) for i = 1, #containerChildren do if containerChildren[i].Name == menuName then containerChildren[i].Visible = true - currentMenuSelection = - { container = container, name = menuName, direction = moveDirection, lastSize = size } + currentMenuSelection = { + container = container, + name = menuName, + direction = moveDirection, + lastSize = size, + } -- selectedMenu = true if size and position then containerChildren[i]:TweenSizeAndPosition( @@ -176,7 +181,13 @@ function resetLocalCharacter() end end -local function createTextButton(text, style, fontSize, buttonSize, buttonPosition) +local function createTextButton( + text, + style, + fontSize, + buttonSize, + buttonPosition +) local newTextButton = Instance.new "TextButton" newTextButton.Font = Enum.Font.Arial newTextButton.FontSize = fontSize @@ -244,9 +255,14 @@ local function CreateTextButtons(frame, buttons, yPos, ySize) buttonNum = 1 while buttonNum <= numButtons do - buttonObjs[buttonNum].Position = - UDim2.new(spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, yPos.Scale, yPos.Offset) - buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) + buttonObjs[buttonNum].Position = UDim2.new( + spacing * buttonNum + (buttonNum - 1) * buttonSize, + 0, + yPos.Scale, + yPos.Offset + ) + buttonObjs[buttonNum].Size = + UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) buttonNum = buttonNum + 1 end end @@ -291,16 +307,25 @@ function setDisabledState(guiObject) guiObject.Active = false else if guiObject["ClassName"] then - print("setDisabledState() got object of unsupported type. object type is ", guiObject.ClassName) + print( + "setDisabledState() got object of unsupported type. object type is ", + guiObject.ClassName + ) end end end local function createHelpDialog(baseZIndex) if helpButton == nil then - if gui:FindFirstChild "TopLeftControl" and gui.TopLeftControl:FindFirstChild "Help" then + if + gui:FindFirstChild "TopLeftControl" + and gui.TopLeftControl:FindFirstChild "Help" + then helpButton = gui.TopLeftControl.Help - elseif gui:FindFirstChild "BottomRightControl" and gui.BottomRightControl:FindFirstChild "Help" then + elseif + gui:FindFirstChild "BottomRightControl" + and gui.BottomRightControl:FindFirstChild "Help" + then helpButton = gui.BottomRightControl.Help end end @@ -358,7 +383,10 @@ local function createHelpDialog(baseZIndex) local image = Instance.new "ImageLabel" image.Name = "Image" - if UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then + if + UserSettings().GameSettings.ControlMode + == Enum.ControlMode["Mouse Lock Switch"] + then image.Image = mouseLockLookScreenUrl else image.Image = classicLookScreenUrl @@ -372,7 +400,10 @@ local function createHelpDialog(baseZIndex) buttons[1] = {} buttons[1].Text = "Look" buttons[1].Function = function() - if UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then + if + UserSettings().GameSettings.ControlMode + == Enum.ControlMode["Mouse Lock Switch"] + then image.Image = mouseLockLookScreenUrl else image.Image = classicLookScreenUrl @@ -381,17 +412,17 @@ local function createHelpDialog(baseZIndex) buttons[2] = {} buttons[2].Text = "Move" buttons[2].Function = function() - image.Image = "http://www.roblox.com/Asset?id=45915811" + image.Image = "http://banland.xyz/Asset?id=45915811" end buttons[3] = {} buttons[3].Text = "Gear" buttons[3].Function = function() - image.Image = "http://www.roblox.com/Asset?id=45917596" + image.Image = "http://banland.xyz/Asset?id=45917596" end buttons[4] = {} buttons[4].Text = "Zoom" buttons[4].Function = function() - image.Image = "http://www.roblox.com/Asset?id=45915825" + image.Image = "http://banland.xyz/Asset?id=45915825" end CreateTextButtons(buttonRow, buttons, UDim.new(0, 0), UDim.new(1, 0)) @@ -401,15 +432,27 @@ local function createHelpDialog(baseZIndex) waitForChild(gui, "UserSettingsShield") waitForChild(gui.UserSettingsShield, "Settings") waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle") - waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameSettingsMenu") - waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu, "CameraField") - waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField, "DropDownMenuButton") + waitForChild( + gui.UserSettingsShield.Settings.SettingsStyle, + "GameSettingsMenu" + ) + waitForChild( + gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu, + "CameraField" + ) + waitForChild( + gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField, + "DropDownMenuButton" + ) gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Changed:connect( function(prop) if prop ~= "Text" then return end - if buttonRow.Button1.Style == Enum.ButtonStyle.RobloxButtonDefault then -- only change if this is the currently selected panel + if + buttonRow.Button1.Style + == Enum.ButtonStyle.RobloxButtonDefault + then -- only change if this is the currently selected panel if gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Text == "Classic" @@ -476,7 +519,12 @@ local function createLeaveConfirmationMenu(baseZIndex, shield) noButton.Parent = frame noButton.ZIndex = baseZIndex + 4 noButton.MouseButton1Click:connect(function() - goToMenu(shield.Settings.SettingsStyle, "GameMainMenu", "down", UDim2.new(0, 525, 0, 430)) + goToMenu( + shield.Settings.SettingsStyle, + "GameMainMenu", + "down", + UDim2.new(0, 525, 0, 430) + ) shield.Settings:TweenSize( UDim2.new(0, 525, 0, 430), Enum.EasingDirection.InOut, @@ -536,7 +584,12 @@ local function createResetConfirmationMenu(baseZIndex, shield) noButton.Parent = frame noButton.ZIndex = baseZIndex + 4 noButton.MouseButton1Click:connect(function() - goToMenu(shield.Settings.SettingsStyle, "GameMainMenu", "down", UDim2.new(0, 525, 0, 430)) + goToMenu( + shield.Settings.SettingsStyle, + "GameMainMenu", + "down", + UDim2.new(0, 525, 0, 430) + ) shield.Settings:TweenSize( UDim2.new(0, 525, 0, 430), Enum.EasingDirection.InOut, @@ -739,7 +792,10 @@ local function createGameMainMenu(baseZIndex, shield) gameSettingsButton.ZIndex = baseZIndex + 4 gameSettingsButton.Parent = gameMainMenuFrame - if game:FindFirstChild "LoadingGuiService" and #game.LoadingGuiService:GetChildren() > 0 then + if + game:FindFirstChild "LoadingGuiService" + and #game.LoadingGuiService:GetChildren() > 0 + then local gameSettingsButton = createTextButton( "Game Instructions", Enum.ButtonStyle.RobloxButton, @@ -751,8 +807,11 @@ local function createGameMainMenu(baseZIndex, shield) gameSettingsButton.ZIndex = baseZIndex + 4 gameSettingsButton.Parent = gameMainMenuFrame gameSettingsButton.MouseButton1Click:connect(function() - if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then - local loadingGui = game.Players.LocalPlayer:FindFirstChild "PlayerLoadingGui" + if + game:FindFirstChild "Players" and game.Players["LocalPlayer"] + then + local loadingGui = + game.Players.LocalPlayer:FindFirstChild "PlayerLoadingGui" if loadingGui then loadingGui.Visible = true end @@ -838,7 +897,7 @@ local function createGameSettingsMenu(baseZIndex, _) studioShortcut.Position = UDim2.new(0, 154, 0, 175) studioShortcut.Parent = gameSettingsMenuFrame - local studioCheckbox = nil + local studioCheckbox if hasGraphicsSlider then local qualityText = Instance.new "TextLabel" @@ -909,17 +968,23 @@ local function createGameSettingsMenu(baseZIndex, _) autoGraphicsButton.Parent = gameSettingsMenuFrame autoGraphicsButton.Visible = not inStudioMode - local graphicsSlider, graphicsLevel = RbxGui.CreateSlider(GraphicsQualityLevels, 150, UDim2.new(0, 230, 0, 280)) -- graphics - 1 because slider starts at 1 instead of 0 + local graphicsSlider, graphicsLevel = RbxGui.CreateSlider( + GraphicsQualityLevels, + 150, + UDim2.new(0, 230, 0, 280) + ) -- graphics - 1 because slider starts at 1 instead of 0 graphicsSlider.Parent = gameSettingsMenuFrame graphicsSlider.Bar.ZIndex = baseZIndex + 4 graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5 graphicsSlider.Visible = not inStudioMode - graphicsLevel.Value = math.floor((settings().Rendering:GetMaxQualityLevel() - 1) / 2) + graphicsLevel.Value = + math.floor((settings().Rendering:GetMaxQualityLevel() - 1) / 2) local graphicsSetter = Instance.new "TextBox" graphicsSetter.Name = "GraphicsSetter" graphicsSetter.BackgroundColor3 = Color3.new(0, 0, 0) - graphicsSetter.BorderColor3 = Color3.new(128 / 255, 128 / 255, 128 / 255) + graphicsSetter.BorderColor3 = + Color3.new(128 / 255, 128 / 255, 128 / 255) graphicsSetter.Size = UDim2.new(0, 50, 0, 25) graphicsSetter.Position = UDim2.new(0, 450, 0, 269) graphicsSetter.TextColor3 = Color3.new(1, 1, 1) @@ -933,7 +998,10 @@ local function createGameSettingsMenu(baseZIndex, _) local isAutoGraphics = true if not inStudioMode then - isAutoGraphics = (UserSettings().GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic) + isAutoGraphics = ( + UserSettings().GameSettings.SavedQualityLevel + == Enum.SavedQualitySetting.Automatic + ) else settings().Rendering.EnableFRM = false end @@ -967,14 +1035,17 @@ local function createGameSettingsMenu(baseZIndex, _) local function goToAutoGraphics() setAutoGraphicsGui(true) - UserSettings().GameSettings.SavedQualityLevel = Enum.SavedQualitySetting.Automatic + UserSettings().GameSettings.SavedQualityLevel = + Enum.SavedQualitySetting.Automatic settings().Rendering.QualityLevel = Enum.QualityLevel.Automatic end local function setGraphicsQualityLevel(newLevel) local percentage = newLevel / GraphicsQualityLevels - local newSetting = math.floor((settings().Rendering:GetMaxQualityLevel() - 1) * percentage) + local newSetting = math.floor( + (settings().Rendering:GetMaxQualityLevel() - 1) * percentage + ) if newSetting == 20 then -- Level 20 is the same as level 21, except it doesn't render ambient occlusion newSetting = 21 elseif newLevel == 1 then -- make sure we can go to lowest settings (for terrible computers) @@ -994,8 +1065,10 @@ local function createGameSettingsMenu(baseZIndex, _) graphicsLevel.Value = explicitLevel else graphicsLevel.Value = math.floor( - (settings().Rendering.AutoFRMLevel / (settings().Rendering:GetMaxQualityLevel() - 1)) - * GraphicsQualityLevels + ( + settings().Rendering.AutoFRMLevel + / (settings().Rendering:GetMaxQualityLevel() - 1) + ) * GraphicsQualityLevels ) end @@ -1004,7 +1077,8 @@ local function createGameSettingsMenu(baseZIndex, _) end if not explicitLevel then - UserSettings().GameSettings.SavedQualityLevel = graphicsLevel.Value + UserSettings().GameSettings.SavedQualityLevel = + graphicsLevel.Value end graphicsSetter.Text = tostring(graphicsLevel.Value) end @@ -1042,25 +1116,45 @@ local function createGameSettingsMenu(baseZIndex, _) local function translateSavedQualityLevelToInt(savedQualityLevel) if savedQualityLevel == Enum.SavedQualitySetting.Automatic then return 0 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel1 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel1 + then return 1 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel2 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel2 + then return 2 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel3 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel3 + then return 3 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel4 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel4 + then return 4 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel5 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel5 + then return 5 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel6 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel6 + then return 6 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel7 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel7 + then return 7 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel8 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel8 + then return 8 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel9 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel9 + then return 9 - elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel10 then + elseif + savedQualityLevel == Enum.SavedQualitySetting.QualityLevel10 + then return 10 end end @@ -1068,14 +1162,21 @@ local function createGameSettingsMenu(baseZIndex, _) local function enableGraphicsWidget() settings().Rendering.EnableFRM = true - isAutoGraphics = (UserSettings().GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic) + isAutoGraphics = ( + UserSettings().GameSettings.SavedQualityLevel + == Enum.SavedQualitySetting.Automatic + ) if isAutoGraphics then showAutoGraphics() goToAutoGraphics() else showAutoGraphics() showManualGraphics() - goToManualGraphics(translateSavedQualityLevelToInt(UserSettings().GameSettings.SavedQualityLevel)) + goToManualGraphics( + translateSavedQualityLevelToInt( + UserSettings().GameSettings.SavedQualityLevel + ) + ) end end @@ -1099,7 +1200,9 @@ local function createGameSettingsMenu(baseZIndex, _) if newGraphicsValue < 1 then newGraphicsValue = 1 - elseif newGraphicsValue >= settings().Rendering:GetMaxQualityLevel() then + elseif + newGraphicsValue >= settings().Rendering:GetMaxQualityLevel() + then newGraphicsValue = settings().Rendering:GetMaxQualityLevel() - 1 end @@ -1121,7 +1224,11 @@ local function createGameSettingsMenu(baseZIndex, _) end) -- setup our graphic mode on load - if inStudioMode or UserSettings().GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic then + if + inStudioMode + or UserSettings().GameSettings.SavedQualityLevel + == Enum.SavedQualitySetting.Automatic + then if inStudioMode then settings().Rendering.EnableFRM = false disableGraphicsWidget() @@ -1131,7 +1238,11 @@ local function createGameSettingsMenu(baseZIndex, _) end else settings().Rendering.EnableFRM = true - goToManualGraphics(translateSavedQualityLevelToInt(UserSettings().GameSettings.SavedQualityLevel)) + goToManualGraphics( + translateSavedQualityLevelToInt( + UserSettings().GameSettings.SavedQualityLevel + ) + ) end autoGraphicsButton.MouseButton1Click:connect(function() @@ -1208,7 +1319,9 @@ local function createGameSettingsMenu(baseZIndex, _) studioCheckbox:SetVerb "TogglePlayMode" studioCheckbox.Visible = false -- todo: enabled when studio h4x aren't an issue anymore - local wasManualGraphics = (settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic) + local wasManualGraphics = ( + settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic + ) if inStudioMode and not game.Players.LocalPlayer then studioCheckbox.Text = "X" disableGraphicsWidget() @@ -1217,23 +1330,28 @@ local function createGameSettingsMenu(baseZIndex, _) enableGraphicsWidget() end if hasGraphicsSlider then - UserSettings().GameSettings.StudioModeChanged:connect(function(isStudioMode) - inStudioMode = isStudioMode - if isStudioMode then - wasManualGraphics = (settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic) - goToAutoGraphics() - studioCheckbox.Text = "X" - autoGraphicsButton.ZIndex = 1 - autoText.ZIndex = 1 - else - if wasManualGraphics then - goToManualGraphics() + UserSettings().GameSettings.StudioModeChanged:connect( + function(isStudioMode) + inStudioMode = isStudioMode + if isStudioMode then + wasManualGraphics = ( + settings().Rendering.QualityLevel + ~= Enum.QualityLevel.Automatic + ) + goToAutoGraphics() + studioCheckbox.Text = "X" + autoGraphicsButton.ZIndex = 1 + autoText.ZIndex = 1 + else + if wasManualGraphics then + goToManualGraphics() + end + studioCheckbox.Text = "" + autoGraphicsButton.ZIndex = baseZIndex + 4 + autoText.ZIndex = baseZIndex + 4 end - studioCheckbox.Text = "" - autoGraphicsButton.ZIndex = baseZIndex + 4 - autoText.ZIndex = baseZIndex + 4 end - end) + ) else studioCheckbox.MouseButton1Click:connect(function() if not studioCheckbox.Active then @@ -1264,13 +1382,15 @@ local function createGameSettingsMenu(baseZIndex, _) fullscreenCheckbox.Text = "X" end if hasGraphicsSlider then - UserSettings().GameSettings.FullscreenChanged:connect(function(isFullscreen) - if isFullscreen then - fullscreenCheckbox.Text = "X" - else - fullscreenCheckbox.Text = "" + UserSettings().GameSettings.FullscreenChanged:connect( + function(isFullscreen) + if isFullscreen then + fullscreenCheckbox.Text = "X" + else + fullscreenCheckbox.Text = "" + end end - end) + ) else fullscreenCheckbox.MouseButton1Click:connect(function() if fullscreenCheckbox.Text == "" then @@ -1335,10 +1455,14 @@ local function createGameSettingsMenu(baseZIndex, _) videoNames[2] = "Upload to YouTube" videoNameToItem[videoNames[2]] = Enum.UploadSetting["Ask me first"] - local videoCaptureDropDown = nil - videoCaptureDropDown, updateVideoCaptureDropDownSelection = RbxGui.CreateDropDownMenu(videoNames, function(text) - UserSettings().GameSettings.VideoUploadPromptBehavior = videoNameToItem[text] - end) + local videoCaptureDropDown + videoCaptureDropDown, updateVideoCaptureDropDownSelection = RbxGui.CreateDropDownMenu( + videoNames, + function(text) + UserSettings().GameSettings.VideoUploadPromptBehavior = + videoNameToItem[text] + end + ) videoCaptureDropDown.Name = "VideoCaptureField" videoCaptureDropDown.ZIndex = baseZIndex + 4 videoCaptureDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4 @@ -1348,12 +1472,19 @@ local function createGameSettingsMenu(baseZIndex, _) videoCaptureDropDown.Parent = gameSettingsMenuFrame syncVideoCaptureSetting = function() - if UserSettings().GameSettings.VideoUploadPromptBehavior == Enum.UploadSetting["Never"] then + if + UserSettings().GameSettings.VideoUploadPromptBehavior + == Enum.UploadSetting["Never"] + then updateVideoCaptureDropDownSelection(videoNames[1]) - elseif UserSettings().GameSettings.VideoUploadPromptBehavior == Enum.UploadSetting["Ask me first"] then + elseif + UserSettings().GameSettings.VideoUploadPromptBehavior + == Enum.UploadSetting["Ask me first"] + then updateVideoCaptureDropDownSelection(videoNames[2]) else - UserSettings().GameSettings.VideoUploadPromptBehavior = Enum.UploadSetting["Ask me first"] + UserSettings().GameSettings.VideoUploadPromptBehavior = + Enum.UploadSetting["Ask me first"] updateVideoCaptureDropDownSelection(videoNames[2]) end end @@ -1372,7 +1503,8 @@ local function createGameSettingsMenu(baseZIndex, _) cameraLabel.ZIndex = baseZIndex + 4 cameraLabel.Parent = gameSettingsMenuFrame - local mouseLockLabel = game.CoreGui.RobloxGui:FindFirstChild("MouseLockLabel", true) + local mouseLockLabel = + game.CoreGui.RobloxGui:FindFirstChild("MouseLockLabel", true) local enumItems = Enum.ControlMode:GetEnumItems() local enumNames = {} @@ -1383,17 +1515,24 @@ local function createGameSettingsMenu(baseZIndex, _) end local cameraDropDown - cameraDropDown, updateCameraDropDownSelection = RbxGui.CreateDropDownMenu(enumNames, function(text) - UserSettings().GameSettings.ControlMode = enumNameToItem[text] + cameraDropDown, updateCameraDropDownSelection = RbxGui.CreateDropDownMenu( + enumNames, + function(text) + UserSettings().GameSettings.ControlMode = enumNameToItem[text] - pcall(function() - if mouseLockLabel and UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then - mouseLockLabel.Visible = true - elseif mouseLockLabel then - mouseLockLabel.Visible = false - end - end) - end) + pcall(function() + if + mouseLockLabel + and UserSettings().GameSettings.ControlMode + == Enum.ControlMode["Mouse Lock Switch"] + then + mouseLockLabel.Visible = true + elseif mouseLockLabel then + mouseLockLabel.Visible = false + end + end) + end + ) cameraDropDown.Name = "CameraField" cameraDropDown.ZIndex = baseZIndex + 4 cameraDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4 @@ -1411,12 +1550,14 @@ if LoadLibrary then if UserSettings then local createSettingsDialog = function() waitForChild(gui, "BottomLeftControl") - settingsButton = gui.BottomLeftControl:FindFirstChild "SettingsButton" + settingsButton = + gui.BottomLeftControl:FindFirstChild "SettingsButton" if settingsButton == nil then settingsButton = Instance.new "ImageButton" settingsButton.Name = "SettingsButton" - settingsButton.Image = "rbxasset://textures/ui/SettingsButton.png" + settingsButton.Image = + "rbxasset://textures/ui/SettingsButton.png" settingsButton.BackgroundTransparency = 1 settingsButton.Active = false settingsButton.Size = UDim2.new(0, 54, 0, 46) @@ -1457,28 +1598,50 @@ if LoadLibrary then gameMainMenu.Parent = settingsFrame gameMainMenu.ScreenshotButton.MouseButton1Click:connect(function() - backToGame(gameMainMenu.ScreenshotButton, shield, settingsButton) + backToGame( + gameMainMenu.ScreenshotButton, + shield, + settingsButton + ) end) gameMainMenu.RecordVideoButton.MouseButton1Click:connect(function() - recordVideoClick(gameMainMenu.RecordVideoButton, gui.StopRecordButton) - backToGame(gameMainMenu.RecordVideoButton, shield, settingsButton) + recordVideoClick( + gameMainMenu.RecordVideoButton, + gui.StopRecordButton + ) + backToGame( + gameMainMenu.RecordVideoButton, + shield, + settingsButton + ) end) if settings():FindFirstChild "Game Options" then pcall(function() - settings():FindFirstChild("Game Options").VideoRecordingChangeRequest:connect(function(recording) - recordingVideo = recording - setRecordGui(recording, gui.StopRecordButton, gameMainMenu.RecordVideoButton) - end) + settings() + :FindFirstChild("Game Options").VideoRecordingChangeRequest + :connect(function(recording) + recordingVideo = recording + setRecordGui( + recording, + gui.StopRecordButton, + gameMainMenu.RecordVideoButton + ) + end) end) end - game.CoreGui.RobloxGui.Changed:connect(function(prop) -- We have stopped recording when we resize - if prop == "AbsoluteSize" and recordingVideo then - recordVideoClick(gameMainMenu.RecordVideoButton, gui.StopRecordButton) + game.CoreGui.RobloxGui.Changed:connect( + function(prop) -- We have stopped recording when we resize + if prop == "AbsoluteSize" and recordingVideo then + recordVideoClick( + gameMainMenu.RecordVideoButton, + gui.StopRecordButton + ) + end end - end) + ) function localPlayerChange() gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer @@ -1504,100 +1667,123 @@ if LoadLibrary then end) end - gameMainMenu.ReportAbuseButton.Visible = game:FindFirstChild "NetworkClient" + gameMainMenu.ReportAbuseButton.Visible = + game:FindFirstChild "NetworkClient" if not gameMainMenu.ReportAbuseButton.Visible then game.ChildAdded:connect(function(child) if child:IsA "NetworkClient" then - gameMainMenu.ReportAbuseButton.Visible = game:FindFirstChild "NetworkClient" + gameMainMenu.ReportAbuseButton.Visible = + game:FindFirstChild "NetworkClient" end end) end gameMainMenu.ResetButton.MouseButton1Click:connect(function() - goToMenu(settingsFrame, "ResetConfirmationMenu", "up", UDim2.new(0, 525, 0, 370)) + goToMenu( + settingsFrame, + "ResetConfirmationMenu", + "up", + UDim2.new(0, 525, 0, 370) + ) end) gameMainMenu.LeaveGameButton.MouseButton1Click:connect(function() - goToMenu(settingsFrame, "LeaveConfirmationMenu", "down", UDim2.new(0, 525, 0, 300)) + goToMenu( + settingsFrame, + "LeaveConfirmationMenu", + "down", + UDim2.new(0, 525, 0, 300) + ) end) if game.CoreGui.Version >= 4 then -- we can use escape! - game:GetService("GuiService").EscapeKeyPressed:connect(function() - if currentMenuSelection == nil then - game.GuiService:AddCenterDialog( - shield, - Enum.CenterDialogType.ModalDialog, - --showFunction - function() - settingsButton.Active = false - updateCameraDropDownSelection(UserSettings().GameSettings.ControlMode.Name) + game:GetService("GuiService").EscapeKeyPressed:connect( + function() + if currentMenuSelection == nil then + game.GuiService:AddCenterDialog( + shield, + Enum.CenterDialogType.ModalDialog, + --showFunction + function() + settingsButton.Active = false + updateCameraDropDownSelection( + UserSettings().GameSettings.ControlMode.Name + ) - if syncVideoCaptureSetting then - syncVideoCaptureSetting() + if syncVideoCaptureSetting then + syncVideoCaptureSetting() + end + + goToMenu( + settingsFrame, + "GameMainMenu", + "right", + UDim2.new(0, 525, 0, 430) + ) + shield.Visible = true + shield.Active = true + settingsFrame.Parent:TweenPosition( + UDim2.new(0.5, -262, 0.5, -200), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + settingsFrame.Parent:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + end, + --hideFunction + function() + settingsFrame.Parent:TweenPosition( + UDim2.new(0.5, -262, -0.5, -200), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + settingsFrame.Parent:TweenSize( + UDim2.new(0, 525, 0, 430), + Enum.EasingDirection.InOut, + Enum.EasingStyle.Sine, + tweenTime, + true + ) + shield.Visible = false + settingsButton.Active = true end - - goToMenu(settingsFrame, "GameMainMenu", "right", UDim2.new(0, 525, 0, 430)) - shield.Visible = true - shield.Active = true - settingsFrame.Parent:TweenPosition( - UDim2.new(0.5, -262, 0.5, -200), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - settingsFrame.Parent:TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - end, - --hideFunction - function() - settingsFrame.Parent:TweenPosition( - UDim2.new(0.5, -262, -0.5, -200), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - settingsFrame.Parent:TweenSize( - UDim2.new(0, 525, 0, 430), - Enum.EasingDirection.InOut, - Enum.EasingStyle.Sine, - tweenTime, - true - ) - shield.Visible = false - settingsButton.Active = true + ) + elseif #lastMenuSelection > 0 then + if #centerDialogs > 0 then + for i = 1, #centerDialogs do + game.GuiService:RemoveCenterDialog( + centerDialogs[i] + ) + centerDialogs[i].Visible = false + end + centerDialogs = {} end - ) - elseif #lastMenuSelection > 0 then - if #centerDialogs > 0 then - for i = 1, #centerDialogs do - game.GuiService:RemoveCenterDialog(centerDialogs[i]) - centerDialogs[i].Visible = false + + goToMenu( + lastMenuSelection[#lastMenuSelection]["container"], + lastMenuSelection[#lastMenuSelection]["name"], + lastMenuSelection[#lastMenuSelection]["direction"], + lastMenuSelection[#lastMenuSelection]["lastSize"] + ) + + table.remove(lastMenuSelection, #lastMenuSelection) + if #lastMenuSelection == 1 then -- apparently lua can't reduce count to 0... T_T + lastMenuSelection = {} end - centerDialogs = {} + else + resumeGameFunction(shield) end - - goToMenu( - lastMenuSelection[#lastMenuSelection]["container"], - lastMenuSelection[#lastMenuSelection]["name"], - lastMenuSelection[#lastMenuSelection]["direction"], - lastMenuSelection[#lastMenuSelection]["lastSize"] - ) - - table.remove(lastMenuSelection, #lastMenuSelection) - if #lastMenuSelection == 1 then -- apparently lua can't reduce count to 0... T_T - lastMenuSelection = {} - end - else - resumeGameFunction(shield) end - end) + ) end local gameSettingsMenu = createGameSettingsMenu(baseZIndex, shield) @@ -1605,18 +1791,30 @@ if LoadLibrary then gameSettingsMenu.Parent = settingsFrame gameMainMenu.SettingsButton.MouseButton1Click:connect(function() - goToMenu(settingsFrame, "GameSettingsMenu", "left", UDim2.new(0, 525, 0, 350)) + goToMenu( + settingsFrame, + "GameSettingsMenu", + "left", + UDim2.new(0, 525, 0, 350) + ) end) gameSettingsMenu.BackButton.MouseButton1Click:connect(function() - goToMenu(settingsFrame, "GameMainMenu", "right", UDim2.new(0, 525, 0, 430)) + goToMenu( + settingsFrame, + "GameMainMenu", + "right", + UDim2.new(0, 525, 0, 430) + ) end) - local resetConfirmationWindow = createResetConfirmationMenu(baseZIndex, shield) + local resetConfirmationWindow = + createResetConfirmationMenu(baseZIndex, shield) resetConfirmationWindow.Visible = false resetConfirmationWindow.Parent = settingsFrame - local leaveConfirmationWindow = createLeaveConfirmationMenu(baseZIndex, shield) + local leaveConfirmationWindow = + createLeaveConfirmationMenu(baseZIndex, shield) leaveConfirmationWindow.Visible = false leaveConfirmationWindow.Parent = settingsFrame @@ -1629,13 +1827,20 @@ if LoadLibrary then --showFunction function() settingsButton.Active = false - updateCameraDropDownSelection(UserSettings().GameSettings.ControlMode.Name) + updateCameraDropDownSelection( + UserSettings().GameSettings.ControlMode.Name + ) if syncVideoCaptureSetting then syncVideoCaptureSetting() end - goToMenu(settingsFrame, "GameMainMenu", "right", UDim2.new(0, 525, 0, 430)) + goToMenu( + settingsFrame, + "GameMainMenu", + "right", + UDim2.new(0, 525, 0, 430) + ) shield.Visible = true settingsFrame.Parent:TweenPosition( UDim2.new(0.5, -262, 0.5, -200), @@ -1681,9 +1886,14 @@ if LoadLibrary then createSettingsDialog().Parent = gui gui.BottomLeftControl.SettingsButton.Active = true - gui.BottomLeftControl.SettingsButton.Position = UDim2.new(0, 2, 0, -2) + gui.BottomLeftControl.SettingsButton.Position = + UDim2.new(0, 2, 0, -2) - if mouseLockLabel and UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then + if + mouseLockLabel + and UserSettings().GameSettings.ControlMode + == Enum.ControlMode["Mouse Lock Switch"] + then mouseLockLabel.Visible = true elseif mouseLockLabel then mouseLockLabel.Visible = false @@ -1822,7 +2032,7 @@ if LoadLibrary then -8 ) spinnerImage.BackgroundTransparency = 1 - spinnerImage.Image = "http://www.roblox.com/Asset?id=45880710" + spinnerImage.Image = "http://banland.xyz/Asset?id=45880710" spinnerImage.Parent = spinnerFrame spinnerIcons[spinnerNum] = spinnerImage @@ -1843,9 +2053,11 @@ if LoadLibrary then while pos < 8 do if pos == spinPos or pos == ((spinPos + 1) % 8) then - spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset?id=45880668" + spinnerIcons[pos + 1].Image = + "http://banland.xyz/Asset?id=45880668" else - spinnerIcons[pos + 1].Image = "http://www.roblox.com/Asset?id=45880710" + spinnerIcons[pos + 1].Image = + "http://banland.xyz/Asset?id=45880710" end pos = pos + 1 @@ -1921,9 +2133,16 @@ if LoadLibrary then waitForChild(gui, "UserSettingsShield") waitForChild(gui.UserSettingsShield, "Settings") waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle") - waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu") - waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, "ReportAbuseButton") - reportAbuseButton = gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton + waitForChild( + gui.UserSettingsShield.Settings.SettingsStyle, + "GameMainMenu" + ) + waitForChild( + gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, + "ReportAbuseButton" + ) + reportAbuseButton = + gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton local shield = Instance.new "TextButton" shield.Name = "ReportAbuseShield" @@ -2025,11 +2244,11 @@ if LoadLibrary then playerLabel.ZIndex = baseZIndex + 2 playerLabel.Parent = settingsFrame - local abusingPlayer = nil - local abuse = nil - local submitReportButton = nil + local abusingPlayer + local abuse + local submitReportButton - local updatePlayerSelection = nil + local updatePlayerSelection local createPlayersDropDown = function() local players = game:GetService "Players" local playerNames = {} @@ -2045,13 +2264,16 @@ if LoadLibrary then end end end - local playerDropDown = nil - playerDropDown, updatePlayerSelection = RbxGui.CreateDropDownMenu(playerNames, function(playerName) - abusingPlayer = nameToPlayer[playerName] - if abuse and abusingPlayer then - submitReportButton.Active = true + local playerDropDown + playerDropDown, updatePlayerSelection = RbxGui.CreateDropDownMenu( + playerNames, + function(playerName) + abusingPlayer = nameToPlayer[playerName] + if abuse and abusingPlayer then + submitReportButton.Active = true + end end - end) + ) playerDropDown.Name = "PlayersComboBox" playerDropDown.ZIndex = baseZIndex + 2 playerDropDown.Position = UDim2.new(0.425, 0, 0, 102) @@ -2084,12 +2306,16 @@ if LoadLibrary then "Bad Model or Script", "Bad Username", } - local abuseDropDown, updateAbuseSelection = RbxGui.CreateDropDownMenu(abuses, function(abuseText) - abuse = abuseText - if abuse and abusingPlayer then - submitReportButton.Active = true - end - end, true) + local abuseDropDown, updateAbuseSelection = RbxGui.CreateDropDownMenu( + abuses, + function(abuseText) + abuse = abuseText + if abuse and abusingPlayer then + submitReportButton.Active = true + end + end, + true + ) abuseDropDown.Name = "AbuseComboBox" abuseDropDown.ZIndex = baseZIndex + 2 abuseDropDown.Position = UDim2.new(0.425, 0, 0, 142) @@ -2154,7 +2380,11 @@ if LoadLibrary then if submitReportButton.Active then if abuse and abusingPlayer then frame.Visible = false - game.Players:ReportAbuse(abusingPlayer, abuse, shortDescriptionBox.Text) + game.Players:ReportAbuse( + abusingPlayer, + abuse, + shortDescriptionBox.Text + ) if abuse == "Cheating/Exploiting" then recordedMessageBox.Visible = true elseif abuse == "Bullying" or abuse == "Swearing" then @@ -2349,9 +2579,16 @@ if LoadLibrary then waitForChild(gui, "UserSettingsShield") waitForChild(gui.UserSettingsShield, "Settings") waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle") - waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu") - waitForChild(gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, "ReportAbuseButton") - gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton.Active = true + waitForChild( + gui.UserSettingsShield.Settings.SettingsStyle, + "GameMainMenu" + ) + waitForChild( + gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu, + "ReportAbuseButton" + ) + gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton.Active = + true end) --Spawn a thread for Chat Bar @@ -2407,7 +2644,9 @@ if LoadLibrary then waitForProperty(game, "PlaceId") if game.PlaceId == BurningManPlaceID then - game.Players.LocalPlayer.Character.Humanoid:SetClickToWalkEnabled(false) + game.Players.LocalPlayer.Character.Humanoid:SetClickToWalkEnabled( + false + ) game.Players.LocalPlayer.CharacterAdded:connect(function(character) waitForChild(character, "Humanoid") character.Humanoid:SetClickToWalkEnabled(false) diff --git a/lua/48488235.lua b/lua/48488235.lua index d798482..247eaac 100644 --- a/lua/48488235.lua +++ b/lua/48488235.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 48488235" --new playerlist by Zach Lindblad (fusroblox) --contact him for any revisions/issues -------------------- @@ -49,7 +50,7 @@ iltalumi = 1, inventx = 1, jackssmirkingrevenge = 1, - jeditkacheff = 'http://www.roblox.com/asset/?id=134032333', + jeditkacheff = 'http://banland.xyz/asset/?id=134032333', kbux = 1, keith = 1, limon = 1, @@ -87,14 +88,14 @@ screenme = 1, scubasomething = 1, seanthornton = 1, - shedletsky = 'http://www.roblox.com/asset/?id=105897927', + shedletsky = 'http://banland.xyz/asset/?id=105897927', sickenedmonkey = 1, slingshotjunkie = 1, smeaferblox = 1, soggoth = 1, solarcrane = 1, sooraya = 1, - sorcus = 'http://www.roblox.com/asset/?id=113059239', + sorcus = 'http://banland.xyz/asset/?id=113059239', squidcod = 1, stickmasterluke = 1, stuball = 1, @@ -125,9 +126,9 @@ local ADMINS = { taskmanager = 1, Heliodex = 1, - multako = "http://www.roblox.com/asset/?id=6923328292", + multako = "http://banland.xyz/asset/?id=6923328292", mercury = 1, - pizzaboxer = "http://www.roblox.com/asset/?id=6917566633", + pizzaboxer = "http://banland.xyz/asset/?id=6917566633", } local Images = { @@ -203,7 +204,7 @@ end function getMembershipTypeIcon(membershipType, playerName) if ADMINS[string.lower(playerName)] ~= nil then if ADMINS[string.lower(playerName)] == 1 then - return "http://www.roblox.com/asset/?id=6923330951" + return "http://banland.xyz/asset/?id=6923330951" else return ADMINS[string.lower(playerName)] end @@ -221,14 +222,17 @@ function getMembershipTypeIcon(membershipType, playerName) end local function getFriendStatusIcon(friendStatus) - if friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend then + if + friendStatus == Enum.FriendStatus.Unknown + or friendStatus == Enum.FriendStatus.NotFriend + then return "" elseif friendStatus == Enum.FriendStatus.Friend then - return "http://www.roblox.com/asset/?id=99749771" + return "http://banland.xyz/asset/?id=99749771" elseif friendStatus == Enum.FriendStatus.FriendRequestSent then - return "http://www.roblox.com/asset/?id=99776888" + return "http://banland.xyz/asset/?id=99776888" elseif friendStatus == Enum.FriendStatus.FriendRequestReceived then - return "http://www.roblox.com/asset/?id=99776838" + return "http://banland.xyz/asset/?id=99776838" else error("Unknown FriendStatus: " .. friendStatus) end @@ -267,18 +271,20 @@ function MakePopupButton(nparent, ntext, index, last) Parent = nparent, } if index == 0 then - tobj.Image = "http://www.roblox.com/asset/?id=97108784" + tobj.Image = "http://banland.xyz/asset/?id=97108784" elseif last then if index % 2 == 1 then - tobj.Image = "http://www.roblox.com/asset/?id=" .. Images["LightPopupBottom"] + tobj.Image = "http://banland.xyz/asset/?id=" + .. Images["LightPopupBottom"] else - tobj.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkPopupBottom"] + tobj.Image = "http://banland.xyz/asset/?id=" + .. Images["DarkPopupBottom"] end else if index % 2 == 1 then - tobj.Image = "http://www.roblox.com/asset/?id=97112126" + tobj.Image = "http://banland.xyz/asset/?id=97112126" else - tobj.Image = "http://www.roblox.com/asset/?id=97109338" + tobj.Image = "http://banland.xyz/asset/?id=97109338" end end return tobj @@ -344,7 +350,7 @@ local HeaderFrame = Obj.Create "Frame" { Position = UDim2.new(0, 0, 0, 0), Size = UDim2.new(1, 0, 0.07, 0), Parent = MainFrame, - MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=94692054", + MakeBackgroundGuiObj "http://banland.xyz/asset/?id=94692054", } local HeaderFrameHeight = HeaderFrame.Size.Y.Scale local MaximizeButton = Obj.Create "ImageButton" { @@ -401,7 +407,7 @@ local BottomFrame = Obj.Create "Frame" { Position = UDim2.new(0, 0, 0.07, 0), Size = UDim2.new(1, 0, 0.03, 0), Parent = BottomShiftFrame, - MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=94754966", + MakeBackgroundGuiObj "http://banland.xyz/asset/?id=94754966", } local ExtendButton = Obj.Create "ImageButton" { Name = "bigbutton", @@ -416,7 +422,7 @@ local ExtendTab = Obj.Create "ImageButton" { Name = "extendTab", Active = true, BackgroundTransparency = 1, - Image = "http://www.roblox.com/asset/?id=94692731", + Image = "http://banland.xyz/asset/?id=94692731", Position = UDim2.new(0.608, 0, 0.3, 0), Size = UDim2.new(0.3, 0, 0.7, 0), Parent = BottomFrame, @@ -470,7 +476,7 @@ local PopUpClipFrame = Obj.Create "Frame" { ClipsDescendants = true, ZIndex = 7, } -local PopUpPanel = nil +local PopUpPanel local PopUpPanelTemplate = Obj.Create "Frame" { Name = "Panel", BackgroundTransparency = 1, @@ -568,7 +574,7 @@ local MiddleBGTemplate = Obj.Create "Frame" { BackgroundTransparency = 1, Position = UDim2.new(100, 0, 0.07, 0), Size = UDim2.new(0.5, 0, 0.025, 0), --UDim2.new(1, 0, .03, 0), - MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=94692025", + MakeBackgroundGuiObj "http://banland.xyz/asset/?id=94692025", } -- REPORT ABUSE OBJECTS @@ -599,7 +605,7 @@ local AbuseSettingsFrame = Obj.Create "Frame" { Size = UDim2.new(1, 0, 1, 0), Active = true, BackgroundTransparency = 1, - MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96488767", -- 96480351'), + MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96488767", -- 96480351'), Obj.Create "TextLabel" { Name = "Title", Text = "Report Abuse", @@ -679,7 +685,7 @@ local SubmitReportButton = Obj.Create "ImageButton" { Position = UDim2.new(0.5, -200, 1, -80), Size = UDim2.new(0, 150, 0, 50), AutoButtonColor = false, - Image = "http://www.roblox.com/asset/?id=96502438", -- 96501119', + Image = "http://banland.xyz/asset/?id=96502438", -- 96501119', Parent = AbuseSettingsFrame, } @@ -689,7 +695,7 @@ local CancelReportButton = Obj.Create "ImageButton" { Position = UDim2.new(0.5, 50, 1, -80), Size = UDim2.new(0, 150, 0, 50), AutoButtonColor = true, - Image = "http://www.roblox.com/asset/?id=96500683", + Image = "http://banland.xyz/asset/?id=96500683", Parent = AbuseSettingsFrame, } @@ -725,7 +731,7 @@ local CalmingAbuseBox = Obj.Create "Frame" { BackgroundTransparency = 1, Position = UDim2.new(0.25, 0, 0.300000012, 0), Size = UDim2.new(0.5, 0, 0.370000005, 0), - MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96506233", + MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96506233", Obj.Create "TextLabel" { Name = "Header", Position = UDim2.new(0, 10, 0.05, 0), @@ -758,7 +764,7 @@ local CalmingAbuseBox = Obj.Create "Frame" { Position = UDim2.new(0.5, -75, 1, -80), Size = UDim2.new(0, 150, 0, 50), AutoButtonColor = true, - Image = "http://www.roblox.com/asset/?id=96507959", + Image = "http://banland.xyz/asset/?id=96507959", }, } local NormalAbuseBox = Obj.Create "Frame" { @@ -766,7 +772,7 @@ local NormalAbuseBox = Obj.Create "Frame" { BackgroundTransparency = 1, Position = UDim2.new(0.25, 0, 0.300000012, 0), Size = UDim2.new(0.5, 0, 0.370000005, 0), - MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96506233", + MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96506233", Obj.Create "TextLabel" { Name = "Header", Position = UDim2.new(0, 10, 0.05, 0), @@ -799,7 +805,7 @@ local NormalAbuseBox = Obj.Create "Frame" { Position = UDim2.new(0.5, -75, 1, -80), Size = UDim2.new(0, 150, 0, 50), AutoButtonColor = true, - Image = "http://www.roblox.com/asset/?id=96507959", + Image = "http://banland.xyz/asset/?id=96507959", }, } @@ -819,7 +825,7 @@ local debugFrame = Obj.Create "Frame" { BackgroundTransparency = 1, Position = UDim2.new(0.25, 0, 0.300000012, 0), Size = UDim2.new(0.5, 0, 0.370000005, 0), - MakeBackgroundGuiObj "http://www.roblox.com/asset/?id=96506233", + MakeBackgroundGuiObj "http://banland.xyz/asset/?id=96506233", } local debugplayers = Obj.Create "TextLabel" { BackgroundTransparency = 0.8, @@ -872,7 +878,8 @@ local RbxGui = assert(LoadLibrary "RbxGui") local DefaultEntriesOnScreen = 8 for _, i in pairs(Images) do - Game:GetService("ContentProvider"):Preload("http://www.roblox.com/asset/?id=" .. i) + Game:GetService("ContentProvider") + :Preload("http://banland.xyz/asset/?id=" .. i) end -- ordered array of 'score data', each entry has: @@ -899,7 +906,7 @@ local PlayerFrames = {} -- ID (int to prevent flipping out of leaderboard, fun times) local TeamFrames = {} -- one special entry from teamFrames, for unaffiliated players, only shown if players non - empty -local NeutralTeam = nil +local NeutralTeam -- final 'to be displayed' list of frames local MiddleFrames = {} @@ -929,8 +936,8 @@ local RightEdgeSpace = -0.04 local DefaultBottomClipPos = BottomClipFrame.Position.Y.Scale -local SelectedPlayerEntry = nil -local SelectedPlayer = nil +local SelectedPlayerEntry +local SelectedPlayer -- locks(semaphores) for stopping race conditions local AddingFrameLock = false @@ -996,7 +1003,8 @@ end) -- end function AreAllEntriesOnScreen() - return #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale <= 1 + DefaultBottomClipPos + return #MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale + <= 1 + DefaultBottomClipPos end -- function GetLengthOfVisbleScroll() @@ -1011,7 +1019,10 @@ function GetMinScroll() if AreAllEntriesOnScreen() then return GetMaxScroll() else - return (GetMaxScroll() - (#MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale)) + (1 + DefaultBottomClipPos) + return ( + GetMaxScroll() + - (#MiddleFrameBackgrounds * MiddleTemplate.Size.Y.Scale) + ) + (1 + DefaultBottomClipPos) end end @@ -1031,7 +1042,8 @@ end function TweenProperty(obj, propName, inita, enda, length) local startTime = tick() while tick() - startTime < length do - obj[propName] = ((enda - inita) * ((tick() - startTime) / length)) + inita + obj[propName] = ((enda - inita) * ((tick() - startTime) / length)) + + inita wait(1 / 30) end obj[propName] = enda @@ -1128,10 +1140,23 @@ end player player to set privileges on nlevel new privilege level for this player --]] -function OnPrivilegeLevelSelect(player, nlevel, BanPlayerButton, VisitorButton, MemberButton, AdminButton) +function OnPrivilegeLevelSelect( + player, + nlevel, + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton +) debugprint "setting privilege level" SetPrivilegeRank(player, nlevel) - HighlightMyRank(player, BanPlayerButton, VisitorButton, MemberButton, AdminButton) + HighlightMyRank( + player, + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton + ) end --[[ @@ -1139,21 +1164,35 @@ end @Args: player Player to check for rank on --]] -function HighlightMyRank(player, BanPlayerButton, VisitorButton, MemberButton, AdminButton) - BanPlayerButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightPopupMid"] - VisitorButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkPopupMid"] - MemberButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightPopupMid"] - AdminButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkPopupBottom"] +function HighlightMyRank( + player, + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton +) + BanPlayerButton.Image = "http://banland.xyz/asset/?id=" + .. Images["LightPopupMid"] + VisitorButton.Image = "http://banland.xyz/asset/?id=" + .. Images["DarkPopupMid"] + MemberButton.Image = "http://banland.xyz/asset/?id=" + .. Images["LightPopupMid"] + AdminButton.Image = "http://banland.xyz/asset/?id=" + .. Images["DarkPopupBottom"] local rank = player.PersonalServerRank if rank <= PrivilegeLevel["Banned"] then - BanPlayerButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightBluePopupMid"] + BanPlayerButton.Image = "http://banland.xyz/asset/?id=" + .. Images["LightBluePopupMid"] elseif rank <= PrivilegeLevel["Visitor"] then - VisitorButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkBluePopupMid"] + VisitorButton.Image = "http://banland.xyz/asset/?id=" + .. Images["DarkBluePopupMid"] elseif rank <= PrivilegeLevel["Member"] then - MemberButton.Image = "http://www.roblox.com/asset/?id=" .. Images["LightBluePopupMid"] + MemberButton.Image = "http://banland.xyz/asset/?id=" + .. Images["LightBluePopupMid"] elseif rank <= PrivilegeLevel["Admin"] then - AdminButton.Image = "http://www.roblox.com/asset/?id=" .. Images["DarkBluePopupBottom"] + AdminButton.Image = "http://banland.xyz/asset/?id=" + .. Images["DarkBluePopupBottom"] end end @@ -1167,8 +1206,15 @@ function OnSubmitAbuse() if SubmitReportButton.Active then if AbuseName and SelectedPlayer then AbuseSettingsFrame.Visible = false - game.Players:ReportAbuse(SelectedPlayer, AbuseName, AbuseDescriptionBox.Text) - if AbuseName == "Rude or Mean Behavior" or AbuseName == "False Reporting Me" then + game.Players:ReportAbuse( + SelectedPlayer, + AbuseName, + AbuseDescriptionBox.Text + ) + if + AbuseName == "Rude or Mean Behavior" + or AbuseName == "False Reporting Me" + then CalmingAbuseBox.Parent = ReportAbuseShield else debugprint "opening abuse box" @@ -1187,7 +1233,13 @@ function OpenAbuseDialog() debugprint "adding report dialog" AbusePlayerLabel.Text = SelectedPlayer.Name --AbuseDescriptionBox.Text = "" - PopUpPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) + PopUpPanel:TweenPosition( + UDim2.new(1, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) AbuseDescriptionBox = OriginalAbuseDescriptionBox:Clone() AbuseDescriptionBox.Parent = AbuseDescriptionWrapper ReportAbuseShield.Parent = ScreenGui @@ -1199,7 +1251,7 @@ end function CloseAbuseDialog() AbuseName = nil SubmitReportButton.Active = false - SubmitReportButton.Image = "http://www.roblox.com/asset/?id=96502438" -- 96501119', + SubmitReportButton.Image = "http://banland.xyz/asset/?id=96502438" -- 96501119', AbuseDescriptionBox:Destroy() CalmingAbuseBox.Parent = nil NormalAbuseBox.Parent = nil @@ -1215,11 +1267,12 @@ function InitReportAbuse() AbuseName = abuseText if AbuseName and SelectedPlayer then SubmitReportButton.Active = true - SubmitReportButton.Image = "http://www.roblox.com/asset/?id=96501119" + SubmitReportButton.Image = "http://banland.xyz/asset/?id=96501119" end end - AbuseDropDown, _ = RbxGui.CreateDropDownMenu(Abuses, UpdateAbuseFunction, true) + AbuseDropDown, _ = + RbxGui.CreateDropDownMenu(Abuses, UpdateAbuseFunction, true) AbuseDropDown.Name = "AbuseComboBox" AbuseDropDown.Position = UDim2.new(0.425, 0, 0, 142) AbuseDropDown.Size = UDim2.new(0.55, 0, 0, 32) @@ -1228,8 +1281,10 @@ function InitReportAbuse() CancelReportButton.MouseButton1Click:connect(CloseAbuseDialog) SubmitReportButton.MouseButton1Click:connect(OnSubmitAbuse) - CalmingAbuseBox:FindFirstChild("OkButton").MouseButton1Down:connect(CloseAbuseDialog) - NormalAbuseBox:FindFirstChild("OkButton").MouseButton1Down:connect(CloseAbuseDialog) + CalmingAbuseBox:FindFirstChild("OkButton").MouseButton1Down + :connect(CloseAbuseDialog) + NormalAbuseBox:FindFirstChild("OkButton").MouseButton1Down + :connect(CloseAbuseDialog) end ------------------------------------- @@ -1280,7 +1335,13 @@ end function OnFriendRefuseButtonSelect() LocalPlayer:RevokeFriendship(SelectedPlayer) ClosePopUpPanel() - PopUpPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) + PopUpPanel:TweenPosition( + UDim2.new(1, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) end ------------------------------------ -- Player Entry Handling @@ -1464,7 +1525,9 @@ function RemoveAllStats(playerEntry) end function GetScoreValue(score) - if score:IsA "DoubleConstrainedValue" or score:IsA "IntConstrainedValue" then + if + score:IsA "DoubleConstrainedValue" or score:IsA "IntConstrainedValue" + then return score.ConstrainedValue elseif score:IsA "BoolValue" then if score.Value then @@ -1484,15 +1547,18 @@ function MakeScoreEntry(entry, scoreval, panel) return end local nscoretxt = panel:FindFirstChild("PlayerScore"):Clone() - local thisScore = nil + local thisScore --here lies the resting place of a once great and terrible bug --may its treachery never be forgoten, lest its survivors fall for it again --RIP the leaderstat bug, oct 2012-nov 2012 wait() if - entry["Player"]:FindFirstChild "leaderstats" and entry["Player"].leaderstats:FindFirstChild(scoreval["Name"]) + entry["Player"]:FindFirstChild "leaderstats" + and entry["Player"].leaderstats:FindFirstChild(scoreval["Name"]) then - thisScore = entry["Player"]:FindFirstChild("leaderstats"):FindFirstChild(scoreval["Name"]) + thisScore = entry["Player"] + :FindFirstChild("leaderstats") + :FindFirstChild(scoreval["Name"]) else return end @@ -1564,13 +1630,20 @@ function RecreateScoreColumns(ptable) -- make an entry for this object local nentry = MakeScoreEntry(entry, scoreval, panel) if nentry then - debugprint("adding " .. nentry.Name .. " to " .. entry["Player"].Name) + debugprint( + "adding " + .. nentry.Name + .. " to " + .. entry["Player"].Name + ) nentry.Parent = panel -- add score to team if entry["MyTeam"] and entry["MyTeam"] ~= NeutralTeam - and not entry["MyTeam"]["Frame"]:FindFirstChild(scoreval["Name"]) + and not entry["MyTeam"]["Frame"]:FindFirstChild( + scoreval["Name"] + ) then local ntitle = nentry:Clone() --ntitle.TextXAlignment = 'Right' @@ -1581,12 +1654,18 @@ function RecreateScoreColumns(ptable) scoreval["XOffset"] = Xoffset if panel:FindFirstChild(scoreval["Name"]) then - MaxSizeColumn = math.max(MaxSizeColumn, panel[scoreval["Name"]].TextBounds.X) + MaxSizeColumn = math.max( + MaxSizeColumn, + panel[scoreval["Name"]].TextBounds.X + ) end end if AreNamesExpanded.Value then - MaxSizeColumn = math.max(MaxSizeColumn, StatTitles[scoreval["Name"]].TextBounds.X) + MaxSizeColumn = math.max( + MaxSizeColumn, + StatTitles[scoreval["Name"]].TextBounds.X + ) StatTitles[scoreval["Name"]]:TweenPosition( UDim2.new(RightEdgeSpace, -Xoffset, 0, 0), "Out", @@ -1607,8 +1686,10 @@ function RecreateScoreColumns(ptable) Xoffset = Xoffset + SpacingPerStat + MaxSizeColumn maxXOffset = math.max(Xoffset, maxXOffset) end - NormalBounds = UDim2.new(0, BaseScreenXSize + maxXOffset - SpacingPerStat, 0, 800) - NormalPosition = UDim2.new(1, -NormalBounds.X.Offset, NormalPosition.Y.Scale, 0) + NormalBounds = + UDim2.new(0, BaseScreenXSize + maxXOffset - SpacingPerStat, 0, 800) + NormalPosition = + UDim2.new(1, -NormalBounds.X.Offset, NormalPosition.Y.Scale, 0) UpdateHeaderNameSize() UpdateMaximize() @@ -1646,7 +1727,13 @@ end function UnTabify() if IsTabified.Value then IsTabified.Value = false - ScreenGui:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + ScreenGui:TweenPosition( + UDim2.new(0, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) end end @@ -1662,35 +1749,75 @@ function UpdateMinimize() end if not IsTabified.Value then MainFrame:TweenSizeAndPosition( - UDim2.new(0.010, HeaderName.TextBounds.X, NormalBounds.Y.Scale, NormalBounds.Y.Offset), - UDim2.new(0.990, -HeaderName.TextBounds.X, NormalPosition.Y.Scale, 0), + UDim2.new( + 0.010, + HeaderName.TextBounds.X, + NormalBounds.Y.Scale, + NormalBounds.Y.Offset + ), + UDim2.new( + 0.990, + -HeaderName.TextBounds.X, + NormalPosition.Y.Scale, + 0 + ), "Out", "Linear", BASE_TWEEN * 1.2, true ) else - MainFrame:TweenSizeAndPosition(NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + MainFrame:TweenSizeAndPosition( + NormalBounds, + NormalPosition, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) end --(#MiddleFrameBackgrounds*MiddleBGTemplate.Size.Y.Scale) - BottomClipFrame:TweenPosition(UDim2.new(0, 0, -1, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) - BottomFrame:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + BottomClipFrame:TweenPosition( + UDim2.new(0, 0, -1, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) + BottomFrame:TweenPosition( + UDim2.new(0, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) FocusFrame.Size = UDim2.new(1, 0, HeaderFrameHeight, 0) - ExtendTab.Image = "http://www.roblox.com/asset/?id=94692731" + ExtendTab.Image = "http://banland.xyz/asset/?id=94692731" else if not IsMaximized.Value then - MainFrame:TweenSizeAndPosition(NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + MainFrame:TweenSizeAndPosition( + NormalBounds, + NormalPosition, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) end --do limiting - DefaultBottomClipPos = - math.min(math.max(DefaultBottomClipPos, -1), -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale)) + DefaultBottomClipPos = math.min( + math.max(DefaultBottomClipPos, -1), + -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) + ) UpdateScrollPosition() BottomClipFrame.Position = UDim2.new(0, 0, DefaultBottomClipPos, 0) - local bottomPositon = (DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale) + local bottomPositon = ( + DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale + ) BottomFrame.Position = UDim2.new(0, 0, bottomPositon, 0) FocusFrame.Size = UDim2.new(1, 0, bottomPositon + HeaderFrameHeight, 0) - ExtendTab.Image = "http://www.roblox.com/asset/?id=94825585" + ExtendTab.Image = "http://banland.xyz/asset/?id=94825585" end end @@ -1717,7 +1844,14 @@ function UpdateMaximize() UpdateMinimize() end - MainFrame:TweenSizeAndPosition(MaximizedBounds, MaximizedPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + MainFrame:TweenSizeAndPosition( + MaximizedBounds, + MaximizedPosition, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) HeaderScore:TweenPosition( UDim2.new(0, 0, HeaderName.Position.Y.Scale, 0), "Out", @@ -1726,30 +1860,45 @@ function UpdateMaximize() true ) HeaderName:TweenPosition( - UDim2.new(-0.1, -HeaderScore.TextBounds.x, HeaderName.Position.Y.Scale, 0), + UDim2.new( + -0.1, + -HeaderScore.TextBounds.x, + HeaderName.Position.Y.Scale, + 0 + ), "Out", "Linear", BASE_TWEEN * 1.2, true ) - HeaderFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeHeader"] - BottomFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeBottom"] + HeaderFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["LargeHeader"] + BottomFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["LargeBottom"] for index, i in ipairs(MiddleFrameBackgrounds) do if (index % 2) ~= 1 then - i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeDark"] + i.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["LargeDark"] else - i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeLight"] + i.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["LargeLight"] end end for _, i in ipairs(MiddleFrames) do if i:FindFirstChild "ClickListener" then - i.ClickListener.Size = UDim2.new(0.974, 0, i.ClickListener.Size.Y.Scale, 0) + i.ClickListener.Size = + UDim2.new(0.974, 0, i.ClickListener.Size.Y.Scale, 0) end for j = 1, #ScoreNames, 1 do local scoreval = ScoreNames[j] if i:FindFirstChild(scoreval["Name"]) then i[scoreval["Name"]]:TweenPosition( - UDim2.new(0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, 0, 0, 0), + UDim2.new( + 0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, + 0, + 0, + 0 + ), "Out", "Linear", BASE_TWEEN, @@ -1769,9 +1918,22 @@ function UpdateMaximize() end else if not IsMinimized.Value then - MainFrame:TweenSizeAndPosition(NormalBounds, NormalPosition, "Out", "Linear", BASE_TWEEN * 1.2, true) + MainFrame:TweenSizeAndPosition( + NormalBounds, + NormalPosition, + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) end - HeaderScore:TweenPosition(UDim2.new(0, 0, 0.4, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + HeaderScore:TweenPosition( + UDim2.new(0, 0, 0.4, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) HeaderName:TweenPosition( UDim2.new(0, 0, HeaderName.Position.Y.Scale, 0), "Out", @@ -1779,24 +1941,37 @@ function UpdateMaximize() BASE_TWEEN * 1.2, true ) - HeaderFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["NormalHeader"] - BottomFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["NormalBottom"] + HeaderFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["NormalHeader"] + BottomFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["NormalBottom"] for index, i in ipairs(MiddleFrameBackgrounds) do if index % 2 ~= 1 then - i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midDark"] + i.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["midDark"] else - i.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midLight"] + i.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["midLight"] end end for _, i in ipairs(MiddleFrames) do if i:FindFirstChild "ClickListener" then - i.ClickListener.Size = UDim2.new(0.96, 0, i.ClickListener.Size.Y.Scale, 0) + i.ClickListener.Size = + UDim2.new(0.96, 0, i.ClickListener.Size.Y.Scale, 0) for j = 1, #ScoreNames, 1 do local scoreval = ScoreNames[j] - if i:FindFirstChild(scoreval["Name"]) and scoreval["XOffset"] then + if + i:FindFirstChild(scoreval["Name"]) + and scoreval["XOffset"] + then --print('updateing stat position: ' .. scoreval['Name']) i[scoreval["Name"]]:TweenPosition( - UDim2.new(RightEdgeSpace, -scoreval["XOffset"], 0, 0), + UDim2.new( + RightEdgeSpace, + -scoreval["XOffset"], + 0, + 0 + ), "Out", "Linear", BASE_TWEEN, @@ -1808,12 +1983,20 @@ function UpdateMaximize() end for _, entry in ipairs(TeamFrames) do - WaitForChild(entry["Frame"], "TitleFrame").Size = - UDim2.new(0, BaseScreenXSize * 0.9, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( + 0, + BaseScreenXSize * 0.9, + entry["Frame"].TitleFrame.Size.Y.Scale, + 0 + ) end for _, entry in ipairs(PlayerFrames) do - WaitForChild(entry["Frame"], "TitleFrame").Size = - UDim2.new(0, BaseScreenXSize * 0.9, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( + 0, + BaseScreenXSize * 0.9, + entry["Frame"].TitleFrame.Size.Y.Scale, + 0 + ) end end end @@ -1822,13 +2005,24 @@ function ExpandNames() if #ScoreNames ~= 0 then for _, i in pairs(StatTitles:GetChildren()) do Spawn(function() - TweenProperty(i, "TextTransparency", i.TextTransparency, 0, BASE_TWEEN) + TweenProperty( + i, + "TextTransparency", + i.TextTransparency, + 0, + BASE_TWEEN + ) end) end HeaderFrameHeight = 0.09 --as of writing, this and 'CloseNames' are the only places headerframe is resized HeaderFrame:TweenSizeAndPosition( - UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), + UDim2.new( + HeaderFrame.Size.X.Scale, + HeaderFrame.Size.X.Offset, + HeaderFrameHeight, + 0 + ), HeaderFrame.Position, "Out", "Linear", @@ -1842,7 +2036,13 @@ function ExpandNames() BASE_TWEEN * 1.2, true ) - BottomShiftFrame:TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + BottomShiftFrame:TweenPosition( + UDim2.new(0, 0, HeaderFrameHeight, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) end end @@ -1852,13 +2052,30 @@ function CloseNames() if not IsMaximized.Value then for _, i in pairs(StatTitles:GetChildren()) do Spawn(function() - TweenProperty(i, "TextTransparency", i.TextTransparency, 1, BASE_TWEEN) + TweenProperty( + i, + "TextTransparency", + i.TextTransparency, + 1, + BASE_TWEEN + ) end) end end - BottomShiftFrame:TweenPosition(UDim2.new(0, 0, HeaderFrameHeight, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + BottomShiftFrame:TweenPosition( + UDim2.new(0, 0, HeaderFrameHeight, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) HeaderFrame:TweenSizeAndPosition( - UDim2.new(HeaderFrame.Size.X.Scale, HeaderFrame.Size.X.Offset, HeaderFrameHeight, 0), + UDim2.new( + HeaderFrame.Size.X.Scale, + HeaderFrame.Size.X.Offset, + HeaderFrameHeight, + 0 + ), HeaderFrame.Position, "Out", "Linear", @@ -1886,9 +2103,17 @@ end function OnScrollWheelMove(direction) if not (IsTabified.Value or IsMinimized.Value or InPopupWaitForClick) then local StartFrame = ListFrame.Position - local newFrameY = math.max(math.min(StartFrame.Y.Scale + direction, GetMaxScroll()), GetMinScroll()) + local newFrameY = math.max( + math.min(StartFrame.Y.Scale + direction, GetMaxScroll()), + GetMinScroll() + ) - ListFrame.Position = UDim2.new(StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset) + ListFrame.Position = UDim2.new( + StartFrame.X.Scale, + StartFrame.X.Offset, + newFrameY, + StartFrame.Y.Offset + ) UpdateScrollPosition() end end @@ -1964,13 +2189,26 @@ function UpdateScrollPosition() local maxPos = GetMaxScroll() local scrollLength = maxPos - minPos - local yscrollpos = math.max(math.min(ListFrame.Position.Y.Scale, maxPos), minPos) - ListFrame.Position = - UDim2.new(ListFrame.Position.X.Scale, ListFrame.Position.X.Offset, yscrollpos, ListFrame.Position.Y.Offset) + local yscrollpos = + math.max(math.min(ListFrame.Position.Y.Scale, maxPos), minPos) + ListFrame.Position = UDim2.new( + ListFrame.Position.X.Scale, + ListFrame.Position.X.Offset, + yscrollpos, + ListFrame.Position.Y.Offset + ) local adjustedLength = 1 - ScrollBar.Size.Y.Scale - ScrollBar.Position = - UDim2.new(0, 0, adjustedLength - (adjustedLength * ((ListFrame.Position.Y.Scale - minPos) / scrollLength)), 0) + ScrollBar.Position = UDim2.new( + 0, + 0, + adjustedLength + - ( + adjustedLength + * ((ListFrame.Position.Y.Scale - minPos) / scrollLength) + ), + 0 + ) end --[[ @@ -1996,20 +2234,33 @@ function StartDrag(entry, startx, starty) ActivatePlayerEntryPanel(entry) end end - local startY = nil + local startY local StartFrame = ListFrame.Position local function dragpoll(nx, ny) if not startY then startY = AbsoluteToPercent(nx, ny).Y end local nowY = AbsoluteToPercent(nx, ny).Y - debugprint("drag dist:" .. Vector2.new(startx - nx, starty - ny).magnitude) - if Vector2.new(startx - nx, starty - ny).magnitude > MOUSE_DRAG_DISTANCE then + debugprint( + "drag dist:" .. Vector2.new(startx - nx, starty - ny).magnitude + ) + if + Vector2.new(startx - nx, starty - ny).magnitude + > MOUSE_DRAG_DISTANCE + then openPanel = false end - local newFrameY = math.max(math.min(StartFrame.Y.Scale + (nowY - startY), GetMaxScroll()), GetMinScroll()) - ListFrame.Position = UDim2.new(StartFrame.X.Scale, StartFrame.X.Offset, newFrameY, StartFrame.Y.Offset) + local newFrameY = math.max( + math.min(StartFrame.Y.Scale + (nowY - startY), GetMaxScroll()), + GetMinScroll() + ) + ListFrame.Position = UDim2.new( + StartFrame.X.Scale, + StartFrame.X.Offset, + newFrameY, + StartFrame.Y.Offset + ) UpdateScrollPosition() end WaitForClick(ScreenGui, dragpoll, dragExit) @@ -2031,7 +2282,7 @@ function StartMinimizeDrag() end -- stopDrag = true end - local startY = nil + local startY local StartFrame = DefaultBottomClipPos local function dragpoll(nx, ny) if not IsMinimized.Value then @@ -2042,14 +2293,26 @@ function StartMinimizeDrag() local newFrameY newFrameY = math.min( math.max(StartFrame + (nowY - startY), -1), - -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) + -1 + + ( + #MiddleFrameBackgrounds + * MiddleBGTemplate.Size.Y.Scale + ) ) DefaultBottomClipPos = newFrameY UpdateMinimize() - ScrollBarFrame.Size = - UDim2.new(ScrollBarFrame.Size.X.Scale, 0, (DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale), 0) - ScrollBarFrame.Position = - UDim2.new(ScrollBarFrame.Position.X.Scale, 0, 1 - ScrollBarFrame.Size.Y.Scale, 0) + ScrollBarFrame.Size = UDim2.new( + ScrollBarFrame.Size.X.Scale, + 0, + (DefaultBottomClipPos + BottomClipFrame.Size.Y.Scale), + 0 + ) + ScrollBarFrame.Position = UDim2.new( + ScrollBarFrame.Position.X.Scale, + 0, + 1 - ScrollBarFrame.Size.Y.Scale, + 0 + ) UpdateScrollBarSize() UpdateScrollPosition() UpdateScrollBarVisibility() @@ -2121,18 +2384,23 @@ end) --]] function AddMiddleBGFrame() local nBGFrame = MiddleBGTemplate:Clone() - nBGFrame.Position = UDim2.new(0.5, 0, (#MiddleFrameBackgrounds * nBGFrame.Size.Y.Scale), 0) + nBGFrame.Position = + UDim2.new(0.5, 0, (#MiddleFrameBackgrounds * nBGFrame.Size.Y.Scale), 0) if (#MiddleFrameBackgrounds + 1) % 2 ~= 1 then if IsMaximized.Value then - nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeDark"] + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["LargeDark"] else - nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midDark"] + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["midDark"] end else if IsMaximized.Value then - nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["LargeLight"] + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["LargeLight"] else - nBGFrame.Background.Image = "http://www.roblox.com/asset/?id=" .. Images["midLight"] + nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" + .. Images["midLight"] end end nBGFrame.Parent = ListFrame @@ -2140,7 +2408,8 @@ function AddMiddleBGFrame() if #MiddleFrameBackgrounds < DefaultListSize and not DidMinimizeDrag then --print('readjusting bottom clip') - DefaultBottomClipPos = -1 + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) + DefaultBottomClipPos = -1 + + (#MiddleFrameBackgrounds * MiddleBGTemplate.Size.Y.Scale) end if not IsMinimized.Value then @@ -2160,7 +2429,17 @@ end ------------------------------- -- Player Callback functions ------------------------------- -local FONT_SIZES = { "Size8", "Size9", "Size10", "Size11", "Size12", "Size14", "Size24", "Size36", "Size48" } +local FONT_SIZES = { + "Size8", + "Size9", + "Size10", + "Size11", + "Size12", + "Size14", + "Size24", + "Size36", + "Size48", +} --[[ note:should probably set to something other than mainFrame.AbsoluteSize, should work for now if textbounds ever works on textscaled, switch to that :( @@ -2239,7 +2518,13 @@ function ClosePopUpPanel() TweenProperty(tframe, "BackgroundTransparency", 0.5, 1, BASE_TWEEN) end) end - PopUpPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) + PopUpPanel:TweenPosition( + UDim2.new(1, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) wait(0.1) InPopupWaitForClick = false SelectedPlayerEntry = nil @@ -2263,7 +2548,8 @@ function InitMovingPanel(entry, player) debugprint(tostring(friendStatus)) local showRankMenu = IsPersonalServer and LocalPlayer.PersonalServerRank >= PrivilegeLevel["Admin"] - and LocalPlayer.PersonalServerRank > SelectedPlayer.PersonalServerRank + and LocalPlayer.PersonalServerRank + > SelectedPlayer.PersonalServerRank local ReportPlayerButton = MakePopupButton(PopUpPanel, "Report Player", 0) ReportPlayerButton.MouseButton1Click:connect(function() @@ -2273,28 +2559,36 @@ function InitMovingPanel(entry, player) PopUpPanel, "Friend", 1, - not showRankMenu and friendStatus ~= Enum.FriendStatus.FriendRequestReceived + not showRankMenu + and friendStatus ~= Enum.FriendStatus.FriendRequestReceived ) FriendPlayerButton.MouseButton1Click:connect(OnFriendButtonSelect) if friendStatus == Enum.FriendStatus.Friend then FriendPlayerButton:FindFirstChild("ButtonText").Text = "UnFriend Player" - elseif friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend then + elseif + friendStatus == Enum.FriendStatus.Unknown + or friendStatus == Enum.FriendStatus.NotFriend + then FriendPlayerButton:FindFirstChild("ButtonText").Text = "Send Request" elseif friendStatus == Enum.FriendStatus.FriendRequestSent then FriendPlayerButton:FindFirstChild("ButtonText").Text = "Revoke Request" elseif friendStatus == Enum.FriendStatus.FriendRequestReceived then FriendPlayerButton:FindFirstChild("ButtonText").Text = "Accept Friend" - local FriendRefuseButton = MakePopupButton(PopUpPanel, "Decline Friend", 2, not showRankMenu) + local FriendRefuseButton = + MakePopupButton(PopUpPanel, "Decline Friend", 2, not showRankMenu) FriendRefuseButton.MouseButton1Click:connect(OnFriendRefuseButtonSelect) nextIndex = nextIndex + 1 end if showRankMenu then local BanPlayerButton = MakePopupButton(PopUpPanel, "Ban", nextIndex) - local VisitorButton = MakePopupButton(PopUpPanel, "Visitor", nextIndex + 1) - local MemberButton = MakePopupButton(PopUpPanel, "Member", nextIndex + 2) - local AdminButton = MakePopupButton(PopUpPanel, "Admin", nextIndex + 3, true) + local VisitorButton = + MakePopupButton(PopUpPanel, "Visitor", nextIndex + 1) + local MemberButton = + MakePopupButton(PopUpPanel, "Member", nextIndex + 2) + local AdminButton = + MakePopupButton(PopUpPanel, "Admin", nextIndex + 3, true) BanPlayerButton.MouseButton1Click:connect(function() OnPrivilegeLevelSelect( @@ -2337,10 +2631,22 @@ function InitMovingPanel(entry, player) ) end) - HighlightMyRank(SelectedPlayer, BanPlayerButton, VisitorButton, MemberButton, AdminButton) + HighlightMyRank( + SelectedPlayer, + BanPlayerButton, + VisitorButton, + MemberButton, + AdminButton + ) end - PopUpPanel:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN, true) + PopUpPanel:TweenPosition( + UDim2.new(0, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) Delay(0, function() local tconnection tconnection = Mouse.Button1Down:connect(function() @@ -2355,8 +2661,12 @@ function InitMovingPanel(entry, player) -- sometimes garbage is the only option. Spawn(function() while InPopupWaitForClick do - PopUpClipFrame.Position = - UDim2.new(0, myFrame.AbsolutePosition.X - PopUpClipFrame.Size.X.Offset, 0, myFrame.AbsolutePosition.Y) + PopUpClipFrame.Position = UDim2.new( + 0, + myFrame.AbsolutePosition.X - PopUpClipFrame.Size.X.Offset, + 0, + myFrame.AbsolutePosition.Y + ) wait() end end) @@ -2416,23 +2726,30 @@ function InsertPlayerFrame(nplayer) AddingFrameLock = true local nFrame = MiddleTemplate:Clone() - WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = nplayer.Name + WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = + nplayer.Name nFrame.Position = UDim2.new(1, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0) local nfriendstatus = GetFriendStatus(nplayer) - nFrame:FindFirstChild("BCLabel").Image = getMembershipTypeIcon(nplayer.MembershipType, nplayer.Name) - nFrame:FindFirstChild("FriendLabel").Image = getFriendStatusIcon(nfriendstatus) + nFrame:FindFirstChild("BCLabel").Image = + getMembershipTypeIcon(nplayer.MembershipType, nplayer.Name) + nFrame:FindFirstChild("FriendLabel").Image = + getFriendStatusIcon(nfriendstatus) nFrame.Name = nplayer.Name - WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = nplayer.Name + WaitForChild(WaitForChild(nFrame, "TitleFrame"), "Title").Text = + nplayer.Name --move for bc label - nFrame.FriendLabel.Position = nFrame.FriendLabel.Position + UDim2.new(0, 17, 0, 0) - nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + UDim2.new(0, 17, 0, 0) + nFrame.FriendLabel.Position = nFrame.FriendLabel.Position + + UDim2.new(0, 17, 0, 0) + nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + + UDim2.new(0, 17, 0, 0) if nFrame:FindFirstChild("FriendLabel").Image ~= "" then - nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + UDim2.new(0, 17, 0, 0) + nFrame.TitleFrame.Title.Position = nFrame.TitleFrame.Title.Position + + UDim2.new(0, 17, 0, 0) end if nplayer.Name == LocalPlayer.Name then @@ -2443,7 +2760,8 @@ function InsertPlayerFrame(nplayer) dropShadow.TextColor3 = Color3.new(0, 0, 0) dropShadow.TextTransparency = 0 dropShadow.ZIndex = 2 - dropShadow.Position = nFrame.TitleFrame.Title.Position + UDim2.new(0, 1, 0, 1) + dropShadow.Position = nFrame.TitleFrame.Title.Position + + UDim2.new(0, 1, 0, 1) dropShadow.Name = "DropShadow" dropShadow.Parent = nFrame.TitleFrame -- else @@ -2452,7 +2770,13 @@ function InsertPlayerFrame(nplayer) nFrame.TitleFrame.Title.Font = "ArialBold" nFrame.Parent = ListFrame - nFrame:TweenPosition(UDim2.new(0.5, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0), "Out", "Linear", BASE_TWEEN, true) + nFrame:TweenPosition( + UDim2.new(0.5, 0, (#MiddleFrames * nFrame.Size.Y.Scale), 0), + "Out", + "Linear", + BASE_TWEEN, + true + ) UpdateMinimize() local nentry = {} nentry["Frame"] = nFrame @@ -2649,9 +2973,11 @@ function AddTeamScores(team) local i = ScoreNames[j] local tscore = 0 for _, j in ipairs(team["MyPlayers"]) do - local tval = j["Player"]:FindFirstChild "leaderstats" and j["Player"].leaderstats:FindFirstChild(i["Name"]) + local tval = j["Player"]:FindFirstChild "leaderstats" + and j["Player"].leaderstats:FindFirstChild(i["Name"]) if tval and not tval:IsA "StringValue" then - tscore = tscore + GetScoreValue((j["Player"].leaderstats)[i["Name"]]) + tscore = tscore + + GetScoreValue((j["Player"].leaderstats)[i["Name"]]) end end if team["Frame"]:FindFirstChild(i["Name"]) then @@ -2770,17 +3096,24 @@ function PlayerChanged(entry, property) SetPlayerToTeam(entry) end BaseUpdate() - elseif property == "TeamColor" and not entry["Player"].Neutral and entry["Player"] ~= entry["MyTeam"] then + elseif + property == "TeamColor" + and not entry["Player"].Neutral + and entry["Player"] ~= entry["MyTeam"] + then debugprint(entry["Player"].Name .. "setting to new team") SetPlayerToTeam(entry) BaseUpdate() elseif property == "Name" or property == "MembershipType" then - entry["Frame"]:FindFirstChild("BCLabel").Image = - getMembershipTypeIcon(entry["Player"].MembershipType, entry["Player"].Name) + entry["Frame"]:FindFirstChild("BCLabel").Image = getMembershipTypeIcon( + entry["Player"].MembershipType, + entry["Player"].Name + ) entry["Frame"].Name = entry["Player"].Name entry["Frame"].TitleFrame.Title.Text = entry["Player"].Name if entry["Frame"].BCLabel.Image ~= "" then - entry["Frame"].TitleFrame.Title.Position = UDim2.new(0.01, 30, 0.1, 0) + entry["Frame"].TitleFrame.Title.Position = + UDim2.new(0.01, 30, 0.1, 0) end if entry["Player"] == LocalPlayer then entry["Frame"].TitleFrame.DropShadow.Text = entry["Player"].Name @@ -2807,7 +3140,9 @@ function OnFriendshipChanged(player, friendStatus) if nicon == "" and entry["Frame"].FriendLabel.Image ~= "" then entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position - UDim2.new(0, 17, 0, 0) - elseif nicon ~= "" and entry["Frame"].FriendLabel.Image == "" then + elseif + nicon ~= "" and entry["Frame"].FriendLabel.Image == "" + then entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + UDim2.new(0, 17, 0, 0) debugprint("confirmed status:" .. player.Name) @@ -2839,16 +3174,28 @@ function AddNeutralTeam() nentry["MyTeam"] = defaultTeam nentry["MyPlayers"] = {} nentry["Frame"] = MiddleTemplate:Clone() - WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = defaultTeam.Name - nentry["Frame"].TitleFrame.Position = - UDim2.new(nentry["Frame"].TitleFrame.Position.X.Scale, nentry["Frame"].TitleFrame.Position.X.Offset, 0.1, 0) - nentry["Frame"].TitleFrame.Size = - UDim2.new(nentry["Frame"].TitleFrame.Size.X.Scale, nentry["Frame"].TitleFrame.Size.X.Offset, 0.8, 0) + WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = + defaultTeam.Name + nentry["Frame"].TitleFrame.Position = UDim2.new( + nentry["Frame"].TitleFrame.Position.X.Scale, + nentry["Frame"].TitleFrame.Position.X.Offset, + 0.1, + 0 + ) + nentry["Frame"].TitleFrame.Size = UDim2.new( + nentry["Frame"].TitleFrame.Size.X.Scale, + nentry["Frame"].TitleFrame.Size.X.Offset, + 0.8, + 0 + ) nentry["Frame"].TitleFrame.Title.Font = "ArialBold" - nentry["Frame"].Position = UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) - WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect(function(nx, ny) - StartDrag(nentry, nx, ny) - end) + nentry["Frame"].Position = + UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) + WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect( + function(nx, ny) + StartDrag(nentry, nx, ny) + end + ) nentry["Frame"].ClickListener.BackgroundColor3 = Color3.new(1, 1, 1) nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 nentry["Frame"].ClickListener.AutoButtonColor = false @@ -2894,7 +3241,8 @@ function TeamChildAdded(entry, nchild) if nchild.Name == "AutoHide" then entry["AutoHide"] = true elseif nchild.Name == "TeamScore" then - WaitForChild(entry["Frame"], "PlayerScore").Text = tostring(nchild.Value) + WaitForChild(entry["Frame"], "PlayerScore").Text = + tostring(nchild.Value) entry["TeamScore"] = nchild.Value nchild.Changed:connect(function() TeamScoreChanged(entry, nchild.Value) @@ -2916,9 +3264,11 @@ end function TeamChanged(entry, property) if property == "Name" then - WaitForChild(WaitForChild(entry["Frame"], "TitleFrame"), "Title").Text = entry["MyTeam"].Name + WaitForChild(WaitForChild(entry["Frame"], "TitleFrame"), "Title").Text = + entry["MyTeam"].Name elseif property == "TeamColor" then - entry["Frame"].ClickListener.BackgroundColor3 = entry["MyTeam"].TeamColor.Color + entry["Frame"].ClickListener.BackgroundColor3 = + entry["MyTeam"].TeamColor.Color for _, i in pairs(TeamFrames) do if i["MyTeam"].TeamColor == entry["MyTeam"] then @@ -2953,17 +3303,29 @@ function InsertTeamFrame(nteam) nentry["MyTeam"] = nteam nentry["MyPlayers"] = {} nentry["Frame"] = MiddleTemplate:Clone() - WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = nteam.Name + WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = + nteam.Name nentry["Frame"].TitleFrame.Title.Font = "ArialBold" nentry["Frame"].TitleFrame.Title.FontSize = "Size18" - nentry["Frame"].TitleFrame.Position = - UDim2.new(nentry["Frame"].TitleFrame.Position.X.Scale, nentry["Frame"].TitleFrame.Position.X.Offset, 0.1, 0) - nentry["Frame"].TitleFrame.Size = - UDim2.new(nentry["Frame"].TitleFrame.Size.X.Scale, nentry["Frame"].TitleFrame.Size.X.Offset, 0.8, 0) - nentry["Frame"].Position = UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) - WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect(function(nx, ny) - StartDrag(nentry, nx, ny) - end) + nentry["Frame"].TitleFrame.Position = UDim2.new( + nentry["Frame"].TitleFrame.Position.X.Scale, + nentry["Frame"].TitleFrame.Position.X.Offset, + 0.1, + 0 + ) + nentry["Frame"].TitleFrame.Size = UDim2.new( + nentry["Frame"].TitleFrame.Size.X.Scale, + nentry["Frame"].TitleFrame.Size.X.Offset, + 0.8, + 0 + ) + nentry["Frame"].Position = + UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) + WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect( + function(nx, ny) + StartDrag(nentry, nx, ny) + end + ) nentry["Frame"].ClickListener.BackgroundColor3 = nteam.TeamColor.Color nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 nentry["Frame"].ClickListener.AutoButtonColor = false @@ -2988,7 +3350,10 @@ function InsertTeamFrame(nteam) end) for _, i in pairs(PlayerFrames) do - if not i["Player"].Neutral and i["Player"].TeamColor == nteam.TeamColor then + if + not i["Player"].Neutral + and i["Player"].TeamColor == nteam.TeamColor + then AddPlayerToTeam(nentry, i) end end @@ -3119,11 +3484,22 @@ game.GuiService.KeyPressed:connect(function(key) LastTabTime = time() if IsTabified.Value then if not IsMaximized.Value then - ScreenGui:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Linear", BASE_TWEEN * 1.2, true) + ScreenGui:TweenPosition( + UDim2.new(0, 0, 0, 0), + "Out", + "Linear", + BASE_TWEEN * 1.2, + true + ) IsMaximized.Value = true else ScreenGui:TweenPosition( - UDim2.new(NormalBounds.X.Scale, NormalBounds.X.Offset - 10, 0, 0), + UDim2.new( + NormalBounds.X.Scale, + NormalBounds.X.Offset - 10, + 0, + 0 + ), "Out", "Linear", BASE_TWEEN * 1.2, @@ -3151,7 +3527,10 @@ function PlayersChildAdded(tplayer) end function coreGuiChanged(coreGuiType, enabled) - if coreGuiType == Enum.CoreGuiType.All or coreGuiType == Enum.CoreGuiType.PlayerList then + if + coreGuiType == Enum.CoreGuiType.All + or coreGuiType == Enum.CoreGuiType.PlayerList + then MainFrame.Visible = enabled end end @@ -3180,7 +3559,10 @@ function debugPlayerAdd(p) end pcall(function() - coreGuiChanged(Enum.CoreGuiType.PlayerList, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.PlayerList)) + coreGuiChanged( + Enum.CoreGuiType.PlayerList, + Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.PlayerList) + ) Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) end) @@ -3214,7 +3596,10 @@ IsPersonalServer = not not game.Workspace:FindFirstChild "PSVariable" ---------------------------- --debug stuffs, will only run for 'newplayerlistisbad' -if LocalPlayer.Name == "newplayerlistisbad" or LocalPlayer.Name == "imtotallyadmin" then +if + LocalPlayer.Name == "newplayerlistisbad" + or LocalPlayer.Name == "imtotallyadmin" +then debugFrame.Parent = ScreenGui Spawn(function() while true do diff --git a/lua/48488398.lua b/lua/48488398.lua index bb9e594..9374322 100644 --- a/lua/48488398.lua +++ b/lua/48488398.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 48488398" function waitForProperty(instance, property) while not instance[property] do instance.Changed:wait() @@ -15,7 +16,7 @@ waitForChild(script.Parent.Popup, "AcceptButton") script.Parent.Popup.AcceptButton.Modal = true local localPlayer = game.Players.LocalPlayer -local teleportUI = nil +local teleportUI local friendRequestBlacklist = {} @@ -39,8 +40,10 @@ function makeFriend(fromPlayer, toPlayer) return end -- previously cancelled friend request, we don't want it! - popup.PopupText.Text = "Accept Friend Request from " .. tostring(fromPlayer.Name) .. "?" - popup.PopupImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?userId=" + popup.PopupText.Text = "Accept Friend Request from " + .. tostring(fromPlayer.Name) + .. "?" + popup.PopupImage.Image = "http://banland.xyz/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=352&y=352" @@ -48,7 +51,13 @@ function makeFriend(fromPlayer, toPlayer) popup.Visible = true popup.AcceptButton.Text = "Accept" popup.DeclineButton.Text = "Decline" - popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + popup:TweenSize( + UDim2.new(0, 330, 0, 350), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true + ) local yesCon, noCon @@ -104,7 +113,9 @@ game.Players.FriendRequestEvent:connect(function(fromPlayer, toPlayer, event) game:GetService("GuiService"):SendNotification( "You are Friends", "With " .. toPlayer.Name .. "!", - "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(toPlayer.userId) .. "&x=48&y=48", + "http://banland.xyz/thumbs/avatar.ashx?userId=" + .. tostring(toPlayer.userId) + .. "&x=48&y=48", 5, function() end ) @@ -117,7 +128,9 @@ game.Players.FriendRequestEvent:connect(function(fromPlayer, toPlayer, event) game:GetService("GuiService"):SendNotification( "Friend Request", "From " .. fromPlayer.Name, - "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48", + "http://banland.xyz/thumbs/avatar.ashx?userId=" + .. tostring(fromPlayer.userId) + .. "&x=48&y=48", 8, function() makeFriend(fromPlayer, toPlayer) @@ -127,7 +140,9 @@ game.Players.FriendRequestEvent:connect(function(fromPlayer, toPlayer, event) game:GetService("GuiService"):SendNotification( "You are Friends", "With " .. fromPlayer.Name .. "!", - "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48", + "http://banland.xyz/thumbs/avatar.ashx?userId=" + .. tostring(fromPlayer.userId) + .. "&x=48&y=48", 5, function() end ) @@ -176,7 +191,10 @@ function onTeleport(teleportState, _, _) elseif teleportState == Enum.TeleportState.InProgress then showTeleportUI("Teleporting...", 0) elseif teleportState == Enum.TeleportState.Failed then - showTeleportUI("Teleport failed. Insufficient privileges or target place does not exist.", 3) + showTeleportUI( + "Teleport failed. Insufficient privileges or target place does not exist.", + 3 + ) end end end @@ -194,7 +212,9 @@ if teleportEnabled then if clickCon then clickCon:disconnect() end - game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup") + game.GuiService:RemoveCenterDialog( + script.Parent:FindFirstChild "Popup" + ) popup:TweenSize( UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, @@ -211,7 +231,13 @@ if teleportEnabled then function() showOneButton() script.Parent:FindFirstChild("Popup").Visible = true - popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + popup:TweenSize( + UDim2.new(0, 330, 0, 350), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true + ) end, --HideFunction function() @@ -226,7 +252,11 @@ if teleportEnabled then end ) end - game:GetService("TeleportService").ConfirmationCallback = function(message, placeId, spawnName) + game:GetService("TeleportService").ConfirmationCallback = function( + message, + placeId, + spawnName + ) local popup = script.Parent:FindFirstChild "Popup" popup.PopupText.Text = message popup.PopupImage.Image = "" @@ -240,7 +270,9 @@ if teleportEnabled then if noCon then noCon:disconnect() end - game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup") + game.GuiService:RemoveCenterDialog( + script.Parent:FindFirstChild "Popup" + ) popup:TweenSize( UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, @@ -254,7 +286,8 @@ if teleportEnabled then yesCon = popup.AcceptButton.MouseButton1Click:connect(function() killCons() local success, err = pcall(function() - game:GetService("TeleportService"):TeleportImpl(placeId, spawnName) + game:GetService("TeleportService") + :TeleportImpl(placeId, spawnName) end) if not success then showOneButton() @@ -264,7 +297,9 @@ if teleportEnabled then if clickCon then clickCon:disconnect() end - game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup") + game.GuiService:RemoveCenterDialog( + script.Parent:FindFirstChild "Popup" + ) popup:TweenSize( UDim2.new(0, 0, 0, 0), Enum.EasingDirection.Out, @@ -347,7 +382,13 @@ if teleportEnabled then script.Parent:FindFirstChild("Popup").Visible = true popup.AcceptButton.Text = "Leave" popup.DeclineButton.Text = "Stay" - popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true) + popup:TweenSize( + UDim2.new(0, 330, 0, 350), + Enum.EasingDirection.Out, + Enum.EasingStyle.Quart, + 1, + true + ) end return true end diff --git a/lua/48488451.lua b/lua/48488451.lua index f93b7c3..76f8558 100644 --- a/lua/48488451.lua +++ b/lua/48488451.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 48488451" --build our gui local popupFrame = Instance.new "Frame" @@ -52,7 +53,7 @@ popupImage.Parent = popupFrame local backing = Instance.new "ImageLabel" backing.BackgroundTransparency = 1 backing.Size = UDim2.new(1, 0, 1, 0) -backing.Image = "http://www.roblox.com/asset/?id=47574181" +backing.Image = "http://banland.xyz/asset/?id=47574181" backing.Name = "Backing" backing.ZIndex = 2 backing.Parent = popupImage diff --git a/lua/53878047.lua b/lua/53878047.lua index eb5b87d..e9a6f25 100644 --- a/lua/53878047.lua +++ b/lua/53878047.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 53878047" -- This script creates almost all gui elements found in the backpack (warning: there are a lot!) -- TODO: automate this process @@ -49,7 +50,7 @@ CurrentLoadout.Parent = gui local CLBackground = Instance.new "ImageLabel" CLBackground.Name = "Background" CLBackground.Size = UDim2.new(1.2, 0, 1.2, 0) -CLBackground.Image = "http://www.roblox.com/asset/?id=96536002" +CLBackground.Image = "http://banland.xyz/asset/?id=96536002" CLBackground.BackgroundTransparency = 1 CLBackground.Position = UDim2.new(-0.1, 0, -0.1, 0) CLBackground.ZIndex = 0.0 @@ -59,7 +60,7 @@ CLBackground.Visible = false local BackgroundUp = Instance.new "ImageLabel" BackgroundUp.Size = UDim2.new(1, 0, 0.025, 1) BackgroundUp.Position = UDim2.new(0, 0, 0, 0) -BackgroundUp.Image = "http://www.roblox.com/asset/?id=97662207" +BackgroundUp.Image = "http://banland.xyz/asset/?id=97662207" BackgroundUp.BackgroundTransparency = 1 BackgroundUp.Parent = CLBackground @@ -73,7 +74,7 @@ BackpackButton.RobloxLocked = true BackpackButton.Visible = false BackpackButton.Name = "BackpackButton" BackpackButton.BackgroundTransparency = 1 -BackpackButton.Image = "http://www.roblox.com/asset/?id=97617958" +BackpackButton.Image = "http://banland.xyz/asset/?id=97617958" BackpackButton.Position = UDim2.new(0.5, -60, 1, -108) BackpackButton.Size = UDim2.new(0, 120, 0, 18) waitForChild(gui, "ControlFrame") @@ -106,7 +107,12 @@ for i = 0, NumSlots do if gui.AbsoluteSize.Y <= 320 then slotFrame.Position = UDim2.new(0, (i - 1) * 60, 0, -50) - print("Well got here", slotFrame, slotFrame.Position.X.Scale, slotFrame.Position.X.Offset) + print( + "Well got here", + slotFrame, + slotFrame.Position.X.Scale, + slotFrame.Position.X.Offset + ) end if gui.AbsoluteSize.Y <= 320 and i == 0 then slotFrame:Destroy() @@ -127,14 +133,14 @@ TempSlot.ZIndex = 3.0 local slotBackground = Instance.new "ImageLabel" slotBackground.Name = "Background" slotBackground.BackgroundTransparency = 1 -slotBackground.Image = "http://www.roblox.com/asset/?id=97613075" +slotBackground.Image = "http://banland.xyz/asset/?id=97613075" slotBackground.Size = UDim2.new(1, 0, 1, 0) slotBackground.Parent = TempSlot local HighLight = Instance.new "ImageLabel" HighLight.Name = "Highlight" HighLight.BackgroundTransparency = 1 -HighLight.Image = "http://www.roblox.com/asset/?id=97643886" +HighLight.Image = "http://banland.xyz/asset/?id=97643886" HighLight.Size = UDim2.new(1, 0, 1, 0) --HighLight.Parent = TempSlot HighLight.Visible = false @@ -328,8 +334,9 @@ closeButton.Modal = true local XImage = Instance.new "ImageLabel" XImage.RobloxLocked = true XImage.Name = "XImage" -game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75547445" -XImage.Image = "http://www.roblox.com/asset/?id=75547445" --TODO: move to rbxasset +game:GetService("ContentProvider") + :Preload "http://banland.xyz/asset/?id=75547445" +XImage.Image = "http://banland.xyz/asset/?id=75547445" --TODO: move to rbxasset XImage.BackgroundTransparency = 1 XImage.Position = UDim2.new(-0.25, -1, -0.25, -1) XImage.Size = UDim2.new(1.5, 2, 1.5, 2) @@ -431,7 +438,7 @@ GearButton.Parent = GearGrid local slotBackground = Instance.new "ImageLabel" slotBackground.Name = "Background" slotBackground.BackgroundTransparency = 1 -slotBackground.Image = "http://www.roblox.com/asset/?id=97613075" +slotBackground.Image = "http://banland.xyz/asset/?id=97613075" slotBackground.Size = UDim2.new(1, 0, 1, 0) slotBackground.Parent = GearButton @@ -760,31 +767,43 @@ CharacterPane.Parent = Wardrobe --CharacterPane Children local FaceFrame = makeCharFrame("FacesFrame", CharacterPane) -game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75460621" +game:GetService("ContentProvider") + :Preload "http://banland.xyz/asset/?id=75460621" makeZone( "FaceZone", - "http://www.roblox.com/asset/?id=75460621", + "http://banland.xyz/asset/?id=75460621", UDim2.new(0, 157, 0, 137), UDim2.new(0.5, -78, 0.5, -68), FaceFrame ) -makeStyledButton("Face", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -135), FaceFrame) +makeStyledButton( + "Face", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, -32, 0.5, -135), + FaceFrame +) local HeadFrame = makeCharFrame("HeadsFrame", CharacterPane) makeZone( "FaceZone", - "http://www.roblox.com/asset/?id=75460621", + "http://banland.xyz/asset/?id=75460621", UDim2.new(0, 157, 0, 137), UDim2.new(0.5, -78, 0.5, -68), HeadFrame ) -makeStyledButton("Head", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -135), HeadFrame) +makeStyledButton( + "Head", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, -32, 0.5, -135), + HeadFrame +) local HatsFrame = makeCharFrame("HatsFrame", CharacterPane) -game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75457888" +game:GetService("ContentProvider") + :Preload "http://banland.xyz/asset/?id=75457888" local HatsZone = makeZone( "HatsZone", - "http://www.roblox.com/asset/?id=75457888", + "http://banland.xyz/asset/?id=75457888", UDim2.new(0, 186, 0, 184), UDim2.new(0.5, -93, 0.5, -100), HatsFrame @@ -812,10 +831,11 @@ makeStyledButton( ) local PantsFrame = makeCharFrame("PantsFrame", CharacterPane) -game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75457920" +game:GetService("ContentProvider") + :Preload "http://banland.xyz/asset/?id=75457920" makeZone( "PantsZone", - "http://www.roblox.com/asset/?id=75457920", + "http://banland.xyz/asset/?id=75457920", UDim2.new(0, 121, 0, 99), UDim2.new(0.5, -60, 0.5, -100), PantsFrame @@ -860,7 +880,12 @@ local leftLegButton = makeStyledButton( MeshFrame, Enum.ButtonStyle.RobloxButton ) -makeTextLabel("LeftLegLabel", "Left Leg", UDim2.new(0.5, -16, 0, -25), leftLegButton) +makeTextLabel( + "LeftLegLabel", + "Left Leg", + UDim2.new(0.5, -16, 0, -25), + leftLegButton +) local rightLegButton = makeStyledButton( "RightLegMeshButton", UDim2.new(0, 64, 0, 64), @@ -868,7 +893,12 @@ local rightLegButton = makeStyledButton( MeshFrame, Enum.ButtonStyle.RobloxButton ) -makeTextLabel("RightLegLabel", "Right Leg", UDim2.new(0.5, -16, 0, -25), rightLegButton) +makeTextLabel( + "RightLegLabel", + "Right Leg", + UDim2.new(0.5, -16, 0, -25), + rightLegButton +) local rightArmButton = makeStyledButton( "RightArmMeshButton", UDim2.new(0, 64, 0, 64), @@ -876,7 +906,12 @@ local rightArmButton = makeStyledButton( MeshFrame, Enum.ButtonStyle.RobloxButton ) -makeTextLabel("RightArmLabel", "Right Arm", UDim2.new(0.5, -16, 0, -25), rightArmButton) +makeTextLabel( + "RightArmLabel", + "Right Arm", + UDim2.new(0.5, -16, 0, -25), + rightArmButton +) local leftArmButton = makeStyledButton( "LeftArmMeshButton", UDim2.new(0, 64, 0, 64), @@ -884,46 +919,96 @@ local leftArmButton = makeStyledButton( MeshFrame, Enum.ButtonStyle.RobloxButton ) -makeTextLabel("LeftArmLabel", "Left Arm", UDim2.new(0.5, -16, 0, -25), leftArmButton) +makeTextLabel( + "LeftArmLabel", + "Left Arm", + UDim2.new(0.5, -16, 0, -25), + leftArmButton +) local TShirtFrame = makeCharFrame("T-ShirtsFrame", CharacterPane) -game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=75460642" +game:GetService("ContentProvider") + :Preload "http://banland.xyz/asset/?id=75460642" makeZone( "TShirtZone", - "http://www.roblox.com/asset/?id=75460642", + "http://banland.xyz/asset/?id=75460642", UDim2.new(0, 121, 0, 154), UDim2.new(0.5, -60, 0.5, -100), TShirtFrame ) -makeStyledButton("TShirtButton", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -64), TShirtFrame) +makeStyledButton( + "TShirtButton", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, -32, 0.5, -64), + TShirtFrame +) local ShirtFrame = makeCharFrame("ShirtsFrame", CharacterPane) makeZone( "ShirtZone", - "http://www.roblox.com/asset/?id=75460642", + "http://banland.xyz/asset/?id=75460642", UDim2.new(0, 121, 0, 154), UDim2.new(0.5, -60, 0.5, -100), ShirtFrame ) -makeStyledButton("ShirtButton", UDim2.new(0, 64, 0, 64), UDim2.new(0.5, -32, 0.5, -64), ShirtFrame) +makeStyledButton( + "ShirtButton", + UDim2.new(0, 64, 0, 64), + UDim2.new(0.5, -32, 0.5, -64), + ShirtFrame +) local ColorFrame = makeCharFrame("ColorFrame", CharacterPane) -game:GetService("ContentProvider"):Preload "http://www.roblox.com/asset/?id=76049888" +game:GetService("ContentProvider") + :Preload "http://banland.xyz/asset/?id=76049888" local ColorZone = makeZone( "ColorZone", - "http://www.roblox.com/asset/?id=76049888", + "http://banland.xyz/asset/?id=76049888", UDim2.new(0, 120, 0, 150), UDim2.new(0.5, -60, 0.5, -100), ColorFrame ) -makeStyledButton("Head", UDim2.new(0.26, 0, 0.19, 0), UDim2.new(0.37, 0, 0.02, 0), ColorZone).AutoButtonColor = false -makeStyledButton("LeftArm", UDim2.new(0.19, 0, 0.36, 0), UDim2.new(0.78, 0, 0.26, 0), ColorZone).AutoButtonColor = false -makeStyledButton("RightArm", UDim2.new(0.19, 0, 0.36, 0), UDim2.new(0.025, 0, 0.26, 0), ColorZone).AutoButtonColor = +makeStyledButton( + "Head", + UDim2.new(0.26, 0, 0.19, 0), + UDim2.new(0.37, 0, 0.02, 0), + ColorZone +).AutoButtonColor = false -makeStyledButton("Torso", UDim2.new(0.43, 0, 0.36, 0), UDim2.new(0.28, 0, 0.26, 0), ColorZone).AutoButtonColor = false -makeStyledButton("RightLeg", UDim2.new(0.19, 0, 0.31, 0), UDim2.new(0.275, 0, 0.67, 0), ColorZone).AutoButtonColor = +makeStyledButton( + "LeftArm", + UDim2.new(0.19, 0, 0.36, 0), + UDim2.new(0.78, 0, 0.26, 0), + ColorZone +).AutoButtonColor = false -makeStyledButton("LeftLeg", UDim2.new(0.19, 0, 0.31, 0), UDim2.new(0.525, 0, 0.67, 0), ColorZone).AutoButtonColor = +makeStyledButton( + "RightArm", + UDim2.new(0.19, 0, 0.36, 0), + UDim2.new(0.025, 0, 0.26, 0), + ColorZone +).AutoButtonColor = + false +makeStyledButton( + "Torso", + UDim2.new(0.43, 0, 0.36, 0), + UDim2.new(0.28, 0, 0.26, 0), + ColorZone +).AutoButtonColor = + false +makeStyledButton( + "RightLeg", + UDim2.new(0.19, 0, 0.31, 0), + UDim2.new(0.275, 0, 0.67, 0), + ColorZone +).AutoButtonColor = + false +makeStyledButton( + "LeftLeg", + UDim2.new(0.19, 0, 0.31, 0), + UDim2.new(0.525, 0, 0.67, 0), + ColorZone +).AutoButtonColor = false -- Character Panel label (shows what category we are currently browsing) diff --git a/lua/53878057.lua b/lua/53878057.lua index 2b3168a..c354fe1 100644 --- a/lua/53878057.lua +++ b/lua/53878057.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 53878057" if game.CoreGui.Version < 3 then return end -- peace out if we aren't using the right client @@ -77,7 +78,8 @@ game.LocalBackpack:SetOldSchoolBackpack(false) waitForChild(currentLoadout.Parent, "Backpack") local guiBackpack = currentLoadout.Parent.Backpack -local backpackManager = waitForChild(guiBackpack, "CoreScripts/BackpackScripts/BackpackManager") +local backpackManager = + waitForChild(guiBackpack, "CoreScripts/BackpackScripts/BackpackManager") local backpackOpenEvent = waitForChild(backpackManager, "BackpackOpenEvent") local backpackCloseEvent = waitForChild(backpackManager, "BackpackCloseEvent") local tabClickedEvent = waitForChild(backpackManager, "TabClickedEvent") @@ -90,8 +92,8 @@ if robloxGui.AbsoluteSize.Y <= 320 then maxNumLoadoutItems = 4 end -local characterChildAddedCon = nil -local backpackChildCon = nil +local characterChildAddedCon +local backpackChildCon local debounce = false @@ -159,7 +161,7 @@ function characterInWorkspace() end function removeGear(gear) - local emptySlot = nil + local emptySlot for i = 1, #gearSlots do if gearSlots[i] == gear and gear.Parent ~= nil then emptySlot = i @@ -168,8 +170,12 @@ function removeGear(gear) end if emptySlot then if gearSlots[emptySlot].GearReference.Value then - if gearSlots[emptySlot].GearReference.Value.Parent == game.Players.LocalPlayer.Character then -- if we currently have this equipped, unequip it - gearSlots[emptySlot].GearReference.Value.Parent = game.Players.LocalPlayer.Backpack + if + gearSlots[emptySlot].GearReference.Value.Parent + == game.Players.LocalPlayer.Character + then -- if we currently have this equipped, unequip it + gearSlots[emptySlot].GearReference.Value.Parent = + game.Players.LocalPlayer.Backpack end if @@ -217,7 +223,7 @@ function removeGear(gear) end function insertGear(gear, addToSlot) - local pos = nil + local pos if not addToSlot then for i = 1, #gearSlots do if gearSlots[i] == "empty" then @@ -269,7 +275,7 @@ function insertGear(gear, addToSlot) end gear.Visible = true - local con = nil + local con con = gear.Kill.Changed:connect(function(prop) kill(prop, con, gear) end) @@ -292,7 +298,10 @@ function checkToolAncestry(child, parent) end -- don't show roblox build tools if child:IsA "Tool" or child:IsA "HopperBin" then for i = 1, #gearSlots do - if gearSlots[i] ~= "empty" and gearSlots[i].GearReference.Value == child then + if + gearSlots[i] ~= "empty" + and gearSlots[i].GearReference.Value == child + then if parent == nil then gearSlots[i].Kill.Value = true return false @@ -316,7 +325,10 @@ end function removeAllEquippedGear(physGear) local stuff = player.Character:GetChildren() for i = 1, #stuff do - if (stuff[i]:IsA "Tool" or stuff[i]:IsA "HopperBin") and stuff[i] ~= physGear then + if + (stuff[i]:IsA "Tool" or stuff[i]:IsA "HopperBin") + and stuff[i] ~= physGear + then if stuff[i]:IsA "Tool" then stuff[i].Parent = player.Backpack end @@ -400,7 +412,7 @@ function toolSwitcher(numKey) end function activateGear(num) - local numKey = nil + local numKey if num == "0" then numKey = 10 -- why do lua indexes have to start at 1? :( else @@ -446,8 +458,12 @@ enlargeButton = function(button) if button:IsA "ImageButton" or button:IsA "TextButton" then button.ZIndex = 5 - local centerizeX = -(buttonSizeEnlarge.X.Scale - button.Size.X.Scale) / 2 - local centerizeY = -(buttonSizeEnlarge.Y.Scale - button.Size.Y.Scale) / 2 + local centerizeX = -( + buttonSizeEnlarge.X.Scale - button.Size.X.Scale + ) / 2 + local centerizeY = -( + buttonSizeEnlarge.Y.Scale - button.Size.Y.Scale + ) / 2 button:TweenSizeAndPosition( buttonSizeEnlarge, UDim2.new( @@ -526,7 +542,10 @@ end function pointInRectangle(point, rectTopLeft, rectSize) if point.x > rectTopLeft.x and point.x < (rectTopLeft.x + rectSize.x) then - if point.y > rectTopLeft.y and point.y < (rectTopLeft.y + rectSize.y) then + if + point.y > rectTopLeft.y + and point.y < (rectTopLeft.y + rectSize.y) + then return true end end @@ -550,17 +569,28 @@ function swapGear(gearClone, toFrame) gearSlots[gearCloneSlot] = toFrameChildren[1] toFrameChildren[1].SlotNumber.Text = gearClone.SlotNumber.Text - toFrameChildren[1].SlotNumberDownShadow.Text = gearClone.SlotNumber.Text - toFrameChildren[1].SlotNumberUpShadow.Text = gearClone.SlotNumber.Text + toFrameChildren[1].SlotNumberDownShadow.Text = + gearClone.SlotNumber.Text + toFrameChildren[1].SlotNumberUpShadow.Text = + gearClone.SlotNumber.Text local subString = string.sub(toFrame.Name, 5) gearClone.SlotNumber.Text = subString gearClone.SlotNumberDownShadow.Text = subString gearClone.SlotNumberUpShadow.Text = subString - gearClone.Position = UDim2.new(gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0) - toFrameChildren[1].Position = - UDim2.new(toFrameChildren[1].Position.X.Scale, 0, toFrameChildren[1].Position.Y.Scale, 0) + gearClone.Position = UDim2.new( + gearClone.Position.X.Scale, + 0, + gearClone.Position.Y.Scale, + 0 + ) + toFrameChildren[1].Position = UDim2.new( + toFrameChildren[1].Position.X.Scale, + 0, + toFrameChildren[1].Position.Y.Scale, + 0 + ) toFrameChildren[1].Parent = gearClone.Parent gearClone.Parent = toFrame @@ -582,7 +612,12 @@ function swapGear(gearClone, toFrame) toSlotNum = 10 end gearSlots[toSlotNum] = gearClone - gearClone.Position = UDim2.new(gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0) + gearClone.Position = UDim2.new( + gearClone.Position.X.Scale, + 0, + gearClone.Position.Y.Scale, + 0 + ) gearClone.Parent = toFrame end end @@ -595,7 +630,13 @@ function resolveDrag(gearClone, x, y) for i = 1, #frames do if frames[i]:IsA "Frame" then - if pointInRectangle(mousePoint, frames[i].AbsolutePosition, frames[i].AbsoluteSize) then + if + pointInRectangle( + mousePoint, + frames[i].AbsolutePosition, + frames[i].AbsoluteSize + ) + then swapGear(gearClone, frames[i]) return true end @@ -603,8 +644,14 @@ function resolveDrag(gearClone, x, y) end if - (x < frame.AbsolutePosition.x or x > (frame.AbsolutePosition.x + frame.AbsoluteSize.x)) - or (y < frame.AbsolutePosition.y or y > (frame.AbsolutePosition.y + frame.AbsoluteSize.y)) + ( + x < frame.AbsolutePosition.x + or x > (frame.AbsolutePosition.x + frame.AbsoluteSize.x) + ) + or ( + y < frame.AbsolutePosition.y + or y > (frame.AbsolutePosition.y + frame.AbsoluteSize.y) + ) then reorganizeLoadout(gearClone, false) return false @@ -621,11 +668,15 @@ function unequipAllItems(dontEquipThis) if gearSlots[i] == "empty" then break end - if gearSlots[i].GearReference.Value and gearSlots[i].GearReference.Value ~= dontEquipThis then + if + gearSlots[i].GearReference.Value + and gearSlots[i].GearReference.Value ~= dontEquipThis + then if gearSlots[i].GearReference.Value:IsA "HopperBin" then gearSlots[i].GearReference.Value:Disable() elseif gearSlots[i].GearReference.Value:IsA "Tool" then - gearSlots[i].GearReference.Value.Parent = game.Players.LocalPlayer.Backpack + gearSlots[i].GearReference.Value.Parent = + game.Players.LocalPlayer.Backpack end gearSlots[i].Selected = false end @@ -648,12 +699,21 @@ function showToolTip(button, tip) end function hideToolTip(button, _) - if button and button:FindFirstChild "ToolTipLabel" and button.ToolTipLabel:IsA "TextLabel" then + if + button + and button:FindFirstChild "ToolTipLabel" + and button.ToolTipLabel:IsA "TextLabel" + then button.ToolTipLabel.Visible = false end end -local addingPlayerChild = function(child, equipped, addToSlot, inventoryGearButton) +local addingPlayerChild = function( + child, + equipped, + addToSlot, + inventoryGearButton +) waitForDebounce() debounce = true @@ -670,7 +730,10 @@ local addingPlayerChild = function(child, equipped, addToSlot, inventoryGearButt if not addToSlot then for i = 1, #gearSlots do - if gearSlots[i] ~= "empty" and gearSlots[i].GearReference.Value == child then -- we already have gear, do nothing + if + gearSlots[i] ~= "empty" + and gearSlots[i].GearReference.Value == child + then -- we already have gear, do nothing debounce = false return end @@ -733,7 +796,12 @@ local addingPlayerChild = function(child, equipped, addToSlot, inventoryGearButt local absolutePositionFinal = inventoryGearButton.AbsolutePosition local currentAbsolutePosition = gearClone.AbsolutePosition local diff = absolutePositionFinal - currentAbsolutePosition - gearClone.Position = UDim2.new(gearClone.Position.X.Scale, diff.x, gearClone.Position.Y.Scale, diff.y) + gearClone.Position = UDim2.new( + gearClone.Position.X.Scale, + diff.x, + gearClone.Position.Y.Scale, + diff.y + ) gearClone.ZIndex = 4 end @@ -751,20 +819,27 @@ local addingPlayerChild = function(child, equipped, addToSlot, inventoryGearButt if equipped then gearClone.Selected = true unequipAllItems(child) - delay(guiTweenSpeed + 0.01, function() -- if our gear is equipped, we will want to enlarge it when done moving - if - gearClone:FindFirstChild "GearReference" - and ( - ( - gearClone.GearReference.Value:IsA "Tool" - and gearClone.GearReference.Value.Parent == player.Character + delay( + guiTweenSpeed + 0.01, + function() -- if our gear is equipped, we will want to enlarge it when done moving + if + gearClone:FindFirstChild "GearReference" + and ( + ( + gearClone.GearReference.Value:IsA "Tool" + and gearClone.GearReference.Value.Parent + == player.Character + ) + or ( + gearClone.GearReference.Value:IsA "HopperBin" + and gearClone.GearReference.Value.Active == true + ) ) - or (gearClone.GearReference.Value:IsA "HopperBin" and gearClone.GearReference.Value.Active == true) - ) - then - enlargeButton(gearClone) + then + enlargeButton(gearClone) + end end - end) + ) end local dragBeginPos @@ -844,8 +919,8 @@ local addingPlayerChild = function(child, equipped, addToSlot, inventoryGearButt end end) -- this probably isn't necessary since objects are being deleted (probably), but this might still leak just in case - local childCon = nil - local childChangeCon = nil + local childCon + local childChangeCon childCon = child.AncestryChanged:connect(function(newChild, parent) if not checkToolAncestry(newChild, parent) then if childCon then @@ -900,7 +975,7 @@ function addToInventory(child) return end - local slot = nil + local slot for i = 1, #inventory do if inventory[i] and inventory[i] == child then return @@ -961,7 +1036,7 @@ end local centerGear = function() loadoutChildren = currentLoadout:GetChildren() local gearButtons = {} - local lastSlotAdd = nil + local lastSlotAdd for i = 1, #loadoutChildren do if loadoutChildren[i]:IsA "Frame" then @@ -1056,7 +1131,10 @@ function tabHandler(inFocus) end function coreGuiChanged(coreGuiType, enabled) - if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then + if + coreGuiType == Enum.CoreGuiType.Backpack + or coreGuiType == Enum.CoreGuiType.All + then backpackButton.Visible = enabled clBackground.Visible = enabled backpackEnabled = enabled @@ -1068,7 +1146,10 @@ function coreGuiChanged(coreGuiType, enabled) end end - if coreGuiType == Enum.CoreGuiType.Health or coreGuiType == Enum.CoreGuiType.All then + if + coreGuiType == Enum.CoreGuiType.Health + or coreGuiType == Enum.CoreGuiType.All + then setHealthBarVisible(game.Players.LocalPlayer.PlayerGui, enabled) end end @@ -1078,8 +1159,14 @@ end registerNumberKeys() pcall(function() - coreGuiChanged(Enum.CoreGuiType.Backpack, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack)) - coreGuiChanged(Enum.CoreGuiType.Health, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Health)) + coreGuiChanged( + Enum.CoreGuiType.Backpack, + Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack) + ) + coreGuiChanged( + Enum.CoreGuiType.Health, + Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Health) + ) Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) end) @@ -1108,9 +1195,16 @@ delay(2, function() if robloxGui.AbsoluteSize.Y <= 320 then local cChildren = currentLoadout:GetChildren() for i = 1, #cChildren do - local slotNum = tonumber(string.sub(cChildren[i].Name, 5, string.len(cChildren[i].Name))) + local slotNum = tonumber( + string.sub( + cChildren[i].Name, + 5, + string.len(cChildren[i].Name) + ) + ) if type(slotNum) == "number" then - cChildren[i].Position = UDim2.new(0, (slotNum - 1) * 60, 0, 0) + cChildren[i].Position = + UDim2.new(0, (slotNum - 1) * 60, 0, 0) end end end @@ -1214,9 +1308,16 @@ player.CharacterAdded:connect(function() if robloxGui.AbsoluteSize.Y <= 320 then local cChildren = currentLoadout:GetChildren() for i = 1, #cChildren do - local slotNum = tonumber(string.sub(cChildren[i].Name, 5, string.len(cChildren[i].Name))) + local slotNum = tonumber( + string.sub( + cChildren[i].Name, + 5, + string.len(cChildren[i].Name) + ) + ) if type(slotNum) == "number" then - cChildren[i].Position = UDim2.new(0, (slotNum - 1) * 60, 0, 0) + cChildren[i].Position = + UDim2.new(0, (slotNum - 1) * 60, 0, 0) end end end @@ -1238,7 +1339,11 @@ guiBackpack.SwapSlot.Changed:connect(function() reorganizeLoadout(gearSlots[pos], false) end if swapSlot.GearButton.Value then - addingPlayerChild(swapSlot.GearButton.Value.GearReference.Value, false, pos) + addingPlayerChild( + swapSlot.GearButton.Value.GearReference.Value, + false, + pos + ) end guiBackpack.SwapSlot.Value = false end diff --git a/lua/59002209.lua b/lua/59002209.lua index e69de29..e1963bd 100644 --- a/lua/59002209.lua +++ b/lua/59002209.lua @@ -0,0 +1 @@ +print "[Mercury]: Loaded corescript 59002209" diff --git a/lua/60595411.lua b/lua/60595411.lua index 6115b7f..b013cab 100644 --- a/lua/60595411.lua +++ b/lua/60595411.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 60595411" local t = {} ------------------------------------------------------------------------------------------------------------------------ @@ -273,7 +274,13 @@ end function JsonReader:TestReservedWord(t) for _, v in ipairs(t) do if self:Next() ~= v then - error(string.format("Error reading '%s': %s", table.concat(t), self:All())) + error( + string.format( + "Error reading '%s': %s", + table.concat(t), + self:All() + ) + ) end end end @@ -333,7 +340,9 @@ function JsonReader:ReadBlockComment() done = true end if not done and ch == "/" and self:Peek() == "*" then - error(string.format("Invalid comment: %s, '/*' illegal.", self:All())) + error( + string.format("Invalid comment: %s, '/*' illegal.", self:All()) + ) end end self:Next() @@ -363,7 +372,13 @@ function JsonReader:ReadArray() if not done then local ch = self:Next() if ch ~= "," then - error(string.format("Invalid array: '%s' due to: '%s'", self:All(), ch)) + error( + string.format( + "Invalid array: '%s' due to: '%s'", + self:All(), + ch + ) + ) end end end @@ -386,7 +401,13 @@ function JsonReader:ReadObject() self:SkipWhiteSpace() local ch = self:Next() if ch ~= ":" then - error(string.format("Invalid object: '%s' due to: '%s'", self:All(), ch)) + error( + string.format( + "Invalid object: '%s' due to: '%s'", + self:All(), + ch + ) + ) end self:SkipWhiteSpace() local val = self:Read() @@ -398,7 +419,13 @@ function JsonReader:ReadObject() if not done then ch = self:Next() if ch ~= "," then - error(string.format("Invalid array: '%s' near: '%s'", self:All(), ch)) + error( + string.format( + "Invalid array: '%s' near: '%s'", + self:All(), + ch + ) + ) end end end @@ -479,7 +506,12 @@ t.MakeWedge = function(x, y, z, _) return game:GetService("Terrain"):AutoWedgeCell(x, y, z) end -t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, selectionParent) +t.SelectTerrainRegion = function( + regionToSelect, + color, + selectEmptyCells, + selectionParent +) local terrain = game.Workspace:FindFirstChild "Terrain" if not terrain then return @@ -489,10 +521,16 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select assert(color) if not type(regionToSelect) == "Region3" then - error("regionToSelect (first arg), should be of type Region3, but is type", type(regionToSelect)) + error( + "regionToSelect (first arg), should be of type Region3, but is type", + type(regionToSelect) + ) end if not type(color) == "BrickColor" then - error("color (second arg), should be of type BrickColor, but is type", type(color)) + error( + "color (second arg), should be of type BrickColor, but is type", + type(color) + ) end -- frequently used terrain calls (speeds up call, no lookup necessary) @@ -511,10 +549,10 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select selectionContainer.Parent = game.Workspace end - local updateSelection = nil -- function we return to allow user to update selection - local currentKeepAliveTag = nil -- a tag that determines whether adorns should be destroyed + local updateSelection -- function we return to allow user to update selection + local currentKeepAliveTag -- a tag that determines whether adorns should be destroyed local aliveCounter = 0 -- helper for currentKeepAliveTag - local lastRegion = nil -- used to stop updates that do nothing + local lastRegion -- used to stop updates that do nothing local adornments = {} -- contains all adornments local reusableAdorns = {} @@ -544,8 +582,8 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select -- helper function that creates the basis for a selection box function createAdornment(theColor) - local selectionPartClone = nil - local selectionBoxClone = nil + local selectionPartClone + local selectionBoxClone if #reusableAdorns > 0 then selectionPartClone = reusableAdorns[1]["part"] @@ -580,7 +618,10 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select for cellPos, adornTable in pairs(adornments) do if adornTable.KeepAlive ~= currentKeepAliveTag then -- old news, we should get rid of this adornTable.SelectionBox.Visible = false - table.insert(reusableAdorns, { part = adornTable.SelectionPart, box = adornTable.SelectionBox }) + table.insert(reusableAdorns, { + part = adornTable.SelectionPart, + box = adornTable.SelectionBox, + }) adornments[cellPos] = nil end end @@ -597,8 +638,12 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select -- finds full cells in region and adorns each cell with a box, with the argument color function adornFullCellsInRegion(region, color) - local regionBegin = region.CFrame.p - (region.Size / 2) + Vector3.new(2, 2, 2) - local regionEnd = region.CFrame.p + (region.Size / 2) - Vector3.new(2, 2, 2) + local regionBegin = region.CFrame.p + - (region.Size / 2) + + Vector3.new(2, 2, 2) + local regionEnd = region.CFrame.p + + (region.Size / 2) + - Vector3.new(2, 2, 2) local cellPosBegin = WorldToCellPreferSolid(terrain, regionBegin) local cellPosEnd = WorldToCellPreferSolid(terrain, regionEnd) @@ -626,7 +671,8 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select end if not updated then - local selectionPart, selectionBox = createAdornment(color) + local selectionPart, selectionBox = + createAdornment(color) selectionPart.Size = Vector3.new(4, 4, 4) selectionPart.CFrame = CFrame.new(cframePos) local adornTable = { @@ -735,7 +781,11 @@ function t.CreateSignal() error("connect must be called with `:`, not `.`", 2) end if type(func) ~= "function" then - error("Argument #1 of connect must be a function, got a " .. type(func), 2) + error( + "Argument #1 of connect must be a function, got a " + .. type(func), + 2 + ) end local cn = mBindableEvent.Event:connect(func) mAllCns[cn] = true @@ -890,10 +940,10 @@ local function Create_PrivImpl(objectType) --make the object to mutate local obj = Instance.new(objectType) - local parent = nil + local parent --stored constructor function to be called after other initialization - local ctor = nil + local ctor for k, v in pairs(dat) do --add property @@ -909,7 +959,11 @@ local function Create_PrivImpl(objectType) --add child elseif type(k) == "number" then if type(v) ~= "userdata" then - error("Bad entry in Create body: Numeric keys must be paired with children, got a: " .. type(v), 2) + error( + "Bad entry in Create body: Numeric keys must be paired with children, got a: " + .. type(v), + 2 + ) end v.Parent = obj @@ -936,11 +990,21 @@ local function Create_PrivImpl(objectType) ) elseif ctor then --ctor already exists, only one allowed - error("Bad entry in Create body: Only one constructor function is allowed", 2) + error( + "Bad entry in Create body: Only one constructor function is allowed", + 2 + ) end ctor = v else - error("Bad entry (" .. tostring(k) .. " => " .. tostring(v) .. ") in Create body", 2) + error( + "Bad entry (" + .. tostring(k) + .. " => " + .. tostring(v) + .. ") in Create body", + 2 + ) end end @@ -1000,7 +1064,10 @@ t.Help = function(funcNameOrFunc) .. "parameter is provided, if not sets cell x, y, z to be whatever material it previously was. " .. "Returns true if made a wedge, false if the cell remains a block " end - if funcNameOrFunc == "SelectTerrainRegion" or funcNameOrFunc == t.SelectTerrainRegion then + if + funcNameOrFunc == "SelectTerrainRegion" + or funcNameOrFunc == t.SelectTerrainRegion + then return "Function SelectTerrainRegion. " .. "Arguments: (regionToSelect, color, selectEmptyCells, selectionParent). " .. "Description: Selects all terrain via a series of selection boxes within the regionToSelect " diff --git a/lua/60595695.lua b/lua/60595695.lua index a151712..97fd97d 100644 --- a/lua/60595695.lua +++ b/lua/60595695.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 60595695" -- Library Registration Script -- This script is used to register RbxLua libraries on game servers, so game scripts have -- access to all of the libraries (otherwise only local scripts do) diff --git a/lua/73157242.lua b/lua/73157242.lua index 6dd5e2a..77aea71 100644 --- a/lua/73157242.lua +++ b/lua/73157242.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 73157242" local t = {} -- function waitForChild(instance, name) @@ -16,8 +17,11 @@ local t = {} function PlaneIntersection(vectorPos) local hit = false local currCamera = game.Workspace.CurrentCamera - local startPos = - Vector3.new(currCamera.CoordinateFrame.p.X, currCamera.CoordinateFrame.p.Y, currCamera.CoordinateFrame.p.Z) + local startPos = Vector3.new( + currCamera.CoordinateFrame.p.X, + currCamera.CoordinateFrame.p.Y, + currCamera.CoordinateFrame.p.Z + ) local endPos = Vector3.new(vectorPos.X, vectorPos.Y, vectorPos.Z) local normal = Vector3.new(0, 1, 0) local p3 = Vector3.new(0, 0, 0) @@ -46,12 +50,16 @@ end function GetTerrainForMouse(mouse) -- There was no target, so all it could be is a plane intersection. -- Check for a plane intersection. If there isn't one then nothing will get hit. - local cell = game.Workspace.Terrain:WorldToCellPreferSolid(Vector3.new(mouse.hit.x, mouse.hit.y, mouse.hit.z)) - local planeLoc = nil + local cell = game.Workspace.Terrain:WorldToCellPreferSolid( + Vector3.new(mouse.hit.x, mouse.hit.y, mouse.hit.z) + ) + local planeLoc -- If nothing was hit, do the plane intersection. if 0 == game.Workspace.Terrain:GetCell(cell.X, cell.Y, cell.Z).Value then cell = nil - planeLoc, hit = PlaneIntersection(Vector3.new(mouse.hit.x, mouse.hit.y, mouse.hit.z)) + planeLoc, hit = PlaneIntersection( + Vector3.new(mouse.hit.x, mouse.hit.y, mouse.hit.z) + ) if hit then cell = planeLoc end @@ -66,7 +74,8 @@ local insertBoundingBoxOverlapVector = Vector3.new(0.3, 0.3, 0.3) -- we can stil local function rotatePartAndChildren(part, rotCF, offsetFromOrigin) -- rotate this thing, if it's a part if part:IsA "BasePart" then - part.CFrame = (rotCF * (part.CFrame - offsetFromOrigin)) + offsetFromOrigin + part.CFrame = (rotCF * (part.CFrame - offsetFromOrigin)) + + offsetFromOrigin end -- recursively do the same to all children @@ -195,9 +204,15 @@ local function getClosestAlignedWorldDirection(aVector3InWorld) local xDir = Vector3.new(1, 0, 0) local yDir = Vector3.new(0, 1, 0) local zDir = Vector3.new(0, 0, 1) - local xDot = aVector3InWorld.x * xDir.x + aVector3InWorld.y * xDir.y + aVector3InWorld.z * xDir.z - local yDot = aVector3InWorld.x * yDir.x + aVector3InWorld.y * yDir.y + aVector3InWorld.z * yDir.z - local zDot = aVector3InWorld.x * zDir.x + aVector3InWorld.y * zDir.y + aVector3InWorld.z * zDir.z + local xDot = aVector3InWorld.x * xDir.x + + aVector3InWorld.y * xDir.y + + aVector3InWorld.z * xDir.z + local yDot = aVector3InWorld.x * yDir.x + + aVector3InWorld.y * yDir.y + + aVector3InWorld.z * yDir.z + local zDot = aVector3InWorld.x * zDir.x + + aVector3InWorld.y * zDir.y + + aVector3InWorld.z * zDir.z if math.abs(xDot) > math.abs(yDot) and math.abs(xDot) > math.abs(zDot) then if xDot > 0 then @@ -205,7 +220,9 @@ local function getClosestAlignedWorldDirection(aVector3InWorld) else return 3 end - elseif math.abs(yDot) > math.abs(xDot) and math.abs(yDot) > math.abs(zDot) then + elseif + math.abs(yDot) > math.abs(xDot) and math.abs(yDot) > math.abs(zDot) + then if yDot > 0 then return 1 else @@ -221,11 +238,13 @@ local function getClosestAlignedWorldDirection(aVector3InWorld) end local function positionPartsAtCFrame3(aCFrame, currentParts) - local insertCFrame = nil + local insertCFrame if not currentParts then return currentParts end - if currentParts and (currentParts:IsA "Model" or currentParts:IsA "Tool") then + if + currentParts and (currentParts:IsA "Model" or currentParts:IsA "Tool") + then insertCFrame = currentParts:GetModelCFrame() currentParts:TranslateBy(aCFrame.p - insertCFrame.p) else @@ -246,8 +265,8 @@ local function modelTargetSurface(partOrModel, rayStart, rayEnd) return 0 end - local modelCFrame = nil - local modelSize = nil + local modelCFrame + local modelSize if partOrModel:IsA "Model" then modelCFrame = partOrModel:GetModelCFrame() modelSize = partOrModel:GetModelSize() @@ -274,9 +293,21 @@ local function modelTargetSurface(partOrModel, rayStart, rayEnd) end -- find which surface the transformed mouse ray hits (using modelSize): - local xHitTime = calcRayHitTime(mouseRayStart.X, mouseSlope.X, modelSize.X / 2 * xPositive) - local yHitTime = calcRayHitTime(mouseRayStart.Y, mouseSlope.Y, modelSize.Y / 2 * yPositive) - local zHitTime = calcRayHitTime(mouseRayStart.Z, mouseSlope.Z, modelSize.Z / 2 * zPositive) + local xHitTime = calcRayHitTime( + mouseRayStart.X, + mouseSlope.X, + modelSize.X / 2 * xPositive + ) + local yHitTime = calcRayHitTime( + mouseRayStart.Y, + mouseSlope.Y, + modelSize.Y / 2 * yPositive + ) + local zHitTime = calcRayHitTime( + mouseRayStart.Z, + mouseSlope.Z, + modelSize.Z / 2 * zPositive + ) local hitFace = 0 @@ -326,8 +357,11 @@ local function getBoundingBox2(partOrModel) local justify = justifyValue.Value local two = Vector3.new(2, 2, 2) local actualBox = maxVec - minVec - Vector3.new(0.01, 0.01, 0.01) - local containingGridBox = - Vector3.new(4 * math.ceil(actualBox.x / 4), 4 * math.ceil(actualBox.y / 4), 4 * math.ceil(actualBox.z / 4)) + local containingGridBox = Vector3.new( + 4 * math.ceil(actualBox.x / 4), + 4 * math.ceil(actualBox.y / 4), + 4 * math.ceil(actualBox.z / 4) + ) local adjustment = containingGridBox - actualBox minVec = minVec - 0.5 * adjustment * justify maxVec = maxVec + 0.5 * adjustment * (two - justify) @@ -341,19 +375,41 @@ local function getBoundingBoxInWorldCoordinates(partOrModel) local maxVec = Vector3.new(-math.huge, -math.huge, -math.huge) if partOrModel:IsA "BasePart" and not partOrModel:IsA "Terrain" then - local vec1 = partOrModel.CFrame:pointToWorldSpace(-0.5 * partOrModel.Size) - local vec2 = partOrModel.CFrame:pointToWorldSpace(0.5 * partOrModel.Size) - minVec = Vector3.new(math.min(vec1.X, vec2.X), math.min(vec1.Y, vec2.Y), math.min(vec1.Z, vec2.Z)) - maxVec = Vector3.new(math.max(vec1.X, vec2.X), math.max(vec1.Y, vec2.Y), math.max(vec1.Z, vec2.Z)) + local vec1 = + partOrModel.CFrame:pointToWorldSpace(-0.5 * partOrModel.Size) + local vec2 = + partOrModel.CFrame:pointToWorldSpace(0.5 * partOrModel.Size) + minVec = Vector3.new( + math.min(vec1.X, vec2.X), + math.min(vec1.Y, vec2.Y), + math.min(vec1.Z, vec2.Z) + ) + maxVec = Vector3.new( + math.max(vec1.X, vec2.X), + math.max(vec1.Y, vec2.Y), + math.max(vec1.Z, vec2.Z) + ) elseif not partOrModel:IsA "Terrain" then -- we shouldn't have to deal with this case --minVec = Vector3.new(-2, -2, -2) --maxVec = Vector3.new(2, 2, 2) -- else - local vec1 = partOrModel:GetModelCFrame():pointToWorldSpace(-0.5 * partOrModel:GetModelSize()) - local vec2 = partOrModel:GetModelCFrame():pointToWorldSpace(0.5 * partOrModel:GetModelSize()) - minVec = Vector3.new(math.min(vec1.X, vec2.X), math.min(vec1.Y, vec2.Y), math.min(vec1.Z, vec2.Z)) - maxVec = Vector3.new(math.max(vec1.X, vec2.X), math.max(vec1.Y, vec2.Y), math.max(vec1.Z, vec2.Z)) + local vec1 = partOrModel + :GetModelCFrame() + :pointToWorldSpace(-0.5 * partOrModel:GetModelSize()) + local vec2 = partOrModel + :GetModelCFrame() + :pointToWorldSpace(0.5 * partOrModel:GetModelSize()) + minVec = Vector3.new( + math.min(vec1.X, vec2.X), + math.min(vec1.Y, vec2.Y), + math.min(vec1.Z, vec2.Z) + ) + maxVec = Vector3.new( + math.max(vec1.X, vec2.X), + math.max(vec1.Y, vec2.Y), + math.max(vec1.Z, vec2.Z) + ) end return minVec, maxVec @@ -389,7 +445,9 @@ local function isBlocker(part) -- returns whether or not we want to cancel the s if part:FindFirstChild "Humanoid" then return false end - if part:FindFirstChild "RobloxStamper" or part:FindFirstChild "RobloxModel" then + if + part:FindFirstChild "RobloxStamper" or part:FindFirstChild "RobloxModel" + then return true end if part:IsA "Part" and not part.CanCollide then @@ -406,23 +464,30 @@ end local function spaceAboveCharacter(charTorso, newTorsoY, stampData) local partsAboveChar = game.Workspace:FindPartsInRegion3( Region3.new( - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) - Vector3.new(0.75, 2.75, 0.75), - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + Vector3.new(0.75, 1.75, 0.75) + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + - Vector3.new(0.75, 2.75, 0.75), + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + + Vector3.new(0.75, 1.75, 0.75) ), charTorso.Parent, 100 ) for j = 1, #partsAboveChar do - if partsAboveChar[j].CanCollide and not partsAboveChar[j]:IsDescendantOf(stampData.CurrentParts) then + if + partsAboveChar[j].CanCollide + and not partsAboveChar[j]:IsDescendantOf(stampData.CurrentParts) + then return false end end if clusterPartsInRegion( - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) - Vector3.new(0.75, 2.75, 0.75), - Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + Vector3.new(0.75, 1.75, 0.75) + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + - Vector3.new(0.75, 2.75, 0.75), + Vector3.new(charTorso.Position.X, newTorsoY, charTorso.Position.Z) + + Vector3.new(0.75, 1.75, 0.75) ) then return false @@ -457,7 +522,9 @@ local function findConfigAtMouseTarget(Mouse, stampData) local diagBB = maxBB - minBB local insertCFrame - if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + if + stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" + then insertCFrame = stampData.CurrentParts:GetModelCFrame() else insertCFrame = stampData.CurrentParts.CFrame @@ -472,7 +539,7 @@ local function findConfigAtMouseTarget(Mouse, stampData) end local hitPlane = false - local targetPart = nil + local targetPart local success = pcall(function() targetPart = Mouse.Target end) @@ -486,7 +553,7 @@ local function findConfigAtMouseTarget(Mouse, stampData) mouseHitInWorld = Vector3.new(Mouse.Hit.x, Mouse.Hit.y, Mouse.Hit.z) end - local cellPos = nil + local cellPos -- Nothing was hit, so check for the default plane. if nil == targetPart then @@ -499,7 +566,11 @@ local function findConfigAtMouseTarget(Mouse, stampData) hitPlane = true -- Take into account error that will occur. cellPos = Vector3.new(cellPos.X - 1, cellPos.Y, cellPos.Z) - mouseHitInWorld = game.Workspace.Terrain:CellCenterToWorld(cellPos.x, cellPos.y, cellPos.z) + mouseHitInWorld = game.Workspace.Terrain:CellCenterToWorld( + cellPos.x, + cellPos.y, + cellPos.z + ) end end @@ -517,7 +588,13 @@ local function findConfigAtMouseTarget(Mouse, stampData) cellID = cellPos end - targetCFrame = CFrame.new(game.Workspace.Terrain:CellCenterToWorld(cellID.x, cellID.y, cellID.z)) + targetCFrame = CFrame.new( + game.Workspace.Terrain:CellCenterToWorld( + cellID.x, + cellID.y, + cellID.z + ) + ) end local mouseHitInTarget = targetCFrame:pointToObjectSpace(mouseHitInWorld) @@ -526,7 +603,9 @@ local function findConfigAtMouseTarget(Mouse, stampData) -- DON'T WANT THIS IN TERMS OF THE MODEL CFRAME! (.TargetSurface is in terms of the part CFrame, so this would break, right? [HotThoth]) -- (ideally, we would want to make the Mouse.TargetSurface a model-targetsurface instead, but for testing will be using the converse) --targetVectorInWorld = targetCFrame:vectorToWorldSpace(Vector3.FromNormalId(Mouse.TargetSurface)) - targetVectorInWorld = targetPart.CFrame:vectorToWorldSpace(Vector3.FromNormalId(Mouse.TargetSurface)) -- better, but model cframe would be best + targetVectorInWorld = targetPart.CFrame:vectorToWorldSpace( + Vector3.FromNormalId(Mouse.TargetSurface) + ) -- better, but model cframe would be best --[[if targetPart.Parent:IsA("Model") then local hitFace = modelTargetSurface(targetPart.Parent, Mouse.Hit.p, game.Workspace.CurrentCamera.CoordinateFrame.p) -- best, if you get it right local WORLD_AXES = {Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1)} @@ -542,33 +621,47 @@ local function findConfigAtMouseTarget(Mouse, stampData) local clampToSurface if getClosestAlignedWorldDirection(targetVectorInWorld) == 0 then - targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(1, -1, 1)) - insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + targetRefPointInTarget = + targetCFrame:vectorToObjectSpace(Vector3.new(1, -1, 1)) + insertRefPointInInsert = + insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) clampToSurface = Vector3.new(0, 1, 1) elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 3 then - targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, -1)) - insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(1, -1, -1)) + targetRefPointInTarget = + targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, -1)) + insertRefPointInInsert = + insertCFrame:vectorToObjectSpace(Vector3.new(1, -1, -1)) clampToSurface = Vector3.new(0, 1, 1) elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 1 then - targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, 1, 1)) - insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + targetRefPointInTarget = + targetCFrame:vectorToObjectSpace(Vector3.new(-1, 1, 1)) + insertRefPointInInsert = + insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) clampToSurface = Vector3.new(1, 0, 1) elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 4 then - targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) - insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, 1, 1)) + targetRefPointInTarget = + targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + insertRefPointInInsert = + insertCFrame:vectorToObjectSpace(Vector3.new(-1, 1, 1)) clampToSurface = Vector3.new(1, 0, 1) elseif getClosestAlignedWorldDirection(targetVectorInWorld) == 2 then - targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) - insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, -1)) + targetRefPointInTarget = + targetCFrame:vectorToObjectSpace(Vector3.new(-1, -1, 1)) + insertRefPointInInsert = + insertCFrame:vectorToObjectSpace(Vector3.new(-1, -1, -1)) clampToSurface = Vector3.new(1, 1, 0) else - targetRefPointInTarget = targetCFrame:vectorToObjectSpace(Vector3.new(1, -1, -1)) - insertRefPointInInsert = insertCFrame:vectorToObjectSpace(Vector3.new(1, -1, 1)) + targetRefPointInTarget = + targetCFrame:vectorToObjectSpace(Vector3.new(1, -1, -1)) + insertRefPointInInsert = + insertCFrame:vectorToObjectSpace(Vector3.new(1, -1, 1)) clampToSurface = Vector3.new(1, 1, 0) end - targetRefPointInTarget = targetRefPointInTarget * (0.5 * diagBBTarget) + 0.5 * (maxBBTarget + minBBTarget) - insertRefPointInInsert = insertRefPointInInsert * (0.5 * diagBB) + 0.5 * (maxBB + minBB) + targetRefPointInTarget = targetRefPointInTarget * (0.5 * diagBBTarget) + + 0.5 * (maxBBTarget + minBBTarget) + insertRefPointInInsert = insertRefPointInInsert * (0.5 * diagBB) + + 0.5 * (maxBB + minBB) -- To Do: For cases that are not aligned to the world grid, account for the minimal rotation -- needed to bring the Insert part(s) into alignment with the Target Part @@ -583,11 +676,14 @@ local function findConfigAtMouseTarget(Mouse, stampData) deltaClamped = deltaClamped * clampToSurface local targetTouchInTarget = deltaClamped + targetRefPointInTarget - local TargetTouchRelToWorld = targetCFrame:pointToWorldSpace(targetTouchInTarget) - local InsertTouchInWorld = insertCFrame:vectorToWorldSpace(insertRefPointInInsert) + local TargetTouchRelToWorld = + targetCFrame:pointToWorldSpace(targetTouchInTarget) + local InsertTouchInWorld = + insertCFrame:vectorToWorldSpace(insertRefPointInInsert) local posInsertOriginInWorld = TargetTouchRelToWorld - InsertTouchInWorld - local _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = insertCFrame:components() + local _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = + insertCFrame:components() targetConfig = CFrame.new( posInsertOriginInWorld.x, posInsertOriginInWorld.y, @@ -604,7 +700,9 @@ local function findConfigAtMouseTarget(Mouse, stampData) ) admissibleConfig = true - return admissibleConfig, targetConfig, getClosestAlignedWorldDirection(targetVectorInWorld) + return admissibleConfig, + targetConfig, + getClosestAlignedWorldDirection(targetVectorInWorld) end local function truncateToCircleEighth(bigValue, littleValue) @@ -624,7 +722,8 @@ local function truncateToCircleEighth(bigValue, littleValue) if frac > 0.382683432 then -- between 22.5 and 45 degrees, so truncate to 45-degree tilt - return 0.707106781 * hypotenuse * bigSign, 0.707106781 * hypotenuse * littleSign + return 0.707106781 * hypotenuse * bigSign, + 0.707106781 * hypotenuse * littleSign else -- between 0 and 22.5 degrees, so truncate to 0-degree tilt return hypotenuse * bigSign, 0 @@ -733,7 +832,7 @@ t.GetStampModel = function(assetId, terrainShape, useAssetVersionId) end local function setupFakeTerrainPart(cellMat, cellType, cellOrient) - local newTerrainPiece = nil + local newTerrainPiece if cellType == 1 or cellType == 4 then newTerrainPiece = Instance.new "WedgePart" newTerrainPiece.formFactor = "Custom" @@ -759,12 +858,14 @@ t.GetStampModel = function(assetId, terrainShape, useAssetVersionId) if cellType == 2 or cellType == 3 then flipped = 0 end - newTerrainPiece.CFrame = CFrame.Angles(0, math.pi / 2 * cellOrient + flipped, sideways) + newTerrainPiece.CFrame = + CFrame.Angles(0, math.pi / 2 * cellOrient + flipped, sideways) if cellType == 3 then local inverseCornerWedgeMesh = Instance.new "SpecialMesh" inverseCornerWedgeMesh.MeshType = "FileMesh" - inverseCornerWedgeMesh.MeshId = "http://www.roblox.com/asset?id=66832495" + inverseCornerWedgeMesh.MeshId = + "http://banland.xyz/asset?id=66832495" inverseCornerWedgeMesh.Scale = Vector3.new(2, 2, 2) inverseCornerWedgeMesh.Parent = newTerrainPiece end @@ -869,9 +970,17 @@ t.GetStampModel = function(assetId, terrainShape, useAssetVersionId) local clusterTag = root:FindFirstChild "ClusterMaterial" if clusterTag then if clusterTag:IsA "Vector3Value" then - root = setupFakeTerrainPart(clusterTag.Value.X, terrainShape, clusterTag.Value.Z) + root = setupFakeTerrainPart( + clusterTag.Value.X, + terrainShape, + clusterTag.Value.Z + ) else - root = setupFakeTerrainPart(clusterTag.Value, terrainShape, 0) + root = setupFakeTerrainPart( + clusterTag.Value, + terrainShape, + 0 + ) end else root = setupFakeTerrainPart(1, terrainShape, 0) @@ -883,7 +992,13 @@ t.GetStampModel = function(assetId, terrainShape, useAssetVersionId) return root end -t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStampRegion, StampFailedFunc) +t.SetupStamperDragger = function( + modelToStamp, + Mouse, + StampInModel, + AllowedStampRegion, + StampFailedFunc +) if not modelToStamp then error "SetupStamperDragger: modelToStamp (first arg) is nil! Should be a stamper model" return nil @@ -901,9 +1016,9 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp return nil end - local stampInModel = nil - local allowedStampRegion = nil - local stampFailedFunc = nil + local stampInModel + local allowedStampRegion + local stampFailedFunc if StampInModel then if not StampInModel:IsA "Model" then error "SetupStamperDragger: StampInModel (optional third arg) is not of type 'Model'" @@ -920,8 +1035,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- Init all state variables local gInitial90DegreeRotations = 0 - local stampData = nil - local mouseTarget = nil + local stampData + local mouseTarget local errorBox = Instance.new "SelectionBox" errorBox.Color = BrickColor.new "Bright red" @@ -961,7 +1076,7 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp local stampUpLock = false local unstampableSurface = false local mouseCons = {} - local keyCon = nil + local keyCon local stamped = Instance.new "BoolValue" stamped.Archivable = false @@ -1001,7 +1116,7 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end HighScalabilityLine.End = megaCube.CFrame.p - local line = nil + local line local line2 = Vector3.new(0, 0, 0) local line3 = Vector3.new(0, 0, 0) @@ -1050,7 +1165,10 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- take out any component of line2 along line1, so you get perpendicular to line1 component line2 = line2 - line.unit * line.unit:Dot(line2) - tempCFrame = CFrame.new(HighScalabilityLine.Start, HighScalabilityLine.Start + line) + tempCFrame = CFrame.new( + HighScalabilityLine.Start, + HighScalabilityLine.Start + line + ) -- then zero out whichever is the smaller component local yAxis = tempCFrame:vectorToWorldSpace(Vector3.new(0, 1, 0)) @@ -1079,22 +1197,34 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end -- resize the "line" graphic to be the correct size and orientation - tempCFrame = CFrame.new(HighScalabilityLine.Start, HighScalabilityLine.Start + line) + tempCFrame = CFrame.new( + HighScalabilityLine.Start, + HighScalabilityLine.Start + line + ) if HighScalabilityLine.Dimensions == 1 then -- faster calculation for line - HighScalabilityLine.AdornPart.Size = Vector3.new(4, 4, line.magnitude + 4) + HighScalabilityLine.AdornPart.Size = + Vector3.new(4, 4, line.magnitude + 4) HighScalabilityLine.AdornPart.CFrame = tempCFrame - + tempCFrame:vectorToWorldSpace(Vector3.new(2, 2, 2) - HighScalabilityLine.AdornPart.Size / 2) + + tempCFrame:vectorToWorldSpace( + Vector3.new(2, 2, 2) + - HighScalabilityLine.AdornPart.Size / 2 + ) else local boxSize = tempCFrame:vectorToObjectSpace(line + line2 + line3) HighScalabilityLine.AdornPart.Size = Vector3.new(4, 4, 4) - + Vector3.new(math.abs(boxSize.X), math.abs(boxSize.Y), math.abs(boxSize.Z)) - HighScalabilityLine.AdornPart.CFrame = tempCFrame + tempCFrame:vectorToWorldSpace(boxSize / 2) + + Vector3.new( + math.abs(boxSize.X), + math.abs(boxSize.Y), + math.abs(boxSize.Z) + ) + HighScalabilityLine.AdornPart.CFrame = tempCFrame + + tempCFrame:vectorToWorldSpace(boxSize / 2) end -- make player able to see this ish - local gui = nil + local gui if game.Players["LocalPlayer"] then gui = game.Players.LocalPlayer:FindFirstChild "PlayerGui" if gui and gui:IsA "PlayerGui" then @@ -1109,7 +1239,10 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if gui == nil then -- we are in studio gui = game:GetService "CoreGui" - if (HighScalabilityLine.Dimensions == 1 and line.magnitude > 3) or HighScalabilityLine.Dimensions > 1 then -- don't show if mouse hasn't moved enough + if + (HighScalabilityLine.Dimensions == 1 and line.magnitude > 3) + or HighScalabilityLine.Dimensions > 1 + then -- don't show if mouse hasn't moved enough HighScalabilityLine.Adorn.Parent = gui end end @@ -1121,7 +1254,11 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp return end if not Mouse:IsA "Mouse" then - error("Error: RbxStamper.DoStamperMouseMove: Mouse is of type", Mouse.className, "should be of type Mouse") + error( + "Error: RbxStamper.DoStamperMouseMove: Mouse is of type", + Mouse.className, + "should be of type Mouse" + ) return end @@ -1139,40 +1276,60 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- don't move with dragger - will move in one step on mouse down -- draw ghost at acceptable positions - configFound, targetCFrame, targetSurface = findConfigAtMouseTarget(Mouse, stampData) + configFound, targetCFrame, targetSurface = + findConfigAtMouseTarget(Mouse, stampData) if not configFound then error "RbxStamper.DoStamperMouseMove No configFound, returning" return end local numRotations = 0 -- update this according to how many rotations you need to get it to target surface - if autoAlignToFace(stampData.CurrentParts) and targetSurface ~= 1 and targetSurface ~= 4 then -- pre-rotate the flag or portrait so it's aligned correctly + if + autoAlignToFace(stampData.CurrentParts) + and targetSurface ~= 1 + and targetSurface ~= 4 + then -- pre-rotate the flag or portrait so it's aligned correctly if targetSurface == 3 then - numRotations = 0 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + numRotations = 0 + - gInitial90DegreeRotations + + autoAlignToFace(stampData.CurrentParts) elseif targetSurface == 0 then - numRotations = 2 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + numRotations = 2 + - gInitial90DegreeRotations + + autoAlignToFace(stampData.CurrentParts) elseif targetSurface == 5 then - numRotations = 3 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + numRotations = 3 + - gInitial90DegreeRotations + + autoAlignToFace(stampData.CurrentParts) elseif targetSurface == 2 then - numRotations = 1 - gInitial90DegreeRotations + autoAlignToFace(stampData.CurrentParts) + numRotations = 1 + - gInitial90DegreeRotations + + autoAlignToFace(stampData.CurrentParts) end end local ry = math.pi / 2 gInitial90DegreeRotations = gInitial90DegreeRotations + numRotations - if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + if + stampData.CurrentParts:IsA "Model" + or stampData.CurrentParts:IsA "Tool" + then --stampData.CurrentParts:Rotate(0, ry*numRotations, 0) modelRotate(stampData.CurrentParts, ry * numRotations) else - stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry * numRotations, 0) - * stampData.CurrentParts.CFrame + stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ( + 0, + ry * numRotations, + 0 + ) * stampData.CurrentParts.CFrame end -- CODE TO CHECK FOR DRAGGING GHOST PART INTO A COLLIDING STATE - local minBB, maxBB = getBoundingBoxInWorldCoordinates(stampData.CurrentParts) + local minBB, maxBB = + getBoundingBoxInWorldCoordinates(stampData.CurrentParts) -- need to offset by distance to be dragged - local currModelCFrame = nil + local currModelCFrame if stampData.CurrentParts:IsA "Model" then currModelCFrame = stampData.CurrentParts:GetModelCFrame() else @@ -1183,12 +1340,30 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp maxBB = maxBB + targetCFrame.p - currModelCFrame.p -- don't drag into terrain - if clusterPartsInRegion(minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector) then + if + clusterPartsInRegion( + minBB + insertBoundingBoxOverlapVector, + maxBB - insertBoundingBoxOverlapVector + ) + then if lastTarget.CFrame then - if stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) then - local theClusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + if + stampData.CurrentParts:FindFirstChild( + "ClusterMaterial", + true + ) + then + local theClusterMaterial = + stampData.CurrentParts:FindFirstChild( + "ClusterMaterial", + true + ) if theClusterMaterial:IsA "Vector3Value" then - local stampClusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + local stampClusterMaterial = + stampData.CurrentParts:FindFirstChild( + "ClusterMaterial", + true + ) if stampClusterMaterial then stampClusterMaterial = clusterMat end @@ -1200,10 +1375,15 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- if we are stamping a terrain part, make sure it goes on the grid! Otherwise preview block could be placed off grid, but stamped on grid if isMegaClusterPart() then - local cellToStamp = game.Workspace.Terrain:WorldToCell(targetCFrame.p) - local newCFramePosition = - game.Workspace.Terrain:CellCenterToWorld(cellToStamp.X, cellToStamp.Y, cellToStamp.Z) - local _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = targetCFrame:components() + local cellToStamp = + game.Workspace.Terrain:WorldToCell(targetCFrame.p) + local newCFramePosition = game.Workspace.Terrain:CellCenterToWorld( + cellToStamp.X, + cellToStamp.Y, + cellToStamp.Z + ) + local _, _, _, R00, R01, R02, R10, R11, R12, R20, R21, R22 = + targetCFrame:components() targetCFrame = CFrame.new( newCFramePosition.X, newCFramePosition.Y, @@ -1223,7 +1403,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp positionPartsAtCFrame3(targetCFrame, stampData.CurrentParts) lastTarget.CFrame = targetCFrame -- successful positioning, so update 'dat cframe if stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) then - local clusterMat = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + local clusterMat = + stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) if clusterMat:IsA "Vector3Value" then lastTarget.TerrainOrientation = clusterMat.Value.Z end @@ -1236,13 +1417,17 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp modelInfo = Mouse.Target.Parent:FindFirstChild "RobloxModel" end - local myModelInfo = stampData.CurrentParts:FindFirstChild "UnstampableFaces" + local myModelInfo = + stampData.CurrentParts:FindFirstChild "UnstampableFaces" --if (modelInfo and modelInfo.Parent:FindFirstChild("UnstampableFaces")) or (modelInfo and myModelInfo) then -- need better targetSurface calcs if true then local breakingFaces = "" local myBreakingFaces = "" - if modelInfo and modelInfo.Parent:FindFirstChild "UnstampableFaces" then + if + modelInfo + and modelInfo.Parent:FindFirstChild "UnstampableFaces" + then breakingFaces = modelInfo.Parent.UnstampableFaces.Value end if myModelInfo then @@ -1296,7 +1481,12 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- most common mouse inactive error occurs here, so check mouse active one more time in a pcall if not pcall(function() - if Mouse and Mouse.Target and Mouse.Target.Parent:FindFirstChild "RobloxModel" == nil then + if + Mouse + and Mouse.Target + and Mouse.Target.Parent:FindFirstChild "RobloxModel" + == nil + then return else return @@ -1309,7 +1499,11 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp return end - if Mouse and Mouse.Target and Mouse.Target.Parent:FindFirstChild "RobloxModel" == nil then + if + Mouse + and Mouse.Target + and Mouse.Target.Parent:FindFirstChild "RobloxModel" == nil + then game.JointsService:SetJoinAfterMoveTarget(Mouse.Target) else game.JointsService:SetJoinAfterMoveTarget(nil) @@ -1317,7 +1511,11 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp game.JointsService:ShowPermissibleJoints() -- here we allow for a line of high-scalability parts - if isMegaClusterPart() and HighScalabilityLine and HighScalabilityLine.Start then + if + isMegaClusterPart() + and HighScalabilityLine + and HighScalabilityLine.Start + then DoHighScalabilityRegionSelect() end end @@ -1332,23 +1530,35 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp gInitial90DegreeRotations = gInitial90DegreeRotations + 1 -- Update orientation value if this is a fake terrain part - local clusterValues = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + local clusterValues = + stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) if clusterValues and clusterValues:IsA "Vector3Value" then - clusterValues.Value = - Vector3.new(clusterValues.Value.X, clusterValues.Value.Y, (clusterValues.Value.Z + 1) % 4) + clusterValues.Value = Vector3.new( + clusterValues.Value.X, + clusterValues.Value.Y, + (clusterValues.Value.Z + 1) % 4 + ) end -- Rotate the parts or all the parts in the model local ry = math.pi / 2 - if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + if + stampData.CurrentParts:IsA "Model" + or stampData.CurrentParts:IsA "Tool" + then --stampData.CurrentParts:Rotate(0, ry, 0) modelRotate(stampData.CurrentParts, ry) else - stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry, 0) * stampData.CurrentParts.CFrame + stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ( + 0, + ry, + 0 + ) * stampData.CurrentParts.CFrame end -- After rotating, update the position - configFound, targetCFrame = findConfigAtMouseTarget(Mouse, stampData) + configFound, targetCFrame = + findConfigAtMouseTarget(Mouse, stampData) if configFound then positionPartsAtCFrame3(targetCFrame, stampData.CurrentParts) @@ -1361,17 +1571,22 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp and HighScalabilityLine.InternalLine.magnitude > 0 and HighScalabilityLine.Dimensions < 3 then - HighScalabilityLine.MorePoints[HighScalabilityLine.Dimensions] = HighScalabilityLine.End - HighScalabilityLine.MoreLines[HighScalabilityLine.Dimensions] = HighScalabilityLine.InternalLine - HighScalabilityLine.Dimensions = HighScalabilityLine.Dimensions + 1 + HighScalabilityLine.MorePoints[HighScalabilityLine.Dimensions] = + HighScalabilityLine.End + HighScalabilityLine.MoreLines[HighScalabilityLine.Dimensions] = + HighScalabilityLine.InternalLine + HighScalabilityLine.Dimensions = HighScalabilityLine.Dimensions + + 1 HighScalabilityLine.NewHint = true end end end - keyCon = Mouse.KeyDown:connect(function(key) -- init key connection (keeping code close to func) - setupKeyListener(key, Mouse) - end) + keyCon = Mouse.KeyDown:connect( + function(key) -- init key connection (keeping code close to func) + setupKeyListener(key, Mouse) + end + ) local function resetHighScalabilityLine() if HighScalabilityLine then @@ -1426,7 +1641,11 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp return end if not Mouse:IsA "Mouse" then - error("Error: RbxStamper.DoStamperMouseDown: Mouse is of type", Mouse.className, "should be of type Mouse") + error( + "Error: RbxStamper.DoStamperMouseDown: Mouse is of type", + Mouse.className, + "should be of type Mouse" + ) return end if not stampData then @@ -1435,17 +1654,29 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if isMegaClusterPart() then if Mouse and HighScalabilityLine then - local megaCube = stampData.CurrentParts:FindFirstChild("MegaClusterCube", true) + local megaCube = stampData.CurrentParts:FindFirstChild( + "MegaClusterCube", + true + ) local terrain = game.Workspace.Terrain if megaCube then HighScalabilityLine.Dimensions = 1 local tempCell = terrain:WorldToCell(megaCube.CFrame.p) - HighScalabilityLine.Start = terrain:CellCenterToWorld(tempCell.X, tempCell.Y, tempCell.Z) + HighScalabilityLine.Start = terrain:CellCenterToWorld( + tempCell.X, + tempCell.Y, + tempCell.Z + ) return else HighScalabilityLine.Dimensions = 1 - local tempCell = terrain:WorldToCell(stampData.CurrentParts.CFrame.p) - HighScalabilityLine.Start = terrain:CellCenterToWorld(tempCell.X, tempCell.Y, tempCell.Z) + local tempCell = + terrain:WorldToCell(stampData.CurrentParts.CFrame.p) + HighScalabilityLine.Start = terrain:CellCenterToWorld( + tempCell.X, + tempCell.Y, + tempCell.Z + ) return end end @@ -1509,12 +1740,14 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp for _, script in pairs(scripts) do if not script.Disabled then script.Disabled = true - stampData.DisabledScripts[#stampData.DisabledScripts + 1] = script + stampData.DisabledScripts[#stampData.DisabledScripts + 1] = + script end end for _, part in pairs(parts) do stampData.TransparencyTable[part] = part.Transparency - part.Transparency = gStaticTrans + (1 - gStaticTrans) * part.Transparency + part.Transparency = gStaticTrans + + (1 - gStaticTrans) * part.Transparency stampData.MaterialTable[part] = part.Material part.Material = Enum.Material.Plastic stampData.CanCollideTable[part] = part.CanCollide @@ -1539,16 +1772,30 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp and part:IsA "BasePart" and part.Transparency > gDesiredTrans do - local newTrans = 1 - (((currTime - begTime) / transFadeInTime) * (gStaticTrans - gDesiredTrans)) - if stampData["TransparencyTable"] and stampData.TransparencyTable[part] then - part.Transparency = newTrans + (1 - newTrans) * stampData.TransparencyTable[part] + local newTrans = 1 + - ( + ((currTime - begTime) / transFadeInTime) + * (gStaticTrans - gDesiredTrans) + ) + if + stampData["TransparencyTable"] + and stampData.TransparencyTable[part] + then + part.Transparency = newTrans + + (1 - newTrans) + * stampData.TransparencyTable[part] end wait(0.03) currTime = tick() end if part and part:IsA "BasePart" then - if stampData["TransparencyTable"] and stampData.TransparencyTable[part] then - part.Transparency = gDesiredTrans + (1 - gDesiredTrans) * stampData.TransparencyTable[part] + if + stampData["TransparencyTable"] + and stampData.TransparencyTable[part] + then + part.Transparency = gDesiredTrans + + (1 - gDesiredTrans) + * stampData.TransparencyTable[part] end end end) @@ -1556,7 +1803,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp for _, decal in pairs(decals) do stampData.DecalTransparencyTable[decal] = decal.Transparency - decal.Transparency = gDesiredTrans + (1 - gDesiredTrans) * decal.Transparency + decal.Transparency = gDesiredTrans + + (1 - gDesiredTrans) * decal.Transparency end -- disable all seats @@ -1571,11 +1819,18 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp gInitial90DegreeRotations = 0 else -- pre-rotate if necessary local ry = gInitial90DegreeRotations * math.pi / 2 - if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + if + stampData.CurrentParts:IsA "Model" + or stampData.CurrentParts:IsA "Tool" + then --stampData.CurrentParts:Rotate(0, ry, 0) modelRotate(stampData.CurrentParts, ry) else - stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ(0, ry, 0) * stampData.CurrentParts.CFrame + stampData.CurrentParts.CFrame = CFrame.fromEulerAnglesXYZ( + 0, + ry, + 0 + ) * stampData.CurrentParts.CFrame end end @@ -1583,7 +1838,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- rotations we expect since then [either that or we need to store the just-stamped clusterMaterial.Value.Z somewhere]. This should fix the terrain rotation -- issue (fingers crossed) [HotThoth] - local clusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + local clusterMaterial = + stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) if clusterMaterial and clusterMaterial:IsA "Vector3Value" then clusterMaterial.Value = Vector3.new( clusterMaterial.Value.X, @@ -1593,9 +1849,11 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end -- After rotating, update the position - local configFound, targetCFrame = findConfigAtMouseTarget(Mouse, stampData) + local configFound, targetCFrame = + findConfigAtMouseTarget(Mouse, stampData) if configFound then - stampData.CurrentParts = positionPartsAtCFrame3(targetCFrame, stampData.CurrentParts) + stampData.CurrentParts = + positionPartsAtCFrame3(targetCFrame, stampData.CurrentParts) end -- to show joints during the mouse move @@ -1604,13 +1862,25 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp return clone, parts end - local function checkTerrainBlockCollisions(cellPos, checkHighScalabilityStamp) + local function checkTerrainBlockCollisions( + cellPos, + checkHighScalabilityStamp + ) local cellCenterToWorld = game.Workspace.Terrain.CellCenterToWorld - local cellCenter = cellCenterToWorld(game.Workspace.Terrain, cellPos.X, cellPos.Y, cellPos.Z) + local cellCenter = cellCenterToWorld( + game.Workspace.Terrain, + cellPos.X, + cellPos.Y, + cellPos.Z + ) local cellBlockingParts = game.Workspace:FindPartsInRegion3( Region3.new( - cellCenter - Vector3.new(2, 2, 2) + insertBoundingBoxOverlapVector, - cellCenter + Vector3.new(2, 2, 2) - insertBoundingBoxOverlapVector + cellCenter + - Vector3.new(2, 2, 2) + + insertBoundingBoxOverlapVector, + cellCenter + + Vector3.new(2, 2, 2) + - insertBoundingBoxOverlapVector ), stampData.CurrentParts, 100 @@ -1634,18 +1904,31 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp cellBlockingParts[b].Parent and not alreadyPushedUp[cellBlockingParts[b].Parent] and cellBlockingParts[b].Parent:FindFirstChild "Humanoid" - and cellBlockingParts[b].Parent:FindFirstChild("Humanoid"):IsA "Humanoid" + and cellBlockingParts[b].Parent + :FindFirstChild("Humanoid") + :IsA "Humanoid" then ----------------------------------------------------------------------------------- - local blockingPersonTorso = cellBlockingParts[b].Parent:FindFirstChild "Torso" + local blockingPersonTorso = + cellBlockingParts[b].Parent:FindFirstChild "Torso" alreadyPushedUp[cellBlockingParts[b].Parent] = true if blockingPersonTorso then -- if so, let's push the person upwards so they pop on top of the stamped model/part (but only if there's space above them) local newY = cellCenter.Y + 5 - if spaceAboveCharacter(blockingPersonTorso, newY, stampData) then + if + spaceAboveCharacter( + blockingPersonTorso, + newY, + stampData + ) + then blockingPersonTorso.CFrame = blockingPersonTorso.CFrame - + Vector3.new(0, newY - blockingPersonTorso.CFrame.p.Y, 0) + + Vector3.new( + 0, + newY - blockingPersonTorso.CFrame.p.Y, + 0 + ) else -- if no space, we just skip this one skipThisCell = true @@ -1662,14 +1945,27 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if checkHighScalabilityStamp then -- check to see if cell is in region, if not we'll skip set if allowedStampRegion then - local cellPos = cellCenterToWorld(game.Workspace.Terrain, cellPos.X, cellPos.Y, cellPos.Z) + local cellPos = cellCenterToWorld( + game.Workspace.Terrain, + cellPos.X, + cellPos.Y, + cellPos.Z + ) if - (cellPos.X + 2 > allowedStampRegion.CFrame.p.X + allowedStampRegion.Size.X / 2) + ( + cellPos.X + 2 + > allowedStampRegion.CFrame.p.X + + allowedStampRegion.Size.X / 2 + ) or (cellPos.X - 2 < allowedStampRegion.CFrame.p.X - allowedStampRegion.Size.X / 2) or (cellPos.Y + 2 > allowedStampRegion.CFrame.p.Y + allowedStampRegion.Size.Y / 2) or (cellPos.Y - 2 < allowedStampRegion.CFrame.p.Y - allowedStampRegion.Size.Y / 2) or (cellPos.Z + 2 > allowedStampRegion.CFrame.p.Z + allowedStampRegion.Size.Z / 2) - or (cellPos.Z - 2 < allowedStampRegion.CFrame.p.Z - allowedStampRegion.Size.Z / 2) + or ( + cellPos.Z - 2 + < allowedStampRegion.CFrame.p.Z + - allowedStampRegion.Size.Z / 2 + ) then canSetCell = false end @@ -1700,7 +1996,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end if stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) then - clusterMaterial = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) + clusterMaterial = + stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) if clusterMaterial:IsA "Vector3Value" then clusterType = clusterMaterial.Value.Y clusterOrientation = clusterMaterial.Value.Z @@ -1713,17 +2010,29 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if HighScalabilityLine.Adorn.Parent and HighScalabilityLine.Start - and ((HighScalabilityLine.Dimensions > 1) or (line and line.magnitude > 0)) + and ( + (HighScalabilityLine.Dimensions > 1) + or (line and line.magnitude > 0) + ) then - local startCell = game.Workspace.Terrain:WorldToCell(HighScalabilityLine.Start) + local startCell = + game.Workspace.Terrain:WorldToCell(HighScalabilityLine.Start) local xInc = { 0, 0, 0 } local yInc = { 0, 0, 0 } local zInc = { 0, 0, 0 } local incrementVect = { nil, nil, nil } - local stepVect = { Vector3.new(0, 0, 0), Vector3.new(0, 0, 0), Vector3.new(0, 0, 0) } + local stepVect = { + Vector3.new(0, 0, 0), + Vector3.new(0, 0, 0), + Vector3.new(0, 0, 0), + } - local worldAxes = { Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1) } + local worldAxes = { + Vector3.new(1, 0, 0), + Vector3.new(0, 1, 0), + Vector3.new(0, 0, 1), + } local lines = {} if HighScalabilityLine.Dimensions > 1 then @@ -1772,8 +2081,13 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp lines[3] = Vector3.new(0, 0, 0) end - local waterForceTag = stampData.CurrentParts:FindFirstChild("WaterForceTag", true) - local waterForceDirectionTag = stampData.CurrentParts:FindFirstChild("WaterForceDirectionTag", true) + local waterForceTag = + stampData.CurrentParts:FindFirstChild("WaterForceTag", true) + local waterForceDirectionTag = + stampData.CurrentParts:FindFirstChild( + "WaterForceDirectionTag", + true + ) while stepVect[3].magnitude * 4 <= lines[3].magnitude do local outerStepVectIndex = 1 @@ -1783,8 +2097,12 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp local innerStepVectIndex = 1 while innerStepVectIndex < 4 do stepVect[1] = Vector3.new(0, 0, 0) - while stepVect[1].magnitude * 4 <= lines[1].magnitude do - local stepVectSum = stepVect[1] + stepVect[2] + stepVect[3] + while + stepVect[1].magnitude * 4 <= lines[1].magnitude + do + local stepVectSum = stepVect[1] + + stepVect[2] + + stepVect[3] local cellPos = Vector3int16.new( startCell.X + stepVectSum.X, startCell.Y + stepVectSum.Y, @@ -1800,7 +2118,10 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp then -- check if overlaps player or part local okToStampTerrainBlock = - checkTerrainBlockCollisions(cellPos, checkHighScalabilityStamp) + checkTerrainBlockCollisions( + cellPos, + checkHighScalabilityStamp + ) if okToStampTerrainBlock then if waterForceTag then @@ -1827,8 +2148,16 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if autoWedgeClusterParts then game.Workspace.Terrain:AutowedgeCells( Region3int16.new( - Vector3int16.new(cellPos.x - 1, cellPos.y - 1, cellPos.z - 1), - Vector3int16.new(cellPos.x + 1, cellPos.y + 1, cellPos.z + 1) + Vector3int16.new( + cellPos.x - 1, + cellPos.y - 1, + cellPos.z - 1 + ), + Vector3int16.new( + cellPos.x + 1, + cellPos.y + 1, + cellPos.z + 1 + ) ) ) end @@ -1839,33 +2168,48 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if incrementVect[2] then while innerStepVectIndex < 4 - and worldAxes[innerStepVectIndex]:Dot(incrementVect[2]) == 0 + and worldAxes[innerStepVectIndex]:Dot( + incrementVect[2] + ) + == 0 do innerStepVectIndex = innerStepVectIndex + 1 end if innerStepVectIndex < 4 then stepVect[2] = stepVect[2] + worldAxes[innerStepVectIndex] - * worldAxes[innerStepVectIndex]:Dot(incrementVect[2]) + * worldAxes[innerStepVectIndex]:Dot( + incrementVect[2] + ) end innerStepVectIndex = innerStepVectIndex + 1 else stepVect[2] = Vector3.new(1, 0, 0) innerStepVectIndex = 4 -- skip all remaining loops end - if stepVect[2].magnitude * 4 > lines[2].magnitude then + if + stepVect[2].magnitude * 4 > lines[2].magnitude + then innerStepVectIndex = 4 end end end if incrementVect[3] then - while outerStepVectIndex < 4 and worldAxes[outerStepVectIndex]:Dot(incrementVect[3]) == 0 do + while + outerStepVectIndex < 4 + and worldAxes[outerStepVectIndex]:Dot( + incrementVect[3] + ) + == 0 + do outerStepVectIndex = outerStepVectIndex + 1 end if outerStepVectIndex < 4 then stepVect[3] = stepVect[3] + worldAxes[outerStepVectIndex] - * worldAxes[outerStepVectIndex]:Dot(incrementVect[3]) + * worldAxes[outerStepVectIndex]:Dot( + incrementVect[3] + ) end outerStepVectIndex = outerStepVectIndex + 1 else -- skip all remaining loops @@ -1887,7 +2231,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if cellSet then stampData.CurrentParts.Parent = nil pcall(function() - game:GetService("ChangeHistoryService"):SetWaypoint "StamperMulti" + game:GetService("ChangeHistoryService") + :SetWaypoint "StamperMulti" end) end @@ -1900,7 +2245,11 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp return false end if not Mouse:IsA "Mouse" then - error("Error: RbxStamper.DoStamperMouseUp: Mouse is of type", Mouse.className, "should be of type Mouse") + error( + "Error: RbxStamper.DoStamperMouseUp: Mouse is of type", + Mouse.className, + "should be of type Mouse" + ) return false end @@ -1913,9 +2262,9 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp return false end - local checkHighScalabilityStamp = nil + local checkHighScalabilityStamp if stampInModel then - local canStamp = nil + local canStamp local isHSLPart = isMegaClusterPart() if @@ -1928,7 +2277,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp canStamp = true checkHighScalabilityStamp = true else - canStamp, checkHighScalabilityStamp = t.CanEditRegion(stampData.CurrentParts, allowedStampRegion) + canStamp, checkHighScalabilityStamp = + t.CanEditRegion(stampData.CurrentParts, allowedStampRegion) end if not canStamp then @@ -1946,7 +2296,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end -- recheck if we can stamp, as we just moved part - canStamp, checkHighScalabilityStamp = t.CanEditRegion(stampData.CurrentParts, allowedStampRegion) + canStamp, checkHighScalabilityStamp = + t.CanEditRegion(stampData.CurrentParts, allowedStampRegion) if not canStamp then if stampFailedFunc then stampFailedFunc() @@ -1956,7 +2307,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- Prevent part from being stamped on top of a player - local minBB, maxBB = getBoundingBoxInWorldCoordinates(stampData.CurrentParts) + local minBB, maxBB = + getBoundingBoxInWorldCoordinates(stampData.CurrentParts) -- HotThoth's note: Now that above CurrentParts positioning has been commented out, to be truly correct, we would need to use the -- value of configFound from the previous onStamperMouseMove call which moved the CurrentParts @@ -1964,13 +2316,21 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp configFound, targetCFrame = findConfigAtMouseTarget(Mouse, stampData) if configFound and not HighScalabilityLine.Adorn.Parent then - if clusterPartsInRegion(minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector) then + if + clusterPartsInRegion( + minBB + insertBoundingBoxOverlapVector, + maxBB - insertBoundingBoxOverlapVector + ) + then flashRedBox() return false end local blockingParts = game.Workspace:FindPartsInRegion3( - Region3.new(minBB + insertBoundingBoxOverlapVector, maxBB - insertBoundingBoxOverlapVector), + Region3.new( + minBB + insertBoundingBoxOverlapVector, + maxBB - insertBoundingBoxOverlapVector + ), stampData.CurrentParts, 100 ) @@ -1989,18 +2349,31 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp blockingParts[b].Parent and not alreadyPushedUp[blockingParts[b].Parent] and blockingParts[b].Parent:FindFirstChild "Humanoid" - and blockingParts[b].Parent:FindFirstChild("Humanoid"):IsA "Humanoid" + and blockingParts[b].Parent + :FindFirstChild("Humanoid") + :IsA "Humanoid" then --------------------------------------------------------------------------- - local blockingPersonTorso = blockingParts[b].Parent:FindFirstChild "Torso" + local blockingPersonTorso = + blockingParts[b].Parent:FindFirstChild "Torso" alreadyPushedUp[blockingParts[b].Parent] = true if blockingPersonTorso then -- if so, let's push the person upwards so they pop on top of the stamped model/part (but only if there's space above them) local newY = maxBB.Y + 3 - if spaceAboveCharacter(blockingPersonTorso, newY, stampData) then + if + spaceAboveCharacter( + blockingPersonTorso, + newY, + stampData + ) + then blockingPersonTorso.CFrame = blockingPersonTorso.CFrame - + Vector3.new(0, newY - blockingPersonTorso.CFrame.p.Y, 0) + + Vector3.new( + 0, + newY - blockingPersonTorso.CFrame.p.Y, + 0 + ) else -- if no space, we just error flashRedBox() @@ -2010,7 +2383,12 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp --------------------------------------------------------------------------- end end - elseif (not configFound) and not (HighScalabilityLine.Start and HighScalabilityLine.Adorn.Parent) then -- if no config then only stamp if it's a real HSL! + elseif + not configFound + and not ( + HighScalabilityLine.Start and HighScalabilityLine.Adorn.Parent + ) + then -- if no config then only stamp if it's a real HSL! resetHighScalabilityLine() return false end @@ -2029,8 +2407,15 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end -- if we drew a line of mega parts, stamp them out - if HighScalabilityLine.Start and HighScalabilityLine.Adorn.Parent and isMegaClusterPart() then - if ResolveMegaClusterStamp(checkHighScalabilityStamp) or checkHighScalabilityStamp then + if + HighScalabilityLine.Start + and HighScalabilityLine.Adorn.Parent + and isMegaClusterPart() + then + if + ResolveMegaClusterStamp(checkHighScalabilityStamp) + or checkHighScalabilityStamp + then -- kill the ghost part stampData.CurrentParts.Parent = nil return true @@ -2050,7 +2435,9 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp local cellPos if stampData.CurrentParts:IsA "Model" then - cellPos = cluster:WorldToCell(stampData.CurrentParts:GetModelCFrame().p) + cellPos = cluster:WorldToCell( + stampData.CurrentParts:GetModelCFrame().p + ) else cellPos = cluster:WorldToCell(stampData.CurrentParts.CFrame.p) end @@ -2059,9 +2446,17 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp local cMin = game.Workspace.Terrain.MaxExtents.Min if checkTerrainBlockCollisions(cellPos, false) then - local clusterValues = stampData.CurrentParts:FindFirstChild("ClusterMaterial", true) - local waterForceTag = stampData.CurrentParts:FindFirstChild("WaterForceTag", true) - local waterForceDirectionTag = stampData.CurrentParts:FindFirstChild("WaterForceDirectionTag", true) + local clusterValues = stampData.CurrentParts:FindFirstChild( + "ClusterMaterial", + true + ) + local waterForceTag = + stampData.CurrentParts:FindFirstChild("WaterForceTag", true) + local waterForceDirectionTag = + stampData.CurrentParts:FindFirstChild( + "WaterForceDirectionTag", + true + ) if cellPos.X >= cMin.X @@ -2098,7 +2493,14 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp clusterValues.Value.Z ) else - cluster:SetCell(cellPos.X, cellPos.Y, cellPos.Z, clusterValues.Value, 0, 0) + cluster:SetCell( + cellPos.X, + cellPos.Y, + cellPos.Z, + clusterValues.Value, + 0, + 0 + ) end local autoWedgeClusterParts = false @@ -2110,8 +2512,16 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp if autoWedgeClusterParts then game.Workspace.Terrain:AutowedgeCells( Region3int16.new( - Vector3int16.new(cellPos.x - 1, cellPos.y - 1, cellPos.z - 1), - Vector3int16.new(cellPos.x + 1, cellPos.y + 1, cellPos.z + 1) + Vector3int16.new( + cellPos.x - 1, + cellPos.y - 1, + cellPos.z - 1 + ), + Vector3int16.new( + cellPos.x + 1, + cellPos.y + 1, + cellPos.z + 1 + ) ) ) end @@ -2121,7 +2531,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- Mark for undo. It has to happen here or the selection display will come back also. pcall(function() - game:GetService("ChangeHistoryService"):SetWaypoint "StamperSingle" + game:GetService("ChangeHistoryService") + :SetWaypoint "StamperSingle" end) return true end @@ -2142,12 +2553,19 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end -- Post process: after positioning the part or model, restore transparency, material, anchored and collide states and create joints - if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" then + if + stampData.CurrentParts:IsA "Model" + or stampData.CurrentParts:IsA "Tool" + then if stampData.CurrentParts:IsA "Model" then -- Tyler's magical hack-code for allowing/preserving clones of both Surface and Manual Welds... just don't ask X< local manualWeldTable = {} local manualWeldParentTable = {} - saveTheWelds(stampData.CurrentParts, manualWeldTable, manualWeldParentTable) + saveTheWelds( + stampData.CurrentParts, + manualWeldTable, + manualWeldParentTable + ) stampData.CurrentParts:BreakJoints() stampData.CurrentParts:MakeJoints() restoreTheWelds(manualWeldTable, manualWeldParentTable) @@ -2155,7 +2573,8 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp -- if it's a model, we also want to fill in the playerID and playerName tags, if it has those (e.g. for the friend-only door) playerIdTag = stampData.CurrentParts:FindFirstChild "PlayerIdTag" - playerNameTag = stampData.CurrentParts:FindFirstChild "PlayerNameTag" + playerNameTag = + stampData.CurrentParts:FindFirstChild "PlayerNameTag" if playerIdTag ~= nil then tempPlayerValue = getPlayer() if tempPlayerValue ~= nil then @@ -2163,7 +2582,10 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end end if playerNameTag ~= nil then - if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + if + game:FindFirstChild "Players" + and game.Players["LocalPlayer"] + then tempPlayerValue = game.Players.LocalPlayer if tempPlayerValue ~= nil then playerNameTag.Value = tempPlayerValue.Name @@ -2177,7 +2599,9 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp stringTag.Name = "RobloxModel" stringTag.Parent = stampData.CurrentParts - if stampData.CurrentParts:FindFirstChild "RobloxStamper" == nil then + if + stampData.CurrentParts:FindFirstChild "RobloxStamper" == nil + then local stringTag2 = Instance.new "BoolValue" stringTag2.Name = "RobloxStamper" stringTag2.Parent = stampData.CurrentParts @@ -2289,21 +2713,30 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end local function prepareUnjoinableSurfaces(modelCFrame, parts, whichSurface) - local AXIS_VECTORS = { Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1) } -- maybe last one is negative? TODO: check this! + local AXIS_VECTORS = + { Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1) } -- maybe last one is negative? TODO: check this! local isPositive = 1 if whichSurface < 0 then isPositive = isPositive * -1 whichSurface = whichSurface * -1 end - local surfaceNormal = isPositive * modelCFrame:vectorToWorldSpace(AXIS_VECTORS[whichSurface]) + local surfaceNormal = isPositive + * modelCFrame:vectorToWorldSpace(AXIS_VECTORS[whichSurface]) for i = 1, #parts do local currPart = parts[i] -- now just need to find which surface of currPart most closely match surfaceNormal and then set that to Unjoinable - local surfaceNormalInLocalCoords = currPart.CFrame:vectorToObjectSpace(surfaceNormal) - if math.abs(surfaceNormalInLocalCoords.X) > math.abs(surfaceNormalInLocalCoords.Y) then - if math.abs(surfaceNormalInLocalCoords.X) > math.abs(surfaceNormalInLocalCoords.Z) then + local surfaceNormalInLocalCoords = + currPart.CFrame:vectorToObjectSpace(surfaceNormal) + if + math.abs(surfaceNormalInLocalCoords.X) + > math.abs(surfaceNormalInLocalCoords.Y) + then + if + math.abs(surfaceNormalInLocalCoords.X) + > math.abs(surfaceNormalInLocalCoords.Z) + then if surfaceNormalInLocalCoords.X > 0 then currPart.RightSurface = "Unjoinable" else @@ -2317,7 +2750,10 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp end end else - if math.abs(surfaceNormalInLocalCoords.Y) > math.abs(surfaceNormalInLocalCoords.Z) then + if + math.abs(surfaceNormalInLocalCoords.Y) + > math.abs(surfaceNormalInLocalCoords.Z) + then if surfaceNormalInLocalCoords.Y > 0 then currPart.TopSurface = "Unjoinable" else @@ -2347,9 +2783,17 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp for unjoinableSurface in string.gmatch(unjoinableTag.Value, "[^,]*") do if tonumber(unjoinableSurface) then if clone:IsA "Model" then - prepareUnjoinableSurfaces(clone:GetModelCFrame(), parts, tonumber(unjoinableSurface)) + prepareUnjoinableSurfaces( + clone:GetModelCFrame(), + parts, + tonumber(unjoinableSurface) + ) else - prepareUnjoinableSurfaces(clone.CFrame, parts, tonumber(unjoinableSurface)) + prepareUnjoinableSurfaces( + clone.CFrame, + parts, + tonumber(unjoinableSurface) + ) end end end @@ -2377,7 +2821,10 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp mouseTarget = Mouse.Target end) - if mouseTarget and mouseTarget.Parent:FindFirstChild "RobloxModel" == nil then + if + mouseTarget + and mouseTarget.Parent:FindFirstChild "RobloxModel" == nil + then game.JointsService:SetJoinAfterMoveTarget(mouseTarget) else game.JointsService:SetJoinAfterMoveTarget(nil) @@ -2436,7 +2883,10 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp local function resetStamperState(newModelToStamp) -- if we have a new model, swap it out if newModelToStamp then - if not newModelToStamp:IsA "Model" and not newModelToStamp:IsA "BasePart" then + if + not newModelToStamp:IsA "Model" + and not newModelToStamp:IsA "BasePart" + then error "resetStamperState: newModelToStamp (first arg) is not nil, but not a model or part!" end modelToStamp = newModelToStamp @@ -2455,19 +2905,21 @@ t.SetupStamperDragger = function(modelToStamp, Mouse, StampInModel, AllowedStamp control.Stamped = stamped -- BoolValue that fires when user stamps control.Paused = false - control.LoadNewModel = - function(newStampModel) -- allows us to specify a new stamper model to be used with this stamper - if newStampModel and not newStampModel:IsA "Model" and not newStampModel:IsA "BasePart" then - error "Control.LoadNewModel: newStampModel (first arg) is not a Model or Part!" - return nil - end - resetStamperState(newStampModel) + control.LoadNewModel = function(newStampModel) -- allows us to specify a new stamper model to be used with this stamper + if + newStampModel + and not newStampModel:IsA "Model" + and not newStampModel:IsA "BasePart" + then + error "Control.LoadNewModel: newStampModel (first arg) is not a Model or Part!" + return nil end + resetStamperState(newStampModel) + end - control.ReloadModel = - function() -- will automatically set stamper to get a new model of current model and start stamping with new model - resetStamperState() - end + control.ReloadModel = function() -- will automatically set stamper to get a new model of current model and start stamping with new model + resetStamperState() + end control.Pause = function() -- temporarily stops stamping, use resume to start up again if not control.Paused then @@ -2533,10 +2985,16 @@ end t.Help = function(funcNameOrFunc) --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - if funcNameOrFunc == "GetStampModel" or funcNameOrFunc == t.GetStampModel then + if + funcNameOrFunc == "GetStampModel" + or funcNameOrFunc == t.GetStampModel + then return "Function GetStampModel. Arguments: assetId, useAssetVersionId. assetId is the asset to load in, define useAssetVersionId as true if assetId is a version id instead of a relative assetId. Side effect: returns a model of the assetId, or a string with error message if something fails" end - if funcNameOrFunc == "SetupStamperDragger" or funcNameOrFunc == t.SetupStamperDragger then + if + funcNameOrFunc == "SetupStamperDragger" + or funcNameOrFunc == t.SetupStamperDragger + then return "Function SetupStamperDragger. Side Effect: Creates 4x4 stamping mechanism for building out parts quickly. Arguments: ModelToStamp, Mouse, LegalStampCheckFunction. ModelToStamp should be a Model or Part, preferrably loaded from RbxStamper.GetStampModel and should have extents that are multiples of 4. Mouse should be a mouse object (obtained from things such as Tool.OnEquipped), used to drag parts around 'stamp' them out. LegalStampCheckFunction is optional, used as a callback with a table argument (table is full of instances about to be stamped). Function should return either true or false, false stopping the stamp action." end end diff --git a/lua/89449008.lua b/lua/89449008.lua index fc35871..95a352f 100644 --- a/lua/89449008.lua +++ b/lua/89449008.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 89449008" -- A couple of necessary functions local function waitForChild(instance, name) assert(instance) @@ -48,9 +49,9 @@ local browsingMenu = false local mouseEnterCons = {} local mouseClickCons = {} -local characterChildAddedCon = nil -local characterChildRemovedCon = nil -local backpackAddCon = nil +local characterChildAddedCon +local characterChildRemovedCon +local backpackAddCon local playerBackpack = waitForChild(player, "Backpack") @@ -68,16 +69,19 @@ local gearButton = waitForChild(grid, "GearButton") local swapSlot = waitForChild(script.Parent, "SwapSlot") -local backpackManager = waitForChild(script.Parent, "CoreScripts/BackpackScripts/BackpackManager") +local backpackManager = + waitForChild(script.Parent, "CoreScripts/BackpackScripts/BackpackManager") local backpackOpenEvent = waitForChild(backpackManager, "BackpackOpenEvent") local backpackCloseEvent = waitForChild(backpackManager, "BackpackCloseEvent") local tabClickedEvent = waitForChild(backpackManager, "TabClickedEvent") local resizeEvent = waitForChild(backpackManager, "ResizeEvent") -local searchRequestedEvent = waitForChild(backpackManager, "SearchRequestedEvent") +local searchRequestedEvent = + waitForChild(backpackManager, "SearchRequestedEvent") local tellBackpackReadyFunc = waitForChild(backpackManager, "BackpackReady") -- creating scroll bar early as to make sure items get placed correctly -local scrollFrame, scrollUp, scrollDown, recalculateScroll = RbxGui.CreateScrollingFrame(nil, "grid", Vector2.new(6, 6)) +local scrollFrame, scrollUp, scrollDown, recalculateScroll = + RbxGui.CreateScrollingFrame(nil, "grid", Vector2.new(6, 6)) scrollFrame.Position = UDim2.new(0, 0, 0, 30) scrollFrame.Size = UDim2.new(1, 0, 1, -30) @@ -97,7 +101,8 @@ scrollDown.Position = UDim2.new(0, 0, 1, -17) scrollUp.Parent = scroller scrollDown.Parent = scroller -local scrollFrameLoadout, scrollUpLoadout, scrollDownLoadout, recalculateScrollLoadout = RbxGui.CreateScrollingFrame() +local scrollFrameLoadout, scrollUpLoadout, scrollDownLoadout, recalculateScrollLoadout = + RbxGui.CreateScrollingFrame() scrollFrameLoadout.Position = UDim2.new(0, 0, 0, 0) scrollFrameLoadout.Size = UDim2.new(1, 0, 1, 0) @@ -171,7 +176,8 @@ function resize() waitForChild(gearPreview, "GearImage") gearPreview.GearImage.Size = UDim2.new(0, size, 0, size) - gearPreview.GearImage.Position = UDim2.new(0, gearPreview.AbsoluteSize.X / 2 - size / 2, 0.75, -size) + gearPreview.GearImage.Position = + UDim2.new(0, gearPreview.AbsoluteSize.X / 2 - size / 2, 0.75, -size) resizeGrid() end @@ -203,9 +209,9 @@ function addToGrid(child) end end end) - local ancestryCon = nil + local ancestryCon ancestryCon = child.AncestryChanged:connect(function(_, _) - local thisObject = nil + local thisObject for _, v in pairs(backpackItems) do if v == child then thisObject = v @@ -215,7 +221,10 @@ function addToGrid(child) waitForProperty(player, "Character") waitForChild(player, "Backpack") - if child.Parent ~= player.Backpack and child.Parent ~= player.Character then + if + child.Parent ~= player.Backpack + and child.Parent ~= player.Character + then if ancestryCon then ancestryCon:disconnect() end @@ -264,7 +273,7 @@ function previewGear(button) end function findEmptySlot() - local smallestNum = nil + local smallestNum local loadout = currentLoadout:GetChildren() for i = 1, #loadout do if loadout[i]:IsA "Frame" and #loadout[i]:GetChildren() <= 0 then @@ -286,16 +295,22 @@ end function checkForSwap(button, x, y) local loadoutChildren = currentLoadout:GetChildren() for i = 1, #loadoutChildren do - if loadoutChildren[i]:IsA "Frame" and string.find(loadoutChildren[i].Name, "Slot") then + if + loadoutChildren[i]:IsA "Frame" + and string.find(loadoutChildren[i].Name, "Slot") + then if x >= loadoutChildren[i].AbsolutePosition.x - and x <= (loadoutChildren[i].AbsolutePosition.x + loadoutChildren[i].AbsoluteSize.x) + and x + <= (loadoutChildren[i].AbsolutePosition.x + loadoutChildren[i].AbsoluteSize.x) then if y >= loadoutChildren[i].AbsolutePosition.y - and y <= (loadoutChildren[i].AbsolutePosition.y + loadoutChildren[i].AbsoluteSize.y) + and y + <= (loadoutChildren[i].AbsolutePosition.y + loadoutChildren[i].AbsoluteSize.y) then - local slot = tonumber(string.sub(loadoutChildren[i].Name, 5)) + local slot = + tonumber(string.sub(loadoutChildren[i].Name, 5)) swapGearSlot(slot, button) return true end @@ -328,7 +343,7 @@ function resizeGrid() unequipMenu.Parent = buttonClone end - local beginPos = nil + local beginPos buttonClone.DragBegin:connect(function(value) waitForChild(buttonClone, "Background") buttonClone["Background"].ZIndex = 10 @@ -358,22 +373,29 @@ function resizeGrid() end end) local clickTime = tick() - mouseEnterCons[buttonClone] = buttonClone.MouseEnter:connect(function() - previewGear(buttonClone) - end) - mouseClickCons[buttonClone] = buttonClone.MouseButton1Click:connect(function() - local newClickTime = tick() - if buttonClone.Active and (newClickTime - clickTime) < 0.5 then - local slot = findEmptySlot() - if slot then - buttonClone.ZIndex = 1 - swapGearSlot(slot, buttonClone) - end - else - buttonClick(buttonClone) + mouseEnterCons[buttonClone] = buttonClone.MouseEnter:connect( + function() + previewGear(buttonClone) end - clickTime = newClickTime - end) + ) + mouseClickCons[buttonClone] = buttonClone.MouseButton1Click:connect( + function() + local newClickTime = tick() + if + buttonClone.Active + and (newClickTime - clickTime) < 0.5 + then + local slot = findEmptySlot() + if slot then + buttonClone.ZIndex = 1 + swapGearSlot(slot, buttonClone) + end + else + buttonClick(buttonClone) + end + clickTime = newClickTime + end + ) end end end @@ -405,7 +427,10 @@ function inLoadout(gear) if children[i]:IsA "Frame" then local button = children[i]:GetChildren() if #button > 0 then - if button[1].GearReference.Value and button[1].GearReference.Value == gear then + if + button[1].GearReference.Value + and button[1].GearReference.Value == gear + then return true end end @@ -417,7 +442,7 @@ end function updateGridActive() for _, v in pairs(backpackItems) do if buttons[v] then - local gear = nil + local gear local gearRef = buttons[v]:FindFirstChild "GearReference" if gearRef then @@ -435,9 +460,12 @@ end function centerGear(loadoutChildren) local gearButtons = {} - local lastSlotAdd = nil + local lastSlotAdd for i = 1, #loadoutChildren do - if loadoutChildren[i]:IsA "Frame" and #loadoutChildren[i]:GetChildren() > 0 then + if + loadoutChildren[i]:IsA "Frame" + and #loadoutChildren[i]:GetChildren() > 0 + then if loadoutChildren[i].Name == "Slot0" then lastSlotAdd = loadoutChildren[i] else @@ -502,8 +530,13 @@ function loadoutCheck(child, selectState) end for _, v in pairs(backpackItems) do if buttons[v] then - if child:FindFirstChild "GearReference" and buttons[v]:FindFirstChild "GearReference" then - if buttons[v].GearReference.Value == child.GearReference.Value then + if + child:FindFirstChild "GearReference" + and buttons[v]:FindFirstChild "GearReference" + then + if + buttons[v].GearReference.Value == child.GearReference.Value + then buttons[v].Active = selectState break end @@ -569,7 +602,10 @@ local UnequipGearMenuClick = function(element, menu) for i = 1, #loadoutChildren do if loadoutChildren[i]:IsA "Frame" then local button = loadoutChildren[i]:GetChildren() - if button[1] and button[1].GearReference.Value == gearToUnequip then + if + button[1] + and button[1].GearReference.Value == gearToUnequip + then slot = button[1].SlotNumber.Text break end @@ -583,9 +619,11 @@ function setupCharacterConnections() if backpackAddCon then backpackAddCon:disconnect() end - backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) - addToGrid(child) - end) + backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect( + function(child) + addToGrid(child) + end + ) -- make sure we get all the children local backpackChildren = game.Players.LocalPlayer.Backpack:GetChildren() @@ -596,17 +634,21 @@ function setupCharacterConnections() if characterChildAddedCon then characterChildAddedCon:disconnect() end - characterChildAddedCon = game.Players.LocalPlayer.Character.ChildAdded:connect(function(child) - addToGrid(child) - updateGridActive() - end) + characterChildAddedCon = game.Players.LocalPlayer.Character.ChildAdded:connect( + function(child) + addToGrid(child) + updateGridActive() + end + ) if characterChildRemovedCon then characterChildRemovedCon:disconnect() end - characterChildRemovedCon = game.Players.LocalPlayer.Character.ChildRemoved:connect(function(_) - updateGridActive() - end) + characterChildRemovedCon = game.Players.LocalPlayer.Character.ChildRemoved:connect( + function(_) + updateGridActive() + end + ) wait() centerGear(currentLoadout:GetChildren()) @@ -826,7 +868,10 @@ function getGearContextMenu() end function coreGuiChanged(coreGuiType, enabled) - if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then + if + coreGuiType == Enum.CoreGuiType.Backpack + or coreGuiType == Enum.CoreGuiType.All + then if not enabled then backpack.Gear.Visible = false end @@ -860,12 +905,18 @@ currentLoadout.ChildRemoved:connect(function(child) end) currentLoadout.DescendantAdded:connect(function(descendant) - if not backpack.Visible and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") then + if + not backpack.Visible + and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") + then centerGear(currentLoadout:GetChildren()) end end) currentLoadout.DescendantRemoving:connect(function(descendant) - if not backpack.Visible and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") then + if + not backpack.Visible + and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") + then wait() centerGear(currentLoadout:GetChildren()) end @@ -892,9 +943,11 @@ player.ChildAdded:connect(function(child) if backpackAddCon then backpackAddCon:disconnect() end - backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) - addToGrid(child) - end) + backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect( + function(child) + addToGrid(child) + end + ) end end) @@ -906,7 +959,10 @@ end) local loadoutChildren = currentLoadout:GetChildren() for i = 1, #loadoutChildren do - if loadoutChildren[i]:IsA "Frame" and string.find(loadoutChildren[i].Name, "Slot") then + if + loadoutChildren[i]:IsA "Frame" + and string.find(loadoutChildren[i].Name, "Slot") + then loadoutChildren[i].ChildRemoved:connect(function() updateGridActive() end) @@ -918,7 +974,10 @@ end ------------------------- End Lifelong Connections ----------------------- pcall(function() - coreGuiChanged(Enum.CoreGuiType.Backpack, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack)) + coreGuiChanged( + Enum.CoreGuiType.Backpack, + Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack) + ) Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) end) @@ -939,9 +998,11 @@ if characterChildAddedCon == nil and game.Players.LocalPlayer["Character"] then setupCharacterConnections() end if not backpackAddCon then - backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) - addToGrid(child) - end) + backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect( + function(child) + addToGrid(child) + end + ) end backpackOpenEvent.Event:connect(backpackOpenHandler) diff --git a/lua/89449093.lua b/lua/89449093.lua index e241e7f..171feaf 100644 --- a/lua/89449093.lua +++ b/lua/89449093.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 89449093" -- This script manages context switches in the backpack (Gear to Wardrobe, etc.) and player state changes. Also manages global functions across different tabs (currently only search) if game.CoreGui.Version < 7 then return @@ -45,7 +46,8 @@ if game.CoreGui.Version >= 8 then wardrobeButton = backpack.Tabs.WardrobeButton end waitForChild(backpack.Parent, "ControlFrame") -local backpackButton = waitForChild(backpack.Parent.ControlFrame, "BackpackButton") +local backpackButton = + waitForChild(backpack.Parent.ControlFrame, "BackpackButton") local currentTab = "gear" local searchFrame = waitForChild(backpack, "SearchFrame") @@ -64,7 +66,7 @@ local backpackIsOpen = false local active = true local disabledByDeveloper = false -local humanoidDiedCon = nil +local humanoidDiedCon local guiTweenSpeed = 0.25 -- how quickly we open/close the backpack @@ -97,7 +99,10 @@ function createPublicFunction(funcName, invokeFunc) assert(funcName, "funcName is nil") assert(tostring(funcName), "funcName is not a string") assert(invokeFunc, "invokeFunc is nil") - assert(type(invokeFunc) == "function", "invokeFunc should be of type 'function'") + assert( + type(invokeFunc) == "function", + "invokeFunc should be of type 'function'" + ) local newFunction = Instance.new "BindableFunction" newFunction.Name = tostring(funcName) @@ -128,7 +133,9 @@ function initHumanoidDiedConnections() end waitForProperty(game.Players.LocalPlayer, "Character") waitForChild(game.Players.LocalPlayer.Character, "Humanoid") - humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect(deactivateBackpack) + humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect( + deactivateBackpack + ) end function activateBackpack() @@ -171,18 +178,28 @@ local hideBackpack = function() end function showBackpack() - game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, function() - backpack.Visible = true - backpackButton.Selected = true - end, function() - backpack.Visible = false - backpackButton.Selected = false - end) + game.GuiService:AddCenterDialog( + backpack, + Enum.CenterDialogType.PlayerInitiatedDialog, + function() + backpack.Visible = true + backpackButton.Selected = true + end, + function() + backpack.Visible = false + backpackButton.Selected = false + end + ) backpack.Visible = true backpackButton.Selected = true backpack:TweenSizeAndPosition( backpackSize, - UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -backpackSize.Y.Offset - 88), + UDim2.new( + 0.5, + -backpackSize.X.Offset / 2, + 1, + -backpackSize.Y.Offset - 88 + ), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, guiTweenSpeed, @@ -194,8 +211,9 @@ function showBackpack() backpackOpenEvent:Fire(currentTab) canToggle = true readyForNextEvent = true - backpackButton.Image = "http://www.roblox.com/asset/?id=97644093" - backpackButton.Position = UDim2.new(0.5, -60, 1, -backpackSize.Y.Offset - 103) + backpackButton.Image = "http://banland.xyz/asset/?id=97644093" + backpackButton.Position = + UDim2.new(0.5, -60, 1, -backpackSize.Y.Offset - 103) end) end @@ -218,7 +236,7 @@ function toggleBackpack() backpackIsOpen = not backpackIsOpen if backpackIsOpen then - loadoutBackground.Image = "http://www.roblox.com/asset/?id=97623721" + loadoutBackground.Image = "http://banland.xyz/asset/?id=97623721" loadoutBackground.Position = UDim2.new(-0.03, 0, -0.17, 0) loadoutBackground.Size = UDim2.new(1.05, 0, 1.25, 0) loadoutBackground.ZIndex = 2.0 @@ -228,8 +246,8 @@ function toggleBackpack() backpackButton.Position = UDim2.new(0.5, -60, 1, -44) loadoutBackground.Visible = false backpackButton.Selected = false - backpackButton.Image = "http://www.roblox.com/asset/?id=97617958" - loadoutBackground.Image = "http://www.roblox.com/asset/?id=96536002" + backpackButton.Image = "http://banland.xyz/asset/?id=97617958" + loadoutBackground.Image = "http://banland.xyz/asset/?id=96536002" loadoutBackground.Position = UDim2.new(-0.1, 0, -0.1, 0) loadoutBackground.Size = UDim2.new(1.2, 0, 1.2, 0) hideBackpack() @@ -368,7 +386,10 @@ local backpackReady = function() end function coreGuiChanged(coreGuiType, enabled) - if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then + if + coreGuiType == Enum.CoreGuiType.Backpack + or coreGuiType == Enum.CoreGuiType.All + then active = enabled disabledByDeveloper = not enabled @@ -401,7 +422,10 @@ createPublicFunction("BackpackReady", backpackReady) ------------------------ Connections/Script Main ------------------------------------------- pcall(function() - coreGuiChanged(Enum.CoreGuiType.Backpack, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack)) + coreGuiChanged( + Enum.CoreGuiType.Backpack, + Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack) + ) Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) end) diff --git a/lua/97188756.lua b/lua/97188756.lua index aee1491..90194a4 100644 --- a/lua/97188756.lua +++ b/lua/97188756.lua @@ -1,3 +1,4 @@ +print "[Mercury]: Loaded corescript 97188756" --[[ //FileName: ChatScript.LUA //Written by: Sorcus @@ -95,7 +96,10 @@ do return function(t) local e = { [EnumName] = enumName } for i, name in pairs(t) do - local item = setmetatable({ Name = name, Value = i, Enum = e, [EnumName] = enumName }, item_mt) + local item = setmetatable( + { Name = name, Value = i, Enum = e, [EnumName] = enumName }, + item_mt + ) e[i] = item e[name] = item e[item] = item @@ -184,7 +188,12 @@ local Chat = { ["Use the Chat menu to talk to me."] = { "/sc 0", true }, ["I can only see menu chats."] = { "/sc 1", true }, ["Hello"] = { - ["Hi"] = { "/sc 2_0", true, ["Hi there!"] = true, ["Hi everyone"] = true }, + ["Hi"] = { + "/sc 2_0", + true, + ["Hi there!"] = true, + ["Hi everyone"] = true, + }, ["Howdy"] = { "/sc 2_1", true, ["Howdy partner!"] = true }, ["Greetings"] = { "/sc 2_2", @@ -277,7 +286,13 @@ local Chat = { ["Goodluck!"] = true, ["Ta-ta for now!"] = true, }, - ["Peace"] = { "/sc 3_6", true, ["Peace out!"] = true, ["Peace dudes!"] = true, ["Rest in pieces!"] = true }, + ["Peace"] = { + "/sc 3_6", + true, + ["Peace out!"] = true, + ["Peace dudes!"] = true, + ["Rest in pieces!"] = true, + }, ["Silly"] = { "/sc 3_7", true, @@ -319,7 +334,13 @@ local Chat = { ["No, thank you"] = true, ["Thanx"] = true, }, - ["No problem"] = { "/sc 4_4", true, ["Don't worry"] = true, ["That's ok"] = true, ["np"] = true }, + ["No problem"] = { + "/sc 4_4", + true, + ["Don't worry"] = true, + ["That's ok"] = true, + ["np"] = true, + }, ["You are ..."] = { "/sc 4_5", true, @@ -462,7 +483,12 @@ local Chat = { ["Animals"] = { "/sc 6_3", true, - ["Cats"] = { ["Lion"] = true, ["Tiger"] = true, ["Leopard"] = true, ["Cheetah"] = true }, + ["Cats"] = { + ["Lion"] = true, + ["Tiger"] = true, + ["Leopard"] = true, + ["Cheetah"] = true, + }, ["Dogs"] = { ["Wolves"] = true, ["Beagle"] = true, @@ -474,8 +500,17 @@ local Chat = { ["Terrier"] = true, ["Retriever"] = true, }, - ["Horses"] = { ["Ponies"] = true, ["Stallions"] = true, ["Pwnyz"] = true }, - ["Reptiles"] = { ["Dinosaurs"] = true, ["Lizards"] = true, ["Snakes"] = true, ["Turtles!"] = true }, + ["Horses"] = { + ["Ponies"] = true, + ["Stallions"] = true, + ["Pwnyz"] = true, + }, + ["Reptiles"] = { + ["Dinosaurs"] = true, + ["Lizards"] = true, + ["Snakes"] = true, + ["Turtles!"] = true, + }, ["Hamster"] = true, ["Monkey"] = true, ["Bears"] = true, @@ -545,7 +580,11 @@ local Chat = { ["Volleyball"] = true, ["Tennis"] = true, ["Sports team practice"] = true, - ["Watersports"] = { ["Surfing"] = true, ["Swimming"] = true, ["Water Polo"] = true }, + ["Watersports"] = { + ["Surfing"] = true, + ["Swimming"] = true, + ["Water Polo"] = true, + }, ["Winter sports"] = { ["Skiing"] = true, ["Snowboarding"] = true, @@ -599,7 +638,10 @@ local Chat = { ["Coding"] = true, ["Hacking"] = true, }, - ["The Internet"] = { ["lol. teh internets!"] = true, ["Watching vids"] = true }, + ["The Internet"] = { + ["lol. teh internets!"] = true, + ["Watching vids"] = true, + }, ["Dance"] = true, ["Gymnastics"] = true, ["Listening to music"] = true, @@ -759,7 +801,10 @@ local Chat = { }, ["Boy"] = { "/sc 6_12", true }, ["Girl"] = { "/sc 6_13", true }, - ["I don't want to say boy or girl. Don't ask."] = { "/sc 6_14", true }, + ["I don't want to say boy or girl. Don't ask."] = { + "/sc 6_14", + true, + }, [1] = "/sc 6", }, ["Game"] = { @@ -905,9 +950,13 @@ function Chat:EnableScrolling(toggle) Camera.CameraType = "Scriptable" -- Get relative position of camera and keep to it Spawn(function() - local currentRelativePos = Camera.CoordinateFrame.p - torso.Position + local currentRelativePos = Camera.CoordinateFrame.p + - torso.Position while Chat.MouseOnFrame do - Camera.CoordinateFrame = CFrame.new(torso.Position + currentRelativePos, head.Position) + Camera.CoordinateFrame = CFrame.new( + torso.Position + currentRelativePos, + head.Position + ) wait(0.015) end end) @@ -962,23 +1011,30 @@ function Chat:UpdateQueue(field, diff) for i = #self.MessageQueue, 1, -1 do if self.MessageQueue[i] then for _, label in pairs(self.MessageQueue[i]) do - if label and type(label) ~= "table" and type(label) ~= "number" then + if + label + and type(label) ~= "table" + and type(label) ~= "number" + then if label:IsA "TextLabel" or label:IsA "TextButton" then if diff then - label.Position = label.Position - UDim2.new(0, 0, diff, 0) + label.Position = label.Position + - UDim2.new(0, 0, diff, 0) else if field == self.MessageQueue[i] then label.Position = UDim2.new( self.Configuration.XScale, 0, - label.Position.Y.Scale - field["Message"].Size.Y.Scale, + label.Position.Y.Scale + - field["Message"].Size.Y.Scale, 0 ) -- Just to show up popping effect for the latest message in chat Spawn(function() wait(0.05) while label.TextTransparency >= 0 do - label.TextTransparency = label.TextTransparency - 0.2 + label.TextTransparency = label.TextTransparency + - 0.2 wait(0.03) end if label == field["Message"] then @@ -991,7 +1047,8 @@ function Chat:UpdateQueue(field, diff) label.Position = UDim2.new( self.Configuration.XScale, 0, - label.Position.Y.Scale - field["Message"].Size.Y.Scale, + label.Position.Y.Scale + - field["Message"].Size.Y.Scale, 0 ) end @@ -1045,7 +1102,12 @@ function Chat:ComputeSpaceString(pLabel) local nString = " " if not self.TempSpaceLabel then self.TempSpaceLabel = Gui.Create "TextButton" { - Size = UDim2.new(0, pLabel.AbsoluteSize.X, 0, pLabel.AbsoluteSize.Y), + Size = UDim2.new( + 0, + pLabel.AbsoluteSize.X, + 0, + pLabel.AbsoluteSize.Y + ), FontSize = self.Configuration.FontSize, Parent = self.RenderFrame, BackgroundTransparency = 1, @@ -1239,7 +1301,8 @@ function Chat:CreateMessage(cPlayer, message) -- This will give beautiful multilines as well local heightField = mLabel.TextBounds.Y - mLabel.Size = UDim2.new(1, 0, heightField / self.RenderFrame.AbsoluteSize.Y, 0) + mLabel.Size = + UDim2.new(1, 0, heightField / self.RenderFrame.AbsoluteSize.Y, 0) pLabel.Size = mLabel.Size local queueField = {} @@ -1314,7 +1377,8 @@ function Chat:CreateSafeChatOptions(list, rootButton) count = count + 1 if type(list[msg]) == "table" then - text_List[rootButton][chatText] = Chat:CreateSafeChatOptions(list[msg], chatText) + text_List[rootButton][chatText] = + Chat:CreateSafeChatOptions(list[msg], chatText) -- else -- --table.insert(text_List[chatText], true) end @@ -1354,13 +1418,14 @@ function Chat:CreateSafeChatGui() Size = UDim2.new(0, 44, 0, 31), Position = UDim2.new(0, 1, 0.35, 0), BackgroundTransparency = 1, - Image = "http://www.roblox.com/asset/?id=97080365", + Image = "http://banland.xyz/asset/?id=97080365", }, } self.SafeChatButton = self.SafeChatFrame.SafeChatButton -- safe chat button is the root of this tree - self.SafeChatTree[self.SafeChatButton] = Chat:CreateSafeChatOptions(self.SafeChat_List, self.SafeChatButton) + self.SafeChatTree[self.SafeChatButton] = + Chat:CreateSafeChatOptions(self.SafeChat_List, self.SafeChatButton) self.SafeChatButton.MouseButton1Click:connect(function() Chat:ToggleSafeChatMenu(self.SafeChatButton) @@ -1400,7 +1465,7 @@ function Chat:CreateTouchButton() Size = UDim2.new(1, 0, 1, 0), Position = UDim2.new(0, 0, 0, 0), BackgroundTransparency = 1, - Image = "http://www.roblox.com/asset/?id=97078724", + Image = "http://banland.xyz/asset/?id=97078724", }, } self.TapToChatLabel = self.ChatTouchFrame.ChatLabel @@ -1505,7 +1570,7 @@ function Chat:CreateGui() Gui.Create "ImageLabel" { Name = "Background", - Image = "http://www.roblox.com/asset/?id=97120937", --96551212'; + Image = "http://banland.xyz/asset/?id=97120937", --96551212'; Size = UDim2.new(1.3, 0, 1.64, 0), Position = UDim2.new(0, 0, 0, 0), BackgroundTransparency = 1, @@ -1680,9 +1745,16 @@ function Chat:PlayerChatted(...) if PlayersService.ClassicChat then if - not (string.sub(message, 1, 3) == "/e " or string.sub(message, 1, 7) == "/emote ") + not ( + string.sub(message, 1, 3) == "/e " + or string.sub(message, 1, 7) == "/emote " + ) and (forceChatGUI or Player.ChatMode == Enum.ChatMode.TextAndMenu) - or (Player.ChatMode == Enum.ChatMode.Menu and string.sub(message, 1, 3) == "/sc") + or (Player.ChatMode == Enum.ChatMode.Menu and string.sub( + message, + 1, + 3 + ) == "/sc") or (Chat:FindMessageInSafeChat(message, self.SafeChat_List)) then Chat:UpdateChat(player, message) @@ -1701,7 +1773,8 @@ function Chat:CullThread() field["SpawnTime"] and field["Player"] and field["Message"] - and tick() - field["SpawnTime"] > self.Configuration.LifeTime + and tick() - field["SpawnTime"] + > self.Configuration.LifeTime then field["Player"].Visible = false field["Message"].Visible = false @@ -1724,7 +1797,10 @@ function Chat:LockAllFields(gui) end function Chat:CoreGuiChanged(coreGuiType, enabled) - if coreGuiType == Enum.CoreGuiType.Chat or coreGuiType == Enum.CoreGuiType.All then + if + coreGuiType == Enum.CoreGuiType.Chat + or coreGuiType == Enum.CoreGuiType.All + then if self.Frame then self.Frame.Visible = enabled end @@ -1746,10 +1822,15 @@ function Chat:Initialize() Chat:CreateGui() pcall(function() - Chat:CoreGuiChanged(Enum.CoreGuiType.Chat, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Chat)) - Game.StarterGui.CoreGuiChangedSignal:connect(function(coreGuiType, enabled) - Chat:CoreGuiChanged(coreGuiType, enabled) - end) + Chat:CoreGuiChanged( + Enum.CoreGuiType.Chat, + Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Chat) + ) + Game.StarterGui.CoreGuiChangedSignal:connect( + function(coreGuiType, enabled) + Chat:CoreGuiChanged(coreGuiType, enabled) + end + ) end) self.EventListener = PlayersService.PlayerChatted:connect(function(...) diff --git a/lua/host.lua b/lua/host.lua index 0c1d6ee..7808ae2 100644 --- a/lua/host.lua +++ b/lua/host.lua @@ -1,11 +1,19 @@ print "[Mercury]: Loaded Host corescript" +-- Start Game Script Arguments local placeId, sleeptime, access, url, killID, deathID, timeout, injectScriptAssetID, servicesUrl, libraryRegistrationScriptAssetID + +-- StartGame -- pcall(function() - return game:GetService("ScriptContext"):AddStarterScript(injectScriptAssetID) + game:GetService("ScriptContext"):AddStarterScript(injectScriptAssetID) end) game:GetService("RunService"):Run() -local waitForChild -waitForChild = function(parent, childName) + +-- REQUIRES: StartGanmeSharedArgs.txt +-- REQUIRES: MonitorGameStatus.txt + +------------------- UTILITY FUNCTIONS -------------------------- + +function waitForChild(parent, childName) while true do local child = parent:findFirstChild(childName) if child then @@ -14,184 +22,265 @@ waitForChild = function(parent, childName) parent.ChildAdded:wait() end end -local getKillerOfHumanoidIfStillInGame -getKillerOfHumanoidIfStillInGame = function(humanoid) + +-- returns the player object that killed this humanoid +-- returns nil if the killer is no longer in the game +function getKillerOfHumanoidIfStillInGame(humanoid) + -- check for kill tag on humanoid - may be more than one - todo: deal with this local tag = humanoid:findFirstChild "creator" - if tag and tag.Value.Parent then - return tag.Value + + -- find player with name on tag + if tag then + local killer = tag.Value + if killer.Parent then -- killer still in game + return killer + end end + + return nil end -local onDied -onDied = function(victim, humanoid) - local killer, victorId = getKillerOfHumanoidIfStillInGame(humanoid), 0 + +-- send kill and death stats when a player dies +function onDied(victim, humanoid) + local killer = getKillerOfHumanoidIfStillInGame(humanoid) + local victorId = 0 if killer then victorId = killer.userId - print("STAT: kill by " .. tostring(victorId) .. " of " .. tostring(victim.userId)) - game:HttpGet(tostring(url) .. "/Game/Knockouts.ashx?UserID=" .. tostring(victorId) .. "&" .. tostring(access)) + print("STAT: kill by " .. victorId .. " of " .. victim.userId) + game:HttpGet( + url .. "/Game/Knockouts.ashx?UserID=" .. victorId .. "&" .. access + ) end - print("STAT: death of " .. tostring(victim.userId) .. " by " .. tostring(victorId)) - return game:HttpGet( - tostring(url) .. "/Game/Wipeouts.ashx?UserID=" .. tostring(victim.userId) .. "&" .. tostring(access) + print("STAT: death of " .. victim.userId .. " by " .. victorId) + game:HttpGet( + url .. "/Game/Wipeouts.ashx?UserID=" .. victim.userId .. "&" .. access ) end + +-----------------------------------END UTILITY FUNCTIONS ------------------------- + +-----------------------------------"CUSTOM" SHARED CODE---------------------------------- + pcall(function() settings().Network.UseInstancePacketCache = true end) pcall(function() settings().Network.UsePhysicsPacketCache = true end) +--pcall(function() settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.FIFO end) pcall(function() - settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError + settings()["Task Scheduler"].PriorityMethod = + Enum.PriorityMethod.AccumulatedError end) + +--settings().Network.PhysicsSend = 1 -- 1==RoundRobin settings().Network.PhysicsSend = Enum.PhysicsSendMethod.ErrorComputation2 settings().Network.ExperimentalPhysicsEnabled = true settings().Network.WaitingForCharacterLogRate = 100 pcall(function() - return settings().Diagnostics:LegacyScriptMode() + settings().Diagnostics:LegacyScriptMode() end) + +-----------------------------------START GAME SHARED SCRIPT------------------------------ + url = "_BASE_URL" + local scriptContext = game:GetService "ScriptContext" pcall(function() - return scriptContext:AddStarterScript(libraryRegistrationScriptAssetID) + scriptContext:AddStarterScript(libraryRegistrationScriptAssetID) end) scriptContext.ScriptsDisabled = true + +-- game:SetPlaceID(nil, false) game:GetService("ChangeHistoryService"):SetEnabled(false) + +-- establish this peer as the Server local ns = game:GetService "NetworkServer" + if url ~= nil then pcall(function() - return game:GetService("Players"):SetAbuseReportUrl(tostring(url) .. "/Report/Games.ashx") + game:GetService("Players"):SetAbuseReportUrl( + url .. "/Report/Games.ashx" + ) end) pcall(function() - return game:GetService("ScriptInformationProvider"):SetAssetUrl(tostring(url) .. "/Asset/") + game:GetService("ScriptInformationProvider") + :SetAssetUrl(url .. "/Asset/") end) pcall(function() - return game:GetService("ContentProvider"):SetBaseUrl(tostring(url) .. "/") + game:GetService("ContentProvider"):SetBaseUrl(url .. "/") end) + -- pcall(function() game:GetService("Players"):SetChatFilterUrl(url .. "/Game/ChatFilter.ashx") end) + + -- game:GetService("BadgeService"):SetPlaceId(placeId) if access ~= nil then - do - local _with_0 = game:GetService "BadgeService" - _with_0:SetAwardBadgeUrl( - tostring(url) .. "/Game/Badge/AwardBadge.ashx?UserID=%d&BadgeID=%d&PlaceID=%d&" .. tostring(access) - ) - _with_0:SetHasBadgeUrl( - tostring(url) .. "/Game/Badge/HasBadge.ashx?UserID=%d&BadgeID=%d&" .. tostring(access) - ) - _with_0:SetIsBadgeDisabledUrl( - tostring(url) .. "/Game/Badge/IsBadgeDisabled.ashx?BadgeID=%d&PlaceID=%d&" .. tostring(access) - ) - end - do - local _with_0 = game:GetService "FriendService" - _with_0:SetMakeFriendUrl( - tostring(servicesUrl) .. "/Friend/CreateFriend?firstUserId=%d&secondUserId=%d&" .. tostring(access) - ) - _with_0:SetBreakFriendUrl( - tostring(servicesUrl) .. "/Friend/BreakFriend?firstUserId=%d&secondUserId=%d&" .. tostring(access) - ) - _with_0:SetGetFriendsUrl(tostring(servicesUrl) .. "/Friend/AreFriends?userId=%d&" .. tostring(access)) - end + game:GetService("BadgeService"):SetAwardBadgeUrl( + url + .. "/Game/Badge/AwardBadge.ashx?UserID=%d&BadgeID=%d&PlaceID=%d&" + .. access + ) + game:GetService("BadgeService"):SetHasBadgeUrl( + url .. "/Game/Badge/HasBadge.ashx?UserID=%d&BadgeID=%d&" .. access + ) + game:GetService("BadgeService"):SetIsBadgeDisabledUrl( + url + .. "/Game/Badge/IsBadgeDisabled.ashx?BadgeID=%d&PlaceID=%d&" + .. access + ) + + game:GetService("FriendService"):SetMakeFriendUrl( + servicesUrl + .. "/Friend/CreateFriend?firstUserId=%d&secondUserId=%d&" + .. access + ) + game:GetService("FriendService"):SetBreakFriendUrl( + servicesUrl + .. "/Friend/BreakFriend?firstUserId=%d&secondUserId=%d&" + .. access + ) + game:GetService("FriendService"):SetGetFriendsUrl( + servicesUrl .. "/Friend/AreFriends?userId=%d&" .. access + ) end game:GetService("BadgeService"):SetIsBadgeLegalUrl "" - do - local _with_0 = game:GetService "InsertService" - _with_0:SetBaseSetsUrl(tostring(url) .. "/game/tools/insertasset?nsets=10&type=base") - _with_0:SetUserSetsUrl(tostring(url) .. "/game/tools/insertasset?nsets=20&type=user&userid=%d") - _with_0:SetCollectionUrl(tostring(url) .. "/game/tools/insertasset?sid=%d") - _with_0:SetAssetUrl(tostring(url) .. "/Asset/?id=%d") - _with_0:SetAssetVersionUrl(tostring(url) .. "/Asset/?assetversionid=%d") - end + game:GetService("InsertService") + :SetBaseSetsUrl( + url .. "/Game/Tools/InsertAsset.ashx?nsets=10&type=base" + ) + game:GetService("InsertService"):SetUserSetsUrl( + url .. "/Game/Tools/InsertAsset.ashx?nsets=20&type=user&userid=%d" + ) + game:GetService("InsertService") + :SetCollectionUrl(url .. "/Game/Tools/InsertAsset.ashx?sid=%d") + game:GetService("InsertService"):SetAssetUrl(url .. "/Asset/?id=%d") + game:GetService("InsertService") + :SetAssetVersionUrl(url .. "/Asset/?assetversionid=%d") + pcall(function() - return loadfile(tostring(url) .. "/Game/LoadPlaceInfo.ashx?PlaceId=" .. tostring(placeId))() + loadfile(url .. "/Game/LoadPlaceInfo.ashx?PlaceId=" .. placeId)() end) + pcall(function() if access then - return loadfile( - tostring(url) + loadfile( + url .. "/Game/PlaceSpecificScript.ashx?PlaceId=" - .. tostring(placeId) + .. placeId .. "&" - .. tostring(access) + .. access )() end end) end + pcall(function() - return game:GetService("NetworkServer"):SetIsPlayerAuthenticationRequired(true) + game:GetService("NetworkServer"):SetIsPlayerAuthenticationRequired(true) end) settings().Diagnostics.LuaRamLimit = 0 -if (placeId ~= nil) and (killID ~= nil) and (deathID ~= nil) and (url ~= nil) then - local createDeathMonitor - createDeathMonitor = function(player) +--settings().Network:SetThroughputSensitivity(0.08, 0.01) +--settings().Network.SendRate = 35 +--settings().Network.PhysicsSend = 0 -- 1==RoundRobin + +--shared["__time"] = 0 +--game:GetService("RunService").Stepped:connect(function (time) shared["__time"] = time end) + +if placeId ~= nil and killID ~= nil and deathID ~= nil and url ~= nil then + -- listen for the death of a Player + function createDeathMonitor(player) + -- we don't need to clean up old monitors or connections since the Character will be destroyed soon if player.Character then local humanoid = waitForChild(player.Character, "Humanoid") - return humanoid.Died:connect(function() - return onDied(player, humanoid) + humanoid.Died:connect(function() + onDied(player, humanoid) end) end end + + -- listen to all Players' Characters game:GetService("Players").ChildAdded:connect(function(player) createDeathMonitor(player) - return player.Changed:connect(function(property) + player.Changed:connect(function(property) if property == "Character" then - return createDeathMonitor(player) + createDeathMonitor(player) end end) end) end + game:GetService("Players").PlayerAdded:connect(function(player) - print("Player " .. tostring(player.userId) .. " added") + print("Player " .. player.userId .. " added") + if url and access and placeId and player and player.userId then game:HttpGet( - tostring(url) + url .. "/Game/ClientPresence.ashx?action=connect&" - .. tostring(access) + .. access .. "&PlaceID=" - .. tostring(placeId) + .. placeId .. "&UserID=" - .. tostring(player.userId) + .. player.userId ) - return game:HttpGet( - tostring(url) + game:HttpGet( + url .. "/Game/PlaceVisit.ashx?UserID=" - .. tostring(player.userId) + .. player.userId .. "&AssociatedPlaceID=" - .. tostring(placeId) + .. placeId .. "&" - .. tostring(access) + .. access ) end end) + game:GetService("Players").PlayerRemoving:connect(function(player) - print("Player " .. tostring(player.userId) .. " leaving") + print("Player " .. player.userId .. " leaving") + if url and access and placeId and player and player.userId then - return game:HttpGet( - tostring(url) + game:HttpGet( + url .. "/Game/ClientPresence.ashx?action=disconnect&" - .. tostring(access) + .. access .. "&PlaceID=" - .. tostring(placeId) + .. placeId .. "&UserID=" - .. tostring(player.userId) + .. player.userId ) end end) -if (placeId ~= nil) and (url ~= nil) then + +if placeId ~= nil and url ~= nil then + -- yield so that file load happens in the heartbeat thread wait() - game:Load(tostring(url) .. "/asset/?id=" .. tostring(placeId)) + + -- load the game + game:Load(url .. "/asset/?id=" .. placeId) end + if _MAP_LOCATION_EXISTS then + -- yield so that file load happens in the heartbeat thread wait() + + -- load the game game:Load "_MAP_LOCATION" end + +-- Now start the connection ns:Start(_SERVER_PORT, sleeptime) + game:GetService("Visit"):SetPing("_SERVER_PRESENCE_URL", 30) + if timeout then scriptContext:SetTimeout(timeout) end scriptContext.ScriptsDisabled = false + +--delay(1, function() +-- loadfile(url .. "/analytics/GamePerfMonitor.ashx")(game.JobId, placeId) +--end) + local reset = ";mc" -return game.Players.PlayerAdded:connect(function(player) - return player.Chatted:connect(function(msg) +game.Players.PlayerAdded:connect(function(player) + player.Chatted:connect(function(msg) if msg == reset then if player.Character then player.Character.Humanoid.Health = 0 diff --git a/lua/join.lua b/lua/join.lua index 8b29920..762b93f 100644 --- a/lua/join.lua +++ b/lua/join.lua @@ -1,9 +1,25 @@ -print "[Mercury]: Loaded Join corescript" -- MultiplayerSharedScript.lua inserted here ------ Prepended to Join.lua -- +print "[Mercury]: Loaded Join corescript" +local InsertService = game:GetService "InsertService" +local ChangeHistoryService = game:GetService "ChangeHistoryService" +local ContentProvider = game:GetService "ContentProvider" +local SocialService = game:GetService "SocialService" +local GamePassService = game:GetService "GamePassService" +local MarketplaceService = game:GetService "MarketplaceService" +-- local UserInputService = game:GetService "UserInputService" +local Players = game:GetService "Players" +local Client = game:GetService "NetworkClient" +local Visit = game:GetService "Visit" + +-- MultiplayerSharedScript.lua inserted here ------ Prepended to Join.lua -- pcall(function() - return game:SetPlaceID(_PLACE_ID, false) + game:SetPlaceID(_PLACE_ID, false) end) -local isTouchDevice = Game:GetService("UserInputService").TouchEnabled + +-- if we are on a touch device, no blocking http calls allowed! This can cause a crash on iOS +-- In general we need a long term strategy to remove blocking http calls from all platforms +-- local isTouchDevice = UserInputService.TouchEnabled + settings()["Game Options"].CollisionSoundEnabled = true pcall(function() settings().Rendering.EnableFRM = true @@ -12,215 +28,268 @@ pcall(function() settings().Physics.Is30FpsThrottleEnabled = false end) pcall(function() - settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError + settings()["Task Scheduler"].PriorityMethod = + Enum.PriorityMethod.AccumulatedError end) pcall(function() - settings().Physics.PhysicsEnvironmentalThrottle = Enum.EnviromentalPhysicsThrottle.DefaultAuto + settings().Physics.PhysicsEnvironmentalThrottle = + Enum.EnviromentalPhysicsThrottle.DefaultAuto end) + +-- arguments --------------------------------------- local threadSleepTime = ... + if threadSleepTime == nil then threadSleepTime = 15 end + local test = _IS_STUDIO_JOIN + print "! Joining game '_PLACE_ID' place _PLACE_ID at _SERVER_ADDRESS" -game:GetService("ChangeHistoryService"):SetEnabled(false) -game:GetService("ContentProvider"):SetThreadPool(16) -do - local _with_0 = game:GetService "InsertService" - _with_0:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" - _with_0:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" - _with_0:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" - _with_0:SetAssetUrl "http://banland.xyz/Asset/?id=%d" - _with_0:SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" -end -do - local _with_0 = game:GetService "SocialService" - pcall(function() - return _with_0:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" - end) - pcall(function() - return _with_0:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" - end) - pcall(function() - return _with_0:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" - end) - pcall(function() - return _with_0:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" - end) - pcall(function() - return _with_0:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" - end) -end + +ChangeHistoryService:SetEnabled(false) +ContentProvider:SetThreadPool(16) +InsertService:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" +InsertService:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" +InsertService:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" +InsertService:SetAssetUrl "http://banland.xyz/Asset/?id=%d" +InsertService:SetAssetVersionUrl "http://banland.xyz/Asset/?assetversionid=%d" + pcall(function() - return game:GetService("GamePassService") - :SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" + SocialService:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" end) pcall(function() - return game:GetService("MarketplaceService") - :SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" + SocialService:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" end) pcall(function() - return game:GetService("MarketplaceService") - :SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" + SocialService:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" end) pcall(function() - return game:SetCreatorID(_CREATOR_ID, Enum.CreatorType.User) + SocialService:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" end) pcall(function() - return game:GetService("Players"):SetChatStyle(Enum.ChatStyle.ClassicAndBubble) + SocialService:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" end) +pcall(function() + GamePassService:SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" +end) +pcall(function() + MarketplaceService:SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" +end) +pcall(function() + MarketplaceService:SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" +end) +pcall(function() + game:SetCreatorID(_CREATOR_ID, Enum.CreatorType.User) +end) + +-- Bubble chat. This is all-encapsulated to allow us to turn it off with a config setting +pcall(function() + Players:SetChatStyle(Enum.ChatStyle.ClassicAndBubble) +end) + local waitingForCharacter = false pcall(function() if settings().Network.MtuOverride == 0 then settings().Network.MtuOverride = 1400 end end) -client = game:GetService "NetworkClient" -visit = game:GetService "Visit" -setMessage = function(message) - return game:SetMessage((function() - do - return message - end - end)()) + +-- functions --------------------------------------- +function setMessage(message) + -- todo: animated "..." + game:SetMessage(message) end -showErrorWindow = function(message, _, _) - return game:SetMessage(message) + +function showErrorWindow(message, _, _) + game:SetMessage(message) end -reportError = function(err, message) - print("***ERROR*** " .. tostring(err)) + +function reportError(err, message) + print("***ERROR*** " .. err) if not test then - visit:SetUploadUrl "" + Visit:SetUploadUrl "" end - client:disconnect() + Client:Disconnect() wait(4) - return showErrorWindow("Error: " .. tostring(err), message, "Other") + showErrorWindow("Error: " .. err, message, "Other") end -onDisconnection = function(_, lostConnection) + +-- called when the client connection closes +function onDisconnection(_, lostConnection) if lostConnection then - return showErrorWindow("You have lost the connection to the game", "LostConnection", "LostConnection") + showErrorWindow( + "You have lost the connection to the game", + "LostConnection", + "LostConnection" + ) else - return showErrorWindow("This game has shut down", "Kick", "Kick") + showErrorWindow("This game has shut down", "Kick", "Kick") end end -requestCharacter = function(replicator) + +function requestCharacter(replicator) + -- prepare code for when the Character appears local connection connection = player.Changed:connect(function(property) if property == "Character" then game:ClearMessage() waitingForCharacter = false - return connection:disconnect() + connection:disconnect() end end) + setMessage "Requesting character" + local success, err = pcall(function() replicator:RequestCharacter() setMessage "Waiting for character" waitingForCharacter = true end) + if not success then reportError(err, "W4C") return end end -onConnectionAccepted = function(url, replicator) - local connectResolved, waitingForMarker = true, true + +-- called when the client connection is established +function onConnectionAccepted(url, replicator) + connectResolved = true + + local waitingForMarker = true + local success, err = pcall(function() if not test then - visit:SetPing("_PING_URL", 30) - end - do - game:SetMessageBrickCount() + Visit:SetPing("_PING_URL", 30) end + game:SetMessageBrickCount() + replicator.Disconnection:connect(onDisconnection) + + -- Wait for a marker to return before creating the Player local marker = replicator:SendMarker() - return marker.Received:connect(function() + + marker.Received:connect(function() waitingForMarker = false - return requestCharacter(replicator) + requestCharacter(replicator) end) end) + if not success then reportError(err, "ConnectionAccepted") return end + + -- TODO: report marker progress + while waitingForMarker do workspace:ZoomToExtents() wait(0.5) end end -onConnectionFailed = function(_, err) - return showErrorWindow( - "Failed to connect to the Game. (ID=" .. tostring(err) .. ")", - "ID" .. tostring(err), + +-- called when the client connection fails +function onConnectionFailed(_, error) + showErrorWindow( + "Failed to connect to the Game. (ID=" .. error .. ")", + "ID" .. error, "Other" ) end -onConnectionRejected = function() + +-- called when the client connection is rejected +function onConnectionRejected() connectionFailed:disconnect() - return showErrorWindow("This game is not available. Please try another", "WrongVersion", "WrongVersion") + showErrorWindow( + "This game is not available. Please try another", + "WrongVersion", + "WrongVersion" + ) end + local idled = false -onPlayerIdled = function(time) +function onPlayerIdled(time) if time > 20 * 60 then - showErrorWindow(string.format("You were disconnected for being idle %d minutes", time / 60), "Idle", "Idle") - client:disconnect() + showErrorWindow( + string.format( + "You were disconnected for being idle %d minutes", + time / 60 + ), + "Idle", + "Idle" + ) + Client:disconnect() if not idled then idled = true end end end + +-- main ------------------------------------------------------------ + pcall(function() - return settings().Diagnostics:LegacyScriptMode() + settings().Diagnostics:LegacyScriptMode() end) local success, err = pcall(function() game:SetRemoteBuildMode(true) + setMessage "Connecting to Server" - client.ConnectionAccepted:connect(onConnectionAccepted) - client.ConnectionRejected:connect(onConnectionRejected) - connectionFailed = client.ConnectionFailed:connect(onConnectionFailed) - client.Ticket = "" + Client.ConnectionAccepted:connect(onConnectionAccepted) + Client.ConnectionRejected:connect(onConnectionRejected) + connectionFailed = Client.ConnectionFailed:connect(onConnectionFailed) + Client.Ticket = "" + playerConnectSucces, player = pcall(function() - return client:PlayerConnect(_USER_ID, "_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime) + return Client:PlayerConnect( + _USER_ID, + "_SERVER_ADDRESS", + _SERVER_PORT, + 0, + threadSleepTime + ) end) if not playerConnectSucces then - player = game:GetService("Players"):CreateLocalPlayer(_USER_ID) - client:Connect("_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime) - end - if not test then - delay(300, function() end) - end - do - local _with_0 = player - _with_0:SetSuperSafeChat(false) - pcall(function() - return _with_0:SetUnder13(false) - end) - pcall(function() - return _with_0:SetMembershipType(Enum.MembershipType._MEMBERSHIP_TYPE) - end) - pcall(function() - return _with_0:SetAccountAge(1) - end) + --Old player connection scheme + player = Players:CreateLocalPlayer(_USER_ID) + Client:Connect("_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime) end + + player:SetSuperSafeChat(false) + pcall(function() + player:SetUnder13(false) + end) + pcall(function() + player:SetMembershipType(Enum.MembershipType._MEMBERSHIP_TYPE) + end) + pcall(function() + player:SetAccountAge(1) + end) player.Idled:connect(onPlayerIdled) + pcall(function() player.Name = [========[_USER_NAME]========] end) player.CharacterAppearance = "_CHAR_APPEARANCE" if not test then - return visit:SetUploadUrl "" + Visit:SetUploadUrl "" end end) + if not success then reportError(err, "CreatePlayer") end + if not test then + -- TODO: Async get? loadfile ""("", -1, 0) end + pcall(function() - return game:SetScreenshotInfo "" + game:SetScreenshotInfo "" end) -return pcall(function() - return game:SetVideoInfo 'GamesROBLOX, video, free game, online virtual world' +pcall(function() + game:SetVideoInfo 'GamesMercury, video, free game, online virtual world' end) +-- use single quotes here because the video info string may have unescaped double quotes diff --git a/lua/studio.lua b/lua/studio.lua index d4d531c..9a42e39 100644 --- a/lua/studio.lua +++ b/lua/studio.lua @@ -1,60 +1,63 @@ print "[Mercury]: Loaded Studio corescript" -do - local _with_0 = game:GetService "InsertService" - pcall(function() - return _with_0:SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" - end) - pcall(function() - return _with_0:SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" - end) - game:GetService("ScriptInformationProvider"):SetAssetUrl "http://banland.xyz/Asset/" - _with_0:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" - _with_0:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" - _with_0:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" - _with_0:SetAssetUrl "http://banland.xyz/Asset/?id=%d" - _with_0:SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" - _with_0:SetTrustLevel(0) -end -do - local _with_0 = game:GetService "SocialService" - pcall(function() - return _with_0:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" - end) - pcall(function() - return _with_0:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" - end) - pcall(function() - return _with_0:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" - end) - pcall(function() - return _with_0:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" - end) - pcall(function() - return _with_0:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" - end) -end +local MarketplaceService = game:GetService "MarketplaceService" +local InsertService = game:GetService "InsertService" +local SocialService = game:GetService "SocialService" +local GamePassService = game:GetService "GamePassService" +local ScriptInformationProvider = game:GetService "ScriptInformationProvider" +local ScriptContext = game:GetService "ScriptContext" +-- Setup studio cmd bar & load core scripts pcall(function() - return game:GetService("GamePassService") - :SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" + InsertService:SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" end) -do - local _with_0 = game:GetService "MarketplaceService" - pcall(function() - return _with_0:SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" - end) - pcall(function() - return _with_0:SetDevProductInfoUrl "https://banland.xyz/marketplace/productDetails?productId=%d" - end) - pcall(function() - return _with_0:SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" - end) -end +pcall(function() + InsertService:SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" +end) + +ScriptInformationProvider:SetAssetUrl "http://banland.xyz/Asset/" +InsertService:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" +InsertService:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" +InsertService:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" +InsertService:SetAssetUrl "http://banland.xyz/Asset/?id=%d" +InsertService:SetAssetVersionUrl "http://banland.xyz/Asset/?assetversionid=%d" +InsertService:SetTrustLevel(0) + +pcall(function() + SocialService:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" +end) +pcall(function() + SocialService:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" +end) +pcall(function() + SocialService:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" +end) +pcall(function() + SocialService:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" +end) +pcall(function() + SocialService:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" +end) +pcall(function() + GamePassService:SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" +end) +pcall(function() + MarketplaceService:SetProductInfoUrl "https://banland.xyz/marketplace/productinfo?assetId=%d" +end) +pcall(function() + MarketplaceService:SetDevProductInfoUrl "https://banland.xyz/marketplace/productDetails?productId=%d" +end) +pcall(function() + MarketplaceService:SetPlayerOwnsAssetUrl "https://banland.xyz/ownership/hasasset?userId=%d&assetId=%d" +end) + local result, _ = pcall(function() - return game:GetService("ScriptContext"):AddStarterScript(37801172) + ScriptContext:AddStarterScript(37801172) end) if not result then - return pcall(function() - return game:GetService("ScriptContext") - :AddCoreScript(37801172, game:GetService("ScriptContext", "StarterScript")) + pcall(function() + ScriptContext:AddCoreScript( + 37801172, + game:GetService "ScriptContext", + "StarterScript" + ) end) end diff --git a/lua/visit.lua b/lua/visit.lua index 996a6df..803ebf5 100644 --- a/lua/visit.lua +++ b/lua/visit.lua @@ -1,127 +1,147 @@ print "[Mercury]: Loaded Visit corescript" +local ChangeHistoryService = game:GetService "ChangeHistoryService" +local InsertService = game:GetService "InsertService" +local Players = game:GetService "Players" +local RunService = game:GetService "RunService" +local ScriptInformationProvider = game:GetService "ScriptInformationProvider" +local SocialService = game:GetService "SocialService" +local CoreGui = game:GetService "CoreGui" +local ContentProvider = game:GetService "ContentProvider" +local GamePassService = game:GetService "GamePassService" +local Visit = game:GetService "Visit" +local ScriptContext = game:GetService "ScriptContext" + +-- Prepended to Edit.lua and Visit.lua and Studio.lua and PlaySolo.lua-- + do pcall(function() return game:SetPlaceID(_PLACE_ID) end) end -local visit, message = game:GetService "Visit", Instance.new "Message" +local message = Instance.new "Message" + message.Parent = workspace message.archivable = false -game:GetService("ScriptInformationProvider"):SetAssetUrl "http://banland.xyz/Asset/" -game:GetService("ContentProvider"):SetThreadPool(16) + +ScriptInformationProvider:SetAssetUrl "http://banland.xyz/Asset/" +ContentProvider:SetThreadPool(16) pcall(function() - return game:GetService("InsertService") - :SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" -end) + InsertService:SetFreeModelUrl "http://banland.xyz/game/tools/insertasset?type=fm&q=%s&pg=%d&rs=%d" +end) -- Used for free model search (insert tool) pcall(function() - return game:GetService("InsertService") - :SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" -end) + InsertService:SetFreeDecalUrl "http://banland.xyz/game/tools/insertasset?type=fd&q=%s&pg=%d&rs=%d" +end) -- Used for free decal search (insert tool) + settings().Diagnostics:LegacyScriptMode() -do - local _with_0 = game:GetService "InsertService" - _with_0:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" - _with_0:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" - _with_0:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" - _with_0:SetAssetUrl "http://banland.xyz/Asset/?id=%d" - _with_0:SetAssetVersionUrl "http://banland.xyz/asset/?assetversionid=%d" -end -do - local _with_0 = game:GetService "SocialService" - pcall(function() - return _with_0:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" - end) - pcall(function() - return _with_0:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" - end) - pcall(function() - return _with_0:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" - end) - pcall(function() - return _with_0:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" - end) - pcall(function() - return _with_0:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" - end) -end + +InsertService:SetBaseSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=10&type=base" +InsertService:SetUserSetsUrl "http://banland.xyz/game/tools/insertasset?nsets=20&type=user&userid=%d" +InsertService:SetCollectionUrl "http://banland.xyz/game/tools/insertasset?sid=%d" +InsertService:SetAssetUrl "http://banland.xyz/Asset/?id=%d" +InsertService:SetAssetVersionUrl "http://banland.xyz/Asset/?assetversionid=%d" + pcall(function() - return game:GetService("GamePassService") - :SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" + SocialService:SetFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d" end) pcall(function() - return game:SetCreatorID(0, Enum.CreatorType.User) + SocialService:SetBestFriendUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d" end) pcall(function() - return game:SetScreenshotInfo "" + SocialService:SetGroupUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d" end) pcall(function() - return game:SetVideoInfo "" + SocialService:SetGroupRankUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d" end) +pcall(function() + SocialService:SetGroupRoleUrl "http://banland.xyz/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d" +end) +pcall(function() + GamePassService:SetPlayerHasPassUrl "http://banland.xyz/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d" +end) +pcall(function() + game:SetCreatorID(0, Enum.CreatorType.User) +end) + +pcall(function() + game:SetScreenshotInfo "" +end) +pcall(function() + game:SetVideoInfo "" +end) + pcall(function() settings().Rendering.EnableFRM = true end) pcall(function() - settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError + settings()["Task Scheduler"].PriorityMethod = + Enum.PriorityMethod.AccumulatedError end) -game:GetService("ChangeHistoryService"):SetEnabled(false) + +ChangeHistoryService:SetEnabled(false) pcall(function() - return game:GetService("Players") - :SetBuildUserPermissionsUrl "http://banland.xyz/Game/BuildActionPermissionCheck.ashx?assetId=0&userId=%d&isSolo=true" + Players:SetBuildUserPermissionsUrl "http://banland.xyz/Game/BuildActionPermissionCheck.ashx?assetId=0&userId=%d&isSolo=true" end) + workspace:SetPhysicsThrottleEnabled(true) -local addedBuildTools, screenGui, doVisit = false, game:GetService("CoreGui"):FindFirstChild "RobloxGui", nil -doVisit = function() + +local addedBuildTools = false +local screenGui = CoreGui:FindFirstChild "RobloxGui" + +function doVisit() message.Text = "Loading Game" - do - pcall(function() - return visit:SetUploadUrl "" - end) - end + + pcall(function() + Visit:SetUploadUrl "" + end) message.Text = "Running" - game:GetService("RunService"):Run() + RunService:Run() + message.Text = "Creating Player" - do - player = game:GetService("Players"):CreateLocalPlayer(0) - end + + player = game:GetService("Players"):CreateLocalPlayer(0) player.CharacterAppearance = "" local propExists, canAutoLoadChar = false, false propExists = pcall(function() canAutoLoadChar = game.Players.CharacterAutoLoads end) + if (propExists and canAutoLoadChar) or not propExists then player:LoadCharacter() end + message.Text = "Setting GUI" player:SetSuperSafeChat(true) pcall(function() - return player:SetMembershipType(Enum.MembershipType.None) + player:SetMembershipType(Enum.MembershipType.None) end) pcall(function() - return player:SetAccountAge(0) + player:SetAccountAge(0) end) end -local success, err = pcall(doVisit) + +success, err = pcall(doVisit) + if not addedBuildTools then - do - local _with_0 = Instance.new "StringValue" - _with_0.Name = "PlayerName" - _with_0.Value = player.Name - _with_0.RobloxLocked = true - _with_0.Parent = screenGui - end + local playerName = Instance.new "StringValue" + playerName.Name = "PlayerName" + playerName.Value = player.Name + playerName.RobloxLocked = true + playerName.Parent = screenGui + pcall(function() - return game:GetService("ScriptContext"):AddCoreScript(59431535, screenGui, "BuildToolsScript") + ScriptContext:AddCoreScript(59431535, screenGui, "BuildToolsScript") end) addedBuildTools = true end + if success then message.Parent = nil else print(err) wait(5) - message.Text = "Error on visit: " .. tostring(err) + message.Text = "Error on visit: " .. err end diff --git a/stylua.toml b/stylua.toml index 6342351..91aa655 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,4 +1,4 @@ -column_width = 120 +column_width = 80 line_endings = "Unix" indent_type = "Tabs" indent_width = 4 From b56129fc7b48e2462d21fe42d5462287708f44ed Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Mon, 14 Aug 2023 19:43:38 +0100 Subject: [PATCH 04/14] Improve formatting and add compound assignment, which will be removed by Darklua --- README.md | 2 +- dense.json5 | 1 + lua/107893730.lua | 70 +++--- lua/152908679.lua | 17 +- lua/153556783.lua | 2 +- lua/157877000.lua | 32 ++- lua/38037565.lua | 17 +- lua/39250920.lua | 14 +- lua/45284430.lua | 134 +++++------ lua/46295863.lua | 30 ++- lua/48488235.lua | 584 ++++++++++++++++++++++------------------------ lua/53878057.lua | 19 +- lua/60595411.lua | 4 +- lua/60595695.lua | 2 +- lua/73157242.lua | 78 +++---- lua/89449008.lua | 10 +- lua/89449093.lua | 4 +- lua/97188756.lua | 46 ++-- lua/host.lua | 4 +- 19 files changed, 513 insertions(+), 557 deletions(-) diff --git a/README.md b/README.md index 0df7d67..3662d02 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # Corescripts -After installing Aftman and running `aftman install`, run `./compile.sh` to compile the corescripts from ./yue/\*.yue to ./processed/\*.lua. +After installing Aftman and running `aftman install`, run `./compile.sh` to compile the corescripts from ./lua/\*.lua to ./processed/\*.lua. diff --git a/dense.json5 b/dense.json5 index 13e7ef8..c02edcc 100644 --- a/dense.json5 +++ b/dense.json5 @@ -3,6 +3,7 @@ rules: [ "remove_comments", "remove_spaces", + "remove_compound_assignment", "group_local_assignment", // "compute_expression", "remove_unused_if_branch", diff --git a/lua/107893730.lua b/lua/107893730.lua index 02d066a..2bd94f1 100644 --- a/lua/107893730.lua +++ b/lua/107893730.lua @@ -145,7 +145,7 @@ function userPurchaseActionsEnded(isSuccess) local newPurchasedSucceededText = string.gsub( purchaseSucceededText, "itemName", - tostring(currentProductInfo["Name"]) + tostring(currentProductInfo.Name) ) purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText @@ -181,26 +181,26 @@ function updatePurchasePromptData(_) -- id to use when we request a purchase if not currentProductId then - currentProductId = currentProductInfo["ProductId"] + currentProductId = currentProductInfo.ProductId end if isFreeItem() then newItemDescription = string.gsub( freeItemPurchaseText, "itemName", - tostring(currentProductInfo["Name"]) + tostring(currentProductInfo.Name) ) newItemDescription = string.gsub( newItemDescription, "assetType", - tostring(assetTypeToString(currentProductInfo["AssetTypeId"])) + tostring(assetTypeToString(currentProductInfo.AssetTypeId)) ) setHeaderText(takeHeaderText) else -- otherwise item costs something, so different prompt newItemDescription = string.gsub( productPurchaseText, "itemName", - tostring(currentProductInfo["Name"]) + tostring(currentProductInfo.Name) ) newItemDescription = string.gsub( newItemDescription, @@ -221,7 +221,7 @@ function updatePurchasePromptData(_) if purchasingConsumable then purchaseDialog.BodyFrame.ItemPreview.Image = baseUrl .. "thumbs/asset.ashx?assetid=" - .. tostring(currentProductInfo["IconImageAssetId"]) + .. tostring(currentProductInfo.IconImageAssetId) .. "&x=100&y=100&format=png" else purchaseDialog.BodyFrame.ItemPreview.Image = baseUrl @@ -244,7 +244,7 @@ function doPlayerFundsCheck(checkIndefinitely) do wait(1 / 10) canPurchase, insufficientFunds = canPurchaseItem() - retries = retries - 1 + retries -= 1 end end if canPurchase and not insufficientFunds then @@ -372,7 +372,7 @@ end function purchaseFailed(inGamePurchasesDisabled) local name = "Item" if currentProductInfo then - name = currentProductInfo["Name"] + name = currentProductInfo.Name end local newPurchasedFailedText = @@ -467,14 +467,14 @@ function doAcceptPurchase(_) response = getRbxUtility().DecodeJSON(response) if response then - if response["success"] == false then - if response["status"] ~= "AlreadyOwned" then + if response.success == false then + if response.status ~= "AlreadyOwned" then print( "web return response of fail on purchase of", currentAssetId, currentProductId ) - purchaseFailed((response["status"] == "EconomyDisabled")) + purchaseFailed((response.status == "EconomyDisabled")) return end end @@ -492,7 +492,7 @@ function doAcceptPurchase(_) currentEquipOnPurchase and success and currentAssetId - and tonumber(currentProductInfo["AssetTypeId"]) == 19 + and tonumber(currentProductInfo.AssetTypeId) == 19 then local tool = getToolAssetID(tonumber(currentAssetId)) if tool then @@ -501,7 +501,7 @@ function doAcceptPurchase(_) end if purchasingConsumable then - if not response["receipt"] then + if not response.receipt then print( "tried to buy productId, but no receipt returned. productId was", currentProductId @@ -510,7 +510,7 @@ function doAcceptPurchase(_) return end Game:GetService("MarketplaceService"):SignalClientPurchaseSuccess( - tostring(response["receipt"]), + tostring(response.receipt), game.Players.LocalPlayer.userId, currentProductId ) @@ -746,8 +746,8 @@ end function isFreeItem() -- if both of these are true, then the item is free, just prompt user if they want to take one return currentProductInfo - and currentProductInfo["IsForSale"] == true - and currentProductInfo["IsPublicDomain"] == true + and currentProductInfo.IsForSale == true + and currentProductInfo.IsPublicDomain == true end ---------------------------------------------- End Currency Functions --------------------------------------------- @@ -847,8 +847,8 @@ function canPurchaseItem() end if - currentProductInfo["IsForSale"] == false - and currentProductInfo["IsPublicDomain"] == false + currentProductInfo.IsForSale == false + and currentProductInfo.IsPublicDomain == false then descText = "This item is no longer for sale." return true, nil, nil, true, descText @@ -857,8 +857,8 @@ function canPurchaseItem() -- now we start talking money, making sure we are going to be able to purchase this if not setCurrencyAmountAndType( - tonumber(currentProductInfo["PriceInRobux"]), - tonumber(currentProductInfo["PriceInTickets"]) + tonumber(currentProductInfo.PriceInRobux), + tonumber(currentProductInfo.PriceInTickets) ) then descText = @@ -873,7 +873,7 @@ function canPurchaseItem() end if - tonumber(currentProductInfo["MinimumMembershipLevel"]) + tonumber(currentProductInfo.MinimumMembershipLevel) > membershipTypeToNumber(game.Players.LocalPlayer.MembershipType) then notRightBc = true @@ -887,7 +887,7 @@ function canPurchaseItem() return true, insufficientFunds, notRightBc, false end - if currentProductInfo["ContentRatingTypeId"] == 1 then + if currentProductInfo.ContentRatingTypeId == 1 then if game.Players.LocalPlayer:GetUnder13() then descText = "Your account is under 13 so purchase of this item is not allowed." @@ -897,13 +897,13 @@ function canPurchaseItem() if ( - currentProductInfo["IsLimited"] == true - or currentProductInfo["IsLimitedUnique"] == true + currentProductInfo.IsLimited == true + or currentProductInfo.IsLimitedUnique == true ) and ( - currentProductInfo["Remaining"] == "" - or currentProductInfo["Remaining"] == 0 - or currentProductInfo["Remaining"] == nil + currentProductInfo.Remaining == "" + or currentProductInfo.Remaining == 0 + or currentProductInfo.Remaining == nil ) then descText = @@ -960,7 +960,7 @@ function startSpinner() "http://banland.xyz/Asset/?id=45880710" end - pos = pos + 1 + pos += 1 end spinPos = (spinPos + 1) % 8 wait(1 / 15) @@ -1019,7 +1019,7 @@ function createSpinner(size, position, parent) spinnerImage.Parent = spinnerFrame spinnerIcons[spinnerNum] = spinnerImage - spinnerNum = spinnerNum + 1 + spinnerNum += 1 end end @@ -1351,7 +1351,7 @@ function userPurchaseProductActionsEnded(userIsClosingDialog) if currentServerResponseTable then local isPurchased = false if - tostring(currentServerResponseTable["isValid"]):lower() + tostring(currentServerResponseTable.isValid):lower() == "true" then isPurchased = true @@ -1359,8 +1359,8 @@ function userPurchaseProductActionsEnded(userIsClosingDialog) Game:GetService("MarketplaceService") :SignalPromptProductPurchaseFinished( - tonumber(currentServerResponseTable["playerId"]), - tonumber(currentServerResponseTable["productId"]), + tonumber(currentServerResponseTable.playerId), + tonumber(currentServerResponseTable.productId), isPurchased ) else @@ -1371,7 +1371,7 @@ function userPurchaseProductActionsEnded(userIsClosingDialog) local newPurchasedSucceededText = string.gsub( purchaseSucceededText, "itemName", - tostring(currentProductInfo["Name"]) + tostring(currentProductInfo.Name) ) purchaseDialog.BodyFrame.ItemPreview.ItemDescription.Text = newPurchasedSucceededText @@ -1388,8 +1388,8 @@ function doProcessServerPurchaseResponse(serverResponseTable) end if - serverResponseTable["playerId"] - and tonumber(serverResponseTable["playerId"]) + serverResponseTable.playerId + and tonumber(serverResponseTable.playerId) == game.Players.LocalPlayer.userId then currentServerResponseTable = serverResponseTable diff --git a/lua/152908679.lua b/lua/152908679.lua index 0576cc1..81c67fe 100644 --- a/lua/152908679.lua +++ b/lua/152908679.lua @@ -9,8 +9,7 @@ local contextActionService = Game:GetService "ContextActionService" local isTouchDevice = Game:GetService("UserInputService").TouchEnabled local functionTable = {} local buttonVector = {} -local buttonScreenGui -local buttonFrame +local buttonScreenGui, buttonFrame local ContextDownImage = "http://www.banland.xyz/asset/?id=97166756" local ContextUpImage = "http://www.banland.xyz/asset/?id=97166444" @@ -169,10 +168,10 @@ function createNewButton(actionName, functionInfoTable) actionIcon.Size = UDim2.new(0.65, 0, 0.65, 0) actionIcon.BackgroundTransparency = 1 if - functionInfoTable["image"] - and type(functionInfoTable["image"]) == "string" + functionInfoTable.image + and type(functionInfoTable.image) == "string" then - actionIcon.Image = functionInfoTable["image"] + actionIcon.Image = functionInfoTable.image end actionIcon.Parent = contextButton @@ -187,10 +186,10 @@ function createNewButton(actionName, functionInfoTable) actionTitle.TextWrapped = true actionTitle.Text = "" if - functionInfoTable["title"] - and type(functionInfoTable["title"]) == "string" + functionInfoTable.title + and type(functionInfoTable.title) == "string" then - actionTitle.Text = functionInfoTable["title"] + actionTitle.Text = functionInfoTable.title end actionTitle.Parent = contextButton @@ -303,5 +302,5 @@ end) -- make sure any bound data before we setup connections is handled local boundActions = contextActionService:GetAllBoundActionInfo() for actionName, actionData in pairs(boundActions) do - addAction(actionName, actionData["createTouchButton"], actionData) + addAction(actionName, actionData.createTouchButton, actionData) end diff --git a/lua/153556783.lua b/lua/153556783.lua index 9a6ddaf..f723014 100644 --- a/lua/153556783.lua +++ b/lua/153556783.lua @@ -406,7 +406,7 @@ function constructThumbstick( end function setupCharacterMovement(parentFrame) - local lastMovementVector, lastMaxMovement = nil + local lastMovementVector, lastMaxMovement local moveCharacterFunc = localPlayer.MoveCharacter local moveCharacterFunction = function(movementVector, maxMovement) if localPlayer then diff --git a/lua/157877000.lua b/lua/157877000.lua index 92a8c82..629a47f 100644 --- a/lua/157877000.lua +++ b/lua/157877000.lua @@ -524,9 +524,9 @@ function initializeDeveloperConsole() repeat if optionsHidden then - frameNumber = frameNumber - 1 + frameNumber -= 1 else - frameNumber = frameNumber + 1 + frameNumber += 1 end local x = frameNumber / 5 @@ -554,9 +554,9 @@ function initializeDeveloperConsole() function changeOffset(value) if currentConsole == LOCAL_CONSOLE then - localOffset = localOffset + value + localOffset += value elseif currentConsole == SERVER_CONSOLE then - serverOffset = serverOffset + value + serverOffset += value end repositionList() @@ -622,7 +622,7 @@ function initializeDeveloperConsole() message.Size = UDim2.new(0.98, 0, 0, message.TextBounds.Y) message.Position = UDim2.new(0, 5, 0, posOffset) message.Parent = Dev_TextHolder - posOffset = posOffset + message.TextBounds.Y + posOffset += message.TextBounds.Y if movePosition then if @@ -680,12 +680,12 @@ function initializeDeveloperConsole() end scrollUpIsDown = true wait(0.6) - inside = inside + 1 + inside += 1 while scrollUpIsDown and inside < 2 do wait() changeOffset(12) end - inside = inside - 1 + inside -= 1 end function holdingDownButton() @@ -694,12 +694,12 @@ function initializeDeveloperConsole() end scrollDownIsDown = true wait(0.6) - inside = inside + 1 + inside += 1 while scrollDownIsDown and inside < 2 do wait() changeOffset(-12) end - inside = inside - 1 + inside -= 1 end Dev_Container.Body.ScrollBar.Up.MouseButton1Click:connect(function() @@ -864,10 +864,10 @@ function initializeDeveloperConsole() local hour = math.floor(dayTime / 3600) - dayTime = dayTime - (hour * 3600) + dayTime -= (hour * 3600) local minute = math.floor(dayTime / 60) - dayTime = dayTime - (minute * 60) + dayTime -= (minute * 60) local h = numberWithZero(hour) local m = numberWithZero(minute) @@ -957,9 +957,7 @@ function initializeDeveloperConsole() localConsole.BackgroundTransparency = 0.6 serverConsole.BackgroundTransparency = 0.8 - if - game:FindFirstChild "Players" and game.Players["LocalPlayer"] - then + if game:FindFirstChild "Players" and game.Players.LocalPlayer then local mouse = game.Players.LocalPlayer:GetMouse() refreshConsolePosition(mouse.X, mouse.Y) refreshConsoleSize(mouse.X, mouse.Y) @@ -993,9 +991,7 @@ function initializeDeveloperConsole() serverConsole.BackgroundTransparency = 0.6 localConsole.BackgroundTransparency = 0.8 - if - game:FindFirstChild "Players" and game.Players["LocalPlayer"] - then + if game:FindFirstChild "Players" and game.Players.LocalPlayer then local mouse = game.Players.LocalPlayer:GetMouse() refreshConsolePosition(mouse.X, mouse.Y) refreshConsoleSize(mouse.X, mouse.Y) @@ -1012,7 +1008,7 @@ function initializeDeveloperConsole() clean() end) - if game:FindFirstChild "Players" and game.Players["LocalPlayer"] then + if game:FindFirstChild "Players" and game.Players.LocalPlayer then local LocalMouse = game.Players.LocalPlayer:GetMouse() LocalMouse.Move:connect(function() if not Dev_Container.Visible then diff --git a/lua/38037565.lua b/lua/38037565.lua index 26bddcd..1fb94f5 100644 --- a/lua/38037565.lua +++ b/lua/38037565.lua @@ -28,8 +28,7 @@ inCharTag.Name = "InCharTag" local hider = Instance.new "BoolValue" hider.Name = "RobloxBuildTool" -local currentChildren -local backpackTools +local currentChildren, backpackTools if config == nil then config = Instance.new "Configuration" @@ -132,7 +131,7 @@ while true do local fire = config:FindFirstChild "Fire" local stun = config:FindFirstChild "Stun" if regen then - delta = delta + regen.Value.X + delta += regen.Value.X if regen.Value.Y >= 0 then regen.Value = Vector3.new( regen.Value.X + regen.Value.Z, @@ -150,7 +149,7 @@ while true do end -- infinity is -1 end if poison then - delta = delta - poison.Value.X + delta -= poison.Value.X if poison.Value.Y >= 0 then poison.Value = Vector3.new( poison.Value.X + poison.Value.Z, @@ -170,7 +169,7 @@ while true do if ice then --print("IN ICE") - delta = delta - ice.Value.X + delta -= ice.Value.X if ice.Value.Y >= 0 then ice.Value = Vector3.new(ice.Value.X, ice.Value.Y - s, ice.Value.Z) @@ -182,7 +181,7 @@ while true do if fire then fireEffect.Enabled = true fireEffect.Parent = Figure.Torso - delta = delta - fire.Value.X + delta -= fire.Value.X if fire.Value.Y >= 0 then fire.Value = Vector3.new( fire.Value.X, @@ -224,7 +223,7 @@ while true do backpackTools[i].Parent = game.Players:GetPlayerFromCharacter(script.Parent).Backpack end - stun.Value = stun.Value - s + stun.Value -= s else Torso.Anchored = false for i = 1, #backpackTools do @@ -256,9 +255,9 @@ while true do if delta ~= 0 then coroutine.resume(coroutine.create(billboardHealthChange), delta) end - --delta = delta * .01 + --delta *= .01 end - --health = health + delta * s * Humanoid.MaxHealth + --health += delta * s * Humanoid.MaxHealth health = Humanoid.Health + delta * s if health * 1.01 < Humanoid.MaxHealth then diff --git a/lua/39250920.lua b/lua/39250920.lua index 787afa9..b90b0d8 100644 --- a/lua/39250920.lua +++ b/lua/39250920.lua @@ -15,9 +15,7 @@ local mainFrame local choices = {} local lastChoice local choiceMap = {} -local currentConversationDialog -local currentConversationPartner -local currentAbortDialogScript +local currentConversationDialog, currentConversationPartner, currentAbortDialogScript local tooFarAwayMessage = "You are too far away to chat!" local tooFarAwaySize = 300 @@ -26,11 +24,7 @@ local characterWanderedOffSize = 350 local conversationTimedOut = "Chat ended because you didn't reply" local conversationTimedOutSize = 350 -local player -local chatNotificationGui -local messageDialog -local timeoutScript -local reenableDialogScript +local player, chatNotificationGui, messageDialog, timeoutScript, reenableDialogScript local dialogMap = {} local dialogConnections = {} @@ -409,8 +403,8 @@ function presentDialogChoices(talkingPart, dialogChoices) choiceMap[choices[pos]] = obj - yPosition = yPosition + height - pos = pos + 1 + yPosition += height + pos += 1 end end diff --git a/lua/45284430.lua b/lua/45284430.lua index 2b2514e..47876ac 100644 --- a/lua/45284430.lua +++ b/lua/45284430.lua @@ -59,7 +59,7 @@ local function CreateButtons(frame, buttons, yPos, ySize) button.FontSize = Enum.FontSize.Size18 button.AutoButtonColor = true button.Modal = true - if obj["Style"] then + if obj.Style then button.Style = obj.Style else button.Style = Enum.ButtonStyle.RobloxButton @@ -70,7 +70,7 @@ local function CreateButtons(frame, buttons, yPos, ySize) button.Parent = frame buttonObjs[buttonNum] = button - buttonNum = buttonNum + 1 + buttonNum += 1 end local numButtons = buttonNum - 1 @@ -97,7 +97,7 @@ local function CreateButtons(frame, buttons, yPos, ySize) ) buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) - buttonNum = buttonNum + 1 + buttonNum += 1 end end end @@ -110,7 +110,7 @@ local function setSliderPos(newAbsPosX, slider, sliderPosition, bar, steps) ) local wholeNum, remainder = math.modf(relativePosX * newStep) if remainder > 0.5 then - wholeNum = wholeNum + 1 + wholeNum += 1 end relativePosX = wholeNum / newStep @@ -382,7 +382,7 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) obj.TextColor3 = Color3.new(1, 1, 1) obj.BackgroundTransparency = 1 - childNum = childNum + 1 + childNum += 1 end end end @@ -417,7 +417,7 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) else obj.Font = Enum.Font.Arial end - childNum = childNum + 1 + childNum += 1 end end end @@ -439,7 +439,7 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) local function scrollDown() if scrollBarPosition + dropDownItemCount <= itemCount then - scrollBarPosition = scrollBarPosition + 1 + scrollBarPosition += 1 updateScroll() return true end @@ -447,7 +447,7 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) end local function scrollUp() if scrollBarPosition > 1 then - scrollBarPosition = scrollBarPosition - 1 + scrollBarPosition -= 1 updateScroll() return true end @@ -464,13 +464,13 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) scrollUpButton.Position = UDim2.new(1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0) scrollUpButton.MouseButton1Click:connect(function() - scrollMouseCount = scrollMouseCount + 1 + scrollMouseCount += 1 end) scrollUpButton.MouseLeave:connect(function() - scrollMouseCount = scrollMouseCount + 1 + scrollMouseCount += 1 end) scrollUpButton.MouseButton1Down:connect(function() - scrollMouseCount = scrollMouseCount + 1 + scrollMouseCount += 1 scrollUp() local val = scrollMouseCount @@ -493,13 +493,13 @@ t.CreateDropDownMenu = function(items, onSelect, forRoblox) scrollDownButton.Position = UDim2.new(1, -11, 1, -11) scrollDownButton.Parent = droppedDownMenu scrollDownButton.MouseButton1Click:connect(function() - scrollMouseCount = scrollMouseCount + 1 + scrollMouseCount += 1 end) scrollDownButton.MouseLeave:connect(function() - scrollMouseCount = scrollMouseCount + 1 + scrollMouseCount += 1 end) scrollDownButton.MouseButton1Down:connect(function() - scrollMouseCount = scrollMouseCount + 1 + scrollMouseCount += 1 scrollDown() local val = scrollMouseCount @@ -670,10 +670,10 @@ local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) local isLabel = child:IsA "TextLabel" if isLabel then pixelsRemaining = pixelsRemaining - - settingsTable["TextLabelPositionPadY"] + - settingsTable.TextLabelPositionPadY else pixelsRemaining = pixelsRemaining - - settingsTable["TextButtonPositionPadY"] + - settingsTable.TextButtonPositionPadY end child.Position = UDim2.new( child.Position.X.Scale, @@ -695,14 +695,14 @@ local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) child.Size.X.Scale, child.Size.X.Offset, 0, - child.TextBounds.Y + settingsTable["TextLabelSizePadY"] + child.TextBounds.Y + settingsTable.TextLabelSizePadY ) else child.Size = UDim2.new( child.Size.X.Scale, child.Size.X.Offset, 0, - child.TextBounds.Y + settingsTable["TextButtonSizePadY"] + child.TextBounds.Y + settingsTable.TextButtonSizePadY ) end @@ -714,14 +714,14 @@ local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) child.AbsoluteSize.Y + 1 ) end - pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + pixelsRemaining -= child.AbsoluteSize.Y if isLabel then pixelsRemaining = pixelsRemaining - - settingsTable["TextLabelPositionPadY"] + - settingsTable.TextLabelPositionPadY else pixelsRemaining = pixelsRemaining - - settingsTable["TextButtonPositionPadY"] + - settingsTable.TextButtonPositionPadY end else child.Visible = false @@ -735,7 +735,7 @@ local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) 0, totalPixels - pixelsRemaining ) - pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + pixelsRemaining -= child.AbsoluteSize.Y child.Visible = (pixelsRemaining >= 0) end end @@ -755,17 +755,17 @@ t.LayoutGuiObjects = function(frame, guiObjects, settingsTable) settingsTable = {} end - if not settingsTable["TextLabelSizePadY"] then - settingsTable["TextLabelSizePadY"] = 0 + if not settingsTable.TextLabelSizePadY then + settingsTable.TextLabelSizePadY = 0 end - if not settingsTable["TextLabelPositionPadY"] then - settingsTable["TextLabelPositionPadY"] = 0 + if not settingsTable.TextLabelPositionPadY then + settingsTable.TextLabelPositionPadY = 0 end - if not settingsTable["TextButtonSizePadY"] then - settingsTable["TextButtonSizePadY"] = 12 + if not settingsTable.TextButtonSizePadY then + settingsTable.TextButtonSizePadY = 12 end - if not settingsTable["TextButtonPositionPadY"] then - settingsTable["TextButtonPositionPadY"] = 2 + if not settingsTable.TextButtonPositionPadY then + settingsTable.TextButtonPositionPadY = 2 end --Wrapper frame takes care of styled objects @@ -843,12 +843,12 @@ t.CreateSlider = function(steps, width, position) bar.Parent = sliderGui if - position["X"] - and position["X"]["Scale"] - and position["X"]["Offset"] - and position["Y"] - and position["Y"]["Scale"] - and position["Y"]["Offset"] + position.X + and position.X.Scale + and position.X.Offset + and position.Y + and position.Y.Scale + and position.Y.Offset then bar.Position = position end @@ -1609,20 +1609,20 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) pos = scrollPosition --count up from current scroll position to fill out grid while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY do - xCounter = xCounter + guiObjects[pos].AbsoluteSize.X + xCounter += guiObjects[pos].AbsoluteSize.X --previous pos was the end of a row if xCounter >= totalPixelsX then - pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + pixelsBelowScrollbar += currentRowY currentRowY = 0 xCounter = guiObjects[pos].AbsoluteSize.X end if guiObjects[pos].AbsoluteSize.Y > currentRowY then currentRowY = guiObjects[pos].AbsoluteSize.Y end - pos = pos + 1 + pos += 1 end --Count wherever current row left off - pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + pixelsBelowScrollbar += currentRowY currentRowY = 0 pos = scrollPosition - 1 @@ -1633,20 +1633,20 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) --count backwards from current scrollPosition to see if we can add more rows while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 do - xCounter = xCounter + guiObjects[pos].AbsoluteSize.X - rowSizeCounter = rowSizeCounter + 1 + xCounter += guiObjects[pos].AbsoluteSize.X + rowSizeCounter += 1 if xCounter >= totalPixelsX then rowSize = rowSizeCounter - 1 rowSizeCounter = 0 xCounter = guiObjects[pos].AbsoluteSize.X if pixelsBelowScrollbar + currentRowY <= totalPixelsY then --It fits, so back up our scroll position - pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + pixelsBelowScrollbar += currentRowY if scrollPosition <= rowSize then scrollPosition = 1 break else - scrollPosition = scrollPosition - rowSize + scrollPosition -= rowSize end currentRowY = 0 else @@ -1658,7 +1658,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) currentRowY = guiObjects[pos].AbsoluteSize.Y end - pos = pos - 1 + pos -= 1 end --Do check last time if pos = 0 @@ -1700,7 +1700,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) --print("Laying out " .. child.Name) --GuiObject if setRowSize then - rowSizeCounter = rowSizeCounter + 1 + rowSizeCounter += 1 end if xCounter + child.AbsoluteSize.X >= totalPixelsX then if setRowSize then @@ -1717,12 +1717,12 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) 0, totalPixelsY - pixelsRemainingY + yOffset ) - xCounter = xCounter + child.AbsoluteSize.X + xCounter += child.AbsoluteSize.X child.Visible = ( (pixelsRemainingY - child.AbsoluteSize.Y) >= 0 ) if child.Visible then - howManyDisplayed = howManyDisplayed + 1 + howManyDisplayed += 1 end lastChildSize = child.AbsoluteSize end @@ -1793,13 +1793,13 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) break else --local ("Backing up ScrollPosition from -- " ..scrollPosition) - scrollPosition = scrollPosition - 1 + scrollPosition -= 1 end else break end end - pos = pos - 1 + pos -= 1 end pos = scrollPosition @@ -1820,10 +1820,10 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) 0, totalPixels - pixelsRemaining ) - pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + pixelsRemaining -= child.AbsoluteSize.Y if pixelsRemaining >= 0 then child.Visible = true - howManyDisplayed = howManyDisplayed + 1 + howManyDisplayed += 1 else child.Visible = false end @@ -1842,7 +1842,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) if children then for _, child in ipairs(children) do if child:IsA "GuiObject" then - guiObjects = guiObjects + 1 + guiObjects += 1 end end end @@ -1892,7 +1892,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) end reentrancyGuard = true wait() - local success, err = nil + local success, err if style == "grid" then success, err = pcall(function() layoutGridScrollBar() @@ -1910,7 +1910,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) end local doScrollUp = function() - scrollPosition = scrollPosition - rowSize + scrollPosition -= rowSize if scrollPosition < 1 then scrollPosition = 1 end @@ -1918,7 +1918,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) end local doScrollDown = function() - scrollPosition = scrollPosition + rowSize + scrollPosition += rowSize recalculate(nil) end @@ -2005,18 +2005,18 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) local dragAbsSize = scrollDrag.AbsoluteSize.y local barAbsOne = barAbsPos + barAbsSize - dragAbsSize - y = y - mouseOffset + y -= mouseOffset y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y - y = y - barAbsPos + y -= barAbsPos local guiObjects = 0 local children = frame:GetChildren() if children then for _, child in ipairs(children) do if child:IsA "GuiObject" then - guiObjects = guiObjects + 1 + guiObjects += 1 end end end @@ -2609,7 +2609,7 @@ t.CreateImageTutorialPage = function( imageLabel.Position = UDim2.new(0.5 - (x / y) / 2, 0, 0, 0) end end - size = size + 50 + size += 50 frame.Size = UDim2.new(0, size, 0, size) frame.Position = UDim2.new(0.5, -size / 2, 0.5, -size / 2) end @@ -2733,7 +2733,7 @@ t.CreateSetPanel = function( -- used for water selections local waterForceDirection = "NegX" local waterForce = "None" - local waterGui, waterTypeChangedEvent = nil + local waterGui, waterTypeChangedEvent local Data = {} Data.CurrentCategory = nil @@ -3023,7 +3023,7 @@ t.CreateSetPanel = function( local numSkipped = 0 for i = 1, #sets do if not showAdminCategories and sets[i].Name == "Beta" then - numSkipped = numSkipped + 1 + numSkipped += 1 else setButtons[i - numSkipped] = buildSetButton( sets[i].Name, @@ -3254,10 +3254,10 @@ t.CreateSetPanel = function( for i = 1, #insertButtons do insertButtons[i].Position = UDim2.new(0, buttonWidth * x, 0, buttonHeight * y) - x = x + 1 + x += 1 if x >= columns then x = 0 - y = y + 1 + y += 1 end end end @@ -3321,7 +3321,7 @@ t.CreateSetPanel = function( insertButtons[arrayPosition], buttonCon = buildInsertButton() table.insert(insertButtonCons, buttonCon) insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame - arrayPosition = arrayPosition + 1 + arrayPosition += 1 end realignButtonGrid(columns) @@ -3495,7 +3495,7 @@ t.CreateSetPanel = function( ) end) - currRow = currRow + 1 + currRow += 1 end local buttons = setGui.SetPanel.Sets.SetsLists:GetChildren() @@ -4293,7 +4293,7 @@ t.CreatePluginFrame = function(name, size, position, scrollable, parent) widgetContainer.Position = position + UDim2.new(0, 0, 0, 20) end - local frame, control, verticalDragger = nil + local frame, control, verticalDragger if scrollable then --frame for widgets frame, control = t.CreateTrueScrollingFrame() diff --git a/lua/46295863.lua b/lua/46295863.lua index c9935a3..aa5378c 100644 --- a/lua/46295863.lua +++ b/lua/46295863.lua @@ -19,9 +19,7 @@ else gui = script.Parent end -local helpButton -local updateCameraDropDownSelection -local updateVideoCaptureDropDownSelection +local helpButton, updateCameraDropDownSelection, updateVideoCaptureDropDownSelection local tweenTime = 0.2 local mouseLockLookScreenUrl = "http://banland.xyz/asset?id=54071825" @@ -233,7 +231,7 @@ local function CreateTextButtons(frame, buttons, yPos, ySize) button.Parent = frame buttonObjs[buttonNum] = button - buttonNum = buttonNum + 1 + buttonNum += 1 end toggleSelection(buttonObjs[1]) @@ -263,7 +261,7 @@ local function CreateTextButtons(frame, buttons, yPos, ySize) ) buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) - buttonNum = buttonNum + 1 + buttonNum += 1 end end end @@ -306,7 +304,7 @@ function setDisabledState(guiObject) guiObject.TextTransparency = 0.9 guiObject.Active = false else - if guiObject["ClassName"] then + if guiObject.ClassName then print( "setDisabledState() got object of unsupported type. object type is ", guiObject.ClassName @@ -807,9 +805,7 @@ local function createGameMainMenu(baseZIndex, shield) gameSettingsButton.ZIndex = baseZIndex + 4 gameSettingsButton.Parent = gameMainMenuFrame gameSettingsButton.MouseButton1Click:connect(function() - if - game:FindFirstChild "Players" and game.Players["LocalPlayer"] - then + if game:FindFirstChild "Players" and game.Players.LocalPlayer then local loadingGui = game.Players.LocalPlayer:FindFirstChild "PlayerLoadingGui" if loadingGui then @@ -1266,7 +1262,7 @@ local function createGameSettingsMenu(baseZIndex, _) if (graphicsLevel.Value + 1) > GraphicsQualityLevels then return end - graphicsLevel.Value = graphicsLevel.Value + 1 + graphicsLevel.Value += 1 graphicsSetter.Text = tostring(graphicsLevel.Value) setGraphicsQualityLevel(graphicsLevel.Value) @@ -1281,7 +1277,7 @@ local function createGameSettingsMenu(baseZIndex, _) if (graphicsLevel.Value - 1) <= 0 then return end - graphicsLevel.Value = graphicsLevel.Value - 1 + graphicsLevel.Value -= 1 graphicsSetter.Text = tostring(graphicsLevel.Value) setGraphicsQualityLevel(graphicsLevel.Value) @@ -1451,7 +1447,7 @@ local function createGameSettingsMenu(baseZIndex, _) local videoNames = {} local videoNameToItem = {} videoNames[1] = "Just Save to Disk" - videoNameToItem[videoNames[1]] = Enum.UploadSetting["Never"] + videoNameToItem[videoNames[1]] = Enum.UploadSetting.Never videoNames[2] = "Upload to YouTube" videoNameToItem[videoNames[2]] = Enum.UploadSetting["Ask me first"] @@ -1474,7 +1470,7 @@ local function createGameSettingsMenu(baseZIndex, _) syncVideoCaptureSetting = function() if UserSettings().GameSettings.VideoUploadPromptBehavior - == Enum.UploadSetting["Never"] + == Enum.UploadSetting.Never then updateVideoCaptureDropDownSelection(videoNames[1]) elseif @@ -1972,7 +1968,7 @@ if LoadLibrary then errorBoxButtons[buttonOffset].Function = function() saveLocal() end - buttonOffset = buttonOffset + 1 + buttonOffset += 1 end errorBoxButtons[buttonOffset] = {} errorBoxButtons[buttonOffset].Text = "Keep Playing" @@ -2036,7 +2032,7 @@ if LoadLibrary then spinnerImage.Parent = spinnerFrame spinnerIcons[spinnerNum] = spinnerImage - spinnerNum = spinnerNum + 1 + spinnerNum += 1 end save = function() @@ -2060,7 +2056,7 @@ if LoadLibrary then "http://banland.xyz/Asset?id=45880710" end - pos = pos + 1 + pos += 1 end spinPos = (spinPos + 1) % 8 wait(0.2) @@ -2260,7 +2256,7 @@ if LoadLibrary then if player:IsA "Player" and player ~= localPlayer then playerNames[pos] = player.Name nameToPlayer[player.Name] = player - pos = pos + 1 + pos += 1 end end end diff --git a/lua/48488235.lua b/lua/48488235.lua index 247eaac..44bf27f 100644 --- a/lua/48488235.lua +++ b/lua/48488235.lua @@ -275,10 +275,10 @@ function MakePopupButton(nparent, ntext, index, last) elseif last then if index % 2 == 1 then tobj.Image = "http://banland.xyz/asset/?id=" - .. Images["LightPopupBottom"] + .. Images.LightPopupBottom else tobj.Image = "http://banland.xyz/asset/?id=" - .. Images["DarkPopupBottom"] + .. Images.DarkPopupBottom end else if index % 2 == 1 then @@ -936,8 +936,7 @@ local RightEdgeSpace = -0.04 local DefaultBottomClipPos = BottomClipFrame.Position.Y.Scale -local SelectedPlayerEntry -local SelectedPlayer +local SelectedPlayerEntry, SelectedPlayer -- locks(semaphores) for stopping race conditions local AddingFrameLock = false @@ -969,8 +968,7 @@ local Abuses = { "Rude or Mean Behavior", "False Reporting Me", } -local UpdateAbuseFunction -local AbuseDropDown +local UpdateAbuseFunction, AbuseDropDown local PrivilegeLevel = { Owner = 255, @@ -997,7 +995,7 @@ end) -- function GetEntryListLength() -- local numEnts = #PlayerFrames + #TeamFrames -- if NeutralTeam then --- numEnts = numEnts + 1 +-- numEnts += 1 -- end -- return numEnts -- end @@ -1105,16 +1103,16 @@ end @Return Normalized integer value for rank? --]] -- function GetPrivilegeType(rank) --- if rank <= PrivilegeLevel["Banned"] then --- return PrivilegeLevel["Banned"] --- elseif rank <= PrivilegeLevel["Visitor"] then --- return PrivilegeLevel["Visitor"] --- elseif rank <= PrivilegeLevel["Member"] then --- return PrivilegeLevel["Member"] --- elseif rank <= PrivilegeLevel["Admin"] then --- return PrivilegeLevel["Admin"] +-- if rank <= PrivilegeLevel.Banned then +-- return PrivilegeLevel.Banned +-- elseif rank <= PrivilegeLevel.Visitor then +-- return PrivilegeLevel.Visitor +-- elseif rank <= PrivilegeLevel.Member then +-- return PrivilegeLevel.Member +-- elseif rank <= PrivilegeLevel.Admin then +-- return PrivilegeLevel.Admin -- else --- return PrivilegeLevel["Owner"] +-- return PrivilegeLevel.Owner -- end -- end @@ -1172,27 +1170,25 @@ function HighlightMyRank( AdminButton ) BanPlayerButton.Image = "http://banland.xyz/asset/?id=" - .. Images["LightPopupMid"] - VisitorButton.Image = "http://banland.xyz/asset/?id=" - .. Images["DarkPopupMid"] - MemberButton.Image = "http://banland.xyz/asset/?id=" - .. Images["LightPopupMid"] + .. Images.LightPopupMid + VisitorButton.Image = "http://banland.xyz/asset/?id=" .. Images.DarkPopupMid + MemberButton.Image = "http://banland.xyz/asset/?id=" .. Images.LightPopupMid AdminButton.Image = "http://banland.xyz/asset/?id=" - .. Images["DarkPopupBottom"] + .. Images.DarkPopupBottom local rank = player.PersonalServerRank - if rank <= PrivilegeLevel["Banned"] then + if rank <= PrivilegeLevel.Banned then BanPlayerButton.Image = "http://banland.xyz/asset/?id=" - .. Images["LightBluePopupMid"] - elseif rank <= PrivilegeLevel["Visitor"] then + .. Images.LightBluePopupMid + elseif rank <= PrivilegeLevel.Visitor then VisitorButton.Image = "http://banland.xyz/asset/?id=" - .. Images["DarkBluePopupMid"] - elseif rank <= PrivilegeLevel["Member"] then + .. Images.DarkBluePopupMid + elseif rank <= PrivilegeLevel.Member then MemberButton.Image = "http://banland.xyz/asset/?id=" - .. Images["LightBluePopupMid"] - elseif rank <= PrivilegeLevel["Admin"] then + .. Images.LightBluePopupMid + elseif rank <= PrivilegeLevel.Admin then AdminButton.Image = "http://banland.xyz/asset/?id=" - .. Images["DarkBluePopupBottom"] + .. Images.DarkBluePopupBottom end end @@ -1351,16 +1347,16 @@ end --]] function PlayerSortFunction(a, b) -- prevents flipping out leaderboard - if a["Score"] == b["Score"] then - return a["Player"].Name:upper() < b["Player"].Name:upper() + if a.Score == b.Score then + return a.Player.Name:upper() < b.Player.Name:upper() end - if not a["Score"] then + if not a.Score then return false end - if not b["Score"] then + if not b.Score then return true end - return a["Score"] < b["Score"] + return a.Score < b.Score end --------------------------------- @@ -1431,27 +1427,27 @@ function StatAdded(nchild, playerEntry) else local haveScore = false for _, i in pairs(ScoreNames) do - if i["Name"] == nchild.Name then + if i.Name == nchild.Name then haveScore = true end end if not haveScore then local nstat = {} - nstat["Name"] = nchild.Name - nstat["Priority"] = 0 + nstat.Name = nchild.Name + nstat.Priority = 0 if nchild:FindFirstChild "Priority" then - nstat["Priority"] = nchild.Priority + nstat.Priority = nchild.Priority end - nstat["IsPrimary"] = false + nstat.IsPrimary = false if nchild:FindFirstChild "IsPrimary" then - nstat["IsPrimary"] = true + nstat.IsPrimary = true end nstat.AddId = AddId - AddId = AddId + 1 + AddId += 1 table.insert(ScoreNames, nstat) table.sort(ScoreNames, StatSort) - if not StatTitles:FindFirstChild(nstat["Name"]) then - CreateStatTitle(nstat["Name"]) + if not StatTitles:FindFirstChild(nstat.Name) then + CreateStatTitle(nstat.Name) end UpdateMaximize() end @@ -1466,9 +1462,9 @@ end function DoesStatExist(statName, exception) for _, playerf in pairs(PlayerFrames) do if - playerf["Player"] ~= exception - and playerf["Player"]:FindFirstChild "leaderstats" - and playerf["Player"].leaderstats:FindFirstChild(statName) + playerf.Player ~= exception + and playerf.Player:FindFirstChild "leaderstats" + and playerf.Player.leaderstats:FindFirstChild(statName) then --print('player:' .. playerf['Player'].Name ..' has stat') return true @@ -1492,20 +1488,20 @@ function StatRemoved(nchild, playerEntry) wait(1 / 30) end AddingStatLock = true - if playerEntry["Frame"]:FindFirstChild(nchild.Name) then + if playerEntry.Frame:FindFirstChild(nchild.Name) then debugprint "Destroyed frame!" - playerEntry["Frame"][nchild.Name].Parent = nil + playerEntry.Frame[nchild.Name].Parent = nil end - if not DoesStatExist(nchild.Name, playerEntry["Player"]) then + if not DoesStatExist(nchild.Name, playerEntry.Player) then for i, val in ipairs(ScoreNames) do - if val["Name"] == nchild.Name then + if val.Name == nchild.Name then table.remove(ScoreNames, i) if StatTitles:FindFirstChild(nchild.Name) then StatTitles[nchild.Name]:Destroy() end for _, teamf in pairs(TeamFrames) do - if teamf["Frame"]:FindFirstChild(nchild.Name) then - teamf["Frame"][nchild.Name]:Destroy() + if teamf.Frame:FindFirstChild(nchild.Name) then + teamf.Frame[nchild.Name]:Destroy() end end end @@ -1553,26 +1549,26 @@ function MakeScoreEntry(entry, scoreval, panel) --RIP the leaderstat bug, oct 2012-nov 2012 wait() if - entry["Player"]:FindFirstChild "leaderstats" - and entry["Player"].leaderstats:FindFirstChild(scoreval["Name"]) + entry.Player:FindFirstChild "leaderstats" + and entry.Player.leaderstats:FindFirstChild(scoreval.Name) then - thisScore = entry["Player"] + thisScore = entry.Player :FindFirstChild("leaderstats") - :FindFirstChild(scoreval["Name"]) + :FindFirstChild(scoreval.Name) else return end - if not entry["Player"].Parent then + if not entry.Player.Parent then return end - nscoretxt.Name = scoreval["Name"] + nscoretxt.Name = scoreval.Name nscoretxt.Text = tostring(GetScoreValue(thisScore)) - if scoreval["Name"] == ScoreNames[1]["Name"] then + if scoreval.Name == ScoreNames[1]["Name"] then debugprint "changing score" - entry["Score"] = GetScoreValue(thisScore) - if entry["Player"] == LocalPlayer then + entry.Score = GetScoreValue(thisScore) + if entry.Player == LocalPlayer then HeaderScore.Text = tostring(GetScoreValue(thisScore)) end end @@ -1581,9 +1577,9 @@ function MakeScoreEntry(entry, scoreval, panel) if not thisScore.Parent then return end - if scoreval["Name"] == ScoreNames[1]["Name"] then - entry["Score"] = GetScoreValue(thisScore) - if entry["Player"] == LocalPlayer then + if scoreval.Name == ScoreNames[1]["Name"] then + entry.Score = GetScoreValue(thisScore) + if entry.Player == LocalPlayer then HeaderScore.Text = tostring(GetScoreValue(thisScore)) end end @@ -1623,50 +1619,41 @@ function RecreateScoreColumns(ptable) MaxSizeColumn = 0 -- for each entry in this player table for _, entry in ipairs(ptable) do - local panel = entry["Frame"] - local tplayer = entry["Player"] + local panel = entry.Frame + local tplayer = entry.Player -- if this panel does not have an element named after this stat - if not panel:FindFirstChild(scoreval["Name"]) then + if not panel:FindFirstChild(scoreval.Name) then -- make an entry for this object local nentry = MakeScoreEntry(entry, scoreval, panel) if nentry then debugprint( - "adding " - .. nentry.Name - .. " to " - .. entry["Player"].Name + "adding " .. nentry.Name .. " to " .. entry.Player.Name ) nentry.Parent = panel -- add score to team if - entry["MyTeam"] - and entry["MyTeam"] ~= NeutralTeam - and not entry["MyTeam"]["Frame"]:FindFirstChild( - scoreval["Name"] - ) + entry.MyTeam + and entry.MyTeam ~= NeutralTeam + and not entry.MyTeam.Frame:FindFirstChild(scoreval.Name) then local ntitle = nentry:Clone() --ntitle.TextXAlignment = 'Right' - ntitle.Parent = entry["MyTeam"]["Frame"] + ntitle.Parent = entry.MyTeam.Frame end end end - scoreval["XOffset"] = Xoffset + scoreval.XOffset = Xoffset - if panel:FindFirstChild(scoreval["Name"]) then - MaxSizeColumn = math.max( - MaxSizeColumn, - panel[scoreval["Name"]].TextBounds.X - ) + if panel:FindFirstChild(scoreval.Name) then + MaxSizeColumn = + math.max(MaxSizeColumn, panel[scoreval.Name].TextBounds.X) end end if AreNamesExpanded.Value then - MaxSizeColumn = math.max( - MaxSizeColumn, - StatTitles[scoreval["Name"]].TextBounds.X - ) - StatTitles[scoreval["Name"]]:TweenPosition( + MaxSizeColumn = + math.max(MaxSizeColumn, StatTitles[scoreval.Name].TextBounds.X) + StatTitles[scoreval.Name]:TweenPosition( UDim2.new(RightEdgeSpace, -Xoffset, 0, 0), "Out", "Linear", @@ -1674,7 +1661,7 @@ function RecreateScoreColumns(ptable) true ) else - StatTitles[scoreval["Name"]]:TweenPosition( + StatTitles[scoreval.Name]:TweenPosition( UDim2.new((0.4 + ((0.6 / #ScoreNames) * (j - 1))) - 1, 0, 0, 0), "Out", "Linear", @@ -1682,8 +1669,8 @@ function RecreateScoreColumns(ptable) true ) end - scoreval["ColumnSize"] = MaxSizeColumn - Xoffset = Xoffset + SpacingPerStat + MaxSizeColumn + scoreval.ColumnSize = MaxSizeColumn + Xoffset += SpacingPerStat + MaxSizeColumn maxXOffset = math.max(Xoffset, maxXOffset) end NormalBounds = @@ -1829,7 +1816,7 @@ function UpdateMaximize() if IsMaximized.Value then for j = 1, #ScoreNames, 1 do local scoreval = ScoreNames[j] - StatTitles[scoreval["Name"]]:TweenPosition( + StatTitles[scoreval.Name]:TweenPosition( UDim2.new(0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, 0, 0, 0), "Out", "Linear", @@ -1872,16 +1859,16 @@ function UpdateMaximize() true ) HeaderFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["LargeHeader"] + .. Images.LargeHeader BottomFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["LargeBottom"] + .. Images.LargeBottom for index, i in ipairs(MiddleFrameBackgrounds) do if (index % 2) ~= 1 then i.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["LargeDark"] + .. Images.LargeDark else i.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["LargeLight"] + .. Images.LargeLight end end for _, i in ipairs(MiddleFrames) do @@ -1891,8 +1878,8 @@ function UpdateMaximize() end for j = 1, #ScoreNames, 1 do local scoreval = ScoreNames[j] - if i:FindFirstChild(scoreval["Name"]) then - i[scoreval["Name"]]:TweenPosition( + if i:FindFirstChild(scoreval.Name) then + i[scoreval.Name]:TweenPosition( UDim2.new( 0.4 + ((0.6 / #ScoreNames) * (j - 1)) - 1, 0, @@ -1908,13 +1895,13 @@ function UpdateMaximize() end end for _, entry in ipairs(PlayerFrames) do - WaitForChild(entry["Frame"], "TitleFrame").Size = - UDim2.new(0.38, 0, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + WaitForChild(entry.Frame, "TitleFrame").Size = + UDim2.new(0.38, 0, entry.Frame.TitleFrame.Size.Y.Scale, 0) end for _, entry in ipairs(TeamFrames) do - WaitForChild(entry["Frame"], "TitleFrame").Size = - UDim2.new(0.38, 0, entry["Frame"].TitleFrame.Size.Y.Scale, 0) + WaitForChild(entry.Frame, "TitleFrame").Size = + UDim2.new(0.38, 0, entry.Frame.TitleFrame.Size.Y.Scale, 0) end else if not IsMinimized.Value then @@ -1942,16 +1929,16 @@ function UpdateMaximize() true ) HeaderFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["NormalHeader"] + .. Images.NormalHeader BottomFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["NormalBottom"] + .. Images.NormalBottom for index, i in ipairs(MiddleFrameBackgrounds) do if index % 2 ~= 1 then i.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["midDark"] + .. Images.midDark else i.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["midLight"] + .. Images.midLight end end for _, i in ipairs(MiddleFrames) do @@ -1960,18 +1947,10 @@ function UpdateMaximize() UDim2.new(0.96, 0, i.ClickListener.Size.Y.Scale, 0) for j = 1, #ScoreNames, 1 do local scoreval = ScoreNames[j] - if - i:FindFirstChild(scoreval["Name"]) - and scoreval["XOffset"] - then + if i:FindFirstChild(scoreval.Name) and scoreval.XOffset then --print('updateing stat position: ' .. scoreval['Name']) - i[scoreval["Name"]]:TweenPosition( - UDim2.new( - RightEdgeSpace, - -scoreval["XOffset"], - 0, - 0 - ), + i[scoreval.Name]:TweenPosition( + UDim2.new(RightEdgeSpace, -scoreval.XOffset, 0, 0), "Out", "Linear", BASE_TWEEN, @@ -1983,18 +1962,18 @@ function UpdateMaximize() end for _, entry in ipairs(TeamFrames) do - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( + WaitForChild(entry.Frame, "TitleFrame").Size = UDim2.new( 0, BaseScreenXSize * 0.9, - entry["Frame"].TitleFrame.Size.Y.Scale, + entry.Frame.TitleFrame.Size.Y.Scale, 0 ) end for _, entry in ipairs(PlayerFrames) do - WaitForChild(entry["Frame"], "TitleFrame").Size = UDim2.new( + WaitForChild(entry.Frame, "TitleFrame").Size = UDim2.new( 0, BaseScreenXSize * 0.9, - entry["Frame"].TitleFrame.Size.Y.Scale, + entry.Frame.TitleFrame.Size.Y.Scale, 0 ) end @@ -2219,15 +2198,15 @@ end function StartDrag(entry, startx, starty) local openPanel = true --[[local draggedFrame = ]] - WaitForChild(entry["Frame"], "ClickListener") + WaitForChild(entry.Frame, "ClickListener") local function dragExit() -- stopDrag = true if - entry["Player"] + entry.Player and SelectedPlayer and openPanel - and entry["Player"] ~= LocalPlayer + and entry.Player ~= LocalPlayer and SelectedPlayer.userId > 1 and LocalPlayer.userId > 1 then @@ -2389,18 +2368,18 @@ function AddMiddleBGFrame() if (#MiddleFrameBackgrounds + 1) % 2 ~= 1 then if IsMaximized.Value then nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["LargeDark"] + .. Images.LargeDark else nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["midDark"] + .. Images.midDark end else if IsMaximized.Value then nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["LargeLight"] + .. Images.LargeLight else nBGFrame.Background.Image = "http://banland.xyz/asset/?id=" - .. Images["midLight"] + .. Images.midLight end end nBGFrame.Parent = ListFrame @@ -2465,7 +2444,7 @@ function UpdateHeaderNameSize() wait(1 / 30) end while tHeader.TextBounds.x - NormalBounds.X.Offset > 1 do - fSize = fSize - 1 + fSize -= 1 tHeader.FontSize = FONT_SIZES[fSize] wait(0.2) end @@ -2483,7 +2462,7 @@ ScreenGui.Changed:connect(UpdateHeaderNameSize) --]] function LeaderstatsAdded(playerEntry) --RemoveAllStats(playerEntry) - local nplayer = playerEntry["Player"] + local nplayer = playerEntry.Player for _, i in pairs(nplayer.leaderstats:GetChildren()) do StatAdded(i, playerEntry) end @@ -2503,7 +2482,7 @@ end --]] function LeaderstatsRemoved(_, playerEntry) while AddingFrameLock do - debugprint("waiting to insert " .. playerEntry["Player"].Name) + debugprint("waiting to insert " .. playerEntry.Player.Name) wait(1 / 30) end AddingFrameLock = true @@ -2513,7 +2492,7 @@ end function ClosePopUpPanel() if SelectedPlayerEntry then - local tframe = SelectedPlayerEntry["Frame"] + local tframe = SelectedPlayerEntry.Frame Spawn(function() TweenProperty(tframe, "BackgroundTransparency", 0.5, 1, BASE_TWEEN) end) @@ -2547,7 +2526,7 @@ function InitMovingPanel(entry, player) local friendStatus = GetFriendStatus(player) debugprint(tostring(friendStatus)) local showRankMenu = IsPersonalServer - and LocalPlayer.PersonalServerRank >= PrivilegeLevel["Admin"] + and LocalPlayer.PersonalServerRank >= PrivilegeLevel.Admin and LocalPlayer.PersonalServerRank > SelectedPlayer.PersonalServerRank @@ -2578,7 +2557,7 @@ function InitMovingPanel(entry, player) local FriendRefuseButton = MakePopupButton(PopUpPanel, "Decline Friend", 2, not showRankMenu) FriendRefuseButton.MouseButton1Click:connect(OnFriendRefuseButtonSelect) - nextIndex = nextIndex + 1 + nextIndex += 1 end if showRankMenu then @@ -2593,7 +2572,7 @@ function InitMovingPanel(entry, player) BanPlayerButton.MouseButton1Click:connect(function() OnPrivilegeLevelSelect( player, - PrivilegeLevel["Banned"], + PrivilegeLevel.Banned, BanPlayerButton, VisitorButton, MemberButton, @@ -2603,7 +2582,7 @@ function InitMovingPanel(entry, player) VisitorButton.MouseButton1Click:connect(function() OnPrivilegeLevelSelect( player, - PrivilegeLevel["Visitor"], + PrivilegeLevel.Visitor, BanPlayerButton, VisitorButton, MemberButton, @@ -2613,7 +2592,7 @@ function InitMovingPanel(entry, player) MemberButton.MouseButton1Click:connect(function() OnPrivilegeLevelSelect( player, - PrivilegeLevel["Member"], + PrivilegeLevel.Member, BanPlayerButton, VisitorButton, MemberButton, @@ -2623,7 +2602,7 @@ function InitMovingPanel(entry, player) AdminButton.MouseButton1Click:connect(function() OnPrivilegeLevelSelect( player, - PrivilegeLevel["Admin"], + PrivilegeLevel.Admin, BanPlayerButton, VisitorButton, MemberButton, @@ -2655,7 +2634,7 @@ function InitMovingPanel(entry, player) end) end) - local myFrame = entry["Frame"] + local myFrame = entry.Frame -- THIS IS GARBAGE. -- if I parent to frame to auto update position, it gets clipped -- sometimes garbage is the only option. @@ -2681,19 +2660,19 @@ end function OnPlayerEntrySelect(entry, startx, starty) if not InPopupWaitForClick then SelectedPlayerEntry = entry - SelectedPlayer = entry["Player"] + SelectedPlayer = entry.Player StartDrag(entry, startx, starty) end end function ActivatePlayerEntryPanel(entry) - entry["Frame"].BackgroundColor3 = Color3.new(0, 1, 1) + entry.Frame.BackgroundColor3 = Color3.new(0, 1, 1) Spawn(function() - TweenProperty(entry["Frame"], "BackgroundTransparency", 1, 0.5, 0.5) + TweenProperty(entry.Frame, "BackgroundTransparency", 1, 0.5, 0.5) end) InPopupWaitForClick = true - InitMovingPanel(entry, entry["Player"]) + InitMovingPanel(entry, entry.Player) end --[[ @@ -2704,7 +2683,7 @@ function PlayerListModeUpdate() RecreateScoreColumns(PlayerFrames) table.sort(PlayerFrames, PlayerSortFunction) for i, val in ipairs(PlayerFrames) do - MiddleFrames[i] = val["Frame"] + MiddleFrames[i] = val.Frame end for i = #PlayerFrames + 1, #MiddleFrames, 1 do MiddleFrames[i] = nil @@ -2779,14 +2758,14 @@ function InsertPlayerFrame(nplayer) ) UpdateMinimize() local nentry = {} - nentry["Frame"] = nFrame - nentry["Player"] = nplayer - nentry["ID"] = AddId - AddId = AddId + 1 + nentry.Frame = nFrame + nentry.Player = nplayer + nentry.ID = AddId + AddId += 1 table.insert(PlayerFrames, nentry) if #TeamFrames ~= 0 then if nplayer.Neutral then - nentry["MyTeam"] = nil + nentry.MyTeam = nil if not NeutralTeam then AddNeutralTeam() else @@ -2795,20 +2774,20 @@ function InsertPlayerFrame(nplayer) else local addedToTeam = false for _, tval in ipairs(TeamFrames) do - if tval["MyTeam"].TeamColor == nplayer.TeamColor then + if tval.MyTeam.TeamColor == nplayer.TeamColor then AddPlayerToTeam(tval, nentry) - nentry["MyTeam"] = tval + nentry.MyTeam = tval addedToTeam = true end end if not addedToTeam then - nentry["MyTeam"] = nil + nentry.MyTeam = nil if not NeutralTeam then AddNeutralTeam() else AddPlayerToTeam(NeutralTeam, nentry) end - nentry["MyTeam"] = NeutralTeam + nentry.MyTeam = NeutralTeam end end end @@ -2862,18 +2841,18 @@ function RemovePlayerFrame(tplayer) local tteam for i, key in ipairs(PlayerFrames) do - if tplayer == key["Player"] then - if PopUpClipFrame.Parent == key["Frame"] then + if tplayer == key.Player then + if PopUpClipFrame.Parent == key.Frame then PopUpClipFrame.Parent = nil end - key["Frame"]:Destroy() - tteam = key["MyTeam"] + key.Frame:Destroy() + tteam = key.MyTeam table.remove(PlayerFrames, i) end end if tteam then - for j, tentry in ipairs(tteam["MyPlayers"]) do - if tentry["Player"] == tplayer then + for j, tentry in ipairs(tteam.MyPlayers) do + if tentry.Player == tplayer then RemovePlayerFromTeam(tteam, j) end end @@ -2899,22 +2878,22 @@ Players.ChildRemoved:connect(RemovePlayerFrame) --]] function UnrollTeams(tframes, outframes) local numEntries = 0 - if NeutralTeam and not NeutralTeam["IsHidden"] then - for _, val in ipairs(NeutralTeam["MyPlayers"]) do - numEntries = numEntries + 1 - outframes[numEntries] = val["Frame"] + if NeutralTeam and not NeutralTeam.IsHidden then + for _, val in ipairs(NeutralTeam.MyPlayers) do + numEntries += 1 + outframes[numEntries] = val.Frame end - numEntries = numEntries + 1 - outframes[numEntries] = NeutralTeam["Frame"] + numEntries += 1 + outframes[numEntries] = NeutralTeam.Frame end for _, val in ipairs(tframes) do - if not val["IsHidden"] then + if not val.IsHidden then for _, pval in ipairs(val.MyPlayers) do - numEntries = numEntries + 1 - outframes[numEntries] = pval["Frame"] + numEntries += 1 + outframes[numEntries] = pval.Frame end - numEntries = numEntries + 1 - outframes[numEntries] = val["Frame"] + numEntries += 1 + outframes[numEntries] = val.Frame end end -- clear any additional entries from outframes @@ -2926,16 +2905,16 @@ end uses lua's table.sort to sort the teams --]] function TeamSortFunc(a, b) - if a["TeamScore"] == b["TeamScore"] then - return a["ID"] < b["ID"] + if a.TeamScore == b.TeamScore then + return a.ID < b.ID end - if not a["TeamScore"] then + if not a.TeamScore then return false end - if not b["TeamScore"] then + if not b.TeamScore then return true end - return a["TeamScore"] < b["TeamScore"] + return a.TeamScore < b.TeamScore end --[[ consider adding lock with wait for performance @@ -2945,7 +2924,7 @@ end --]] function SortTeams(tentries) for _, val in ipairs(tentries) do - table.sort(val["MyPlayers"], PlayerSortFunction) + table.sort(val.MyPlayers, PlayerSortFunction) AddTeamScores(val) end table.sort(tentries, TeamSortFunc) @@ -2972,17 +2951,21 @@ function AddTeamScores(team) for j = 1, #ScoreNames, 1 do local i = ScoreNames[j] local tscore = 0 - for _, j in ipairs(team["MyPlayers"]) do - local tval = j["Player"]:FindFirstChild "leaderstats" - and j["Player"].leaderstats:FindFirstChild(i["Name"]) + for _, j in ipairs(team.MyPlayers) do + local tval = j.Player:FindFirstChild "leaderstats" + and j.Player.leaderstats:FindFirstChild(i.Name) if tval and not tval:IsA "StringValue" then - tscore = tscore - + GetScoreValue((j["Player"].leaderstats)[i["Name"]]) + tscore += GetScoreValue((j.Player.leaderstats)[i.Name]) end end - if team["Frame"]:FindFirstChild(i["Name"]) then - --team['Frame'][i['Name'] ].Size = UDim2.new(1 - (ScrollBarFrame.Size.X.Scale * 2),- ((j-1) * SpacingPerStat),1,0) - team["Frame"][i["Name"]].Text = tostring(tscore) + if team.Frame:FindFirstChild(i.Name) then + -- team.Frame[i.Name].Size = UDim2.new( + -- 1 - (ScrollBarFrame.Size.X.Scale * 2), + -- -((j - 1) * SpacingPerStat), + -- 1, + -- 0 + -- ) + team.Frame[i.Name].Text = tostring(tscore) end end UpdateMinimize() @@ -2994,16 +2977,16 @@ end entry Player entry --]] function FindRemovePlayerFromTeam(entry) - if entry["MyTeam"] then - for j, oldEntry in ipairs(entry["MyTeam"]["MyPlayers"]) do - if oldEntry["Player"] == entry["Player"] then - RemovePlayerFromTeam(entry["MyTeam"], j) + if entry.MyTeam then + for j, oldEntry in ipairs(entry.MyTeam.MyPlayers) do + if oldEntry.Player == entry.Player then + RemovePlayerFromTeam(entry.MyTeam, j) return end end elseif NeutralTeam then - for j, oldEntry in ipairs(NeutralTeam["MyPlayers"]) do - if oldEntry["Player"] == entry["Player"] then + for j, oldEntry in ipairs(NeutralTeam.MyPlayers) do + if oldEntry.Player == entry.Player then RemovePlayerFromTeam(NeutralTeam, j) return end @@ -3017,9 +3000,9 @@ end index index of player in 'MyPlayers' list to remove --]] function RemovePlayerFromTeam(teamEntry, index) - table.remove(teamEntry["MyPlayers"], index) - --if teamEntry['AutoHide'] and #teamEntry['MyPlayers'] == 0 then - if teamEntry == NeutralTeam and #teamEntry["MyPlayers"] == 0 then + table.remove(teamEntry.MyPlayers, index) + --if teamEntry.AutoHide and #teamEntry.MyPlayers == 0 then + if teamEntry == NeutralTeam and #teamEntry.MyPlayers == 0 then RemoveNeutralTeam() end end @@ -3032,13 +3015,13 @@ end --]] function AddPlayerToTeam(teamEntry, entry) FindRemovePlayerFromTeam(entry) - table.insert(teamEntry["MyPlayers"], entry) - entry["MyTeam"] = teamEntry - if teamEntry["IsHidden"] then - teamEntry["Frame"].Parent = ListFrame + table.insert(teamEntry.MyPlayers, entry) + entry.MyTeam = teamEntry + if teamEntry.IsHidden then + teamEntry.Frame.Parent = ListFrame AddMiddleBGFrame() end - teamEntry["IsHidden"] = false + teamEntry.IsHidden = false end function SetPlayerToTeam(entry) @@ -3047,15 +3030,15 @@ function SetPlayerToTeam(entry) local setToTeam = false for _, tframe in ipairs(TeamFrames) do -- add my entry on the new team - if tframe["MyTeam"].TeamColor == entry["Player"].TeamColor then + if tframe.MyTeam.TeamColor == entry.Player.TeamColor then AddPlayerToTeam(tframe, entry) setToTeam = true end end -- if player was set to an invalid team, then set it back to neutral if not setToTeam and #(game.Teams:GetTeams()) > 0 then - debugprint(entry["Player"].Name .. "could not find team") - entry["MyTeam"] = nil + debugprint(entry.Player.Name .. "could not find team") + entry.MyTeam = nil if not NeutralTeam then AddNeutralTeam() else @@ -3080,44 +3063,43 @@ function PlayerChanged(entry, property) PlayerChangedLock = true if property == "Neutral" then -- if player changing to neutral - if entry["Player"].Neutral and #(game.Teams:GetTeams()) > 0 then - debugprint(entry["Player"].Name .. "setting to neutral") + if entry.Player.Neutral and #(game.Teams:GetTeams()) > 0 then + debugprint(entry.Player.Name .. "setting to neutral") FindRemovePlayerFromTeam(entry) - entry["MyTeam"] = nil + entry.MyTeam = nil if not NeutralTeam then - debugprint(entry["Player"].Name .. "creating neutral team") + debugprint(entry.Player.Name .. "creating neutral team") AddNeutralTeam() else - debugprint(entry["Player"].Name .. "adding to neutral team") + debugprint(entry.Player.Name .. "adding to neutral team") AddPlayerToTeam(NeutralTeam, entry) end elseif #(game.Teams:GetTeams()) > 0 then -- else player switching to a team, or a weird edgecase - debugprint(entry["Player"].Name .. "has been set non-neutral") + debugprint(entry.Player.Name .. "has been set non-neutral") SetPlayerToTeam(entry) end BaseUpdate() elseif property == "TeamColor" - and not entry["Player"].Neutral - and entry["Player"] ~= entry["MyTeam"] + and not entry.Player.Neutral + and entry.Player ~= entry.MyTeam then - debugprint(entry["Player"].Name .. "setting to new team") + debugprint(entry.Player.Name .. "setting to new team") SetPlayerToTeam(entry) BaseUpdate() elseif property == "Name" or property == "MembershipType" then - entry["Frame"]:FindFirstChild("BCLabel").Image = getMembershipTypeIcon( - entry["Player"].MembershipType, - entry["Player"].Name + entry.Frame:FindFirstChild("BCLabel").Image = getMembershipTypeIcon( + entry.Player.MembershipType, + entry.Player.Name ) - entry["Frame"].Name = entry["Player"].Name - entry["Frame"].TitleFrame.Title.Text = entry["Player"].Name - if entry["Frame"].BCLabel.Image ~= "" then - entry["Frame"].TitleFrame.Title.Position = - UDim2.new(0.01, 30, 0.1, 0) + entry.Frame.Name = entry.Player.Name + entry.Frame.TitleFrame.Title.Text = entry.Player.Name + if entry.Frame.BCLabel.Image ~= "" then + entry.Frame.TitleFrame.Title.Position = UDim2.new(0.01, 30, 0.1, 0) end - if entry["Player"] == LocalPlayer then - entry["Frame"].TitleFrame.DropShadow.Text = entry["Player"].Name - ChangeHeaderName(entry["Player"].Name) + if entry.Player == LocalPlayer then + entry.Frame.TitleFrame.DropShadow.Text = entry.Player.Name + ChangeHeaderName(entry.Player.Name) end BaseUpdate() end @@ -3135,19 +3117,17 @@ function OnFriendshipChanged(player, friendStatus) .. tostring(GetFriendStatus(player)) ) for _, entry in ipairs(PlayerFrames) do - if entry["Player"] == player then + if entry.Player == player then local nicon = getFriendStatusIcon(friendStatus) - if nicon == "" and entry["Frame"].FriendLabel.Image ~= "" then - entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + if nicon == "" and entry.Frame.FriendLabel.Image ~= "" then + entry.Frame.TitleFrame.Title.Position = entry.Frame.TitleFrame.Title.Position - UDim2.new(0, 17, 0, 0) - elseif - nicon ~= "" and entry["Frame"].FriendLabel.Image == "" - then - entry["Frame"].TitleFrame.Title.Position = entry["Frame"].TitleFrame.Title.Position + elseif nicon ~= "" and entry.Frame.FriendLabel.Image == "" then + entry.Frame.TitleFrame.Title.Position = entry.Frame.TitleFrame.Title.Position + UDim2.new(0, 17, 0, 0) debugprint("confirmed status:" .. player.Name) end - entry["Frame"].FriendLabel.Image = nicon + entry.Frame.FriendLabel.Image = nicon return end end @@ -3171,42 +3151,42 @@ function AddNeutralTeam() defaultTeam.TeamColor = BrickColor.new "White" defaultTeam.Name = "Neutral" local nentry = {} - nentry["MyTeam"] = defaultTeam - nentry["MyPlayers"] = {} - nentry["Frame"] = MiddleTemplate:Clone() - WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = + nentry.MyTeam = defaultTeam + nentry.MyPlayers = {} + nentry.Frame = MiddleTemplate:Clone() + WaitForChild(WaitForChild(nentry.Frame, "TitleFrame"), "Title").Text = defaultTeam.Name - nentry["Frame"].TitleFrame.Position = UDim2.new( - nentry["Frame"].TitleFrame.Position.X.Scale, - nentry["Frame"].TitleFrame.Position.X.Offset, + nentry.Frame.TitleFrame.Position = UDim2.new( + nentry.Frame.TitleFrame.Position.X.Scale, + nentry.Frame.TitleFrame.Position.X.Offset, 0.1, 0 ) - nentry["Frame"].TitleFrame.Size = UDim2.new( - nentry["Frame"].TitleFrame.Size.X.Scale, - nentry["Frame"].TitleFrame.Size.X.Offset, + nentry.Frame.TitleFrame.Size = UDim2.new( + nentry.Frame.TitleFrame.Size.X.Scale, + nentry.Frame.TitleFrame.Size.X.Offset, 0.8, 0 ) - nentry["Frame"].TitleFrame.Title.Font = "ArialBold" - nentry["Frame"].Position = - UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) - WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect( + nentry.Frame.TitleFrame.Title.Font = "ArialBold" + nentry.Frame.Position = + UDim2.new(1, 0, (#MiddleFrames * nentry.Frame.Size.Y.Scale), 0) + WaitForChild(nentry.Frame, "ClickListener").MouseButton1Down:connect( function(nx, ny) StartDrag(nentry, nx, ny) end ) - nentry["Frame"].ClickListener.BackgroundColor3 = Color3.new(1, 1, 1) - nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 - nentry["Frame"].ClickListener.AutoButtonColor = false - nentry["AutoHide"] = true - nentry["IsHidden"] = true + nentry.Frame.ClickListener.BackgroundColor3 = Color3.new(1, 1, 1) + nentry.Frame.ClickListener.BackgroundTransparency = 0.7 + nentry.Frame.ClickListener.AutoButtonColor = false + nentry.AutoHide = true + nentry.IsHidden = true for _, i in pairs(PlayerFrames) do - if i["Player"].Neutral or not i["MyTeam"] then + if i.Player.Neutral or not i.MyTeam then AddPlayerToTeam(nentry, i) end end - if #nentry["MyPlayers"] > 0 then + if #nentry.MyPlayers > 0 then NeutralTeam = nentry UpdateMinimize() BaseUpdate() @@ -3220,7 +3200,7 @@ function RemoveNeutralTeam() wait() end NeutralTeamLock = true - NeutralTeam["Frame"]:Destroy() + NeutralTeam.Frame:Destroy() NeutralTeam = nil RemoveMiddleBGFrame() NeutralTeamLock = false @@ -3230,8 +3210,8 @@ end --]] function TeamScoreChanged(entry, nscore) - WaitForChild(entry["Frame"], "PlayerScore").Text = tostring(nscore) - entry["TeamScore"] = nscore + WaitForChild(entry.Frame, "PlayerScore").Text = tostring(nscore) + entry.TeamScore = nscore end --[[ called when child added to a team, used for autohide functionality @@ -3239,11 +3219,10 @@ end --]] function TeamChildAdded(entry, nchild) if nchild.Name == "AutoHide" then - entry["AutoHide"] = true + entry.AutoHide = true elseif nchild.Name == "TeamScore" then - WaitForChild(entry["Frame"], "PlayerScore").Text = - tostring(nchild.Value) - entry["TeamScore"] = nchild.Value + WaitForChild(entry.Frame, "PlayerScore").Text = tostring(nchild.Value) + entry.TeamScore = nchild.Value nchild.Changed:connect(function() TeamScoreChanged(entry, nchild.Value) end) @@ -3255,28 +3234,28 @@ end --]] function TeamChildRemoved(entry, nchild) if nchild.Name == "AutoHide" then - entry["AutoHide"] = false + entry.AutoHide = false elseif nchild.Name == "TeamScore" then - WaitForChild(entry["Frame"], "PlayerScore").Text = "" - entry["TeamScore"] = nil + WaitForChild(entry.Frame, "PlayerScore").Text = "" + entry.TeamScore = nil end end function TeamChanged(entry, property) if property == "Name" then - WaitForChild(WaitForChild(entry["Frame"], "TitleFrame"), "Title").Text = - entry["MyTeam"].Name + WaitForChild(WaitForChild(entry.Frame, "TitleFrame"), "Title").Text = + entry.MyTeam.Name elseif property == "TeamColor" then - entry["Frame"].ClickListener.BackgroundColor3 = - entry["MyTeam"].TeamColor.Color + entry.Frame.ClickListener.BackgroundColor3 = + entry.MyTeam.TeamColor.Color for _, i in pairs(TeamFrames) do - if i["MyTeam"].TeamColor == entry["MyTeam"] then - RemoveTeamFrame(entry["MyTeam"]) --NO DUPLICATE TEAMS! + if i.MyTeam.TeamColor == entry.MyTeam then + RemoveTeamFrame(entry.MyTeam) --NO DUPLICATE TEAMS! end end - entry["MyPlayers"] = {} + entry.MyPlayers = {} for _, i in pairs(PlayerFrames) do SetPlayerToTeam(i) @@ -3300,40 +3279,40 @@ function InsertTeamFrame(nteam) AddingFrameLock = true --for _,i in pairs(TeamFrames) do local nentry = {} - nentry["MyTeam"] = nteam - nentry["MyPlayers"] = {} - nentry["Frame"] = MiddleTemplate:Clone() - WaitForChild(WaitForChild(nentry["Frame"], "TitleFrame"), "Title").Text = + nentry.MyTeam = nteam + nentry.MyPlayers = {} + nentry.Frame = MiddleTemplate:Clone() + WaitForChild(WaitForChild(nentry.Frame, "TitleFrame"), "Title").Text = nteam.Name - nentry["Frame"].TitleFrame.Title.Font = "ArialBold" - nentry["Frame"].TitleFrame.Title.FontSize = "Size18" - nentry["Frame"].TitleFrame.Position = UDim2.new( - nentry["Frame"].TitleFrame.Position.X.Scale, - nentry["Frame"].TitleFrame.Position.X.Offset, + nentry.Frame.TitleFrame.Title.Font = "ArialBold" + nentry.Frame.TitleFrame.Title.FontSize = "Size18" + nentry.Frame.TitleFrame.Position = UDim2.new( + nentry.Frame.TitleFrame.Position.X.Scale, + nentry.Frame.TitleFrame.Position.X.Offset, 0.1, 0 ) - nentry["Frame"].TitleFrame.Size = UDim2.new( - nentry["Frame"].TitleFrame.Size.X.Scale, - nentry["Frame"].TitleFrame.Size.X.Offset, + nentry.Frame.TitleFrame.Size = UDim2.new( + nentry.Frame.TitleFrame.Size.X.Scale, + nentry.Frame.TitleFrame.Size.X.Offset, 0.8, 0 ) - nentry["Frame"].Position = - UDim2.new(1, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0) - WaitForChild(nentry["Frame"], "ClickListener").MouseButton1Down:connect( + nentry.Frame.Position = + UDim2.new(1, 0, (#MiddleFrames * nentry.Frame.Size.Y.Scale), 0) + WaitForChild(nentry.Frame, "ClickListener").MouseButton1Down:connect( function(nx, ny) StartDrag(nentry, nx, ny) end ) - nentry["Frame"].ClickListener.BackgroundColor3 = nteam.TeamColor.Color - nentry["Frame"].ClickListener.BackgroundTransparency = 0.7 - nentry["Frame"].ClickListener.AutoButtonColor = false - AddId = AddId + 1 - nentry["ID"] = AddId - nentry["AutoHide"] = false + nentry.Frame.ClickListener.BackgroundColor3 = nteam.TeamColor.Color + nentry.Frame.ClickListener.BackgroundTransparency = 0.7 + nentry.Frame.ClickListener.AutoButtonColor = false + AddId += 1 + nentry.ID = AddId + nentry.AutoHide = false if nteam:FindFirstChild "AutoHide" then - nentry["AutoHide"] = true + nentry.AutoHide = true end if nteam:FindFirstChild "TeamScore" then TeamChildAdded(nentry, nteam.TeamScore) @@ -3350,18 +3329,15 @@ function InsertTeamFrame(nteam) end) for _, i in pairs(PlayerFrames) do - if - not i["Player"].Neutral - and i["Player"].TeamColor == nteam.TeamColor - then + if not i.Player.Neutral and i.Player.TeamColor == nteam.TeamColor then AddPlayerToTeam(nentry, i) end end - nentry["IsHidden"] = false - if not nentry["AutoHide"] or #nentry["MyPlayers"] > 0 then - nentry["Frame"].Parent = ListFrame - nentry["Frame"]:TweenPosition( - UDim2.new(0.5, 0, (#MiddleFrames * nentry["Frame"].Size.Y.Scale), 0), + nentry.IsHidden = false + if not nentry.AutoHide or #nentry.MyPlayers > 0 then + nentry.Frame.Parent = ListFrame + nentry.Frame:TweenPosition( + UDim2.new(0.5, 0, (#MiddleFrames * nentry.Frame.Size.Y.Scale), 0), "Out", "Linear", BASE_TWEEN, @@ -3369,8 +3345,8 @@ function InsertTeamFrame(nteam) ) AddMiddleBGFrame() else - nentry["IsHidden"] = true - nentry["Frame"].Parent = nil + nentry.IsHidden = true + nentry.Frame.Parent = nil end table.insert(TeamFrames, nentry) @@ -3396,9 +3372,9 @@ function RemoveTeamFrame(nteam) -- end local myEntry for i, key in ipairs(TeamFrames) do - if nteam == key["MyTeam"] then + if nteam == key.MyTeam then myEntry = key - key["Frame"]:Destroy() + key.Frame:Destroy() table.remove(TeamFrames, i) end end @@ -3408,7 +3384,7 @@ function RemoveTeamFrame(nteam) RemoveNeutralTeam() end end - for i, key in ipairs(myEntry["MyPlayers"]) do + for i, key in ipairs(myEntry.MyPlayers) do RemovePlayerFromTeam(myEntry, i) PlayerChanged(key, "TeamColor") end diff --git a/lua/53878057.lua b/lua/53878057.lua index c354fe1..4137e9f 100644 --- a/lua/53878057.lua +++ b/lua/53878057.lua @@ -42,15 +42,15 @@ end local function moveHealthBar(pGui) waitForChild(pGui, "HealthGUI") - waitForChild(pGui["HealthGUI"], "tray") - local tray = pGui["HealthGUI"]["tray"] + waitForChild(pGui.HealthGUI, "tray") + local tray = pGui.HealthGUI.tray tray.Position = UDim2.new(0.5, -85, 1, -26) end local function setHealthBarVisible(pGui, visible) waitForChild(pGui, "HealthGUI") - waitForChild(pGui["HealthGUI"], "tray") - local tray = pGui["HealthGUI"]["tray"] + waitForChild(pGui.HealthGUI, "tray") + local tray = pGui.HealthGUI.tray tray.Visible = visible end @@ -92,8 +92,7 @@ if robloxGui.AbsoluteSize.Y <= 320 then maxNumLoadoutItems = 4 end -local characterChildAddedCon -local backpackChildCon +local characterChildAddedCon, backpackChildCon local debounce = false @@ -147,8 +146,8 @@ function unregisterNumberKeys() end function characterInWorkspace() - if game.Players["LocalPlayer"] then - if game.Players.LocalPlayer["Character"] then + if game.Players.LocalPlayer then + if game.Players.LocalPlayer.Character then if game.Players.LocalPlayer.Character ~= nil then if game.Players.LocalPlayer.Character.Parent ~= nil then return true @@ -751,7 +750,7 @@ local addingPlayerChild = function( gearClone.MouseEnter:connect(function() if gearClone.GearReference - and gearClone.GearReference.Value["ToolTip"] + and gearClone.GearReference.Value.ToolTip and gearClone.GearReference.Value.ToolTip ~= "" then showToolTip(gearClone, gearClone.GearReference.Value.ToolTip) @@ -761,7 +760,7 @@ local addingPlayerChild = function( gearClone.MouseLeave:connect(function() if gearClone.GearReference - and gearClone.GearReference.Value["ToolTip"] + and gearClone.GearReference.Value.ToolTip and gearClone.GearReference.Value.ToolTip ~= "" then hideToolTip(gearClone, gearClone.GearReference.Value.ToolTip) diff --git a/lua/60595411.lua b/lua/60595411.lua index b013cab..9666814 100644 --- a/lua/60595411.lua +++ b/lua/60595411.lua @@ -200,7 +200,7 @@ function StringReader:Peek() end function StringReader:Next() - self.i = self.i + 1 + self.i += 1 if self.i <= #self.s then return string.sub(self.s, self.i, self.i) end @@ -629,7 +629,7 @@ t.SelectTerrainRegion = function( -- helper function to update tag function incrementAliveCounter() - aliveCounter = aliveCounter + 1 + aliveCounter += 1 if aliveCounter > 1000000 then aliveCounter = 0 end diff --git a/lua/60595695.lua b/lua/60595695.lua index 97fd97d..9b773b0 100644 --- a/lua/60595695.lua +++ b/lua/60595695.lua @@ -8,7 +8,7 @@ local sc = game:GetService "ScriptContext" local tries = 0 while not sc and tries < 3 do - tries = tries + 1 + tries += 1 sc = game:GetService "ScriptContext" wait(0.2) end diff --git a/lua/73157242.lua b/lua/73157242.lua index 77aea71..188b02b 100644 --- a/lua/73157242.lua +++ b/lua/73157242.lua @@ -363,8 +363,8 @@ local function getBoundingBox2(partOrModel) 4 * math.ceil(actualBox.z / 4) ) local adjustment = containingGridBox - actualBox - minVec = minVec - 0.5 * adjustment * justify - maxVec = maxVec + 0.5 * adjustment * (two - justify) + minVec -= 0.5 * adjustment * justify + maxVec += 0.5 * adjustment * (two - justify) end return minVec, maxVec @@ -510,7 +510,7 @@ local function findConfigAtMouseTarget(Mouse, stampData) error "findConfigAtMouseTarget: stampData is nil" return nil end - if not stampData["CurrentParts"] then + if not stampData.CurrentParts then return nil end @@ -658,10 +658,8 @@ local function findConfigAtMouseTarget(Mouse, stampData) clampToSurface = Vector3.new(1, 1, 0) end - targetRefPointInTarget = targetRefPointInTarget * (0.5 * diagBBTarget) - + 0.5 * (maxBBTarget + minBBTarget) - insertRefPointInInsert = insertRefPointInInsert * (0.5 * diagBB) - + 0.5 * (maxBB + minBB) + targetRefPointInTarget *= (0.5 * diagBBTarget) + 0.5 * (maxBBTarget + minBBTarget) + insertRefPointInInsert *= (0.5 * diagBB) + 0.5 * (maxBB + minBB) -- To Do: For cases that are not aligned to the world grid, account for the minimal rotation -- needed to bring the Insert part(s) into alignment with the Target Part @@ -673,7 +671,7 @@ local function findConfigAtMouseTarget(Mouse, stampData) grid * math.modf(delta.y / grid), grid * math.modf(delta.z / grid) ) - deltaClamped = deltaClamped * clampToSurface + deltaClamped *= clampToSurface local targetTouchInTarget = deltaClamped + targetRefPointInTarget local TargetTouchRelToWorld = @@ -903,7 +901,7 @@ t.GetStampModel = function(assetId, terrainShape, useAssetVersionId) while loading and totalTime < maxWait do lastGameTime = tick() wait(1) - totalTime = totalTime + tick() - lastGameTime + totalTime += tick() - lastGameTime end loading = false @@ -1163,7 +1161,7 @@ t.SetupStamperDragger = function( line2 = HighScalabilityLine.End - HighScalabilityLine.MorePoints[1] -- take out any component of line2 along line1, so you get perpendicular to line1 component - line2 = line2 - line.unit * line.unit:Dot(line2) + line2 -= line.unit * line.unit:Dot(line2) tempCFrame = CFrame.new( HighScalabilityLine.Start, @@ -1178,9 +1176,9 @@ t.SetupStamperDragger = function( local yComp = yAxis:Dot(line2) if math.abs(yComp) > math.abs(xComp) then - line2 = line2 - xAxis * xComp + line2 -= xAxis * xComp else - line2 = line2 - yAxis * yComp + line2 -= yAxis * yComp end HighScalabilityLine.InternalLine = line2 @@ -1190,8 +1188,8 @@ t.SetupStamperDragger = function( line3 = HighScalabilityLine.End - HighScalabilityLine.MorePoints[2] -- zero out all components of previous lines - line3 = line3 - line.unit * line.unit:Dot(line3) - line3 = line3 - line2.unit * line2.unit:Dot(line3) + line3 -= line.unit * line.unit:Dot(line3) + line3 -= line2.unit * line2.unit:Dot(line3) HighScalabilityLine.InternalLine = line3 end @@ -1225,7 +1223,7 @@ t.SetupStamperDragger = function( -- make player able to see this ish local gui - if game.Players["LocalPlayer"] then + if game.Players.LocalPlayer then gui = game.Players.LocalPlayer:FindFirstChild "PlayerGui" if gui and gui:IsA "PlayerGui" then if @@ -1309,7 +1307,7 @@ t.SetupStamperDragger = function( end local ry = math.pi / 2 - gInitial90DegreeRotations = gInitial90DegreeRotations + numRotations + gInitial90DegreeRotations += numRotations if stampData.CurrentParts:IsA "Model" or stampData.CurrentParts:IsA "Tool" @@ -1336,8 +1334,8 @@ t.SetupStamperDragger = function( currModelCFrame = stampData.CurrentParts.CFrame end - minBB = minBB + targetCFrame.p - currModelCFrame.p - maxBB = maxBB + targetCFrame.p - currModelCFrame.p + minBB += targetCFrame.p - currModelCFrame.p + maxBB += targetCFrame.p - currModelCFrame.p -- don't drag into terrain if @@ -1521,13 +1519,13 @@ t.SetupStamperDragger = function( end local function setupKeyListener(key, Mouse) - if control and control["Paused"] then + if control and control.Paused then return end -- don't do this if we have no stamp key = string.lower(key) if key == "r" and not autoAlignToFace(stampData.CurrentParts) then -- rotate the model - gInitial90DegreeRotations = gInitial90DegreeRotations + 1 + gInitial90DegreeRotations += 1 -- Update orientation value if this is a fake terrain part local clusterValues = @@ -1600,13 +1598,13 @@ t.SetupStamperDragger = function( local function flashRedBox() local gui = game.CoreGui if game:FindFirstChild "Players" then - if game.Players["LocalPlayer"] then + if game.Players.LocalPlayer then if game.Players.LocalPlayer:FindFirstChild "PlayerGui" then gui = game.Players.LocalPlayer.PlayerGui end end end - if not stampData["ErrorBox"] then + if not stampData.ErrorBox then return end @@ -1619,16 +1617,16 @@ t.SetupStamperDragger = function( delay(0, function() for _ = 1, 3 do - if stampData["ErrorBox"] then + if stampData.ErrorBox then stampData.ErrorBox.Visible = true end wait(0.13) - if stampData["ErrorBox"] then + if stampData.ErrorBox then stampData.ErrorBox.Visible = false end wait(0.13) end - if stampData["ErrorBox"] then + if stampData.ErrorBox then stampData.ErrorBox.Adornee = nil stampData.ErrorBox.Parent = Tool end @@ -1778,7 +1776,7 @@ t.SetupStamperDragger = function( * (gStaticTrans - gDesiredTrans) ) if - stampData["TransparencyTable"] + stampData.TransparencyTable and stampData.TransparencyTable[part] then part.Transparency = newTrans @@ -1790,7 +1788,7 @@ t.SetupStamperDragger = function( end if part and part:IsA "BasePart" then if - stampData["TransparencyTable"] + stampData.TransparencyTable and stampData.TransparencyTable[part] then part.Transparency = gDesiredTrans @@ -2163,7 +2161,7 @@ t.SetupStamperDragger = function( end end end - stepVect[1] = stepVect[1] + incrementVect[1] + stepVect[1] += incrementVect[1] end if incrementVect[2] then while @@ -2173,7 +2171,7 @@ t.SetupStamperDragger = function( ) == 0 do - innerStepVectIndex = innerStepVectIndex + 1 + innerStepVectIndex += 1 end if innerStepVectIndex < 4 then stepVect[2] = stepVect[2] @@ -2182,7 +2180,7 @@ t.SetupStamperDragger = function( incrementVect[2] ) end - innerStepVectIndex = innerStepVectIndex + 1 + innerStepVectIndex += 1 else stepVect[2] = Vector3.new(1, 0, 0) innerStepVectIndex = 4 -- skip all remaining loops @@ -2202,7 +2200,7 @@ t.SetupStamperDragger = function( ) == 0 do - outerStepVectIndex = outerStepVectIndex + 1 + outerStepVectIndex += 1 end if outerStepVectIndex < 4 then stepVect[3] = stepVect[3] @@ -2211,7 +2209,7 @@ t.SetupStamperDragger = function( incrementVect[3] ) end - outerStepVectIndex = outerStepVectIndex + 1 + outerStepVectIndex += 1 else -- skip all remaining loops stepVect[3] = Vector3.new(1, 0, 0) outerStepVectIndex = 4 @@ -2395,8 +2393,8 @@ t.SetupStamperDragger = function( -- something will be stamped! so set the "StampedSomething" toggle to true if game:FindFirstChild "Players" then - if game.Players["LocalPlayer"] then - if game.Players.LocalPlayer["Character"] then + if game.Players.LocalPlayer then + if game.Players.LocalPlayer.Character then local localChar = game.Players.LocalPlayer.Character local stampTracker = localChar:FindFirstChild "StampTracker" if stampTracker and not stampTracker.Value then @@ -2545,7 +2543,7 @@ t.SetupStamperDragger = function( local function getPlayer() if game:FindFirstChild "Players" then - if game.Players["LocalPlayer"] then + if game.Players.LocalPlayer then return game.Players.LocalPlayer end end @@ -2584,7 +2582,7 @@ t.SetupStamperDragger = function( if playerNameTag ~= nil then if game:FindFirstChild "Players" - and game.Players["LocalPlayer"] + and game.Players.LocalPlayer then tempPlayerValue = game.Players.LocalPlayer if tempPlayerValue ~= nil then @@ -2717,8 +2715,8 @@ t.SetupStamperDragger = function( { Vector3.new(1, 0, 0), Vector3.new(0, 1, 0), Vector3.new(0, 0, 1) } -- maybe last one is negative? TODO: check this! local isPositive = 1 if whichSurface < 0 then - isPositive = isPositive * -1 - whichSurface = whichSurface * -1 + isPositive *= -1 + whichSurface *= -1 end local surfaceNormal = isPositive * modelCFrame:vectorToWorldSpace(AXIS_VECTORS[whichSurface]) @@ -2967,14 +2965,14 @@ t.SetupStamperDragger = function( errorBox:Destroy() end if stampData then - if stampData["Dragger"] then + if stampData.Dragger then stampData.Dragger:Destroy() end if stampData.CurrentParts then stampData.CurrentParts:Destroy() end end - if control and control["Stamped"] then + if control and control.Stamped then control.Stamped:Destroy() end control = nil diff --git a/lua/89449008.lua b/lua/89449008.lua index 95a352f..bf7b33e 100644 --- a/lua/89449008.lua +++ b/lua/89449008.lua @@ -49,9 +49,7 @@ local browsingMenu = false local mouseEnterCons = {} local mouseClickCons = {} -local characterChildAddedCon -local characterChildRemovedCon -local backpackAddCon +local characterChildAddedCon, characterChildRemovedCon, backpackAddCon local playerBackpack = waitForChild(player, "Backpack") @@ -346,13 +344,13 @@ function resizeGrid() local beginPos buttonClone.DragBegin:connect(function(value) waitForChild(buttonClone, "Background") - buttonClone["Background"].ZIndex = 10 + buttonClone.Background.ZIndex = 10 buttonClone.ZIndex = 10 beginPos = value end) buttonClone.DragStopped:connect(function(x, y) waitForChild(buttonClone, "Background") - buttonClone["Background"].ZIndex = 1 + buttonClone.Background.ZIndex = 1 buttonClone.ZIndex = 2 if beginPos ~= buttonClone.Position then if not checkForSwap(buttonClone, x, y) then @@ -994,7 +992,7 @@ if not backpack.Visible then end -- make sure that inventory is listening to gear reparenting -if characterChildAddedCon == nil and game.Players.LocalPlayer["Character"] then +if characterChildAddedCon == nil and game.Players.LocalPlayer.Character then setupCharacterConnections() end if not backpackAddCon then diff --git a/lua/89449093.lua b/lua/89449093.lua index 171feaf..cb4aefd 100644 --- a/lua/89449093.lua +++ b/lua/89449093.lua @@ -221,7 +221,7 @@ function toggleBackpack() if not game.Players.LocalPlayer then return end - if not game.Players.LocalPlayer["Character"] then + if not game.Players.LocalPlayer.Character then return end if not canToggle then @@ -477,7 +477,7 @@ backpackButton.MouseButton1Click:connect(function() toggleBackpack() end) -if game.Players.LocalPlayer["Character"] then +if game.Players.LocalPlayer.Character then activateBackpack() end diff --git a/lua/97188756.lua b/lua/97188756.lua index 90194a4..0c68380 100644 --- a/lua/97188756.lua +++ b/lua/97188756.lua @@ -921,12 +921,12 @@ local function GetNameValue(pName) local cValue = string.byte(string.sub(pName, index, index)) local reverseIndex = #pName - index + 1 if #pName % 2 == 1 then - reverseIndex = reverseIndex - 1 + reverseIndex -= 1 end if reverseIndex % 4 >= 2 then cValue = -cValue end - value = value + cValue + value += cValue end return value % 8 end @@ -994,9 +994,9 @@ end -- local next = self.MessageQueue[i].Next -- local previous = self.MessageQueue[i].Previous -- if label and label:IsA('TextLabel') or label:IsA('TextButton') then --- if value > 0 and previous and previous['Message'] then +-- if value > 0 and previous and previous.Message then -- label.Position = previous['Message'].Position --- elseif value < 1 and next['Message'] then +-- elseif value < 1 and next.Message then -- label.Position = previous['Message'].Position -- end -- end @@ -1026,7 +1026,7 @@ function Chat:UpdateQueue(field, diff) self.Configuration.XScale, 0, label.Position.Y.Scale - - field["Message"].Size.Y.Scale, + - field.Message.Size.Y.Scale, 0 ) -- Just to show up popping effect for the latest message in chat @@ -1037,7 +1037,7 @@ function Chat:UpdateQueue(field, diff) - 0.2 wait(0.03) end - if label == field["Message"] then + if label == field.Message then label.TextStrokeTransparency = 0.8 else label.TextStrokeTransparency = 1 @@ -1048,7 +1048,7 @@ function Chat:UpdateQueue(field, diff) self.Configuration.XScale, 0, label.Position.Y.Scale - - field["Message"].Size.Y.Scale, + - field.Message.Size.Y.Scale, 0 ) end @@ -1141,7 +1141,7 @@ function Chat:UpdateChat(cPlayer, message) Chat.MessageThread = coroutine.create(function() for i = 1, #Chat.Messages_List do local field = Chat.Messages_List[i] - Chat:CreateMessage(field["Player"], field["Message"]) + Chat:CreateMessage(field.Player, field.Message) end Chat.Messages_List = {} end) @@ -1306,9 +1306,9 @@ function Chat:CreateMessage(cPlayer, message) pLabel.Size = mLabel.Size local queueField = {} - queueField["Player"] = pLabel - queueField["Message"] = mLabel - queueField["SpawnTime"] = tick() -- Used for identifying when to make the message invisible + queueField.Player = pLabel + queueField.Message = mLabel + queueField.SpawnTime = tick() -- Used for identifying when to make the message invisible table.insert(self.MessageQueue, 1, queueField) Chat:UpdateQueue(queueField) @@ -1317,7 +1317,7 @@ end function Chat:ScreenSizeChanged() wait() while self.Frame.AbsoluteSize.Y > 120 do - self.Frame.Size = self.Frame.Size - UDim2.new(0, 0, 0.005, 0) + self.Frame.Size -= UDim2.new(0, 0, 0.005, 0) end Chat:RecalculateSpacing() end @@ -1374,7 +1374,7 @@ function Chat:CreateSafeChatOptions(list, rootButton) ), } - count = count + 1 + count += 1 if type(list[msg]) == "table" then text_List[rootButton][chatText] = @@ -1438,7 +1438,7 @@ function Chat:FocusOnChatBar() end self.GotFocus = true - if self.Frame["Background"] then + if self.Frame.Background then self.Frame.Background.Visible = false end self.ChatBar:CaptureFocus() @@ -1675,12 +1675,12 @@ function Input:OnMouseScroll() while Input.Speed ~= 0 do if Input.Speed > 1 then while Input.Speed > 0 do - Input.Speed = Input.Speed - 1 + Input.Speed -= 1 wait(0.25) end elseif Input.Speed < 0 then while Input.Speed < 0 do - Input.Speed = Input.Speed + 1 + Input.Speed += 1 wait(0.25) end end @@ -1694,7 +1694,7 @@ function Input:OnMouseScroll() end function Input:ApplySpeed(value) - Input.Speed = Input.Speed + value + Input.Speed += value if not self.Simulating then Input:OnMouseScroll() end @@ -1770,14 +1770,14 @@ function Chat:CullThread() if #self.MessageQueue > 0 then for _, field in pairs(self.MessageQueue) do if - field["SpawnTime"] - and field["Player"] - and field["Message"] - and tick() - field["SpawnTime"] + field.SpawnTime + and field.Player + and field.Message + and tick() - field.SpawnTime > self.Configuration.LifeTime then - field["Player"].Visible = false - field["Message"].Visible = false + field.Player.Visible = false + field.Message.Visible = false end end end diff --git a/lua/host.lua b/lua/host.lua index 7808ae2..c121fba 100644 --- a/lua/host.lua +++ b/lua/host.lua @@ -181,8 +181,8 @@ settings().Diagnostics.LuaRamLimit = 0 --settings().Network.SendRate = 35 --settings().Network.PhysicsSend = 0 -- 1==RoundRobin ---shared["__time"] = 0 ---game:GetService("RunService").Stepped:connect(function (time) shared["__time"] = time end) +--shared.__time = 0 +--game:GetService("RunService").Stepped:connect(function (time) shared.__time = time end) if placeId ~= nil and killID ~= nil and deathID ~= nil and url ~= nil then -- listen for the death of a Player From 3c7499eb2e099a07de4795c1ef48633c13157be4 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Mon, 14 Aug 2023 19:47:32 +0100 Subject: [PATCH 05/14] Rename corescripts from .lua to .luau --- README.md | 2 +- compile.sh | 8 ++++---- lua/107893730.lua => luau/107893730.luau | 0 lua/152908679.lua => luau/152908679.luau | 0 lua/153556783.lua => luau/153556783.luau | 0 lua/157877000.lua => luau/157877000.luau | 0 lua/36868950.lua => luau/36868950.luau | 0 lua/37801172.lua => luau/37801172.luau | 0 lua/38037565.lua => luau/38037565.luau | 0 lua/39250920.lua => luau/39250920.luau | 0 lua/45284430.lua => luau/45284430.luau | 0 lua/45374389.lua => luau/45374389.luau | 0 lua/46295863.lua => luau/46295863.luau | 0 lua/48488235.lua => luau/48488235.luau | 0 lua/48488398.lua => luau/48488398.luau | 0 lua/48488451.lua => luau/48488451.luau | 0 lua/53878047.lua => luau/53878047.luau | 0 lua/53878057.lua => luau/53878057.luau | 0 lua/59002209.lua => luau/59002209.luau | 0 lua/60595411.lua => luau/60595411.luau | 0 lua/60595695.lua => luau/60595695.luau | 0 lua/73157242.lua => luau/73157242.luau | 0 lua/89449008.lua => luau/89449008.luau | 0 lua/89449093.lua => luau/89449093.luau | 0 lua/97188756.lua => luau/97188756.luau | 0 lua/host.lua => luau/host.luau | 0 lua/join.lua => luau/join.luau | 0 lua/studio.lua => luau/studio.luau | 0 lua/visit.lua => luau/visit.luau | 0 29 files changed, 5 insertions(+), 5 deletions(-) rename lua/107893730.lua => luau/107893730.luau (100%) rename lua/152908679.lua => luau/152908679.luau (100%) rename lua/153556783.lua => luau/153556783.luau (100%) rename lua/157877000.lua => luau/157877000.luau (100%) rename lua/36868950.lua => luau/36868950.luau (100%) rename lua/37801172.lua => luau/37801172.luau (100%) rename lua/38037565.lua => luau/38037565.luau (100%) rename lua/39250920.lua => luau/39250920.luau (100%) rename lua/45284430.lua => luau/45284430.luau (100%) rename lua/45374389.lua => luau/45374389.luau (100%) rename lua/46295863.lua => luau/46295863.luau (100%) rename lua/48488235.lua => luau/48488235.luau (100%) rename lua/48488398.lua => luau/48488398.luau (100%) rename lua/48488451.lua => luau/48488451.luau (100%) rename lua/53878047.lua => luau/53878047.luau (100%) rename lua/53878057.lua => luau/53878057.luau (100%) rename lua/59002209.lua => luau/59002209.luau (100%) rename lua/60595411.lua => luau/60595411.luau (100%) rename lua/60595695.lua => luau/60595695.luau (100%) rename lua/73157242.lua => luau/73157242.luau (100%) rename lua/89449008.lua => luau/89449008.luau (100%) rename lua/89449093.lua => luau/89449093.luau (100%) rename lua/97188756.lua => luau/97188756.luau (100%) rename lua/host.lua => luau/host.luau (100%) rename lua/join.lua => luau/join.luau (100%) rename lua/studio.lua => luau/studio.luau (100%) rename lua/visit.lua => luau/visit.luau (100%) diff --git a/README.md b/README.md index 3662d02..1f1a387 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # Corescripts -After installing Aftman and running `aftman install`, run `./compile.sh` to compile the corescripts from ./lua/\*.lua to ./processed/\*.lua. +After installing Aftman and running `aftman install`, run `./compile.sh` to compile the corescripts from ./luau/\*.luau to ./processed/\*.lua. diff --git a/compile.sh b/compile.sh index 1017991..b59eee7 100644 --- a/compile.sh +++ b/compile.sh @@ -1,9 +1,9 @@ echo "Processing corescripts..." -for file in lua/[0-9]*.lua; do - darklua process -c dense.json5 $file processed/$(basename "$file") +for file in luau/[0-9]*.luau; do + darklua process -c dense.json5 $file processed/$(basename "${file::-1}") done echo "Processing other corescripts..." -for file in lua/[a-z]*.lua; do - darklua process -c lines.json5 $file processed/$(basename "$file") +for file in luau/[a-z]*.luau; do + darklua process -c lines.json5 $file processed/$(basename "${file::-1}") done diff --git a/lua/107893730.lua b/luau/107893730.luau similarity index 100% rename from lua/107893730.lua rename to luau/107893730.luau diff --git a/lua/152908679.lua b/luau/152908679.luau similarity index 100% rename from lua/152908679.lua rename to luau/152908679.luau diff --git a/lua/153556783.lua b/luau/153556783.luau similarity index 100% rename from lua/153556783.lua rename to luau/153556783.luau diff --git a/lua/157877000.lua b/luau/157877000.luau similarity index 100% rename from lua/157877000.lua rename to luau/157877000.luau diff --git a/lua/36868950.lua b/luau/36868950.luau similarity index 100% rename from lua/36868950.lua rename to luau/36868950.luau diff --git a/lua/37801172.lua b/luau/37801172.luau similarity index 100% rename from lua/37801172.lua rename to luau/37801172.luau diff --git a/lua/38037565.lua b/luau/38037565.luau similarity index 100% rename from lua/38037565.lua rename to luau/38037565.luau diff --git a/lua/39250920.lua b/luau/39250920.luau similarity index 100% rename from lua/39250920.lua rename to luau/39250920.luau diff --git a/lua/45284430.lua b/luau/45284430.luau similarity index 100% rename from lua/45284430.lua rename to luau/45284430.luau diff --git a/lua/45374389.lua b/luau/45374389.luau similarity index 100% rename from lua/45374389.lua rename to luau/45374389.luau diff --git a/lua/46295863.lua b/luau/46295863.luau similarity index 100% rename from lua/46295863.lua rename to luau/46295863.luau diff --git a/lua/48488235.lua b/luau/48488235.luau similarity index 100% rename from lua/48488235.lua rename to luau/48488235.luau diff --git a/lua/48488398.lua b/luau/48488398.luau similarity index 100% rename from lua/48488398.lua rename to luau/48488398.luau diff --git a/lua/48488451.lua b/luau/48488451.luau similarity index 100% rename from lua/48488451.lua rename to luau/48488451.luau diff --git a/lua/53878047.lua b/luau/53878047.luau similarity index 100% rename from lua/53878047.lua rename to luau/53878047.luau diff --git a/lua/53878057.lua b/luau/53878057.luau similarity index 100% rename from lua/53878057.lua rename to luau/53878057.luau diff --git a/lua/59002209.lua b/luau/59002209.luau similarity index 100% rename from lua/59002209.lua rename to luau/59002209.luau diff --git a/lua/60595411.lua b/luau/60595411.luau similarity index 100% rename from lua/60595411.lua rename to luau/60595411.luau diff --git a/lua/60595695.lua b/luau/60595695.luau similarity index 100% rename from lua/60595695.lua rename to luau/60595695.luau diff --git a/lua/73157242.lua b/luau/73157242.luau similarity index 100% rename from lua/73157242.lua rename to luau/73157242.luau diff --git a/lua/89449008.lua b/luau/89449008.luau similarity index 100% rename from lua/89449008.lua rename to luau/89449008.luau diff --git a/lua/89449093.lua b/luau/89449093.luau similarity index 100% rename from lua/89449093.lua rename to luau/89449093.luau diff --git a/lua/97188756.lua b/luau/97188756.luau similarity index 100% rename from lua/97188756.lua rename to luau/97188756.luau diff --git a/lua/host.lua b/luau/host.luau similarity index 100% rename from lua/host.lua rename to luau/host.luau diff --git a/lua/join.lua b/luau/join.luau similarity index 100% rename from lua/join.lua rename to luau/join.luau diff --git a/lua/studio.lua b/luau/studio.luau similarity index 100% rename from lua/studio.lua rename to luau/studio.luau diff --git a/lua/visit.lua b/luau/visit.luau similarity index 100% rename from lua/visit.lua rename to luau/visit.luau From de2033836237b609590638c18a13c878f7e4453c Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Mon, 14 Aug 2023 23:46:25 +0100 Subject: [PATCH 06/14] Add type definitions and fix type errors in corescripts --- defs.d.lua | 11146 ++++++++++++++++++++++++++++++++++++++++++ luau/107893730.luau | 9 +- luau/157877000.luau | 3 +- luau/45284430.luau | 24 +- luau/46295863.luau | 2 +- luau/48488398.luau | 20 +- luau/53878047.luau | 23 +- luau/53878057.luau | 9 +- luau/60595411.luau | 14 +- luau/73157242.luau | 19 +- luau/89449093.luau | 16 +- luau/97188756.luau | 2 +- luau/host.luau | 30 +- luau/join.luau | 8 +- luau/visit.luau | 2 +- mercury.yml | 13 + 16 files changed, 11254 insertions(+), 86 deletions(-) create mode 100644 defs.d.lua diff --git a/defs.d.lua b/defs.d.lua new file mode 100644 index 0000000..f4953d9 --- /dev/null +++ b/defs.d.lua @@ -0,0 +1,11146 @@ +local JointsService = game:GetService("JointsService") +-- Based on https://github.com/JohnnyMorganz/luau-lsp/blob/2bd0fb8a122932be67a16412591089e482bc3209/scripts/globalTypes.d.lua + +type Content = string +type ProtectedString = string +type BinaryString = string +type QDir = string +type QFont = string +type FloatCurveKey = any +type RotationCurveKey = any + +declare class Enum + function GetEnumItems(self): { any } +end + +declare class EnumItem + Name: string + Value: number + EnumType: Enum + function IsA(self, enumName: string): boolean +end + +declare debug: { + info: ((thread, number, string) -> R...) & ((number, string) -> R...) & (((A...) -> R1..., string) -> R2...), + traceback: ((string?, number?) -> string) & ((thread, string?, number?) -> string), + profilebegin: (label: string) -> (), + profileend: () -> (), + setmemorycategory: (tag: string) -> (), + resetmemorycategory: () -> (), +} + +declare task: { + cancel: (thread: thread) -> (), + defer: (f: thread | ((A...) -> R...), A...) -> thread, + spawn: (f: thread | ((A...) -> R...), A...) -> thread, + delay: (sec: number?, f: thread | ((A...) -> R...), A...) -> thread, + wait: (sec: number?) -> number, + synchronize: () -> (), + desynchronize: () -> (), +} + +declare utf8: { + char: (...number) -> string, + charpattern: string, + codepoint: (string, number?, number?) -> (...number), + codes: (string) -> ((string, number) -> (number, number), string, number), + graphemes: (string, number?, number?) -> (() -> (number, number)), + len: (string, number?, number?) -> (number?, number?), + nfcnormalize: (string) -> string, + nfdnormalize: (string) -> string, + offset: (string, number, number?) -> number?, +} + +declare shared: any + +declare function collectgarbage(mode: "count"): number +declare function warn(...: T...) +declare function tick(): number +declare function time(): number +declare function elapsedTime(): number +declare function wait(seconds: number?): (number, number) +declare function delay(delayTime: number?, callback: (T...) -> ()) +declare function Delay(delayTime: number?, callback: (T...) -> ()) +declare function spawn(callback: (T...) -> ()) +declare function Spawn(callback: (T...) -> ()) +declare function version(): string +declare function printidentity(prefix: string?) + +declare class EnumAccessModifierType extends EnumItem end +declare class EnumAccessModifierType_INTERNAL extends Enum + Allow: EnumAccessModifierType + Deny: EnumAccessModifierType +end +declare class EnumAccessoryType extends EnumItem end +declare class EnumAccessoryType_INTERNAL extends Enum + Unknown: EnumAccessoryType + Hat: EnumAccessoryType + Hair: EnumAccessoryType + Face: EnumAccessoryType + Neck: EnumAccessoryType + Shoulder: EnumAccessoryType + Front: EnumAccessoryType + Back: EnumAccessoryType + Waist: EnumAccessoryType + TShirt: EnumAccessoryType + Shirt: EnumAccessoryType + Pants: EnumAccessoryType + Jacket: EnumAccessoryType + Sweater: EnumAccessoryType + Shorts: EnumAccessoryType + LeftShoe: EnumAccessoryType + RightShoe: EnumAccessoryType + DressSkirt: EnumAccessoryType + Eyebrow: EnumAccessoryType + Eyelash: EnumAccessoryType +end +declare class EnumActionType extends EnumItem end +declare class EnumActionType_INTERNAL extends Enum + Nothing: EnumActionType + Pause: EnumActionType + Lose: EnumActionType + Draw: EnumActionType + Win: EnumActionType +end +declare class EnumActuatorRelativeTo extends EnumItem end +declare class EnumActuatorRelativeTo_INTERNAL extends Enum + Attachment0: EnumActuatorRelativeTo + Attachment1: EnumActuatorRelativeTo + World: EnumActuatorRelativeTo +end +declare class EnumActuatorType extends EnumItem end +declare class EnumActuatorType_INTERNAL extends Enum + None: EnumActuatorType + Motor: EnumActuatorType + Servo: EnumActuatorType +end +declare class EnumAdShape extends EnumItem end +declare class EnumAdShape_INTERNAL extends Enum + HorizontalRectangle: EnumAdShape +end +declare class EnumAdTeleportMethod extends EnumItem end +declare class EnumAdTeleportMethod_INTERNAL extends Enum + Undefined: EnumAdTeleportMethod + PortalForward: EnumAdTeleportMethod + InGameMenuBackButton: EnumAdTeleportMethod + UIBackButton: EnumAdTeleportMethod +end +declare class EnumAdUnitStatus extends EnumItem end +declare class EnumAdUnitStatus_INTERNAL extends Enum + Inactive: EnumAdUnitStatus + Active: EnumAdUnitStatus +end +declare class EnumAdornCullingMode extends EnumItem end +declare class EnumAdornCullingMode_INTERNAL extends Enum + Automatic: EnumAdornCullingMode + Never: EnumAdornCullingMode +end +declare class EnumAlignType extends EnumItem end +declare class EnumAlignType_INTERNAL extends Enum + Parallel: EnumAlignType + Perpendicular: EnumAlignType +end +declare class EnumAlphaMode extends EnumItem end +declare class EnumAlphaMode_INTERNAL extends Enum + Overlay: EnumAlphaMode + Transparency: EnumAlphaMode +end +declare class EnumAnalyticsEconomyAction extends EnumItem end +declare class EnumAnalyticsEconomyAction_INTERNAL extends Enum + Default: EnumAnalyticsEconomyAction + Acquire: EnumAnalyticsEconomyAction + Spend: EnumAnalyticsEconomyAction +end +declare class EnumAnalyticsLogLevel extends EnumItem end +declare class EnumAnalyticsLogLevel_INTERNAL extends Enum + Trace: EnumAnalyticsLogLevel + Debug: EnumAnalyticsLogLevel + Information: EnumAnalyticsLogLevel + Warning: EnumAnalyticsLogLevel + Error: EnumAnalyticsLogLevel + Fatal: EnumAnalyticsLogLevel +end +declare class EnumAnalyticsProgressionStatus extends EnumItem end +declare class EnumAnalyticsProgressionStatus_INTERNAL extends Enum + Default: EnumAnalyticsProgressionStatus + Begin: EnumAnalyticsProgressionStatus + Complete: EnumAnalyticsProgressionStatus + Abandon: EnumAnalyticsProgressionStatus + Fail: EnumAnalyticsProgressionStatus +end +declare class EnumAnimationPriority extends EnumItem end +declare class EnumAnimationPriority_INTERNAL extends Enum + Idle: EnumAnimationPriority + Movement: EnumAnimationPriority + Action: EnumAnimationPriority + Action2: EnumAnimationPriority + Action3: EnumAnimationPriority + Action4: EnumAnimationPriority + Core: EnumAnimationPriority +end +declare class EnumAnimatorRetargetingMode extends EnumItem end +declare class EnumAnimatorRetargetingMode_INTERNAL extends Enum + Default: EnumAnimatorRetargetingMode + Disabled: EnumAnimatorRetargetingMode + Enabled: EnumAnimatorRetargetingMode +end +declare class EnumAppShellActionType extends EnumItem end +declare class EnumAppShellActionType_INTERNAL extends Enum + None: EnumAppShellActionType + OpenApp: EnumAppShellActionType + TapChatTab: EnumAppShellActionType + TapConversationEntry: EnumAppShellActionType + TapAvatarTab: EnumAppShellActionType + ReadConversation: EnumAppShellActionType + TapGamePageTab: EnumAppShellActionType + TapHomePageTab: EnumAppShellActionType + GamePageLoaded: EnumAppShellActionType + HomePageLoaded: EnumAppShellActionType + AvatarEditorPageLoaded: EnumAppShellActionType +end +declare class EnumAppShellFeature extends EnumItem end +declare class EnumAppShellFeature_INTERNAL extends Enum + None: EnumAppShellFeature + Chat: EnumAppShellFeature + AvatarEditor: EnumAppShellFeature + GamePage: EnumAppShellFeature + HomePage: EnumAppShellFeature + More: EnumAppShellFeature + Landing: EnumAppShellFeature +end +declare class EnumAppUpdateStatus extends EnumItem end +declare class EnumAppUpdateStatus_INTERNAL extends Enum + Unknown: EnumAppUpdateStatus + NotSupported: EnumAppUpdateStatus + Failed: EnumAppUpdateStatus + NotAvailable: EnumAppUpdateStatus + Available: EnumAppUpdateStatus +end +declare class EnumApplyStrokeMode extends EnumItem end +declare class EnumApplyStrokeMode_INTERNAL extends Enum + Contextual: EnumApplyStrokeMode + Border: EnumApplyStrokeMode +end +declare class EnumAspectType extends EnumItem end +declare class EnumAspectType_INTERNAL extends Enum + FitWithinMaxSize: EnumAspectType + ScaleWithParentSize: EnumAspectType +end +declare class EnumAssetFetchStatus extends EnumItem end +declare class EnumAssetFetchStatus_INTERNAL extends Enum + Success: EnumAssetFetchStatus + Failure: EnumAssetFetchStatus + None: EnumAssetFetchStatus + Loading: EnumAssetFetchStatus + TimedOut: EnumAssetFetchStatus +end +declare class EnumAssetType extends EnumItem end +declare class EnumAssetType_INTERNAL extends Enum + Image: EnumAssetType + TShirt: EnumAssetType + Audio: EnumAssetType + Mesh: EnumAssetType + Lua: EnumAssetType + Hat: EnumAssetType + Place: EnumAssetType + Model: EnumAssetType + Shirt: EnumAssetType + Pants: EnumAssetType + Decal: EnumAssetType + Head: EnumAssetType + Face: EnumAssetType + Gear: EnumAssetType + Badge: EnumAssetType + Animation: EnumAssetType + Torso: EnumAssetType + RightArm: EnumAssetType + LeftArm: EnumAssetType + LeftLeg: EnumAssetType + RightLeg: EnumAssetType + Package: EnumAssetType + GamePass: EnumAssetType + Plugin: EnumAssetType + MeshPart: EnumAssetType + HairAccessory: EnumAssetType + FaceAccessory: EnumAssetType + NeckAccessory: EnumAssetType + ShoulderAccessory: EnumAssetType + FrontAccessory: EnumAssetType + BackAccessory: EnumAssetType + WaistAccessory: EnumAssetType + ClimbAnimation: EnumAssetType + DeathAnimation: EnumAssetType + FallAnimation: EnumAssetType + IdleAnimation: EnumAssetType + JumpAnimation: EnumAssetType + RunAnimation: EnumAssetType + SwimAnimation: EnumAssetType + WalkAnimation: EnumAssetType + PoseAnimation: EnumAssetType + MoodAnimation: EnumAssetType + EarAccessory: EnumAssetType + EyeAccessory: EnumAssetType + EmoteAnimation: EnumAssetType + Video: EnumAssetType + TShirtAccessory: EnumAssetType + ShirtAccessory: EnumAssetType + PantsAccessory: EnumAssetType + JacketAccessory: EnumAssetType + SweaterAccessory: EnumAssetType + ShortsAccessory: EnumAssetType + LeftShoeAccessory: EnumAssetType + RightShoeAccessory: EnumAssetType + DressSkirtAccessory: EnumAssetType + EyebrowAccessory: EnumAssetType + EyelashAccessory: EnumAssetType + DynamicHead: EnumAssetType + FontFamily: EnumAssetType +end +declare class EnumAssetTypeVerification extends EnumItem end +declare class EnumAssetTypeVerification_INTERNAL extends Enum + Default: EnumAssetTypeVerification + ClientOnly: EnumAssetTypeVerification + Always: EnumAssetTypeVerification +end +declare class EnumAudioSubType extends EnumItem end +declare class EnumAudioSubType_INTERNAL extends Enum + Music: EnumAudioSubType + SoundEffect: EnumAudioSubType +end +declare class EnumAudioWindowSize extends EnumItem end +declare class EnumAudioWindowSize_INTERNAL extends Enum + Small: EnumAudioWindowSize + Medium: EnumAudioWindowSize + Large: EnumAudioWindowSize +end +declare class EnumAutoIndentRule extends EnumItem end +declare class EnumAutoIndentRule_INTERNAL extends Enum + Off: EnumAutoIndentRule + Absolute: EnumAutoIndentRule + Relative: EnumAutoIndentRule +end +declare class EnumAutomaticSize extends EnumItem end +declare class EnumAutomaticSize_INTERNAL extends Enum + None: EnumAutomaticSize + X: EnumAutomaticSize + Y: EnumAutomaticSize + XY: EnumAutomaticSize +end +declare class EnumAvatarAssetType extends EnumItem end +declare class EnumAvatarAssetType_INTERNAL extends Enum + TShirt: EnumAvatarAssetType + Hat: EnumAvatarAssetType + HairAccessory: EnumAvatarAssetType + FaceAccessory: EnumAvatarAssetType + NeckAccessory: EnumAvatarAssetType + ShoulderAccessory: EnumAvatarAssetType + FrontAccessory: EnumAvatarAssetType + BackAccessory: EnumAvatarAssetType + WaistAccessory: EnumAvatarAssetType + Shirt: EnumAvatarAssetType + Pants: EnumAvatarAssetType + Gear: EnumAvatarAssetType + Head: EnumAvatarAssetType + Face: EnumAvatarAssetType + Torso: EnumAvatarAssetType + RightArm: EnumAvatarAssetType + LeftArm: EnumAvatarAssetType + LeftLeg: EnumAvatarAssetType + RightLeg: EnumAvatarAssetType + ClimbAnimation: EnumAvatarAssetType + FallAnimation: EnumAvatarAssetType + IdleAnimation: EnumAvatarAssetType + JumpAnimation: EnumAvatarAssetType + RunAnimation: EnumAvatarAssetType + SwimAnimation: EnumAvatarAssetType + WalkAnimation: EnumAvatarAssetType + MoodAnimation: EnumAvatarAssetType + EmoteAnimation: EnumAvatarAssetType + TShirtAccessory: EnumAvatarAssetType + ShirtAccessory: EnumAvatarAssetType + PantsAccessory: EnumAvatarAssetType + JacketAccessory: EnumAvatarAssetType + SweaterAccessory: EnumAvatarAssetType + ShortsAccessory: EnumAvatarAssetType + LeftShoeAccessory: EnumAvatarAssetType + RightShoeAccessory: EnumAvatarAssetType + DressSkirtAccessory: EnumAvatarAssetType + EyebrowAccessory: EnumAvatarAssetType + EyelashAccessory: EnumAvatarAssetType + DynamicHead: EnumAvatarAssetType +end +declare class EnumAvatarChatServiceFeature extends EnumItem end +declare class EnumAvatarChatServiceFeature_INTERNAL extends Enum + None: EnumAvatarChatServiceFeature + UniverseAudio: EnumAvatarChatServiceFeature + UniverseVideo: EnumAvatarChatServiceFeature + PlaceAudio: EnumAvatarChatServiceFeature + PlaceVideo: EnumAvatarChatServiceFeature + UserAudioEligible: EnumAvatarChatServiceFeature + UserAudio: EnumAvatarChatServiceFeature + UserVideoEligible: EnumAvatarChatServiceFeature + UserVideo: EnumAvatarChatServiceFeature + UserBanned: EnumAvatarChatServiceFeature +end +declare class EnumAvatarContextMenuOption extends EnumItem end +declare class EnumAvatarContextMenuOption_INTERNAL extends Enum + Friend: EnumAvatarContextMenuOption + Chat: EnumAvatarContextMenuOption + Emote: EnumAvatarContextMenuOption + InspectMenu: EnumAvatarContextMenuOption +end +declare class EnumAvatarItemType extends EnumItem end +declare class EnumAvatarItemType_INTERNAL extends Enum + Asset: EnumAvatarItemType + Bundle: EnumAvatarItemType +end +declare class EnumAvatarJointUpgrade extends EnumItem end +declare class EnumAvatarJointUpgrade_INTERNAL extends Enum + Default: EnumAvatarJointUpgrade + Enabled: EnumAvatarJointUpgrade + Disabled: EnumAvatarJointUpgrade +end +declare class EnumAvatarPromptResult extends EnumItem end +declare class EnumAvatarPromptResult_INTERNAL extends Enum + Success: EnumAvatarPromptResult + PermissionDenied: EnumAvatarPromptResult + Failed: EnumAvatarPromptResult +end +declare class EnumAvatarThumbnailCustomizationType extends EnumItem end +declare class EnumAvatarThumbnailCustomizationType_INTERNAL extends Enum + Closeup: EnumAvatarThumbnailCustomizationType + FullBody: EnumAvatarThumbnailCustomizationType +end +declare class EnumAvatarUnificationMode extends EnumItem end +declare class EnumAvatarUnificationMode_INTERNAL extends Enum + Default: EnumAvatarUnificationMode + Disabled: EnumAvatarUnificationMode + Enabled: EnumAvatarUnificationMode +end +declare class EnumAxis extends EnumItem end +declare class EnumAxis_INTERNAL extends Enum + X: EnumAxis + Y: EnumAxis + Z: EnumAxis +end +declare class EnumBinType extends EnumItem end +declare class EnumBinType_INTERNAL extends Enum + Script: EnumBinType + GameTool: EnumBinType + Grab: EnumBinType + Clone: EnumBinType + Hammer: EnumBinType +end +declare class EnumBodyPart extends EnumItem end +declare class EnumBodyPart_INTERNAL extends Enum + Head: EnumBodyPart + Torso: EnumBodyPart + LeftArm: EnumBodyPart + RightArm: EnumBodyPart + LeftLeg: EnumBodyPart + RightLeg: EnumBodyPart +end +declare class EnumBodyPartR15 extends EnumItem end +declare class EnumBodyPartR15_INTERNAL extends Enum + Head: EnumBodyPartR15 + UpperTorso: EnumBodyPartR15 + LowerTorso: EnumBodyPartR15 + LeftFoot: EnumBodyPartR15 + LeftLowerLeg: EnumBodyPartR15 + LeftUpperLeg: EnumBodyPartR15 + RightFoot: EnumBodyPartR15 + RightLowerLeg: EnumBodyPartR15 + RightUpperLeg: EnumBodyPartR15 + LeftHand: EnumBodyPartR15 + LeftLowerArm: EnumBodyPartR15 + LeftUpperArm: EnumBodyPartR15 + RightHand: EnumBodyPartR15 + RightLowerArm: EnumBodyPartR15 + RightUpperArm: EnumBodyPartR15 + RootPart: EnumBodyPartR15 + Unknown: EnumBodyPartR15 +end +declare class EnumBorderMode extends EnumItem end +declare class EnumBorderMode_INTERNAL extends Enum + Outline: EnumBorderMode + Middle: EnumBorderMode + Inset: EnumBorderMode +end +declare class EnumBreakReason extends EnumItem end +declare class EnumBreakReason_INTERNAL extends Enum + Other: EnumBreakReason + Error: EnumBreakReason + UserBreakpoint: EnumBreakReason + SpecialBreakpoint: EnumBreakReason +end +declare class EnumBreakpointRemoveReason extends EnumItem end +declare class EnumBreakpointRemoveReason_INTERNAL extends Enum + Requested: EnumBreakpointRemoveReason + ScriptChanged: EnumBreakpointRemoveReason + ScriptRemoved: EnumBreakpointRemoveReason +end +declare class EnumBulkMoveMode extends EnumItem end +declare class EnumBulkMoveMode_INTERNAL extends Enum + FireAllEvents: EnumBulkMoveMode + FireCFrameChanged: EnumBulkMoveMode +end +declare class EnumBundleType extends EnumItem end +declare class EnumBundleType_INTERNAL extends Enum + BodyParts: EnumBundleType + Animations: EnumBundleType + Shoes: EnumBundleType + DynamicHead: EnumBundleType + DynamicHeadAvatar: EnumBundleType +end +declare class EnumButton extends EnumItem end +declare class EnumButton_INTERNAL extends Enum + Jump: EnumButton + Dismount: EnumButton +end +declare class EnumButtonStyle extends EnumItem end +declare class EnumButtonStyle_INTERNAL extends Enum + Custom: EnumButtonStyle + RobloxButtonDefault: EnumButtonStyle + RobloxButton: EnumButtonStyle + RobloxRoundButton: EnumButtonStyle + RobloxRoundDefaultButton: EnumButtonStyle + RobloxRoundDropdownButton: EnumButtonStyle +end +declare class EnumCageType extends EnumItem end +declare class EnumCageType_INTERNAL extends Enum + Inner: EnumCageType + Outer: EnumCageType +end +declare class EnumCameraMode extends EnumItem end +declare class EnumCameraMode_INTERNAL extends Enum + Classic: EnumCameraMode + LockFirstPerson: EnumCameraMode +end +declare class EnumCameraPanMode extends EnumItem end +declare class EnumCameraPanMode_INTERNAL extends Enum + Classic: EnumCameraPanMode + EdgeBump: EnumCameraPanMode +end +declare class EnumCameraType extends EnumItem end +declare class EnumCameraType_INTERNAL extends Enum + Fixed: EnumCameraType + Watch: EnumCameraType + Attach: EnumCameraType + Track: EnumCameraType + Follow: EnumCameraType + Custom: EnumCameraType + Scriptable: EnumCameraType + Orbital: EnumCameraType +end +declare class EnumCatalogCategoryFilter extends EnumItem end +declare class EnumCatalogCategoryFilter_INTERNAL extends Enum + None: EnumCatalogCategoryFilter + Featured: EnumCatalogCategoryFilter + Collectibles: EnumCatalogCategoryFilter + CommunityCreations: EnumCatalogCategoryFilter + Premium: EnumCatalogCategoryFilter + Recommended: EnumCatalogCategoryFilter +end +declare class EnumCatalogSortAggregation extends EnumItem end +declare class EnumCatalogSortAggregation_INTERNAL extends Enum + Past12Hours: EnumCatalogSortAggregation + PastDay: EnumCatalogSortAggregation + Past3Days: EnumCatalogSortAggregation + PastWeek: EnumCatalogSortAggregation + PastMonth: EnumCatalogSortAggregation + AllTime: EnumCatalogSortAggregation +end +declare class EnumCatalogSortType extends EnumItem end +declare class EnumCatalogSortType_INTERNAL extends Enum + Relevance: EnumCatalogSortType + PriceHighToLow: EnumCatalogSortType + PriceLowToHigh: EnumCatalogSortType + MostFavorited: EnumCatalogSortType + RecentlyCreated: EnumCatalogSortType + Bestselling: EnumCatalogSortType +end +declare class EnumCellBlock extends EnumItem end +declare class EnumCellBlock_INTERNAL extends Enum + Solid: EnumCellBlock + VerticalWedge: EnumCellBlock + CornerWedge: EnumCellBlock + InverseCornerWedge: EnumCellBlock + HorizontalWedge: EnumCellBlock +end +declare class EnumCellMaterial extends EnumItem end +declare class EnumCellMaterial_INTERNAL extends Enum + Empty: EnumCellMaterial + Grass: EnumCellMaterial + Sand: EnumCellMaterial + Brick: EnumCellMaterial + Granite: EnumCellMaterial + Asphalt: EnumCellMaterial + Iron: EnumCellMaterial + Aluminum: EnumCellMaterial + Gold: EnumCellMaterial + WoodPlank: EnumCellMaterial + WoodLog: EnumCellMaterial + Gravel: EnumCellMaterial + CinderBlock: EnumCellMaterial + MossyStone: EnumCellMaterial + Cement: EnumCellMaterial + RedPlastic: EnumCellMaterial + BluePlastic: EnumCellMaterial + Water: EnumCellMaterial +end +declare class EnumCellOrientation extends EnumItem end +declare class EnumCellOrientation_INTERNAL extends Enum + NegZ: EnumCellOrientation + X: EnumCellOrientation + Z: EnumCellOrientation + NegX: EnumCellOrientation +end +declare class EnumCenterDialogType extends EnumItem end +declare class EnumCenterDialogType_INTERNAL extends Enum + UnsolicitedDialog: EnumCenterDialogType + PlayerInitiatedDialog: EnumCenterDialogType + ModalDialog: EnumCenterDialogType + QuitDialog: EnumCenterDialogType +end +declare class EnumChatCallbackType extends EnumItem end +declare class EnumChatCallbackType_INTERNAL extends Enum + OnCreatingChatWindow: EnumChatCallbackType + OnClientSendingMessage: EnumChatCallbackType + OnClientFormattingMessage: EnumChatCallbackType + OnServerReceivingMessage: EnumChatCallbackType +end +declare class EnumChatColor extends EnumItem end +declare class EnumChatColor_INTERNAL extends Enum + Blue: EnumChatColor + Green: EnumChatColor + Red: EnumChatColor + White: EnumChatColor +end +declare class EnumChatMode extends EnumItem end +declare class EnumChatMode_INTERNAL extends Enum + Menu: EnumChatMode + TextAndMenu: EnumChatMode +end +declare class EnumChatPrivacyMode extends EnumItem end +declare class EnumChatPrivacyMode_INTERNAL extends Enum + AllUsers: EnumChatPrivacyMode + NoOne: EnumChatPrivacyMode + Friends: EnumChatPrivacyMode +end +declare class EnumChatStyle extends EnumItem end +declare class EnumChatStyle_INTERNAL extends Enum + Classic: EnumChatStyle + Bubble: EnumChatStyle + ClassicAndBubble: EnumChatStyle +end +declare class EnumChatVersion extends EnumItem end +declare class EnumChatVersion_INTERNAL extends Enum + LegacyChatService: EnumChatVersion + TextChatService: EnumChatVersion +end +declare class EnumClientAnimatorThrottlingMode extends EnumItem end +declare class EnumClientAnimatorThrottlingMode_INTERNAL extends Enum + Default: EnumClientAnimatorThrottlingMode + Disabled: EnumClientAnimatorThrottlingMode + Enabled: EnumClientAnimatorThrottlingMode +end +declare class EnumCollisionFidelity extends EnumItem end +declare class EnumCollisionFidelity_INTERNAL extends Enum + Default: EnumCollisionFidelity + Hull: EnumCollisionFidelity + Box: EnumCollisionFidelity + PreciseConvexDecomposition: EnumCollisionFidelity + DynamicPreciseConvexDecomposition: EnumCollisionFidelity +end +declare class EnumCommandPermission extends EnumItem end +declare class EnumCommandPermission_INTERNAL extends Enum + Plugin: EnumCommandPermission + LocalUser: EnumCommandPermission +end +declare class EnumCompileTarget extends EnumItem end +declare class EnumCompileTarget_INTERNAL extends Enum + Client: EnumCompileTarget + CoreScript: EnumCompileTarget + Studio: EnumCompileTarget + CoreScriptRaw: EnumCompileTarget +end +declare class EnumCompletionItemKind extends EnumItem end +declare class EnumCompletionItemKind_INTERNAL extends Enum + Text: EnumCompletionItemKind + Method: EnumCompletionItemKind + Function: EnumCompletionItemKind + Constructor: EnumCompletionItemKind + Field: EnumCompletionItemKind + Variable: EnumCompletionItemKind + Class: EnumCompletionItemKind + Interface: EnumCompletionItemKind + Module: EnumCompletionItemKind + Property: EnumCompletionItemKind + Unit: EnumCompletionItemKind + Value: EnumCompletionItemKind + Enum: EnumCompletionItemKind + Keyword: EnumCompletionItemKind + Snippet: EnumCompletionItemKind + Color: EnumCompletionItemKind + File: EnumCompletionItemKind + Reference: EnumCompletionItemKind + Folder: EnumCompletionItemKind + EnumMember: EnumCompletionItemKind + Constant: EnumCompletionItemKind + Struct: EnumCompletionItemKind + Event: EnumCompletionItemKind + Operator: EnumCompletionItemKind + TypeParameter: EnumCompletionItemKind +end +declare class EnumCompletionItemTag extends EnumItem end +declare class EnumCompletionItemTag_INTERNAL extends Enum + Deprecated: EnumCompletionItemTag + IncorrectIndexType: EnumCompletionItemTag + PluginPermissions: EnumCompletionItemTag + CommandLinePermissions: EnumCompletionItemTag + RobloxPermissions: EnumCompletionItemTag + AddParens: EnumCompletionItemTag + PutCursorInParens: EnumCompletionItemTag + TypeCorrect: EnumCompletionItemTag + ClientServerBoundaryViolation: EnumCompletionItemTag + Invalidated: EnumCompletionItemTag + PutCursorBeforeEnd: EnumCompletionItemTag +end +declare class EnumCompletionTriggerKind extends EnumItem end +declare class EnumCompletionTriggerKind_INTERNAL extends Enum + Invoked: EnumCompletionTriggerKind + TriggerCharacter: EnumCompletionTriggerKind + TriggerForIncompleteCompletions: EnumCompletionTriggerKind +end +declare class EnumComputerCameraMovementMode extends EnumItem end +declare class EnumComputerCameraMovementMode_INTERNAL extends Enum + Default: EnumComputerCameraMovementMode + Follow: EnumComputerCameraMovementMode + Classic: EnumComputerCameraMovementMode + Orbital: EnumComputerCameraMovementMode + CameraToggle: EnumComputerCameraMovementMode +end +declare class EnumComputerMovementMode extends EnumItem end +declare class EnumComputerMovementMode_INTERNAL extends Enum + Default: EnumComputerMovementMode + KeyboardMouse: EnumComputerMovementMode + ClickToMove: EnumComputerMovementMode +end +declare class EnumConnectionError extends EnumItem end +declare class EnumConnectionError_INTERNAL extends Enum + OK: EnumConnectionError + Unknown: EnumConnectionError + DisconnectErrors: EnumConnectionError + DisconnectBadhash: EnumConnectionError + DisconnectSecurityKeyMismatch: EnumConnectionError + DisconnectNewSecurityKeyMismatch: EnumConnectionError + DisconnectProtocolMismatch: EnumConnectionError + DisconnectReceivePacketError: EnumConnectionError + DisconnectReceivePacketStreamError: EnumConnectionError + DisconnectSendPacketError: EnumConnectionError + DisconnectIllegalTeleport: EnumConnectionError + DisconnectDuplicatePlayer: EnumConnectionError + DisconnectDuplicateTicket: EnumConnectionError + DisconnectTimeout: EnumConnectionError + DisconnectLuaKick: EnumConnectionError + DisconnectOnRemoteSysStats: EnumConnectionError + DisconnectHashTimeout: EnumConnectionError + DisconnectCloudEditKick: EnumConnectionError + DisconnectPlayerless: EnumConnectionError + DisconnectEvicted: EnumConnectionError + DisconnectDevMaintenance: EnumConnectionError + DisconnectRobloxMaintenance: EnumConnectionError + DisconnectRejoin: EnumConnectionError + DisconnectConnectionLost: EnumConnectionError + DisconnectIdle: EnumConnectionError + DisconnectRaknetErrors: EnumConnectionError + DisconnectWrongVersion: EnumConnectionError + DisconnectBySecurityPolicy: EnumConnectionError + DisconnectBlockedIP: EnumConnectionError + DisconnectClientFailure: EnumConnectionError + DisconnectClientRequest: EnumConnectionError + DisconnectPrivateServerKickout: EnumConnectionError + DisconnectModeratedGame: EnumConnectionError + DisconnectRomarkEndOfTest: EnumConnectionError + ReplicatorTimeout: EnumConnectionError + PlayerRemoved: EnumConnectionError + DisconnectOutOfMemoryKeepPlayingLeave: EnumConnectionError + DisconnectCollaboratorPermissionRevoked: EnumConnectionError + DisconnectCollaboratorUnderage: EnumConnectionError + PlacelaunchErrors: EnumConnectionError + PlacelaunchDisabled: EnumConnectionError + PlacelaunchError: EnumConnectionError + PlacelaunchGameEnded: EnumConnectionError + PlacelaunchGameFull: EnumConnectionError + PlacelaunchUserLeft: EnumConnectionError + PlacelaunchRestricted: EnumConnectionError + PlacelaunchUnauthorized: EnumConnectionError + PlacelaunchFlooded: EnumConnectionError + PlacelaunchHashExpired: EnumConnectionError + PlacelaunchHashException: EnumConnectionError + PlacelaunchPartyCannotFit: EnumConnectionError + PlacelaunchHttpError: EnumConnectionError + PlacelaunchUserPrivacyUnauthorized: EnumConnectionError + PlacelaunchCustomMessage: EnumConnectionError + PlacelaunchOtherError: EnumConnectionError + TeleportErrors: EnumConnectionError + TeleportFailure: EnumConnectionError + TeleportGameNotFound: EnumConnectionError + TeleportGameEnded: EnumConnectionError + TeleportGameFull: EnumConnectionError + TeleportUnauthorized: EnumConnectionError + TeleportFlooded: EnumConnectionError + TeleportIsTeleporting: EnumConnectionError +end +declare class EnumConnectionState extends EnumItem end +declare class EnumConnectionState_INTERNAL extends Enum + Connected: EnumConnectionState + Disconnected: EnumConnectionState +end +declare class EnumContextActionPriority extends EnumItem end +declare class EnumContextActionPriority_INTERNAL extends Enum + Low: EnumContextActionPriority + Medium: EnumContextActionPriority + High: EnumContextActionPriority +end +declare class EnumContextActionResult extends EnumItem end +declare class EnumContextActionResult_INTERNAL extends Enum + Pass: EnumContextActionResult + Sink: EnumContextActionResult +end +declare class EnumControlMode extends EnumItem end +declare class EnumControlMode_INTERNAL extends Enum + MouseLockSwitch: EnumControlMode + ["Mouse Lock Switch"]: EnumControlMode + Classic: EnumControlMode +end +declare class EnumCoreGuiType extends EnumItem end +declare class EnumCoreGuiType_INTERNAL extends Enum + PlayerList: EnumCoreGuiType + Health: EnumCoreGuiType + Backpack: EnumCoreGuiType + Chat: EnumCoreGuiType + All: EnumCoreGuiType + EmotesMenu: EnumCoreGuiType + SelfView: EnumCoreGuiType +end +declare class EnumCreateOutfitFailure extends EnumItem end +declare class EnumCreateOutfitFailure_INTERNAL extends Enum + InvalidName: EnumCreateOutfitFailure + OutfitLimitReached: EnumCreateOutfitFailure + Other: EnumCreateOutfitFailure +end +declare class EnumCreatorType extends EnumItem end +declare class EnumCreatorType_INTERNAL extends Enum + User: EnumCreatorType + Group: EnumCreatorType +end +declare class EnumCreatorTypeFilter extends EnumItem end +declare class EnumCreatorTypeFilter_INTERNAL extends Enum + User: EnumCreatorTypeFilter + Group: EnumCreatorTypeFilter + All: EnumCreatorTypeFilter +end +declare class EnumCurrencyType extends EnumItem end +declare class EnumCurrencyType_INTERNAL extends Enum + Default: EnumCurrencyType + Robux: EnumCurrencyType + Tix: EnumCurrencyType +end +declare class EnumCustomCameraMode extends EnumItem end +declare class EnumCustomCameraMode_INTERNAL extends Enum + Default: EnumCustomCameraMode + Follow: EnumCustomCameraMode + Classic: EnumCustomCameraMode +end +declare class EnumDataStoreRequestType extends EnumItem end +declare class EnumDataStoreRequestType_INTERNAL extends Enum + GetAsync: EnumDataStoreRequestType + SetIncrementAsync: EnumDataStoreRequestType + UpdateAsync: EnumDataStoreRequestType + GetSortedAsync: EnumDataStoreRequestType + SetIncrementSortedAsync: EnumDataStoreRequestType + OnUpdate: EnumDataStoreRequestType +end +declare class EnumDeathStyle extends EnumItem end +declare class EnumDeathStyle_INTERNAL extends Enum + Default: EnumDeathStyle + ClassicBreakApart: EnumDeathStyle + NonGraphic: EnumDeathStyle + Scriptable: EnumDeathStyle +end +declare class EnumDebuggerEndReason extends EnumItem end +declare class EnumDebuggerEndReason_INTERNAL extends Enum + ClientRequest: EnumDebuggerEndReason + Timeout: EnumDebuggerEndReason + InvalidHost: EnumDebuggerEndReason + Disconnected: EnumDebuggerEndReason + ServerShutdown: EnumDebuggerEndReason + ServerProtocolMismatch: EnumDebuggerEndReason + ConfigurationFailed: EnumDebuggerEndReason + RpcError: EnumDebuggerEndReason +end +declare class EnumDebuggerExceptionBreakMode extends EnumItem end +declare class EnumDebuggerExceptionBreakMode_INTERNAL extends Enum + Never: EnumDebuggerExceptionBreakMode + Unhandled: EnumDebuggerExceptionBreakMode + Always: EnumDebuggerExceptionBreakMode +end +declare class EnumDebuggerFrameType extends EnumItem end +declare class EnumDebuggerFrameType_INTERNAL extends Enum + C: EnumDebuggerFrameType + Lua: EnumDebuggerFrameType +end +declare class EnumDebuggerPauseReason extends EnumItem end +declare class EnumDebuggerPauseReason_INTERNAL extends Enum + Unknown: EnumDebuggerPauseReason + Requested: EnumDebuggerPauseReason + Breakpoint: EnumDebuggerPauseReason + Exception: EnumDebuggerPauseReason + SingleStep: EnumDebuggerPauseReason + Entrypoint: EnumDebuggerPauseReason +end +declare class EnumDebuggerStatus extends EnumItem end +declare class EnumDebuggerStatus_INTERNAL extends Enum + Success: EnumDebuggerStatus + Timeout: EnumDebuggerStatus + ConnectionLost: EnumDebuggerStatus + InvalidResponse: EnumDebuggerStatus + InternalError: EnumDebuggerStatus + InvalidState: EnumDebuggerStatus + RpcError: EnumDebuggerStatus + InvalidArgument: EnumDebuggerStatus + ConnectionClosed: EnumDebuggerStatus +end +declare class EnumDevCameraOcclusionMode extends EnumItem end +declare class EnumDevCameraOcclusionMode_INTERNAL extends Enum + Zoom: EnumDevCameraOcclusionMode + Invisicam: EnumDevCameraOcclusionMode +end +declare class EnumDevComputerCameraMovementMode extends EnumItem end +declare class EnumDevComputerCameraMovementMode_INTERNAL extends Enum + UserChoice: EnumDevComputerCameraMovementMode + Classic: EnumDevComputerCameraMovementMode + Follow: EnumDevComputerCameraMovementMode + Orbital: EnumDevComputerCameraMovementMode + CameraToggle: EnumDevComputerCameraMovementMode +end +declare class EnumDevComputerMovementMode extends EnumItem end +declare class EnumDevComputerMovementMode_INTERNAL extends Enum + UserChoice: EnumDevComputerMovementMode + KeyboardMouse: EnumDevComputerMovementMode + ClickToMove: EnumDevComputerMovementMode + Scriptable: EnumDevComputerMovementMode +end +declare class EnumDevTouchCameraMovementMode extends EnumItem end +declare class EnumDevTouchCameraMovementMode_INTERNAL extends Enum + UserChoice: EnumDevTouchCameraMovementMode + Classic: EnumDevTouchCameraMovementMode + Follow: EnumDevTouchCameraMovementMode + Orbital: EnumDevTouchCameraMovementMode +end +declare class EnumDevTouchMovementMode extends EnumItem end +declare class EnumDevTouchMovementMode_INTERNAL extends Enum + UserChoice: EnumDevTouchMovementMode + Thumbstick: EnumDevTouchMovementMode + DPad: EnumDevTouchMovementMode + Thumbpad: EnumDevTouchMovementMode + ClickToMove: EnumDevTouchMovementMode + Scriptable: EnumDevTouchMovementMode + DynamicThumbstick: EnumDevTouchMovementMode +end +declare class EnumDeveloperMemoryTag extends EnumItem end +declare class EnumDeveloperMemoryTag_INTERNAL extends Enum + Internal: EnumDeveloperMemoryTag + HttpCache: EnumDeveloperMemoryTag + Instances: EnumDeveloperMemoryTag + Signals: EnumDeveloperMemoryTag + LuaHeap: EnumDeveloperMemoryTag + Script: EnumDeveloperMemoryTag + PhysicsCollision: EnumDeveloperMemoryTag + PhysicsParts: EnumDeveloperMemoryTag + GraphicsSolidModels: EnumDeveloperMemoryTag + GraphicsMeshParts: EnumDeveloperMemoryTag + GraphicsParticles: EnumDeveloperMemoryTag + GraphicsParts: EnumDeveloperMemoryTag + GraphicsSpatialHash: EnumDeveloperMemoryTag + GraphicsTerrain: EnumDeveloperMemoryTag + GraphicsTexture: EnumDeveloperMemoryTag + GraphicsTextureCharacter: EnumDeveloperMemoryTag + Sounds: EnumDeveloperMemoryTag + StreamingSounds: EnumDeveloperMemoryTag + TerrainVoxels: EnumDeveloperMemoryTag + Gui: EnumDeveloperMemoryTag + Animation: EnumDeveloperMemoryTag + Navigation: EnumDeveloperMemoryTag + GeometryCSG: EnumDeveloperMemoryTag +end +declare class EnumDeviceType extends EnumItem end +declare class EnumDeviceType_INTERNAL extends Enum + Unknown: EnumDeviceType + Desktop: EnumDeviceType + Tablet: EnumDeviceType + Phone: EnumDeviceType +end +declare class EnumDialogBehaviorType extends EnumItem end +declare class EnumDialogBehaviorType_INTERNAL extends Enum + SinglePlayer: EnumDialogBehaviorType + MultiplePlayers: EnumDialogBehaviorType +end +declare class EnumDialogPurpose extends EnumItem end +declare class EnumDialogPurpose_INTERNAL extends Enum + Quest: EnumDialogPurpose + Help: EnumDialogPurpose + Shop: EnumDialogPurpose +end +declare class EnumDialogTone extends EnumItem end +declare class EnumDialogTone_INTERNAL extends Enum + Neutral: EnumDialogTone + Friendly: EnumDialogTone + Enemy: EnumDialogTone +end +declare class EnumDominantAxis extends EnumItem end +declare class EnumDominantAxis_INTERNAL extends Enum + Width: EnumDominantAxis + Height: EnumDominantAxis +end +declare class EnumDraftStatusCode extends EnumItem end +declare class EnumDraftStatusCode_INTERNAL extends Enum + OK: EnumDraftStatusCode + DraftOutdated: EnumDraftStatusCode + ScriptRemoved: EnumDraftStatusCode + DraftCommitted: EnumDraftStatusCode +end +declare class EnumDragDetectorDragStyle extends EnumItem end +declare class EnumDragDetectorDragStyle_INTERNAL extends Enum + TranslateLine: EnumDragDetectorDragStyle + TranslatePlane: EnumDragDetectorDragStyle + TranslatePlaneOrLine: EnumDragDetectorDragStyle + TranslateLineOrPlane: EnumDragDetectorDragStyle + TranslateViewPlane: EnumDragDetectorDragStyle + RotateAxis: EnumDragDetectorDragStyle + RotateTrackball: EnumDragDetectorDragStyle + Scriptable: EnumDragDetectorDragStyle + BestForDevice: EnumDragDetectorDragStyle +end +declare class EnumDragDetectorResponseStyle extends EnumItem end +declare class EnumDragDetectorResponseStyle_INTERNAL extends Enum + Geometric: EnumDragDetectorResponseStyle + Physical: EnumDragDetectorResponseStyle + Custom: EnumDragDetectorResponseStyle +end +declare class EnumDraggerCoordinateSpace extends EnumItem end +declare class EnumDraggerCoordinateSpace_INTERNAL extends Enum + Object: EnumDraggerCoordinateSpace + World: EnumDraggerCoordinateSpace +end +declare class EnumDraggerMovementMode extends EnumItem end +declare class EnumDraggerMovementMode_INTERNAL extends Enum + Geometric: EnumDraggerMovementMode + Physical: EnumDraggerMovementMode +end +declare class EnumEasingDirection extends EnumItem end +declare class EnumEasingDirection_INTERNAL extends Enum + In: EnumEasingDirection + Out: EnumEasingDirection + InOut: EnumEasingDirection +end +declare class EnumEasingStyle extends EnumItem end +declare class EnumEasingStyle_INTERNAL extends Enum + Linear: EnumEasingStyle + Sine: EnumEasingStyle + Back: EnumEasingStyle + Quad: EnumEasingStyle + Quart: EnumEasingStyle + Quint: EnumEasingStyle + Bounce: EnumEasingStyle + Elastic: EnumEasingStyle + Exponential: EnumEasingStyle + Circular: EnumEasingStyle + Cubic: EnumEasingStyle +end +declare class EnumElasticBehavior extends EnumItem end +declare class EnumElasticBehavior_INTERNAL extends Enum + WhenScrollable: EnumElasticBehavior + Always: EnumElasticBehavior + Never: EnumElasticBehavior +end +declare class EnumEnviromentalPhysicsThrottle extends EnumItem end +declare class EnumEnviromentalPhysicsThrottle_INTERNAL extends Enum + DefaultAuto: EnumEnviromentalPhysicsThrottle + Disabled: EnumEnviromentalPhysicsThrottle + Always: EnumEnviromentalPhysicsThrottle + Skip2: EnumEnviromentalPhysicsThrottle + Skip4: EnumEnviromentalPhysicsThrottle + Skip8: EnumEnviromentalPhysicsThrottle + Skip16: EnumEnviromentalPhysicsThrottle +end +declare class EnumExperienceAuthScope extends EnumItem end +declare class EnumExperienceAuthScope_INTERNAL extends Enum + DefaultScope: EnumExperienceAuthScope + CreatorAssetsCreate: EnumExperienceAuthScope +end +declare class EnumExplosionType extends EnumItem end +declare class EnumExplosionType_INTERNAL extends Enum + NoCraters: EnumExplosionType + Craters: EnumExplosionType +end +declare class EnumFacialAnimationStreamingState extends EnumItem end +declare class EnumFacialAnimationStreamingState_INTERNAL extends Enum + None: EnumFacialAnimationStreamingState + Audio: EnumFacialAnimationStreamingState + Video: EnumFacialAnimationStreamingState + Place: EnumFacialAnimationStreamingState + Server: EnumFacialAnimationStreamingState +end +declare class EnumFieldOfViewMode extends EnumItem end +declare class EnumFieldOfViewMode_INTERNAL extends Enum + Vertical: EnumFieldOfViewMode + Diagonal: EnumFieldOfViewMode + MaxAxis: EnumFieldOfViewMode +end +declare class EnumFillDirection extends EnumItem end +declare class EnumFillDirection_INTERNAL extends Enum + Horizontal: EnumFillDirection + Vertical: EnumFillDirection +end +declare class EnumFilterResult extends EnumItem end +declare class EnumFilterResult_INTERNAL extends Enum + Rejected: EnumFilterResult + Accepted: EnumFilterResult +end +declare class EnumFinishRecordingOperation extends EnumItem end +declare class EnumFinishRecordingOperation_INTERNAL extends Enum + Cancel: EnumFinishRecordingOperation + Commit: EnumFinishRecordingOperation + Append: EnumFinishRecordingOperation +end +declare class EnumFluidForces extends EnumItem end +declare class EnumFluidForces_INTERNAL extends Enum + Default: EnumFluidForces + Experimental: EnumFluidForces +end +declare class EnumFont extends EnumItem end +declare class EnumFont_INTERNAL extends Enum + Legacy: EnumFont + Arial: EnumFont + ArialBold: EnumFont + SourceSans: EnumFont + SourceSansBold: EnumFont + SourceSansSemibold: EnumFont + SourceSansLight: EnumFont + SourceSansItalic: EnumFont + Bodoni: EnumFont + Garamond: EnumFont + Cartoon: EnumFont + Code: EnumFont + Highway: EnumFont + SciFi: EnumFont + Arcade: EnumFont + Fantasy: EnumFont + Antique: EnumFont + Gotham: EnumFont + GothamMedium: EnumFont + GothamBold: EnumFont + GothamBlack: EnumFont + AmaticSC: EnumFont + Bangers: EnumFont + Creepster: EnumFont + DenkOne: EnumFont + Fondamento: EnumFont + FredokaOne: EnumFont + GrenzeGotisch: EnumFont + IndieFlower: EnumFont + JosefinSans: EnumFont + Jura: EnumFont + Kalam: EnumFont + LuckiestGuy: EnumFont + Merriweather: EnumFont + Michroma: EnumFont + Nunito: EnumFont + Oswald: EnumFont + PatrickHand: EnumFont + PermanentMarker: EnumFont + Roboto: EnumFont + RobotoCondensed: EnumFont + RobotoMono: EnumFont + Sarpanch: EnumFont + SpecialElite: EnumFont + TitilliumWeb: EnumFont + Ubuntu: EnumFont + Unknown: EnumFont +end +declare class EnumFontSize extends EnumItem end +declare class EnumFontSize_INTERNAL extends Enum + Size8: EnumFontSize + Size9: EnumFontSize + Size10: EnumFontSize + Size11: EnumFontSize + Size12: EnumFontSize + Size14: EnumFontSize + Size18: EnumFontSize + Size24: EnumFontSize + Size36: EnumFontSize + Size48: EnumFontSize + Size28: EnumFontSize + Size32: EnumFontSize + Size42: EnumFontSize + Size60: EnumFontSize + Size96: EnumFontSize +end +declare class EnumFontStyle extends EnumItem end +declare class EnumFontStyle_INTERNAL extends Enum + Normal: EnumFontStyle + Italic: EnumFontStyle +end +declare class EnumFontWeight extends EnumItem end +declare class EnumFontWeight_INTERNAL extends Enum + Thin: EnumFontWeight + ExtraLight: EnumFontWeight + Light: EnumFontWeight + Regular: EnumFontWeight + Medium: EnumFontWeight + SemiBold: EnumFontWeight + Bold: EnumFontWeight + ExtraBold: EnumFontWeight + Heavy: EnumFontWeight +end +declare class EnumForceLimitMode extends EnumItem end +declare class EnumForceLimitMode_INTERNAL extends Enum + Magnitude: EnumForceLimitMode + PerAxis: EnumForceLimitMode +end +declare class EnumFormFactor extends EnumItem end +declare class EnumFormFactor_INTERNAL extends Enum + Symmetric: EnumFormFactor + Brick: EnumFormFactor + Plate: EnumFormFactor + Custom: EnumFormFactor +end +declare class EnumFrameStyle extends EnumItem end +declare class EnumFrameStyle_INTERNAL extends Enum + Custom: EnumFrameStyle + ChatBlue: EnumFrameStyle + RobloxSquare: EnumFrameStyle + RobloxRound: EnumFrameStyle + ChatGreen: EnumFrameStyle + ChatRed: EnumFrameStyle + DropShadow: EnumFrameStyle +end +declare class EnumFramerateManagerMode extends EnumItem end +declare class EnumFramerateManagerMode_INTERNAL extends Enum + Automatic: EnumFramerateManagerMode + On: EnumFramerateManagerMode + Off: EnumFramerateManagerMode +end +declare class EnumFriendRequestEvent extends EnumItem end +declare class EnumFriendRequestEvent_INTERNAL extends Enum + Issue: EnumFriendRequestEvent + Revoke: EnumFriendRequestEvent + Accept: EnumFriendRequestEvent + Deny: EnumFriendRequestEvent +end +declare class EnumFriendStatus extends EnumItem end +declare class EnumFriendStatus_INTERNAL extends Enum + Unknown: EnumFriendStatus + NotFriend: EnumFriendStatus + Friend: EnumFriendStatus + FriendRequestSent: EnumFriendStatus + FriendRequestReceived: EnumFriendStatus +end +declare class EnumFunctionalTestResult extends EnumItem end +declare class EnumFunctionalTestResult_INTERNAL extends Enum + Passed: EnumFunctionalTestResult + Warning: EnumFunctionalTestResult + Error: EnumFunctionalTestResult +end +declare class EnumGameAvatarType extends EnumItem end +declare class EnumGameAvatarType_INTERNAL extends Enum + R6: EnumGameAvatarType + R15: EnumGameAvatarType + PlayerChoice: EnumGameAvatarType +end +declare class EnumGearGenreSetting extends EnumItem end +declare class EnumGearGenreSetting_INTERNAL extends Enum + AllGenres: EnumGearGenreSetting + MatchingGenreOnly: EnumGearGenreSetting +end +declare class EnumGearType extends EnumItem end +declare class EnumGearType_INTERNAL extends Enum + MeleeWeapons: EnumGearType + RangedWeapons: EnumGearType + Explosives: EnumGearType + PowerUps: EnumGearType + NavigationEnhancers: EnumGearType + MusicalInstruments: EnumGearType + SocialItems: EnumGearType + BuildingTools: EnumGearType + Transport: EnumGearType +end +declare class EnumGenre extends EnumItem end +declare class EnumGenre_INTERNAL extends Enum + All: EnumGenre + TownAndCity: EnumGenre + Fantasy: EnumGenre + SciFi: EnumGenre + Ninja: EnumGenre + Scary: EnumGenre + Pirate: EnumGenre + Adventure: EnumGenre + Sports: EnumGenre + Funny: EnumGenre + WildWest: EnumGenre + War: EnumGenre + SkatePark: EnumGenre + Tutorial: EnumGenre +end +declare class EnumGraphicsMode extends EnumItem end +declare class EnumGraphicsMode_INTERNAL extends Enum + Automatic: EnumGraphicsMode + Direct3D11: EnumGraphicsMode + OpenGL: EnumGraphicsMode + Metal: EnumGraphicsMode + Vulkan: EnumGraphicsMode + NoGraphics: EnumGraphicsMode +end +declare class EnumGuiState extends EnumItem end +declare class EnumGuiState_INTERNAL extends Enum + Idle: EnumGuiState + Hover: EnumGuiState + Press: EnumGuiState + NonInteractable: EnumGuiState +end +declare class EnumGuiType extends EnumItem end +declare class EnumGuiType_INTERNAL extends Enum + Core: EnumGuiType + Custom: EnumGuiType + CustomBillboards: EnumGuiType + PlayerNameplates: EnumGuiType +end +declare class EnumHandlesStyle extends EnumItem end +declare class EnumHandlesStyle_INTERNAL extends Enum + Resize: EnumHandlesStyle + Movement: EnumHandlesStyle +end +declare class EnumHighlightDepthMode extends EnumItem end +declare class EnumHighlightDepthMode_INTERNAL extends Enum + AlwaysOnTop: EnumHighlightDepthMode + Occluded: EnumHighlightDepthMode +end +declare class EnumHorizontalAlignment extends EnumItem end +declare class EnumHorizontalAlignment_INTERNAL extends Enum + Center: EnumHorizontalAlignment + Left: EnumHorizontalAlignment + Right: EnumHorizontalAlignment +end +declare class EnumHoverAnimateSpeed extends EnumItem end +declare class EnumHoverAnimateSpeed_INTERNAL extends Enum + VerySlow: EnumHoverAnimateSpeed + Slow: EnumHoverAnimateSpeed + Medium: EnumHoverAnimateSpeed + Fast: EnumHoverAnimateSpeed + VeryFast: EnumHoverAnimateSpeed +end +declare class EnumHttpCachePolicy extends EnumItem end +declare class EnumHttpCachePolicy_INTERNAL extends Enum + None: EnumHttpCachePolicy + Full: EnumHttpCachePolicy + DataOnly: EnumHttpCachePolicy + Default: EnumHttpCachePolicy + InternalRedirectRefresh: EnumHttpCachePolicy +end +declare class EnumHttpContentType extends EnumItem end +declare class EnumHttpContentType_INTERNAL extends Enum + ApplicationJson: EnumHttpContentType + ApplicationXml: EnumHttpContentType + ApplicationUrlEncoded: EnumHttpContentType + TextPlain: EnumHttpContentType + TextXml: EnumHttpContentType +end +declare class EnumHttpError extends EnumItem end +declare class EnumHttpError_INTERNAL extends Enum + OK: EnumHttpError + InvalidUrl: EnumHttpError + DnsResolve: EnumHttpError + ConnectFail: EnumHttpError + OutOfMemory: EnumHttpError + TimedOut: EnumHttpError + TooManyRedirects: EnumHttpError + InvalidRedirect: EnumHttpError + NetFail: EnumHttpError + Aborted: EnumHttpError + SslConnectFail: EnumHttpError + SslVerificationFail: EnumHttpError + Unknown: EnumHttpError +end +declare class EnumHttpRequestType extends EnumItem end +declare class EnumHttpRequestType_INTERNAL extends Enum + Default: EnumHttpRequestType + MarketplaceService: EnumHttpRequestType + Players: EnumHttpRequestType + Chat: EnumHttpRequestType + Avatar: EnumHttpRequestType + Analytics: EnumHttpRequestType + Localization: EnumHttpRequestType +end +declare class EnumHumanoidCollisionType extends EnumItem end +declare class EnumHumanoidCollisionType_INTERNAL extends Enum + OuterBox: EnumHumanoidCollisionType + InnerBox: EnumHumanoidCollisionType +end +declare class EnumHumanoidDisplayDistanceType extends EnumItem end +declare class EnumHumanoidDisplayDistanceType_INTERNAL extends Enum + Viewer: EnumHumanoidDisplayDistanceType + Subject: EnumHumanoidDisplayDistanceType + None: EnumHumanoidDisplayDistanceType +end +declare class EnumHumanoidHealthDisplayType extends EnumItem end +declare class EnumHumanoidHealthDisplayType_INTERNAL extends Enum + DisplayWhenDamaged: EnumHumanoidHealthDisplayType + AlwaysOn: EnumHumanoidHealthDisplayType + AlwaysOff: EnumHumanoidHealthDisplayType +end +declare class EnumHumanoidOnlySetCollisionsOnStateChange extends EnumItem end +declare class EnumHumanoidOnlySetCollisionsOnStateChange_INTERNAL extends Enum + Default: EnumHumanoidOnlySetCollisionsOnStateChange + Disabled: EnumHumanoidOnlySetCollisionsOnStateChange + Enabled: EnumHumanoidOnlySetCollisionsOnStateChange +end +declare class EnumHumanoidRigType extends EnumItem end +declare class EnumHumanoidRigType_INTERNAL extends Enum + R6: EnumHumanoidRigType + R15: EnumHumanoidRigType +end +declare class EnumHumanoidStateMachineMode extends EnumItem end +declare class EnumHumanoidStateMachineMode_INTERNAL extends Enum + Default: EnumHumanoidStateMachineMode + Legacy: EnumHumanoidStateMachineMode + NoStateMachine: EnumHumanoidStateMachineMode + LuaStateMachine: EnumHumanoidStateMachineMode +end +declare class EnumHumanoidStateType extends EnumItem end +declare class EnumHumanoidStateType_INTERNAL extends Enum + FallingDown: EnumHumanoidStateType + Running: EnumHumanoidStateType + RunningNoPhysics: EnumHumanoidStateType + Climbing: EnumHumanoidStateType + StrafingNoPhysics: EnumHumanoidStateType + Ragdoll: EnumHumanoidStateType + GettingUp: EnumHumanoidStateType + Jumping: EnumHumanoidStateType + Landed: EnumHumanoidStateType + Flying: EnumHumanoidStateType + Freefall: EnumHumanoidStateType + Seated: EnumHumanoidStateType + PlatformStanding: EnumHumanoidStateType + Dead: EnumHumanoidStateType + Swimming: EnumHumanoidStateType + Physics: EnumHumanoidStateType + None: EnumHumanoidStateType +end +declare class EnumIKCollisionsMode extends EnumItem end +declare class EnumIKCollisionsMode_INTERNAL extends Enum + NoCollisions: EnumIKCollisionsMode + OtherMechanismsAnchored: EnumIKCollisionsMode + IncludeContactedMechanisms: EnumIKCollisionsMode +end +declare class EnumIKControlConstraintSupport extends EnumItem end +declare class EnumIKControlConstraintSupport_INTERNAL extends Enum + Default: EnumIKControlConstraintSupport + Disabled: EnumIKControlConstraintSupport + Enabled: EnumIKControlConstraintSupport +end +declare class EnumIKControlType extends EnumItem end +declare class EnumIKControlType_INTERNAL extends Enum + Transform: EnumIKControlType + Position: EnumIKControlType + Rotation: EnumIKControlType + LookAt: EnumIKControlType +end +declare class EnumIXPLoadingStatus extends EnumItem end +declare class EnumIXPLoadingStatus_INTERNAL extends Enum + None: EnumIXPLoadingStatus + Pending: EnumIXPLoadingStatus + Initialized: EnumIXPLoadingStatus + ErrorTimedOut: EnumIXPLoadingStatus + ErrorConnection: EnumIXPLoadingStatus + ErrorJsonParse: EnumIXPLoadingStatus + ErrorInvalidUser: EnumIXPLoadingStatus +end +declare class EnumInOut extends EnumItem end +declare class EnumInOut_INTERNAL extends Enum + Edge: EnumInOut + Inset: EnumInOut + Center: EnumInOut +end +declare class EnumInfoType extends EnumItem end +declare class EnumInfoType_INTERNAL extends Enum + Asset: EnumInfoType + Product: EnumInfoType + GamePass: EnumInfoType + Subscription: EnumInfoType + Bundle: EnumInfoType +end +declare class EnumInitialDockState extends EnumItem end +declare class EnumInitialDockState_INTERNAL extends Enum + Top: EnumInitialDockState + Bottom: EnumInitialDockState + Left: EnumInitialDockState + Right: EnumInitialDockState + Float: EnumInitialDockState +end +declare class EnumInputType extends EnumItem end +declare class EnumInputType_INTERNAL extends Enum + NoInput: EnumInputType + Constant: EnumInputType + Sin: EnumInputType +end +declare class EnumInterpolationThrottlingMode extends EnumItem end +declare class EnumInterpolationThrottlingMode_INTERNAL extends Enum + Default: EnumInterpolationThrottlingMode + Disabled: EnumInterpolationThrottlingMode + Enabled: EnumInterpolationThrottlingMode +end +declare class EnumJointCreationMode extends EnumItem end +declare class EnumJointCreationMode_INTERNAL extends Enum + All: EnumJointCreationMode + Surface: EnumJointCreationMode + None: EnumJointCreationMode +end +declare class EnumKeyCode extends EnumItem end +declare class EnumKeyCode_INTERNAL extends Enum + Unknown: EnumKeyCode + Backspace: EnumKeyCode + Tab: EnumKeyCode + Clear: EnumKeyCode + Return: EnumKeyCode + Pause: EnumKeyCode + Escape: EnumKeyCode + Space: EnumKeyCode + QuotedDouble: EnumKeyCode + Hash: EnumKeyCode + Dollar: EnumKeyCode + Percent: EnumKeyCode + Ampersand: EnumKeyCode + Quote: EnumKeyCode + LeftParenthesis: EnumKeyCode + RightParenthesis: EnumKeyCode + Asterisk: EnumKeyCode + Plus: EnumKeyCode + Comma: EnumKeyCode + Minus: EnumKeyCode + Period: EnumKeyCode + Slash: EnumKeyCode + Zero: EnumKeyCode + One: EnumKeyCode + Two: EnumKeyCode + Three: EnumKeyCode + Four: EnumKeyCode + Five: EnumKeyCode + Six: EnumKeyCode + Seven: EnumKeyCode + Eight: EnumKeyCode + Nine: EnumKeyCode + Colon: EnumKeyCode + Semicolon: EnumKeyCode + LessThan: EnumKeyCode + Equals: EnumKeyCode + GreaterThan: EnumKeyCode + Question: EnumKeyCode + At: EnumKeyCode + LeftBracket: EnumKeyCode + BackSlash: EnumKeyCode + RightBracket: EnumKeyCode + Caret: EnumKeyCode + Underscore: EnumKeyCode + Backquote: EnumKeyCode + A: EnumKeyCode + B: EnumKeyCode + C: EnumKeyCode + D: EnumKeyCode + E: EnumKeyCode + F: EnumKeyCode + G: EnumKeyCode + H: EnumKeyCode + I: EnumKeyCode + J: EnumKeyCode + K: EnumKeyCode + L: EnumKeyCode + M: EnumKeyCode + N: EnumKeyCode + O: EnumKeyCode + P: EnumKeyCode + Q: EnumKeyCode + R: EnumKeyCode + S: EnumKeyCode + T: EnumKeyCode + U: EnumKeyCode + V: EnumKeyCode + W: EnumKeyCode + X: EnumKeyCode + Y: EnumKeyCode + Z: EnumKeyCode + LeftCurly: EnumKeyCode + Pipe: EnumKeyCode + RightCurly: EnumKeyCode + Tilde: EnumKeyCode + Delete: EnumKeyCode + KeypadZero: EnumKeyCode + KeypadOne: EnumKeyCode + KeypadTwo: EnumKeyCode + KeypadThree: EnumKeyCode + KeypadFour: EnumKeyCode + KeypadFive: EnumKeyCode + KeypadSix: EnumKeyCode + KeypadSeven: EnumKeyCode + KeypadEight: EnumKeyCode + KeypadNine: EnumKeyCode + KeypadPeriod: EnumKeyCode + KeypadDivide: EnumKeyCode + KeypadMultiply: EnumKeyCode + KeypadMinus: EnumKeyCode + KeypadPlus: EnumKeyCode + KeypadEnter: EnumKeyCode + KeypadEquals: EnumKeyCode + Up: EnumKeyCode + Down: EnumKeyCode + Right: EnumKeyCode + Left: EnumKeyCode + Insert: EnumKeyCode + Home: EnumKeyCode + End: EnumKeyCode + PageUp: EnumKeyCode + PageDown: EnumKeyCode + LeftShift: EnumKeyCode + RightShift: EnumKeyCode + LeftMeta: EnumKeyCode + RightMeta: EnumKeyCode + LeftAlt: EnumKeyCode + RightAlt: EnumKeyCode + LeftControl: EnumKeyCode + RightControl: EnumKeyCode + CapsLock: EnumKeyCode + NumLock: EnumKeyCode + ScrollLock: EnumKeyCode + LeftSuper: EnumKeyCode + RightSuper: EnumKeyCode + Mode: EnumKeyCode + Compose: EnumKeyCode + Help: EnumKeyCode + Print: EnumKeyCode + SysReq: EnumKeyCode + Break: EnumKeyCode + Menu: EnumKeyCode + Power: EnumKeyCode + Euro: EnumKeyCode + Undo: EnumKeyCode + F1: EnumKeyCode + F2: EnumKeyCode + F3: EnumKeyCode + F4: EnumKeyCode + F5: EnumKeyCode + F6: EnumKeyCode + F7: EnumKeyCode + F8: EnumKeyCode + F9: EnumKeyCode + F10: EnumKeyCode + F11: EnumKeyCode + F12: EnumKeyCode + F13: EnumKeyCode + F14: EnumKeyCode + F15: EnumKeyCode + World0: EnumKeyCode + World1: EnumKeyCode + World2: EnumKeyCode + World3: EnumKeyCode + World4: EnumKeyCode + World5: EnumKeyCode + World6: EnumKeyCode + World7: EnumKeyCode + World8: EnumKeyCode + World9: EnumKeyCode + World10: EnumKeyCode + World11: EnumKeyCode + World12: EnumKeyCode + World13: EnumKeyCode + World14: EnumKeyCode + World15: EnumKeyCode + World16: EnumKeyCode + World17: EnumKeyCode + World18: EnumKeyCode + World19: EnumKeyCode + World20: EnumKeyCode + World21: EnumKeyCode + World22: EnumKeyCode + World23: EnumKeyCode + World24: EnumKeyCode + World25: EnumKeyCode + World26: EnumKeyCode + World27: EnumKeyCode + World28: EnumKeyCode + World29: EnumKeyCode + World30: EnumKeyCode + World31: EnumKeyCode + World32: EnumKeyCode + World33: EnumKeyCode + World34: EnumKeyCode + World35: EnumKeyCode + World36: EnumKeyCode + World37: EnumKeyCode + World38: EnumKeyCode + World39: EnumKeyCode + World40: EnumKeyCode + World41: EnumKeyCode + World42: EnumKeyCode + World43: EnumKeyCode + World44: EnumKeyCode + World45: EnumKeyCode + World46: EnumKeyCode + World47: EnumKeyCode + World48: EnumKeyCode + World49: EnumKeyCode + World50: EnumKeyCode + World51: EnumKeyCode + World52: EnumKeyCode + World53: EnumKeyCode + World54: EnumKeyCode + World55: EnumKeyCode + World56: EnumKeyCode + World57: EnumKeyCode + World58: EnumKeyCode + World59: EnumKeyCode + World60: EnumKeyCode + World61: EnumKeyCode + World62: EnumKeyCode + World63: EnumKeyCode + World64: EnumKeyCode + World65: EnumKeyCode + World66: EnumKeyCode + World67: EnumKeyCode + World68: EnumKeyCode + World69: EnumKeyCode + World70: EnumKeyCode + World71: EnumKeyCode + World72: EnumKeyCode + World73: EnumKeyCode + World74: EnumKeyCode + World75: EnumKeyCode + World76: EnumKeyCode + World77: EnumKeyCode + World78: EnumKeyCode + World79: EnumKeyCode + World80: EnumKeyCode + World81: EnumKeyCode + World82: EnumKeyCode + World83: EnumKeyCode + World84: EnumKeyCode + World85: EnumKeyCode + World86: EnumKeyCode + World87: EnumKeyCode + World88: EnumKeyCode + World89: EnumKeyCode + World90: EnumKeyCode + World91: EnumKeyCode + World92: EnumKeyCode + World93: EnumKeyCode + World94: EnumKeyCode + World95: EnumKeyCode + ButtonX: EnumKeyCode + ButtonY: EnumKeyCode + ButtonA: EnumKeyCode + ButtonB: EnumKeyCode + ButtonR1: EnumKeyCode + ButtonL1: EnumKeyCode + ButtonR2: EnumKeyCode + ButtonL2: EnumKeyCode + ButtonR3: EnumKeyCode + ButtonL3: EnumKeyCode + ButtonStart: EnumKeyCode + ButtonSelect: EnumKeyCode + DPadLeft: EnumKeyCode + DPadRight: EnumKeyCode + DPadUp: EnumKeyCode + DPadDown: EnumKeyCode + Thumbstick1: EnumKeyCode + Thumbstick2: EnumKeyCode +end +declare class EnumKeyInterpolationMode extends EnumItem end +declare class EnumKeyInterpolationMode_INTERNAL extends Enum + Constant: EnumKeyInterpolationMode + Linear: EnumKeyInterpolationMode + Cubic: EnumKeyInterpolationMode +end +declare class EnumKeywordFilterType extends EnumItem end +declare class EnumKeywordFilterType_INTERNAL extends Enum + Include: EnumKeywordFilterType + Exclude: EnumKeywordFilterType +end +declare class EnumLanguage extends EnumItem end +declare class EnumLanguage_INTERNAL extends Enum + Default: EnumLanguage +end +declare class EnumLeftRight extends EnumItem end +declare class EnumLeftRight_INTERNAL extends Enum + Left: EnumLeftRight + Center: EnumLeftRight + Right: EnumLeftRight +end +declare class EnumLimb extends EnumItem end +declare class EnumLimb_INTERNAL extends Enum + Head: EnumLimb + Torso: EnumLimb + LeftArm: EnumLimb + RightArm: EnumLimb + LeftLeg: EnumLimb + RightLeg: EnumLimb + Unknown: EnumLimb +end +declare class EnumLineJoinMode extends EnumItem end +declare class EnumLineJoinMode_INTERNAL extends Enum + Round: EnumLineJoinMode + Bevel: EnumLineJoinMode + Miter: EnumLineJoinMode +end +declare class EnumListDisplayMode extends EnumItem end +declare class EnumListDisplayMode_INTERNAL extends Enum + Horizontal: EnumListDisplayMode + Vertical: EnumListDisplayMode +end +declare class EnumListenerType extends EnumItem end +declare class EnumListenerType_INTERNAL extends Enum + Camera: EnumListenerType + CFrame: EnumListenerType + ObjectPosition: EnumListenerType + ObjectCFrame: EnumListenerType +end +declare class EnumLoadCharacterLayeredClothing extends EnumItem end +declare class EnumLoadCharacterLayeredClothing_INTERNAL extends Enum + Default: EnumLoadCharacterLayeredClothing + Disabled: EnumLoadCharacterLayeredClothing + Enabled: EnumLoadCharacterLayeredClothing +end +declare class EnumLoadDynamicHeads extends EnumItem end +declare class EnumLoadDynamicHeads_INTERNAL extends Enum + Default: EnumLoadDynamicHeads + Disabled: EnumLoadDynamicHeads + Enabled: EnumLoadDynamicHeads +end +declare class EnumMarkupKind extends EnumItem end +declare class EnumMarkupKind_INTERNAL extends Enum + PlainText: EnumMarkupKind + Markdown: EnumMarkupKind +end +declare class EnumMaterial extends EnumItem end +declare class EnumMaterial_INTERNAL extends Enum + Plastic: EnumMaterial + Wood: EnumMaterial + Slate: EnumMaterial + Concrete: EnumMaterial + CorrodedMetal: EnumMaterial + DiamondPlate: EnumMaterial + Foil: EnumMaterial + Grass: EnumMaterial + Ice: EnumMaterial + Marble: EnumMaterial + Granite: EnumMaterial + Brick: EnumMaterial + Pebble: EnumMaterial + Sand: EnumMaterial + Fabric: EnumMaterial + SmoothPlastic: EnumMaterial + Metal: EnumMaterial + WoodPlanks: EnumMaterial + Cobblestone: EnumMaterial + Air: EnumMaterial + Water: EnumMaterial + Rock: EnumMaterial + Glacier: EnumMaterial + Snow: EnumMaterial + Sandstone: EnumMaterial + Mud: EnumMaterial + Basalt: EnumMaterial + Ground: EnumMaterial + CrackedLava: EnumMaterial + Neon: EnumMaterial + Glass: EnumMaterial + Asphalt: EnumMaterial + LeafyGrass: EnumMaterial + Salt: EnumMaterial + Limestone: EnumMaterial + Pavement: EnumMaterial + ForceField: EnumMaterial + Cardboard: EnumMaterial + Carpet: EnumMaterial + CeramicTiles: EnumMaterial + ClayRoofTiles: EnumMaterial + RoofShingles: EnumMaterial + Leather: EnumMaterial + Plaster: EnumMaterial + Rubber: EnumMaterial +end +declare class EnumMaterialPattern extends EnumItem end +declare class EnumMaterialPattern_INTERNAL extends Enum + Regular: EnumMaterialPattern + Organic: EnumMaterialPattern +end +declare class EnumMembershipType extends EnumItem end +declare class EnumMembershipType_INTERNAL extends Enum + None: EnumMembershipType + BuildersClub: EnumMembershipType + TurboBuildersClub: EnumMembershipType + OutrageousBuildersClub: EnumMembershipType + _MEMBERSHIP_TYPE: EnumMembershipType +end +declare class EnumMeshPartDetailLevel extends EnumItem end +declare class EnumMeshPartDetailLevel_INTERNAL extends Enum + DistanceBased: EnumMeshPartDetailLevel + Level00: EnumMeshPartDetailLevel + Level01: EnumMeshPartDetailLevel + Level02: EnumMeshPartDetailLevel + Level03: EnumMeshPartDetailLevel + Level04: EnumMeshPartDetailLevel +end +declare class EnumMeshPartHeadsAndAccessories extends EnumItem end +declare class EnumMeshPartHeadsAndAccessories_INTERNAL extends Enum + Default: EnumMeshPartHeadsAndAccessories + Disabled: EnumMeshPartHeadsAndAccessories + Enabled: EnumMeshPartHeadsAndAccessories +end +declare class EnumMeshScaleUnit extends EnumItem end +declare class EnumMeshScaleUnit_INTERNAL extends Enum + Stud: EnumMeshScaleUnit + Meter: EnumMeshScaleUnit + CM: EnumMeshScaleUnit + MM: EnumMeshScaleUnit + Foot: EnumMeshScaleUnit + Inch: EnumMeshScaleUnit +end +declare class EnumMeshType extends EnumItem end +declare class EnumMeshType_INTERNAL extends Enum + Head: EnumMeshType + Torso: EnumMeshType + Wedge: EnumMeshType + Prism: EnumMeshType + Pyramid: EnumMeshType + ParallelRamp: EnumMeshType + RightAngleRamp: EnumMeshType + CornerWedge: EnumMeshType + Brick: EnumMeshType + Sphere: EnumMeshType + Cylinder: EnumMeshType + FileMesh: EnumMeshType +end +declare class EnumMessageType extends EnumItem end +declare class EnumMessageType_INTERNAL extends Enum + MessageOutput: EnumMessageType + MessageInfo: EnumMessageType + MessageWarning: EnumMessageType + MessageError: EnumMessageType +end +declare class EnumModelLevelOfDetail extends EnumItem end +declare class EnumModelLevelOfDetail_INTERNAL extends Enum + Automatic: EnumModelLevelOfDetail + StreamingMesh: EnumModelLevelOfDetail + Disabled: EnumModelLevelOfDetail +end +declare class EnumModelStreamingBehavior extends EnumItem end +declare class EnumModelStreamingBehavior_INTERNAL extends Enum + Default: EnumModelStreamingBehavior + Legacy: EnumModelStreamingBehavior + Improved: EnumModelStreamingBehavior +end +declare class EnumModelStreamingMode extends EnumItem end +declare class EnumModelStreamingMode_INTERNAL extends Enum + Default: EnumModelStreamingMode + Atomic: EnumModelStreamingMode + Persistent: EnumModelStreamingMode + PersistentPerPlayer: EnumModelStreamingMode + Nonatomic: EnumModelStreamingMode +end +declare class EnumModifierKey extends EnumItem end +declare class EnumModifierKey_INTERNAL extends Enum + Alt: EnumModifierKey + Ctrl: EnumModifierKey + Meta: EnumModifierKey + Shift: EnumModifierKey +end +declare class EnumMouseBehavior extends EnumItem end +declare class EnumMouseBehavior_INTERNAL extends Enum + Default: EnumMouseBehavior + LockCenter: EnumMouseBehavior + LockCurrentPosition: EnumMouseBehavior +end +declare class EnumMoveState extends EnumItem end +declare class EnumMoveState_INTERNAL extends Enum + Stopped: EnumMoveState + Coasting: EnumMoveState + Pushing: EnumMoveState + Stopping: EnumMoveState + AirFree: EnumMoveState +end +declare class EnumMuteState extends EnumItem end +declare class EnumMuteState_INTERNAL extends Enum + Unmuted: EnumMuteState + Muted: EnumMuteState +end +declare class EnumNameOcclusion extends EnumItem end +declare class EnumNameOcclusion_INTERNAL extends Enum + OccludeAll: EnumNameOcclusion + EnemyOcclusion: EnumNameOcclusion + NoOcclusion: EnumNameOcclusion +end +declare class EnumNetworkOwnership extends EnumItem end +declare class EnumNetworkOwnership_INTERNAL extends Enum + Automatic: EnumNetworkOwnership + Manual: EnumNetworkOwnership + OnContact: EnumNetworkOwnership +end +declare class EnumNormalId extends EnumItem end +declare class EnumNormalId_INTERNAL extends Enum + Top: EnumNormalId + Bottom: EnumNormalId + Back: EnumNormalId + Front: EnumNormalId + Right: EnumNormalId + Left: EnumNormalId +end +declare class EnumOrientationAlignmentMode extends EnumItem end +declare class EnumOrientationAlignmentMode_INTERNAL extends Enum + OneAttachment: EnumOrientationAlignmentMode + TwoAttachment: EnumOrientationAlignmentMode +end +declare class EnumOutfitSource extends EnumItem end +declare class EnumOutfitSource_INTERNAL extends Enum + All: EnumOutfitSource + Created: EnumOutfitSource + Purchased: EnumOutfitSource +end +declare class EnumOutfitType extends EnumItem end +declare class EnumOutfitType_INTERNAL extends Enum + All: EnumOutfitType + Avatar: EnumOutfitType + DynamicHead: EnumOutfitType +end +declare class EnumOutputLayoutMode extends EnumItem end +declare class EnumOutputLayoutMode_INTERNAL extends Enum + Horizontal: EnumOutputLayoutMode + Vertical: EnumOutputLayoutMode +end +declare class EnumOverrideMouseIconBehavior extends EnumItem end +declare class EnumOverrideMouseIconBehavior_INTERNAL extends Enum + None: EnumOverrideMouseIconBehavior + ForceShow: EnumOverrideMouseIconBehavior + ForceHide: EnumOverrideMouseIconBehavior +end +declare class EnumPackagePermission extends EnumItem end +declare class EnumPackagePermission_INTERNAL extends Enum + None: EnumPackagePermission + NoAccess: EnumPackagePermission + Revoked: EnumPackagePermission + UseView: EnumPackagePermission + Edit: EnumPackagePermission + Own: EnumPackagePermission +end +declare class EnumPartType extends EnumItem end +declare class EnumPartType_INTERNAL extends Enum + Ball: EnumPartType + Block: EnumPartType + Cylinder: EnumPartType + Wedge: EnumPartType + CornerWedge: EnumPartType +end +declare class EnumParticleEmitterShape extends EnumItem end +declare class EnumParticleEmitterShape_INTERNAL extends Enum + Box: EnumParticleEmitterShape + Sphere: EnumParticleEmitterShape + Cylinder: EnumParticleEmitterShape + Disc: EnumParticleEmitterShape +end +declare class EnumParticleEmitterShapeInOut extends EnumItem end +declare class EnumParticleEmitterShapeInOut_INTERNAL extends Enum + Outward: EnumParticleEmitterShapeInOut + Inward: EnumParticleEmitterShapeInOut + InAndOut: EnumParticleEmitterShapeInOut +end +declare class EnumParticleEmitterShapeStyle extends EnumItem end +declare class EnumParticleEmitterShapeStyle_INTERNAL extends Enum + Volume: EnumParticleEmitterShapeStyle + Surface: EnumParticleEmitterShapeStyle +end +declare class EnumParticleFlipbookLayout extends EnumItem end +declare class EnumParticleFlipbookLayout_INTERNAL extends Enum + None: EnumParticleFlipbookLayout + Grid2x2: EnumParticleFlipbookLayout + Grid4x4: EnumParticleFlipbookLayout + Grid8x8: EnumParticleFlipbookLayout +end +declare class EnumParticleFlipbookMode extends EnumItem end +declare class EnumParticleFlipbookMode_INTERNAL extends Enum + Loop: EnumParticleFlipbookMode + OneShot: EnumParticleFlipbookMode + PingPong: EnumParticleFlipbookMode + Random: EnumParticleFlipbookMode +end +declare class EnumParticleFlipbookTextureCompatible extends EnumItem end +declare class EnumParticleFlipbookTextureCompatible_INTERNAL extends Enum + NotCompatible: EnumParticleFlipbookTextureCompatible + Compatible: EnumParticleFlipbookTextureCompatible + Unknown: EnumParticleFlipbookTextureCompatible +end +declare class EnumParticleOrientation extends EnumItem end +declare class EnumParticleOrientation_INTERNAL extends Enum + FacingCamera: EnumParticleOrientation + FacingCameraWorldUp: EnumParticleOrientation + VelocityParallel: EnumParticleOrientation + VelocityPerpendicular: EnumParticleOrientation +end +declare class EnumPathStatus extends EnumItem end +declare class EnumPathStatus_INTERNAL extends Enum + Success: EnumPathStatus + ClosestNoPath: EnumPathStatus + ClosestOutOfRange: EnumPathStatus + FailStartNotEmpty: EnumPathStatus + FailFinishNotEmpty: EnumPathStatus + NoPath: EnumPathStatus +end +declare class EnumPathWaypointAction extends EnumItem end +declare class EnumPathWaypointAction_INTERNAL extends Enum + Walk: EnumPathWaypointAction + Jump: EnumPathWaypointAction + Custom: EnumPathWaypointAction +end +declare class EnumPermissionLevelShown extends EnumItem end +declare class EnumPermissionLevelShown_INTERNAL extends Enum + Game: EnumPermissionLevelShown + RobloxGame: EnumPermissionLevelShown + RobloxScript: EnumPermissionLevelShown + Studio: EnumPermissionLevelShown + Roblox: EnumPermissionLevelShown +end +declare class EnumPhysicsSimulationRate extends EnumItem end +declare class EnumPhysicsSimulationRate_INTERNAL extends Enum + Fixed240Hz: EnumPhysicsSimulationRate + Fixed120Hz: EnumPhysicsSimulationRate + Fixed60Hz: EnumPhysicsSimulationRate +end +declare class EnumPhysicsSteppingMethod extends EnumItem end +declare class EnumPhysicsSteppingMethod_INTERNAL extends Enum + Default: EnumPhysicsSteppingMethod + Fixed: EnumPhysicsSteppingMethod + Adaptive: EnumPhysicsSteppingMethod +end +declare class EnumPlatform extends EnumItem end +declare class EnumPlatform_INTERNAL extends Enum + Windows: EnumPlatform + OSX: EnumPlatform + IOS: EnumPlatform + Android: EnumPlatform + XBoxOne: EnumPlatform + PS4: EnumPlatform + PS3: EnumPlatform + XBox360: EnumPlatform + WiiU: EnumPlatform + NX: EnumPlatform + Ouya: EnumPlatform + AndroidTV: EnumPlatform + Chromecast: EnumPlatform + Linux: EnumPlatform + SteamOS: EnumPlatform + WebOS: EnumPlatform + DOS: EnumPlatform + BeOS: EnumPlatform + UWP: EnumPlatform + None: EnumPlatform +end +declare class EnumPlaybackState extends EnumItem end +declare class EnumPlaybackState_INTERNAL extends Enum + Begin: EnumPlaybackState + Delayed: EnumPlaybackState + Playing: EnumPlaybackState + Paused: EnumPlaybackState + Completed: EnumPlaybackState + Cancelled: EnumPlaybackState +end +declare class EnumPlayerActions extends EnumItem end +declare class EnumPlayerActions_INTERNAL extends Enum + CharacterForward: EnumPlayerActions + CharacterBackward: EnumPlayerActions + CharacterLeft: EnumPlayerActions + CharacterRight: EnumPlayerActions + CharacterJump: EnumPlayerActions +end +declare class EnumPlayerChatType extends EnumItem end +declare class EnumPlayerChatType_INTERNAL extends Enum + All: EnumPlayerChatType + Team: EnumPlayerChatType + Whisper: EnumPlayerChatType +end +declare class EnumPoseEasingDirection extends EnumItem end +declare class EnumPoseEasingDirection_INTERNAL extends Enum + Out: EnumPoseEasingDirection + InOut: EnumPoseEasingDirection + In: EnumPoseEasingDirection +end +declare class EnumPoseEasingStyle extends EnumItem end +declare class EnumPoseEasingStyle_INTERNAL extends Enum + Linear: EnumPoseEasingStyle + Constant: EnumPoseEasingStyle + Elastic: EnumPoseEasingStyle + Cubic: EnumPoseEasingStyle + Bounce: EnumPoseEasingStyle +end +declare class EnumPositionAlignmentMode extends EnumItem end +declare class EnumPositionAlignmentMode_INTERNAL extends Enum + OneAttachment: EnumPositionAlignmentMode + TwoAttachment: EnumPositionAlignmentMode +end +declare class EnumPrivilegeType extends EnumItem end +declare class EnumPrivilegeType_INTERNAL extends Enum + Owner: EnumPrivilegeType + Admin: EnumPrivilegeType + Member: EnumPrivilegeType + Visitor: EnumPrivilegeType + Banned: EnumPrivilegeType +end +declare class EnumProductLocationRestriction extends EnumItem end +declare class EnumProductLocationRestriction_INTERNAL extends Enum + AvatarShop: EnumProductLocationRestriction + AllowedGames: EnumProductLocationRestriction + AllGames: EnumProductLocationRestriction +end +declare class EnumProductPurchaseDecision extends EnumItem end +declare class EnumProductPurchaseDecision_INTERNAL extends Enum + NotProcessedYet: EnumProductPurchaseDecision + PurchaseGranted: EnumProductPurchaseDecision +end +declare class EnumPromptCreateAssetResult extends EnumItem end +declare class EnumPromptCreateAssetResult_INTERNAL extends Enum + Success: EnumPromptCreateAssetResult + PermissionDenied: EnumPromptCreateAssetResult + Timeout: EnumPromptCreateAssetResult + UploadFailed: EnumPromptCreateAssetResult + NoUserInput: EnumPromptCreateAssetResult + UnknownFailure: EnumPromptCreateAssetResult +end +declare class EnumPromptPublishAssetResult extends EnumItem end +declare class EnumPromptPublishAssetResult_INTERNAL extends Enum + Success: EnumPromptPublishAssetResult + PermissionDenied: EnumPromptPublishAssetResult + Timeout: EnumPromptPublishAssetResult + UploadFailed: EnumPromptPublishAssetResult + NoUserInput: EnumPromptPublishAssetResult + UnknownFailure: EnumPromptPublishAssetResult +end +declare class EnumPropertyStatus extends EnumItem end +declare class EnumPropertyStatus_INTERNAL extends Enum + Ok: EnumPropertyStatus + Warning: EnumPropertyStatus + Error: EnumPropertyStatus +end +declare class EnumProximityPromptExclusivity extends EnumItem end +declare class EnumProximityPromptExclusivity_INTERNAL extends Enum + OnePerButton: EnumProximityPromptExclusivity + OneGlobally: EnumProximityPromptExclusivity + AlwaysShow: EnumProximityPromptExclusivity +end +declare class EnumProximityPromptInputType extends EnumItem end +declare class EnumProximityPromptInputType_INTERNAL extends Enum + Keyboard: EnumProximityPromptInputType + Gamepad: EnumProximityPromptInputType + Touch: EnumProximityPromptInputType +end +declare class EnumProximityPromptStyle extends EnumItem end +declare class EnumProximityPromptStyle_INTERNAL extends Enum + Default: EnumProximityPromptStyle + Custom: EnumProximityPromptStyle +end +declare class EnumQualityLevel extends EnumItem end +declare class EnumQualityLevel_INTERNAL extends Enum + Automatic: EnumQualityLevel + Level01: EnumQualityLevel + Level02: EnumQualityLevel + Level03: EnumQualityLevel + Level04: EnumQualityLevel + Level05: EnumQualityLevel + Level06: EnumQualityLevel + Level07: EnumQualityLevel + Level08: EnumQualityLevel + Level09: EnumQualityLevel + Level10: EnumQualityLevel + Level11: EnumQualityLevel + Level12: EnumQualityLevel + Level13: EnumQualityLevel + Level14: EnumQualityLevel + Level15: EnumQualityLevel + Level16: EnumQualityLevel + Level17: EnumQualityLevel + Level18: EnumQualityLevel + Level19: EnumQualityLevel + Level20: EnumQualityLevel + Level21: EnumQualityLevel +end +declare class EnumR15CollisionType extends EnumItem end +declare class EnumR15CollisionType_INTERNAL extends Enum + OuterBox: EnumR15CollisionType + InnerBox: EnumR15CollisionType +end +declare class EnumRaycastFilterType extends EnumItem end +declare class EnumRaycastFilterType_INTERNAL extends Enum + Exclude: EnumRaycastFilterType + Include: EnumRaycastFilterType +end +declare class EnumRejectCharacterDeletions extends EnumItem end +declare class EnumRejectCharacterDeletions_INTERNAL extends Enum + Default: EnumRejectCharacterDeletions + Disabled: EnumRejectCharacterDeletions + Enabled: EnumRejectCharacterDeletions +end +declare class EnumRenderFidelity extends EnumItem end +declare class EnumRenderFidelity_INTERNAL extends Enum + Automatic: EnumRenderFidelity + Precise: EnumRenderFidelity + Performance: EnumRenderFidelity +end +declare class EnumRenderPriority extends EnumItem end +declare class EnumRenderPriority_INTERNAL extends Enum + First: EnumRenderPriority + Input: EnumRenderPriority + Camera: EnumRenderPriority + Character: EnumRenderPriority + Last: EnumRenderPriority +end +declare class EnumRenderingTestComparisonMethod extends EnumItem end +declare class EnumRenderingTestComparisonMethod_INTERNAL extends Enum + psnr: EnumRenderingTestComparisonMethod + diff: EnumRenderingTestComparisonMethod +end +declare class EnumReplicateInstanceDestroySetting extends EnumItem end +declare class EnumReplicateInstanceDestroySetting_INTERNAL extends Enum + Default: EnumReplicateInstanceDestroySetting + Disabled: EnumReplicateInstanceDestroySetting + Enabled: EnumReplicateInstanceDestroySetting +end +declare class EnumResamplerMode extends EnumItem end +declare class EnumResamplerMode_INTERNAL extends Enum + Default: EnumResamplerMode + Pixelated: EnumResamplerMode +end +declare class EnumReservedHighlightId extends EnumItem end +declare class EnumReservedHighlightId_INTERNAL extends Enum + Standard: EnumReservedHighlightId + Selection: EnumReservedHighlightId + Hover: EnumReservedHighlightId + Active: EnumReservedHighlightId +end +declare class EnumRestPose extends EnumItem end +declare class EnumRestPose_INTERNAL extends Enum + Default: EnumRestPose + RotationsReset: EnumRestPose + Custom: EnumRestPose +end +declare class EnumReturnKeyType extends EnumItem end +declare class EnumReturnKeyType_INTERNAL extends Enum + Default: EnumReturnKeyType + Done: EnumReturnKeyType + Go: EnumReturnKeyType + Next: EnumReturnKeyType + Search: EnumReturnKeyType + Send: EnumReturnKeyType +end +declare class EnumReverbType extends EnumItem end +declare class EnumReverbType_INTERNAL extends Enum + NoReverb: EnumReverbType + GenericReverb: EnumReverbType + PaddedCell: EnumReverbType + Room: EnumReverbType + Bathroom: EnumReverbType + LivingRoom: EnumReverbType + StoneRoom: EnumReverbType + Auditorium: EnumReverbType + ConcertHall: EnumReverbType + Cave: EnumReverbType + Arena: EnumReverbType + Hangar: EnumReverbType + CarpettedHallway: EnumReverbType + Hallway: EnumReverbType + StoneCorridor: EnumReverbType + Alley: EnumReverbType + Forest: EnumReverbType + City: EnumReverbType + Mountains: EnumReverbType + Quarry: EnumReverbType + Plain: EnumReverbType + ParkingLot: EnumReverbType + SewerPipe: EnumReverbType + UnderWater: EnumReverbType +end +declare class EnumRibbonTool extends EnumItem end +declare class EnumRibbonTool_INTERNAL extends Enum + Select: EnumRibbonTool + Scale: EnumRibbonTool + Rotate: EnumRibbonTool + Move: EnumRibbonTool + Transform: EnumRibbonTool + ColorPicker: EnumRibbonTool + MaterialPicker: EnumRibbonTool + Group: EnumRibbonTool + Ungroup: EnumRibbonTool + None: EnumRibbonTool +end +declare class EnumRigScale extends EnumItem end +declare class EnumRigScale_INTERNAL extends Enum + Default: EnumRigScale + Rthro: EnumRigScale + RthroNarrow: EnumRigScale +end +declare class EnumRigType extends EnumItem end +declare class EnumRigType_INTERNAL extends Enum + R15: EnumRigType + Custom: EnumRigType + None: EnumRigType +end +declare class EnumRollOffMode extends EnumItem end +declare class EnumRollOffMode_INTERNAL extends Enum + Inverse: EnumRollOffMode + Linear: EnumRollOffMode + InverseTapered: EnumRollOffMode + LinearSquare: EnumRollOffMode +end +declare class EnumRotationOrder extends EnumItem end +declare class EnumRotationOrder_INTERNAL extends Enum + XYZ: EnumRotationOrder + XZY: EnumRotationOrder + YZX: EnumRotationOrder + YXZ: EnumRotationOrder + ZXY: EnumRotationOrder + ZYX: EnumRotationOrder +end +declare class EnumRotationType extends EnumItem end +declare class EnumRotationType_INTERNAL extends Enum + MovementRelative: EnumRotationType + CameraRelative: EnumRotationType +end +declare class EnumRtlTextSupport extends EnumItem end +declare class EnumRtlTextSupport_INTERNAL extends Enum + Default: EnumRtlTextSupport + Disabled: EnumRtlTextSupport + Enabled: EnumRtlTextSupport +end +declare class EnumRunContext extends EnumItem end +declare class EnumRunContext_INTERNAL extends Enum + Legacy: EnumRunContext + Server: EnumRunContext + Client: EnumRunContext + Plugin: EnumRunContext +end +declare class EnumRuntimeUndoBehavior extends EnumItem end +declare class EnumRuntimeUndoBehavior_INTERNAL extends Enum + Aggregate: EnumRuntimeUndoBehavior + Snapshot: EnumRuntimeUndoBehavior + Hybrid: EnumRuntimeUndoBehavior +end +declare class EnumSafeAreaCompatibility extends EnumItem end +declare class EnumSafeAreaCompatibility_INTERNAL extends Enum + None: EnumSafeAreaCompatibility + FullscreenExtension: EnumSafeAreaCompatibility +end +declare class EnumSalesTypeFilter extends EnumItem end +declare class EnumSalesTypeFilter_INTERNAL extends Enum + All: EnumSalesTypeFilter + Collectibles: EnumSalesTypeFilter + Premium: EnumSalesTypeFilter +end +declare class EnumSaveAvatarThumbnailCustomizationFailure extends EnumItem end +declare class EnumSaveAvatarThumbnailCustomizationFailure_INTERNAL extends Enum + BadThumbnailType: EnumSaveAvatarThumbnailCustomizationFailure + BadYRotDeg: EnumSaveAvatarThumbnailCustomizationFailure + BadFieldOfViewDeg: EnumSaveAvatarThumbnailCustomizationFailure + BadDistanceScale: EnumSaveAvatarThumbnailCustomizationFailure + Other: EnumSaveAvatarThumbnailCustomizationFailure +end +declare class EnumSaveFilter extends EnumItem end +declare class EnumSaveFilter_INTERNAL extends Enum + SaveAll: EnumSaveFilter + SaveWorld: EnumSaveFilter + SaveGame: EnumSaveFilter +end +declare class EnumSavedQualitySetting extends EnumItem end +declare class EnumSavedQualitySetting_INTERNAL extends Enum + Automatic: EnumSavedQualitySetting + QualityLevel1: EnumSavedQualitySetting + QualityLevel2: EnumSavedQualitySetting + QualityLevel3: EnumSavedQualitySetting + QualityLevel4: EnumSavedQualitySetting + QualityLevel5: EnumSavedQualitySetting + QualityLevel6: EnumSavedQualitySetting + QualityLevel7: EnumSavedQualitySetting + QualityLevel8: EnumSavedQualitySetting + QualityLevel9: EnumSavedQualitySetting + QualityLevel10: EnumSavedQualitySetting +end +declare class EnumScaleType extends EnumItem end +declare class EnumScaleType_INTERNAL extends Enum + Stretch: EnumScaleType + Slice: EnumScaleType + Tile: EnumScaleType + Fit: EnumScaleType + Crop: EnumScaleType +end +declare class EnumScopeCheckResult extends EnumItem end +declare class EnumScopeCheckResult_INTERNAL extends Enum + ConsentAccepted: EnumScopeCheckResult + InvalidScopes: EnumScopeCheckResult + Timeout: EnumScopeCheckResult + NoUserInput: EnumScopeCheckResult + BackendError: EnumScopeCheckResult + UnexpectedError: EnumScopeCheckResult + InvalidArgument: EnumScopeCheckResult + ConsentDenied: EnumScopeCheckResult +end +declare class EnumScreenInsets extends EnumItem end +declare class EnumScreenInsets_INTERNAL extends Enum + None: EnumScreenInsets + DeviceSafeInsets: EnumScreenInsets + CoreUISafeInsets: EnumScreenInsets +end +declare class EnumScreenOrientation extends EnumItem end +declare class EnumScreenOrientation_INTERNAL extends Enum + LandscapeLeft: EnumScreenOrientation + LandscapeRight: EnumScreenOrientation + LandscapeSensor: EnumScreenOrientation + Portrait: EnumScreenOrientation + Sensor: EnumScreenOrientation +end +declare class EnumScrollBarInset extends EnumItem end +declare class EnumScrollBarInset_INTERNAL extends Enum + None: EnumScrollBarInset + ScrollBar: EnumScrollBarInset + Always: EnumScrollBarInset +end +declare class EnumScrollingDirection extends EnumItem end +declare class EnumScrollingDirection_INTERNAL extends Enum + X: EnumScrollingDirection + Y: EnumScrollingDirection + XY: EnumScrollingDirection +end +declare class EnumSelectionBehavior extends EnumItem end +declare class EnumSelectionBehavior_INTERNAL extends Enum + Escape: EnumSelectionBehavior + Stop: EnumSelectionBehavior +end +declare class EnumSelectionRenderMode extends EnumItem end +declare class EnumSelectionRenderMode_INTERNAL extends Enum + Outlines: EnumSelectionRenderMode + BoundingBoxes: EnumSelectionRenderMode + Both: EnumSelectionRenderMode +end +declare class EnumSelfViewPosition extends EnumItem end +declare class EnumSelfViewPosition_INTERNAL extends Enum + LastPosition: EnumSelfViewPosition + TopLeft: EnumSelfViewPosition + TopRight: EnumSelfViewPosition + BottomLeft: EnumSelfViewPosition + BottomRight: EnumSelfViewPosition +end +declare class EnumSensorMode extends EnumItem end +declare class EnumSensorMode_INTERNAL extends Enum + Floor: EnumSensorMode + Ladder: EnumSensorMode +end +declare class EnumSensorUpdateType extends EnumItem end +declare class EnumSensorUpdateType_INTERNAL extends Enum + OnRead: EnumSensorUpdateType + Manual: EnumSensorUpdateType +end +declare class EnumServerAudioBehavior extends EnumItem end +declare class EnumServerAudioBehavior_INTERNAL extends Enum + Enabled: EnumServerAudioBehavior + Muted: EnumServerAudioBehavior + OnlineGame: EnumServerAudioBehavior +end +declare class EnumServiceVisibility extends EnumItem end +declare class EnumServiceVisibility_INTERNAL extends Enum + Always: EnumServiceVisibility + Off: EnumServiceVisibility + WithChildren: EnumServiceVisibility +end +declare class EnumSeverity extends EnumItem end +declare class EnumSeverity_INTERNAL extends Enum + Error: EnumSeverity + Warning: EnumSeverity + Information: EnumSeverity + Hint: EnumSeverity +end +declare class EnumSignalBehavior extends EnumItem end +declare class EnumSignalBehavior_INTERNAL extends Enum + Default: EnumSignalBehavior + Immediate: EnumSignalBehavior + Deferred: EnumSignalBehavior + AncestryDeferred: EnumSignalBehavior +end +declare class EnumSizeConstraint extends EnumItem end +declare class EnumSizeConstraint_INTERNAL extends Enum + RelativeXY: EnumSizeConstraint + RelativeXX: EnumSizeConstraint + RelativeYY: EnumSizeConstraint +end +declare class EnumSolverConvergenceVisualizationMode extends EnumItem end +declare class EnumSolverConvergenceVisualizationMode_INTERNAL extends Enum + Disabled: EnumSolverConvergenceVisualizationMode + PerIsland: EnumSolverConvergenceVisualizationMode + PerEdge: EnumSolverConvergenceVisualizationMode +end +declare class EnumSortDirection extends EnumItem end +declare class EnumSortDirection_INTERNAL extends Enum + Ascending: EnumSortDirection + Descending: EnumSortDirection +end +declare class EnumSortOrder extends EnumItem end +declare class EnumSortOrder_INTERNAL extends Enum + LayoutOrder: EnumSortOrder + Name: EnumSortOrder + Custom: EnumSortOrder +end +declare class EnumSpecialKey extends EnumItem end +declare class EnumSpecialKey_INTERNAL extends Enum + Insert: EnumSpecialKey + Home: EnumSpecialKey + End: EnumSpecialKey + PageUp: EnumSpecialKey + PageDown: EnumSpecialKey + ChatHotkey: EnumSpecialKey +end +declare class EnumStartCorner extends EnumItem end +declare class EnumStartCorner_INTERNAL extends Enum + TopLeft: EnumStartCorner + TopRight: EnumStartCorner + BottomLeft: EnumStartCorner + BottomRight: EnumStartCorner +end +declare class EnumStatus extends EnumItem end +declare class EnumStatus_INTERNAL extends Enum + Poison: EnumStatus + Confusion: EnumStatus +end +declare class EnumStreamOutBehavior extends EnumItem end +declare class EnumStreamOutBehavior_INTERNAL extends Enum + Default: EnumStreamOutBehavior + LowMemory: EnumStreamOutBehavior + Opportunistic: EnumStreamOutBehavior +end +declare class EnumStreamingIntegrityMode extends EnumItem end +declare class EnumStreamingIntegrityMode_INTERNAL extends Enum + Default: EnumStreamingIntegrityMode + Disabled: EnumStreamingIntegrityMode + MinimumRadiusPause: EnumStreamingIntegrityMode + PauseOutsideLoadedArea: EnumStreamingIntegrityMode +end +declare class EnumStreamingPauseMode extends EnumItem end +declare class EnumStreamingPauseMode_INTERNAL extends Enum + Default: EnumStreamingPauseMode + Disabled: EnumStreamingPauseMode + ClientPhysicsPause: EnumStreamingPauseMode +end +declare class EnumStudioCloseMode extends EnumItem end +declare class EnumStudioCloseMode_INTERNAL extends Enum + None: EnumStudioCloseMode + CloseStudio: EnumStudioCloseMode + CloseDoc: EnumStudioCloseMode +end +declare class EnumStudioDataModelType extends EnumItem end +declare class EnumStudioDataModelType_INTERNAL extends Enum + Edit: EnumStudioDataModelType + PlayClient: EnumStudioDataModelType + PlayServer: EnumStudioDataModelType + Standalone: EnumStudioDataModelType + None: EnumStudioDataModelType +end +declare class EnumStudioScriptEditorColorCategories extends EnumItem end +declare class EnumStudioScriptEditorColorCategories_INTERNAL extends Enum + Default: EnumStudioScriptEditorColorCategories + Operator: EnumStudioScriptEditorColorCategories + Number: EnumStudioScriptEditorColorCategories + String: EnumStudioScriptEditorColorCategories + Comment: EnumStudioScriptEditorColorCategories + Keyword: EnumStudioScriptEditorColorCategories + Builtin: EnumStudioScriptEditorColorCategories + Method: EnumStudioScriptEditorColorCategories + Property: EnumStudioScriptEditorColorCategories + Nil: EnumStudioScriptEditorColorCategories + Bool: EnumStudioScriptEditorColorCategories + Function: EnumStudioScriptEditorColorCategories + Local: EnumStudioScriptEditorColorCategories + Self: EnumStudioScriptEditorColorCategories + LuauKeyword: EnumStudioScriptEditorColorCategories + FunctionName: EnumStudioScriptEditorColorCategories + TODO: EnumStudioScriptEditorColorCategories + Background: EnumStudioScriptEditorColorCategories + SelectionText: EnumStudioScriptEditorColorCategories + SelectionBackground: EnumStudioScriptEditorColorCategories + FindSelectionBackground: EnumStudioScriptEditorColorCategories + MatchingWordBackground: EnumStudioScriptEditorColorCategories + Warning: EnumStudioScriptEditorColorCategories + Error: EnumStudioScriptEditorColorCategories + Info: EnumStudioScriptEditorColorCategories + Hint: EnumStudioScriptEditorColorCategories + Whitespace: EnumStudioScriptEditorColorCategories + ActiveLine: EnumStudioScriptEditorColorCategories + DebuggerCurrentLine: EnumStudioScriptEditorColorCategories + DebuggerErrorLine: EnumStudioScriptEditorColorCategories + Ruler: EnumStudioScriptEditorColorCategories + Bracket: EnumStudioScriptEditorColorCategories + MenuPrimaryText: EnumStudioScriptEditorColorCategories + MenuSecondaryText: EnumStudioScriptEditorColorCategories + MenuSelectedText: EnumStudioScriptEditorColorCategories + MenuBackground: EnumStudioScriptEditorColorCategories + MenuSelectedBackground: EnumStudioScriptEditorColorCategories + MenuScrollbarBackground: EnumStudioScriptEditorColorCategories + MenuScrollbarHandle: EnumStudioScriptEditorColorCategories + MenuBorder: EnumStudioScriptEditorColorCategories + DocViewCodeBackground: EnumStudioScriptEditorColorCategories + AICOOverlayText: EnumStudioScriptEditorColorCategories + AICOOverlayButtonBackground: EnumStudioScriptEditorColorCategories + AICOOverlayButtonBackgroundHover: EnumStudioScriptEditorColorCategories + AICOOverlayButtonBackgroundPressed: EnumStudioScriptEditorColorCategories + IndentationRuler: EnumStudioScriptEditorColorCategories +end +declare class EnumStudioScriptEditorColorPresets extends EnumItem end +declare class EnumStudioScriptEditorColorPresets_INTERNAL extends Enum + RobloxDefault: EnumStudioScriptEditorColorPresets + Extra1: EnumStudioScriptEditorColorPresets + Extra2: EnumStudioScriptEditorColorPresets + Custom: EnumStudioScriptEditorColorPresets +end +declare class EnumStudioStyleGuideColor extends EnumItem end +declare class EnumStudioStyleGuideColor_INTERNAL extends Enum + MainBackground: EnumStudioStyleGuideColor + Titlebar: EnumStudioStyleGuideColor + Dropdown: EnumStudioStyleGuideColor + Tooltip: EnumStudioStyleGuideColor + Notification: EnumStudioStyleGuideColor + ScrollBar: EnumStudioStyleGuideColor + ScrollBarBackground: EnumStudioStyleGuideColor + TabBar: EnumStudioStyleGuideColor + Tab: EnumStudioStyleGuideColor + FilterButtonDefault: EnumStudioStyleGuideColor + FilterButtonHover: EnumStudioStyleGuideColor + FilterButtonChecked: EnumStudioStyleGuideColor + FilterButtonAccent: EnumStudioStyleGuideColor + FilterButtonBorder: EnumStudioStyleGuideColor + FilterButtonBorderAlt: EnumStudioStyleGuideColor + RibbonTab: EnumStudioStyleGuideColor + RibbonTabTopBar: EnumStudioStyleGuideColor + Button: EnumStudioStyleGuideColor + MainButton: EnumStudioStyleGuideColor + RibbonButton: EnumStudioStyleGuideColor + ViewPortBackground: EnumStudioStyleGuideColor + InputFieldBackground: EnumStudioStyleGuideColor + Item: EnumStudioStyleGuideColor + TableItem: EnumStudioStyleGuideColor + CategoryItem: EnumStudioStyleGuideColor + GameSettingsTableItem: EnumStudioStyleGuideColor + GameSettingsTooltip: EnumStudioStyleGuideColor + EmulatorBar: EnumStudioStyleGuideColor + EmulatorDropDown: EnumStudioStyleGuideColor + ColorPickerFrame: EnumStudioStyleGuideColor + CurrentMarker: EnumStudioStyleGuideColor + Border: EnumStudioStyleGuideColor + DropShadow: EnumStudioStyleGuideColor + Shadow: EnumStudioStyleGuideColor + Light: EnumStudioStyleGuideColor + Dark: EnumStudioStyleGuideColor + Mid: EnumStudioStyleGuideColor + MainText: EnumStudioStyleGuideColor + SubText: EnumStudioStyleGuideColor + TitlebarText: EnumStudioStyleGuideColor + BrightText: EnumStudioStyleGuideColor + DimmedText: EnumStudioStyleGuideColor + LinkText: EnumStudioStyleGuideColor + WarningText: EnumStudioStyleGuideColor + ErrorText: EnumStudioStyleGuideColor + InfoText: EnumStudioStyleGuideColor + SensitiveText: EnumStudioStyleGuideColor + ScriptSideWidget: EnumStudioStyleGuideColor + ScriptBackground: EnumStudioStyleGuideColor + ScriptText: EnumStudioStyleGuideColor + ScriptSelectionText: EnumStudioStyleGuideColor + ScriptSelectionBackground: EnumStudioStyleGuideColor + ScriptFindSelectionBackground: EnumStudioStyleGuideColor + ScriptMatchingWordSelectionBackground: EnumStudioStyleGuideColor + ScriptOperator: EnumStudioStyleGuideColor + ScriptNumber: EnumStudioStyleGuideColor + ScriptString: EnumStudioStyleGuideColor + ScriptComment: EnumStudioStyleGuideColor + ScriptKeyword: EnumStudioStyleGuideColor + ScriptBuiltInFunction: EnumStudioStyleGuideColor + ScriptWarning: EnumStudioStyleGuideColor + ScriptError: EnumStudioStyleGuideColor + ScriptInformation: EnumStudioStyleGuideColor + ScriptHint: EnumStudioStyleGuideColor + ScriptWhitespace: EnumStudioStyleGuideColor + ScriptRuler: EnumStudioStyleGuideColor + DocViewCodeBackground: EnumStudioStyleGuideColor + DebuggerCurrentLine: EnumStudioStyleGuideColor + DebuggerErrorLine: EnumStudioStyleGuideColor + ScriptEditorCurrentLine: EnumStudioStyleGuideColor + DiffFilePathText: EnumStudioStyleGuideColor + DiffTextHunkInfo: EnumStudioStyleGuideColor + DiffTextNoChange: EnumStudioStyleGuideColor + DiffTextAddition: EnumStudioStyleGuideColor + DiffTextDeletion: EnumStudioStyleGuideColor + DiffTextSeparatorBackground: EnumStudioStyleGuideColor + DiffTextNoChangeBackground: EnumStudioStyleGuideColor + DiffTextAdditionBackground: EnumStudioStyleGuideColor + DiffTextDeletionBackground: EnumStudioStyleGuideColor + DiffLineNum: EnumStudioStyleGuideColor + DiffLineNumSeparatorBackground: EnumStudioStyleGuideColor + DiffLineNumNoChangeBackground: EnumStudioStyleGuideColor + DiffLineNumAdditionBackground: EnumStudioStyleGuideColor + DiffLineNumDeletionBackground: EnumStudioStyleGuideColor + DiffFilePathBackground: EnumStudioStyleGuideColor + DiffFilePathBorder: EnumStudioStyleGuideColor + ChatIncomingBgColor: EnumStudioStyleGuideColor + ChatIncomingTextColor: EnumStudioStyleGuideColor + ChatOutgoingBgColor: EnumStudioStyleGuideColor + ChatOutgoingTextColor: EnumStudioStyleGuideColor + ChatModeratedMessageColor: EnumStudioStyleGuideColor + Separator: EnumStudioStyleGuideColor + ButtonBorder: EnumStudioStyleGuideColor + ButtonText: EnumStudioStyleGuideColor + InputFieldBorder: EnumStudioStyleGuideColor + CheckedFieldBackground: EnumStudioStyleGuideColor + CheckedFieldBorder: EnumStudioStyleGuideColor + CheckedFieldIndicator: EnumStudioStyleGuideColor + HeaderSection: EnumStudioStyleGuideColor + Midlight: EnumStudioStyleGuideColor + StatusBar: EnumStudioStyleGuideColor + DialogButton: EnumStudioStyleGuideColor + DialogButtonText: EnumStudioStyleGuideColor + DialogButtonBorder: EnumStudioStyleGuideColor + DialogMainButton: EnumStudioStyleGuideColor + DialogMainButtonText: EnumStudioStyleGuideColor + InfoBarWarningBackground: EnumStudioStyleGuideColor + InfoBarWarningText: EnumStudioStyleGuideColor + ScriptMethod: EnumStudioStyleGuideColor + ScriptProperty: EnumStudioStyleGuideColor + ScriptNil: EnumStudioStyleGuideColor + ScriptBool: EnumStudioStyleGuideColor + ScriptFunction: EnumStudioStyleGuideColor + ScriptLocal: EnumStudioStyleGuideColor + ScriptSelf: EnumStudioStyleGuideColor + ScriptLuauKeyword: EnumStudioStyleGuideColor + ScriptFunctionName: EnumStudioStyleGuideColor + ScriptTodo: EnumStudioStyleGuideColor + ScriptBracket: EnumStudioStyleGuideColor + AICOOverlayText: EnumStudioStyleGuideColor + AICOOverlayButtonBackground: EnumStudioStyleGuideColor + AICOOverlayButtonBackgroundHover: EnumStudioStyleGuideColor + AICOOverlayButtonBackgroundPressed: EnumStudioStyleGuideColor + AttributeCog: EnumStudioStyleGuideColor +end +declare class EnumStudioStyleGuideModifier extends EnumItem end +declare class EnumStudioStyleGuideModifier_INTERNAL extends Enum + Default: EnumStudioStyleGuideModifier + Selected: EnumStudioStyleGuideModifier + Pressed: EnumStudioStyleGuideModifier + Disabled: EnumStudioStyleGuideModifier + Hover: EnumStudioStyleGuideModifier +end +declare class EnumStyle extends EnumItem end +declare class EnumStyle_INTERNAL extends Enum + AlternatingSupports: EnumStyle + BridgeStyleSupports: EnumStyle + NoSupports: EnumStyle +end +declare class EnumSurfaceConstraint extends EnumItem end +declare class EnumSurfaceConstraint_INTERNAL extends Enum + None: EnumSurfaceConstraint + Hinge: EnumSurfaceConstraint + SteppingMotor: EnumSurfaceConstraint + Motor: EnumSurfaceConstraint +end +declare class EnumSurfaceGuiShape extends EnumItem end +declare class EnumSurfaceGuiShape_INTERNAL extends Enum + Flat: EnumSurfaceGuiShape + CurvedHorizontally: EnumSurfaceGuiShape +end +declare class EnumSurfaceGuiSizingMode extends EnumItem end +declare class EnumSurfaceGuiSizingMode_INTERNAL extends Enum + FixedSize: EnumSurfaceGuiSizingMode + PixelsPerStud: EnumSurfaceGuiSizingMode +end +declare class EnumSurfaceType extends EnumItem end +declare class EnumSurfaceType_INTERNAL extends Enum + Smooth: EnumSurfaceType + Glue: EnumSurfaceType + Weld: EnumSurfaceType + Studs: EnumSurfaceType + Inlet: EnumSurfaceType + Universal: EnumSurfaceType + Hinge: EnumSurfaceType + Motor: EnumSurfaceType + SteppingMotor: EnumSurfaceType + SmoothNoOutlines: EnumSurfaceType +end +declare class EnumSwipeDirection extends EnumItem end +declare class EnumSwipeDirection_INTERNAL extends Enum + Right: EnumSwipeDirection + Left: EnumSwipeDirection + Up: EnumSwipeDirection + Down: EnumSwipeDirection + None: EnumSwipeDirection +end +declare class EnumTableMajorAxis extends EnumItem end +declare class EnumTableMajorAxis_INTERNAL extends Enum + RowMajor: EnumTableMajorAxis + ColumnMajor: EnumTableMajorAxis +end +declare class EnumTechnology extends EnumItem end +declare class EnumTechnology_INTERNAL extends Enum + Compatibility: EnumTechnology + Voxel: EnumTechnology + ShadowMap: EnumTechnology + Legacy: EnumTechnology + Future: EnumTechnology +end +declare class EnumTeleportMethod extends EnumItem end +declare class EnumTeleportMethod_INTERNAL extends Enum + TeleportToSpawnByName: EnumTeleportMethod + TeleportToPlaceInstance: EnumTeleportMethod + TeleportToPrivateServer: EnumTeleportMethod + TeleportPartyAsync: EnumTeleportMethod + TeleportUnknown: EnumTeleportMethod +end +declare class EnumTeleportResult extends EnumItem end +declare class EnumTeleportResult_INTERNAL extends Enum + Success: EnumTeleportResult + Failure: EnumTeleportResult + GameNotFound: EnumTeleportResult + GameEnded: EnumTeleportResult + GameFull: EnumTeleportResult + Unauthorized: EnumTeleportResult + Flooded: EnumTeleportResult + IsTeleporting: EnumTeleportResult +end +declare class EnumTeleportState extends EnumItem end +declare class EnumTeleportState_INTERNAL extends Enum + RequestedFromServer: EnumTeleportState + Started: EnumTeleportState + WaitingForServer: EnumTeleportState + Failed: EnumTeleportState + InProgress: EnumTeleportState +end +declare class EnumTeleportType extends EnumItem end +declare class EnumTeleportType_INTERNAL extends Enum + ToPlace: EnumTeleportType + ToInstance: EnumTeleportType + ToReservedServer: EnumTeleportType +end +declare class EnumTerrainAcquisitionMethod extends EnumItem end +declare class EnumTerrainAcquisitionMethod_INTERNAL extends Enum + None: EnumTerrainAcquisitionMethod + Legacy: EnumTerrainAcquisitionMethod + Template: EnumTerrainAcquisitionMethod + Generate: EnumTerrainAcquisitionMethod + Import: EnumTerrainAcquisitionMethod + Convert: EnumTerrainAcquisitionMethod + EditAddTool: EnumTerrainAcquisitionMethod + EditSeaLevelTool: EnumTerrainAcquisitionMethod + EditReplaceTool: EnumTerrainAcquisitionMethod + RegionFillTool: EnumTerrainAcquisitionMethod + RegionPasteTool: EnumTerrainAcquisitionMethod + Other: EnumTerrainAcquisitionMethod +end +declare class EnumTerrainFace extends EnumItem end +declare class EnumTerrainFace_INTERNAL extends Enum + Top: EnumTerrainFace + Side: EnumTerrainFace + Bottom: EnumTerrainFace +end +declare class EnumTextChatMessageStatus extends EnumItem end +declare class EnumTextChatMessageStatus_INTERNAL extends Enum + Unknown: EnumTextChatMessageStatus + Success: EnumTextChatMessageStatus + Sending: EnumTextChatMessageStatus + TextFilterFailed: EnumTextChatMessageStatus + Floodchecked: EnumTextChatMessageStatus + InvalidPrivacySettings: EnumTextChatMessageStatus + InvalidTextChannelPermissions: EnumTextChatMessageStatus + MessageTooLong: EnumTextChatMessageStatus +end +declare class EnumTextDirection extends EnumItem end +declare class EnumTextDirection_INTERNAL extends Enum + Auto: EnumTextDirection + LeftToRight: EnumTextDirection + RightToLeft: EnumTextDirection +end +declare class EnumTextFilterContext extends EnumItem end +declare class EnumTextFilterContext_INTERNAL extends Enum + PublicChat: EnumTextFilterContext + PrivateChat: EnumTextFilterContext +end +declare class EnumTextInputType extends EnumItem end +declare class EnumTextInputType_INTERNAL extends Enum + Default: EnumTextInputType + NoSuggestions: EnumTextInputType + Number: EnumTextInputType + Email: EnumTextInputType + Phone: EnumTextInputType + Password: EnumTextInputType + PasswordShown: EnumTextInputType + Username: EnumTextInputType + OneTimePassword: EnumTextInputType +end +declare class EnumTextTruncate extends EnumItem end +declare class EnumTextTruncate_INTERNAL extends Enum + None: EnumTextTruncate + AtEnd: EnumTextTruncate +end +declare class EnumTextXAlignment extends EnumItem end +declare class EnumTextXAlignment_INTERNAL extends Enum + Left: EnumTextXAlignment + Center: EnumTextXAlignment + Right: EnumTextXAlignment +end +declare class EnumTextYAlignment extends EnumItem end +declare class EnumTextYAlignment_INTERNAL extends Enum + Top: EnumTextYAlignment + Center: EnumTextYAlignment + Bottom: EnumTextYAlignment +end +declare class EnumTextureMode extends EnumItem end +declare class EnumTextureMode_INTERNAL extends Enum + Stretch: EnumTextureMode + Wrap: EnumTextureMode + Static: EnumTextureMode +end +declare class EnumTextureQueryType extends EnumItem end +declare class EnumTextureQueryType_INTERNAL extends Enum + NonHumanoid: EnumTextureQueryType + NonHumanoidOrphaned: EnumTextureQueryType + Humanoid: EnumTextureQueryType + HumanoidOrphaned: EnumTextureQueryType +end +declare class EnumThreadPoolConfig extends EnumItem end +declare class EnumThreadPoolConfig_INTERNAL extends Enum + Auto: EnumThreadPoolConfig + PerCore1: EnumThreadPoolConfig + PerCore2: EnumThreadPoolConfig + PerCore3: EnumThreadPoolConfig + PerCore4: EnumThreadPoolConfig + Threads1: EnumThreadPoolConfig + Threads2: EnumThreadPoolConfig + Threads3: EnumThreadPoolConfig + Threads4: EnumThreadPoolConfig + Threads8: EnumThreadPoolConfig + Threads16: EnumThreadPoolConfig +end +declare class EnumThrottlingPriority extends EnumItem end +declare class EnumThrottlingPriority_INTERNAL extends Enum + Extreme: EnumThrottlingPriority + ElevatedOnServer: EnumThrottlingPriority + Default: EnumThrottlingPriority +end +declare class EnumThumbnailSize extends EnumItem end +declare class EnumThumbnailSize_INTERNAL extends Enum + Size48x48: EnumThumbnailSize + Size180x180: EnumThumbnailSize + Size420x420: EnumThumbnailSize + Size60x60: EnumThumbnailSize + Size100x100: EnumThumbnailSize + Size150x150: EnumThumbnailSize + Size352x352: EnumThumbnailSize +end +declare class EnumThumbnailType extends EnumItem end +declare class EnumThumbnailType_INTERNAL extends Enum + HeadShot: EnumThumbnailType + AvatarBust: EnumThumbnailType + AvatarThumbnail: EnumThumbnailType +end +declare class EnumTickCountSampleMethod extends EnumItem end +declare class EnumTickCountSampleMethod_INTERNAL extends Enum + Fast: EnumTickCountSampleMethod + Benchmark: EnumTickCountSampleMethod + Precise: EnumTickCountSampleMethod +end +declare class EnumTopBottom extends EnumItem end +declare class EnumTopBottom_INTERNAL extends Enum + Top: EnumTopBottom + Center: EnumTopBottom + Bottom: EnumTopBottom +end +declare class EnumTouchCameraMovementMode extends EnumItem end +declare class EnumTouchCameraMovementMode_INTERNAL extends Enum + Default: EnumTouchCameraMovementMode + Follow: EnumTouchCameraMovementMode + Classic: EnumTouchCameraMovementMode + Orbital: EnumTouchCameraMovementMode +end +declare class EnumTouchMovementMode extends EnumItem end +declare class EnumTouchMovementMode_INTERNAL extends Enum + Default: EnumTouchMovementMode + Thumbstick: EnumTouchMovementMode + DPad: EnumTouchMovementMode + Thumbpad: EnumTouchMovementMode + ClickToMove: EnumTouchMovementMode + DynamicThumbstick: EnumTouchMovementMode +end +declare class EnumTrackerError extends EnumItem end +declare class EnumTrackerError_INTERNAL extends Enum + Ok: EnumTrackerError + NoService: EnumTrackerError + InitFailed: EnumTrackerError + NoVideo: EnumTrackerError + VideoError: EnumTrackerError + VideoNoPermission: EnumTrackerError + VideoUnsupported: EnumTrackerError + NoAudio: EnumTrackerError + AudioError: EnumTrackerError + AudioNoPermission: EnumTrackerError + UnsupportedDevice: EnumTrackerError +end +declare class EnumTrackerExtrapolationFlagMode extends EnumItem end +declare class EnumTrackerExtrapolationFlagMode_INTERNAL extends Enum + Auto: EnumTrackerExtrapolationFlagMode + ForceDisabled: EnumTrackerExtrapolationFlagMode + ExtrapolateFacsAndPose: EnumTrackerExtrapolationFlagMode + ExtrapolateFacsOnly: EnumTrackerExtrapolationFlagMode +end +declare class EnumTrackerLodFlagMode extends EnumItem end +declare class EnumTrackerLodFlagMode_INTERNAL extends Enum + Auto: EnumTrackerLodFlagMode + ForceFalse: EnumTrackerLodFlagMode + ForceTrue: EnumTrackerLodFlagMode +end +declare class EnumTrackerLodValueMode extends EnumItem end +declare class EnumTrackerLodValueMode_INTERNAL extends Enum + Auto: EnumTrackerLodValueMode + Force0: EnumTrackerLodValueMode + Force1: EnumTrackerLodValueMode +end +declare class EnumTrackerMode extends EnumItem end +declare class EnumTrackerMode_INTERNAL extends Enum + None: EnumTrackerMode + Audio: EnumTrackerMode + Video: EnumTrackerMode + AudioVideo: EnumTrackerMode +end +declare class EnumTrackerPromptEvent extends EnumItem end +declare class EnumTrackerPromptEvent_INTERNAL extends Enum + LODCameraRecommendDisable: EnumTrackerPromptEvent +end +declare class EnumTriStateBoolean extends EnumItem end +declare class EnumTriStateBoolean_INTERNAL extends Enum + Unknown: EnumTriStateBoolean + True: EnumTriStateBoolean + False: EnumTriStateBoolean +end +declare class EnumTweenStatus extends EnumItem end +declare class EnumTweenStatus_INTERNAL extends Enum + Canceled: EnumTweenStatus + Completed: EnumTweenStatus +end +declare class EnumUITheme extends EnumItem end +declare class EnumUITheme_INTERNAL extends Enum + Light: EnumUITheme + Dark: EnumUITheme +end +declare class EnumUiMessageType extends EnumItem end +declare class EnumUiMessageType_INTERNAL extends Enum + UiMessageError: EnumUiMessageType + UiMessageInfo: EnumUiMessageType +end +declare class EnumUsageContext extends EnumItem end +declare class EnumUsageContext_INTERNAL extends Enum + Default: EnumUsageContext + Preview: EnumUsageContext +end +declare class EnumUserCFrame extends EnumItem end +declare class EnumUserCFrame_INTERNAL extends Enum + Head: EnumUserCFrame + LeftHand: EnumUserCFrame + RightHand: EnumUserCFrame + Floor: EnumUserCFrame +end +declare class EnumUserInputState extends EnumItem end +declare class EnumUserInputState_INTERNAL extends Enum + Begin: EnumUserInputState + Change: EnumUserInputState + End: EnumUserInputState + Cancel: EnumUserInputState + None: EnumUserInputState +end +declare class EnumUserInputType extends EnumItem end +declare class EnumUserInputType_INTERNAL extends Enum + MouseButton1: EnumUserInputType + MouseButton2: EnumUserInputType + MouseButton3: EnumUserInputType + MouseWheel: EnumUserInputType + MouseMovement: EnumUserInputType + Touch: EnumUserInputType + Keyboard: EnumUserInputType + Focus: EnumUserInputType + Accelerometer: EnumUserInputType + Gyro: EnumUserInputType + Gamepad1: EnumUserInputType + Gamepad2: EnumUserInputType + Gamepad3: EnumUserInputType + Gamepad4: EnumUserInputType + Gamepad5: EnumUserInputType + Gamepad6: EnumUserInputType + Gamepad7: EnumUserInputType + Gamepad8: EnumUserInputType + TextInput: EnumUserInputType + InputMethod: EnumUserInputType + None: EnumUserInputType +end +declare class EnumVRSafetyBubbleMode extends EnumItem end +declare class EnumVRSafetyBubbleMode_INTERNAL extends Enum + NoOne: EnumVRSafetyBubbleMode + OnlyFriends: EnumVRSafetyBubbleMode + Anyone: EnumVRSafetyBubbleMode +end +declare class EnumVRScaling extends EnumItem end +declare class EnumVRScaling_INTERNAL extends Enum + World: EnumVRScaling + Off: EnumVRScaling +end +declare class EnumVRSessionState extends EnumItem end +declare class EnumVRSessionState_INTERNAL extends Enum + Idle: EnumVRSessionState + Visible: EnumVRSessionState + Focused: EnumVRSessionState + Stopping: EnumVRSessionState + Undefined: EnumVRSessionState +end +declare class EnumVRTouchpad extends EnumItem end +declare class EnumVRTouchpad_INTERNAL extends Enum + Left: EnumVRTouchpad + Right: EnumVRTouchpad +end +declare class EnumVRTouchpadMode extends EnumItem end +declare class EnumVRTouchpadMode_INTERNAL extends Enum + Touch: EnumVRTouchpadMode + VirtualThumbstick: EnumVRTouchpadMode + ABXY: EnumVRTouchpadMode +end +declare class EnumVelocityConstraintMode extends EnumItem end +declare class EnumVelocityConstraintMode_INTERNAL extends Enum + Line: EnumVelocityConstraintMode + Plane: EnumVelocityConstraintMode + Vector: EnumVelocityConstraintMode +end +declare class EnumVerticalAlignment extends EnumItem end +declare class EnumVerticalAlignment_INTERNAL extends Enum + Center: EnumVerticalAlignment + Top: EnumVerticalAlignment + Bottom: EnumVerticalAlignment +end +declare class EnumVerticalScrollBarPosition extends EnumItem end +declare class EnumVerticalScrollBarPosition_INTERNAL extends Enum + Left: EnumVerticalScrollBarPosition + Right: EnumVerticalScrollBarPosition +end +declare class EnumVibrationMotor extends EnumItem end +declare class EnumVibrationMotor_INTERNAL extends Enum + Large: EnumVibrationMotor + Small: EnumVibrationMotor + LeftTrigger: EnumVibrationMotor + RightTrigger: EnumVibrationMotor + LeftHand: EnumVibrationMotor + RightHand: EnumVibrationMotor +end +declare class EnumViewMode extends EnumItem end +declare class EnumViewMode_INTERNAL extends Enum + None: EnumViewMode + GeometryComplexity: EnumViewMode + Transparent: EnumViewMode + Decal: EnumViewMode +end +declare class EnumVirtualCursorMode extends EnumItem end +declare class EnumVirtualCursorMode_INTERNAL extends Enum + Default: EnumVirtualCursorMode + Disabled: EnumVirtualCursorMode + Enabled: EnumVirtualCursorMode +end +declare class EnumVirtualInputMode extends EnumItem end +declare class EnumVirtualInputMode_INTERNAL extends Enum + Recording: EnumVirtualInputMode + Playing: EnumVirtualInputMode + None: EnumVirtualInputMode +end +declare class EnumVoiceChatState extends EnumItem end +declare class EnumVoiceChatState_INTERNAL extends Enum + Idle: EnumVoiceChatState + Joining: EnumVoiceChatState + JoiningRetry: EnumVoiceChatState + Joined: EnumVoiceChatState + Leaving: EnumVoiceChatState + Ended: EnumVoiceChatState + Failed: EnumVoiceChatState +end +declare class EnumVolumetricAudio extends EnumItem end +declare class EnumVolumetricAudio_INTERNAL extends Enum + Disabled: EnumVolumetricAudio + Automatic: EnumVolumetricAudio + Enabled: EnumVolumetricAudio +end +declare class EnumWaterDirection extends EnumItem end +declare class EnumWaterDirection_INTERNAL extends Enum + NegX: EnumWaterDirection + X: EnumWaterDirection + NegY: EnumWaterDirection + Y: EnumWaterDirection + NegZ: EnumWaterDirection + Z: EnumWaterDirection +end +declare class EnumWaterForce extends EnumItem end +declare class EnumWaterForce_INTERNAL extends Enum + None: EnumWaterForce + Small: EnumWaterForce + Medium: EnumWaterForce + Strong: EnumWaterForce + Max: EnumWaterForce +end +declare class EnumWeldConstraintPreserve extends EnumItem end +declare class EnumWeldConstraintPreserve_INTERNAL extends Enum + All: EnumWeldConstraintPreserve + None: EnumWeldConstraintPreserve + Touching: EnumWeldConstraintPreserve +end +declare class EnumWrapLayerAutoSkin extends EnumItem end +declare class EnumWrapLayerAutoSkin_INTERNAL extends Enum + Disabled: EnumWrapLayerAutoSkin + EnabledPreserve: EnumWrapLayerAutoSkin + EnabledOverride: EnumWrapLayerAutoSkin +end +declare class EnumWrapLayerDebugMode extends EnumItem end +declare class EnumWrapLayerDebugMode_INTERNAL extends Enum + None: EnumWrapLayerDebugMode + BoundCage: EnumWrapLayerDebugMode + LayerCage: EnumWrapLayerDebugMode + BoundCageAndLinks: EnumWrapLayerDebugMode + Reference: EnumWrapLayerDebugMode + Rbf: EnumWrapLayerDebugMode + OuterCage: EnumWrapLayerDebugMode + ReferenceMeshAfterMorph: EnumWrapLayerDebugMode + HSROuterDetail: EnumWrapLayerDebugMode + HSROuter: EnumWrapLayerDebugMode + HSRInner: EnumWrapLayerDebugMode + HSRInnerReverse: EnumWrapLayerDebugMode + LayerCageFittedToBase: EnumWrapLayerDebugMode + LayerCageFittedToPrev: EnumWrapLayerDebugMode +end +declare class EnumWrapTargetDebugMode extends EnumItem end +declare class EnumWrapTargetDebugMode_INTERNAL extends Enum + None: EnumWrapTargetDebugMode + TargetCageOriginal: EnumWrapTargetDebugMode + TargetCageCompressed: EnumWrapTargetDebugMode + TargetCageInterface: EnumWrapTargetDebugMode + TargetLayerCageOriginal: EnumWrapTargetDebugMode + TargetLayerCageCompressed: EnumWrapTargetDebugMode + TargetLayerInterface: EnumWrapTargetDebugMode + Rbf: EnumWrapTargetDebugMode + OuterCageDetail: EnumWrapTargetDebugMode +end +declare class EnumZIndexBehavior extends EnumItem end +declare class EnumZIndexBehavior_INTERNAL extends Enum + Global: EnumZIndexBehavior + Sibling: EnumZIndexBehavior +end + + + + +declare class EnumUploadSetting extends EnumItem end +declare class EnumUploadSetting_INTERNAL extends Enum + Never: EnumUploadSetting + ["Ask me first"]: EnumUploadSetting +end + +declare class EnumPhysicsSendMethod extends EnumItem end +declare class EnumPhysicsSendMethod_INTERNAL extends Enum + ErrorComputation2: EnumPhysicsSendMethod +end + +declare class EnumPriorityMethod extends EnumItem end +declare class EnumPriorityMethod_INTERNAL extends Enum + AccumulatedError: EnumPriorityMethod +end + + + +type ENUM_LIST = { + AccessModifierType: EnumAccessModifierType_INTERNAL, + AccessoryType: EnumAccessoryType_INTERNAL, + ActionType: EnumActionType_INTERNAL, + ActuatorRelativeTo: EnumActuatorRelativeTo_INTERNAL, + ActuatorType: EnumActuatorType_INTERNAL, + AdShape: EnumAdShape_INTERNAL, + AdTeleportMethod: EnumAdTeleportMethod_INTERNAL, + AdUnitStatus: EnumAdUnitStatus_INTERNAL, + AdornCullingMode: EnumAdornCullingMode_INTERNAL, + AlignType: EnumAlignType_INTERNAL, + AlphaMode: EnumAlphaMode_INTERNAL, + AnalyticsEconomyAction: EnumAnalyticsEconomyAction_INTERNAL, + AnalyticsLogLevel: EnumAnalyticsLogLevel_INTERNAL, + AnalyticsProgressionStatus: EnumAnalyticsProgressionStatus_INTERNAL, + AnimationPriority: EnumAnimationPriority_INTERNAL, + AnimatorRetargetingMode: EnumAnimatorRetargetingMode_INTERNAL, + AppShellActionType: EnumAppShellActionType_INTERNAL, + AppShellFeature: EnumAppShellFeature_INTERNAL, + AppUpdateStatus: EnumAppUpdateStatus_INTERNAL, + ApplyStrokeMode: EnumApplyStrokeMode_INTERNAL, + AspectType: EnumAspectType_INTERNAL, + AssetFetchStatus: EnumAssetFetchStatus_INTERNAL, + AssetType: EnumAssetType_INTERNAL, + AssetTypeVerification: EnumAssetTypeVerification_INTERNAL, + AudioSubType: EnumAudioSubType_INTERNAL, + AudioWindowSize: EnumAudioWindowSize_INTERNAL, + AutoIndentRule: EnumAutoIndentRule_INTERNAL, + AutomaticSize: EnumAutomaticSize_INTERNAL, + AvatarAssetType: EnumAvatarAssetType_INTERNAL, + AvatarChatServiceFeature: EnumAvatarChatServiceFeature_INTERNAL, + AvatarContextMenuOption: EnumAvatarContextMenuOption_INTERNAL, + AvatarItemType: EnumAvatarItemType_INTERNAL, + AvatarJointUpgrade: EnumAvatarJointUpgrade_INTERNAL, + AvatarPromptResult: EnumAvatarPromptResult_INTERNAL, + AvatarThumbnailCustomizationType: EnumAvatarThumbnailCustomizationType_INTERNAL, + AvatarUnificationMode: EnumAvatarUnificationMode_INTERNAL, + Axis: EnumAxis_INTERNAL, + BinType: EnumBinType_INTERNAL, + BodyPart: EnumBodyPart_INTERNAL, + BodyPartR15: EnumBodyPartR15_INTERNAL, + BorderMode: EnumBorderMode_INTERNAL, + BreakReason: EnumBreakReason_INTERNAL, + BreakpointRemoveReason: EnumBreakpointRemoveReason_INTERNAL, + BulkMoveMode: EnumBulkMoveMode_INTERNAL, + BundleType: EnumBundleType_INTERNAL, + Button: EnumButton_INTERNAL, + ButtonStyle: EnumButtonStyle_INTERNAL, + CageType: EnumCageType_INTERNAL, + CameraMode: EnumCameraMode_INTERNAL, + CameraPanMode: EnumCameraPanMode_INTERNAL, + CameraType: EnumCameraType_INTERNAL, + CatalogCategoryFilter: EnumCatalogCategoryFilter_INTERNAL, + CatalogSortAggregation: EnumCatalogSortAggregation_INTERNAL, + CatalogSortType: EnumCatalogSortType_INTERNAL, + CellBlock: EnumCellBlock_INTERNAL, + CellMaterial: EnumCellMaterial_INTERNAL, + CellOrientation: EnumCellOrientation_INTERNAL, + CenterDialogType: EnumCenterDialogType_INTERNAL, + ChatCallbackType: EnumChatCallbackType_INTERNAL, + ChatColor: EnumChatColor_INTERNAL, + ChatMode: EnumChatMode_INTERNAL, + ChatPrivacyMode: EnumChatPrivacyMode_INTERNAL, + ChatStyle: EnumChatStyle_INTERNAL, + ChatVersion: EnumChatVersion_INTERNAL, + ClientAnimatorThrottlingMode: EnumClientAnimatorThrottlingMode_INTERNAL, + CollisionFidelity: EnumCollisionFidelity_INTERNAL, + CommandPermission: EnumCommandPermission_INTERNAL, + CompileTarget: EnumCompileTarget_INTERNAL, + CompletionItemKind: EnumCompletionItemKind_INTERNAL, + CompletionItemTag: EnumCompletionItemTag_INTERNAL, + CompletionTriggerKind: EnumCompletionTriggerKind_INTERNAL, + ComputerCameraMovementMode: EnumComputerCameraMovementMode_INTERNAL, + ComputerMovementMode: EnumComputerMovementMode_INTERNAL, + ConnectionError: EnumConnectionError_INTERNAL, + ConnectionState: EnumConnectionState_INTERNAL, + ContextActionPriority: EnumContextActionPriority_INTERNAL, + ContextActionResult: EnumContextActionResult_INTERNAL, + ControlMode: EnumControlMode_INTERNAL, + CoreGuiType: EnumCoreGuiType_INTERNAL, + CreateOutfitFailure: EnumCreateOutfitFailure_INTERNAL, + CreatorType: EnumCreatorType_INTERNAL, + CreatorTypeFilter: EnumCreatorTypeFilter_INTERNAL, + CurrencyType: EnumCurrencyType_INTERNAL, + CustomCameraMode: EnumCustomCameraMode_INTERNAL, + DataStoreRequestType: EnumDataStoreRequestType_INTERNAL, + DeathStyle: EnumDeathStyle_INTERNAL, + DebuggerEndReason: EnumDebuggerEndReason_INTERNAL, + DebuggerExceptionBreakMode: EnumDebuggerExceptionBreakMode_INTERNAL, + DebuggerFrameType: EnumDebuggerFrameType_INTERNAL, + DebuggerPauseReason: EnumDebuggerPauseReason_INTERNAL, + DebuggerStatus: EnumDebuggerStatus_INTERNAL, + DevCameraOcclusionMode: EnumDevCameraOcclusionMode_INTERNAL, + DevComputerCameraMovementMode: EnumDevComputerCameraMovementMode_INTERNAL, + DevComputerMovementMode: EnumDevComputerMovementMode_INTERNAL, + DevTouchCameraMovementMode: EnumDevTouchCameraMovementMode_INTERNAL, + DevTouchMovementMode: EnumDevTouchMovementMode_INTERNAL, + DeveloperMemoryTag: EnumDeveloperMemoryTag_INTERNAL, + DeviceType: EnumDeviceType_INTERNAL, + DialogBehaviorType: EnumDialogBehaviorType_INTERNAL, + DialogPurpose: EnumDialogPurpose_INTERNAL, + DialogTone: EnumDialogTone_INTERNAL, + DominantAxis: EnumDominantAxis_INTERNAL, + DraftStatusCode: EnumDraftStatusCode_INTERNAL, + DragDetectorDragStyle: EnumDragDetectorDragStyle_INTERNAL, + DragDetectorResponseStyle: EnumDragDetectorResponseStyle_INTERNAL, + DraggerCoordinateSpace: EnumDraggerCoordinateSpace_INTERNAL, + DraggerMovementMode: EnumDraggerMovementMode_INTERNAL, + EasingDirection: EnumEasingDirection_INTERNAL, + EasingStyle: EnumEasingStyle_INTERNAL, + ElasticBehavior: EnumElasticBehavior_INTERNAL, + EnviromentalPhysicsThrottle: EnumEnviromentalPhysicsThrottle_INTERNAL, + ExperienceAuthScope: EnumExperienceAuthScope_INTERNAL, + ExplosionType: EnumExplosionType_INTERNAL, + FacialAnimationStreamingState: EnumFacialAnimationStreamingState_INTERNAL, + FieldOfViewMode: EnumFieldOfViewMode_INTERNAL, + FillDirection: EnumFillDirection_INTERNAL, + FilterResult: EnumFilterResult_INTERNAL, + FinishRecordingOperation: EnumFinishRecordingOperation_INTERNAL, + FluidForces: EnumFluidForces_INTERNAL, + Font: EnumFont_INTERNAL, + FontSize: EnumFontSize_INTERNAL, + FontStyle: EnumFontStyle_INTERNAL, + FontWeight: EnumFontWeight_INTERNAL, + ForceLimitMode: EnumForceLimitMode_INTERNAL, + FormFactor: EnumFormFactor_INTERNAL, + FrameStyle: EnumFrameStyle_INTERNAL, + FramerateManagerMode: EnumFramerateManagerMode_INTERNAL, + FriendRequestEvent: EnumFriendRequestEvent_INTERNAL, + FriendStatus: EnumFriendStatus_INTERNAL, + FunctionalTestResult: EnumFunctionalTestResult_INTERNAL, + GameAvatarType: EnumGameAvatarType_INTERNAL, + GearGenreSetting: EnumGearGenreSetting_INTERNAL, + GearType: EnumGearType_INTERNAL, + Genre: EnumGenre_INTERNAL, + GraphicsMode: EnumGraphicsMode_INTERNAL, + GuiState: EnumGuiState_INTERNAL, + GuiType: EnumGuiType_INTERNAL, + HandlesStyle: EnumHandlesStyle_INTERNAL, + HighlightDepthMode: EnumHighlightDepthMode_INTERNAL, + HorizontalAlignment: EnumHorizontalAlignment_INTERNAL, + HoverAnimateSpeed: EnumHoverAnimateSpeed_INTERNAL, + HttpCachePolicy: EnumHttpCachePolicy_INTERNAL, + HttpContentType: EnumHttpContentType_INTERNAL, + HttpError: EnumHttpError_INTERNAL, + HttpRequestType: EnumHttpRequestType_INTERNAL, + HumanoidCollisionType: EnumHumanoidCollisionType_INTERNAL, + HumanoidDisplayDistanceType: EnumHumanoidDisplayDistanceType_INTERNAL, + HumanoidHealthDisplayType: EnumHumanoidHealthDisplayType_INTERNAL, + HumanoidOnlySetCollisionsOnStateChange: EnumHumanoidOnlySetCollisionsOnStateChange_INTERNAL, + HumanoidRigType: EnumHumanoidRigType_INTERNAL, + HumanoidStateMachineMode: EnumHumanoidStateMachineMode_INTERNAL, + HumanoidStateType: EnumHumanoidStateType_INTERNAL, + IKCollisionsMode: EnumIKCollisionsMode_INTERNAL, + IKControlConstraintSupport: EnumIKControlConstraintSupport_INTERNAL, + IKControlType: EnumIKControlType_INTERNAL, + IXPLoadingStatus: EnumIXPLoadingStatus_INTERNAL, + InOut: EnumInOut_INTERNAL, + InfoType: EnumInfoType_INTERNAL, + InitialDockState: EnumInitialDockState_INTERNAL, + InputType: EnumInputType_INTERNAL, + InterpolationThrottlingMode: EnumInterpolationThrottlingMode_INTERNAL, + JointCreationMode: EnumJointCreationMode_INTERNAL, + KeyCode: EnumKeyCode_INTERNAL, + KeyInterpolationMode: EnumKeyInterpolationMode_INTERNAL, + KeywordFilterType: EnumKeywordFilterType_INTERNAL, + Language: EnumLanguage_INTERNAL, + LeftRight: EnumLeftRight_INTERNAL, + Limb: EnumLimb_INTERNAL, + LineJoinMode: EnumLineJoinMode_INTERNAL, + ListDisplayMode: EnumListDisplayMode_INTERNAL, + ListenerType: EnumListenerType_INTERNAL, + LoadCharacterLayeredClothing: EnumLoadCharacterLayeredClothing_INTERNAL, + LoadDynamicHeads: EnumLoadDynamicHeads_INTERNAL, + MarkupKind: EnumMarkupKind_INTERNAL, + Material: EnumMaterial_INTERNAL, + MaterialPattern: EnumMaterialPattern_INTERNAL, + MembershipType: EnumMembershipType_INTERNAL, + MeshPartDetailLevel: EnumMeshPartDetailLevel_INTERNAL, + MeshPartHeadsAndAccessories: EnumMeshPartHeadsAndAccessories_INTERNAL, + MeshScaleUnit: EnumMeshScaleUnit_INTERNAL, + MeshType: EnumMeshType_INTERNAL, + MessageType: EnumMessageType_INTERNAL, + ModelLevelOfDetail: EnumModelLevelOfDetail_INTERNAL, + ModelStreamingBehavior: EnumModelStreamingBehavior_INTERNAL, + ModelStreamingMode: EnumModelStreamingMode_INTERNAL, + ModifierKey: EnumModifierKey_INTERNAL, + MouseBehavior: EnumMouseBehavior_INTERNAL, + MoveState: EnumMoveState_INTERNAL, + MuteState: EnumMuteState_INTERNAL, + NameOcclusion: EnumNameOcclusion_INTERNAL, + NetworkOwnership: EnumNetworkOwnership_INTERNAL, + NormalId: EnumNormalId_INTERNAL, + OrientationAlignmentMode: EnumOrientationAlignmentMode_INTERNAL, + OutfitSource: EnumOutfitSource_INTERNAL, + OutfitType: EnumOutfitType_INTERNAL, + OutputLayoutMode: EnumOutputLayoutMode_INTERNAL, + OverrideMouseIconBehavior: EnumOverrideMouseIconBehavior_INTERNAL, + PackagePermission: EnumPackagePermission_INTERNAL, + PartType: EnumPartType_INTERNAL, + ParticleEmitterShape: EnumParticleEmitterShape_INTERNAL, + ParticleEmitterShapeInOut: EnumParticleEmitterShapeInOut_INTERNAL, + ParticleEmitterShapeStyle: EnumParticleEmitterShapeStyle_INTERNAL, + ParticleFlipbookLayout: EnumParticleFlipbookLayout_INTERNAL, + ParticleFlipbookMode: EnumParticleFlipbookMode_INTERNAL, + ParticleFlipbookTextureCompatible: EnumParticleFlipbookTextureCompatible_INTERNAL, + ParticleOrientation: EnumParticleOrientation_INTERNAL, + PathStatus: EnumPathStatus_INTERNAL, + PathWaypointAction: EnumPathWaypointAction_INTERNAL, + PermissionLevelShown: EnumPermissionLevelShown_INTERNAL, + PhysicsSimulationRate: EnumPhysicsSimulationRate_INTERNAL, + PhysicsSteppingMethod: EnumPhysicsSteppingMethod_INTERNAL, + Platform: EnumPlatform_INTERNAL, + PlaybackState: EnumPlaybackState_INTERNAL, + PlayerActions: EnumPlayerActions_INTERNAL, + PlayerChatType: EnumPlayerChatType_INTERNAL, + PoseEasingDirection: EnumPoseEasingDirection_INTERNAL, + PoseEasingStyle: EnumPoseEasingStyle_INTERNAL, + PositionAlignmentMode: EnumPositionAlignmentMode_INTERNAL, + PrivilegeType: EnumPrivilegeType_INTERNAL, + ProductLocationRestriction: EnumProductLocationRestriction_INTERNAL, + ProductPurchaseDecision: EnumProductPurchaseDecision_INTERNAL, + PromptCreateAssetResult: EnumPromptCreateAssetResult_INTERNAL, + PromptPublishAssetResult: EnumPromptPublishAssetResult_INTERNAL, + PropertyStatus: EnumPropertyStatus_INTERNAL, + ProximityPromptExclusivity: EnumProximityPromptExclusivity_INTERNAL, + ProximityPromptInputType: EnumProximityPromptInputType_INTERNAL, + ProximityPromptStyle: EnumProximityPromptStyle_INTERNAL, + QualityLevel: EnumQualityLevel_INTERNAL, + R15CollisionType: EnumR15CollisionType_INTERNAL, + RaycastFilterType: EnumRaycastFilterType_INTERNAL, + RejectCharacterDeletions: EnumRejectCharacterDeletions_INTERNAL, + RenderFidelity: EnumRenderFidelity_INTERNAL, + RenderPriority: EnumRenderPriority_INTERNAL, + RenderingTestComparisonMethod: EnumRenderingTestComparisonMethod_INTERNAL, + ReplicateInstanceDestroySetting: EnumReplicateInstanceDestroySetting_INTERNAL, + ResamplerMode: EnumResamplerMode_INTERNAL, + ReservedHighlightId: EnumReservedHighlightId_INTERNAL, + RestPose: EnumRestPose_INTERNAL, + ReturnKeyType: EnumReturnKeyType_INTERNAL, + ReverbType: EnumReverbType_INTERNAL, + RibbonTool: EnumRibbonTool_INTERNAL, + RigScale: EnumRigScale_INTERNAL, + RigType: EnumRigType_INTERNAL, + RollOffMode: EnumRollOffMode_INTERNAL, + RotationOrder: EnumRotationOrder_INTERNAL, + RotationType: EnumRotationType_INTERNAL, + RtlTextSupport: EnumRtlTextSupport_INTERNAL, + RunContext: EnumRunContext_INTERNAL, + RuntimeUndoBehavior: EnumRuntimeUndoBehavior_INTERNAL, + SafeAreaCompatibility: EnumSafeAreaCompatibility_INTERNAL, + SalesTypeFilter: EnumSalesTypeFilter_INTERNAL, + SaveAvatarThumbnailCustomizationFailure: EnumSaveAvatarThumbnailCustomizationFailure_INTERNAL, + SaveFilter: EnumSaveFilter_INTERNAL, + SavedQualitySetting: EnumSavedQualitySetting_INTERNAL, + ScaleType: EnumScaleType_INTERNAL, + ScopeCheckResult: EnumScopeCheckResult_INTERNAL, + ScreenInsets: EnumScreenInsets_INTERNAL, + ScreenOrientation: EnumScreenOrientation_INTERNAL, + ScrollBarInset: EnumScrollBarInset_INTERNAL, + ScrollingDirection: EnumScrollingDirection_INTERNAL, + SelectionBehavior: EnumSelectionBehavior_INTERNAL, + SelectionRenderMode: EnumSelectionRenderMode_INTERNAL, + SelfViewPosition: EnumSelfViewPosition_INTERNAL, + SensorMode: EnumSensorMode_INTERNAL, + SensorUpdateType: EnumSensorUpdateType_INTERNAL, + ServerAudioBehavior: EnumServerAudioBehavior_INTERNAL, + ServiceVisibility: EnumServiceVisibility_INTERNAL, + Severity: EnumSeverity_INTERNAL, + SignalBehavior: EnumSignalBehavior_INTERNAL, + SizeConstraint: EnumSizeConstraint_INTERNAL, + SolverConvergenceVisualizationMode: EnumSolverConvergenceVisualizationMode_INTERNAL, + SortDirection: EnumSortDirection_INTERNAL, + SortOrder: EnumSortOrder_INTERNAL, + SpecialKey: EnumSpecialKey_INTERNAL, + StartCorner: EnumStartCorner_INTERNAL, + Status: EnumStatus_INTERNAL, + StreamOutBehavior: EnumStreamOutBehavior_INTERNAL, + StreamingIntegrityMode: EnumStreamingIntegrityMode_INTERNAL, + StreamingPauseMode: EnumStreamingPauseMode_INTERNAL, + StudioCloseMode: EnumStudioCloseMode_INTERNAL, + StudioDataModelType: EnumStudioDataModelType_INTERNAL, + StudioScriptEditorColorCategories: EnumStudioScriptEditorColorCategories_INTERNAL, + StudioScriptEditorColorPresets: EnumStudioScriptEditorColorPresets_INTERNAL, + StudioStyleGuideColor: EnumStudioStyleGuideColor_INTERNAL, + StudioStyleGuideModifier: EnumStudioStyleGuideModifier_INTERNAL, + Style: EnumStyle_INTERNAL, + SurfaceConstraint: EnumSurfaceConstraint_INTERNAL, + SurfaceGuiShape: EnumSurfaceGuiShape_INTERNAL, + SurfaceGuiSizingMode: EnumSurfaceGuiSizingMode_INTERNAL, + SurfaceType: EnumSurfaceType_INTERNAL, + SwipeDirection: EnumSwipeDirection_INTERNAL, + TableMajorAxis: EnumTableMajorAxis_INTERNAL, + Technology: EnumTechnology_INTERNAL, + TeleportMethod: EnumTeleportMethod_INTERNAL, + TeleportResult: EnumTeleportResult_INTERNAL, + TeleportState: EnumTeleportState_INTERNAL, + TeleportType: EnumTeleportType_INTERNAL, + TerrainAcquisitionMethod: EnumTerrainAcquisitionMethod_INTERNAL, + TerrainFace: EnumTerrainFace_INTERNAL, + TextChatMessageStatus: EnumTextChatMessageStatus_INTERNAL, + TextDirection: EnumTextDirection_INTERNAL, + TextFilterContext: EnumTextFilterContext_INTERNAL, + TextInputType: EnumTextInputType_INTERNAL, + TextTruncate: EnumTextTruncate_INTERNAL, + TextXAlignment: EnumTextXAlignment_INTERNAL, + TextYAlignment: EnumTextYAlignment_INTERNAL, + TextureMode: EnumTextureMode_INTERNAL, + TextureQueryType: EnumTextureQueryType_INTERNAL, + ThreadPoolConfig: EnumThreadPoolConfig_INTERNAL, + ThrottlingPriority: EnumThrottlingPriority_INTERNAL, + ThumbnailSize: EnumThumbnailSize_INTERNAL, + ThumbnailType: EnumThumbnailType_INTERNAL, + TickCountSampleMethod: EnumTickCountSampleMethod_INTERNAL, + TopBottom: EnumTopBottom_INTERNAL, + TouchCameraMovementMode: EnumTouchCameraMovementMode_INTERNAL, + TouchMovementMode: EnumTouchMovementMode_INTERNAL, + TrackerError: EnumTrackerError_INTERNAL, + TrackerExtrapolationFlagMode: EnumTrackerExtrapolationFlagMode_INTERNAL, + TrackerLodFlagMode: EnumTrackerLodFlagMode_INTERNAL, + TrackerLodValueMode: EnumTrackerLodValueMode_INTERNAL, + TrackerMode: EnumTrackerMode_INTERNAL, + TrackerPromptEvent: EnumTrackerPromptEvent_INTERNAL, + TriStateBoolean: EnumTriStateBoolean_INTERNAL, + TweenStatus: EnumTweenStatus_INTERNAL, + UITheme: EnumUITheme_INTERNAL, + UiMessageType: EnumUiMessageType_INTERNAL, + UsageContext: EnumUsageContext_INTERNAL, + UserCFrame: EnumUserCFrame_INTERNAL, + UserInputState: EnumUserInputState_INTERNAL, + UserInputType: EnumUserInputType_INTERNAL, + VRSafetyBubbleMode: EnumVRSafetyBubbleMode_INTERNAL, + VRScaling: EnumVRScaling_INTERNAL, + VRSessionState: EnumVRSessionState_INTERNAL, + VRTouchpad: EnumVRTouchpad_INTERNAL, + VRTouchpadMode: EnumVRTouchpadMode_INTERNAL, + VelocityConstraintMode: EnumVelocityConstraintMode_INTERNAL, + VerticalAlignment: EnumVerticalAlignment_INTERNAL, + VerticalScrollBarPosition: EnumVerticalScrollBarPosition_INTERNAL, + VibrationMotor: EnumVibrationMotor_INTERNAL, + ViewMode: EnumViewMode_INTERNAL, + VirtualCursorMode: EnumVirtualCursorMode_INTERNAL, + VirtualInputMode: EnumVirtualInputMode_INTERNAL, + VoiceChatState: EnumVoiceChatState_INTERNAL, + VolumetricAudio: EnumVolumetricAudio_INTERNAL, + WaterDirection: EnumWaterDirection_INTERNAL, + WaterForce: EnumWaterForce_INTERNAL, + WeldConstraintPreserve: EnumWeldConstraintPreserve_INTERNAL, + WrapLayerAutoSkin: EnumWrapLayerAutoSkin_INTERNAL, + WrapLayerDebugMode: EnumWrapLayerDebugMode_INTERNAL, + WrapTargetDebugMode: EnumWrapTargetDebugMode_INTERNAL, + ZIndexBehavior: EnumZIndexBehavior_INTERNAL, + + UploadSetting: EnumUploadSetting_INTERNAL, + PhysicsSendMethod: EnumPhysicsSendMethod_INTERNAL, + PriorityMethod: EnumPriorityMethod_INTERNAL, + +} & { GetEnums: (self: ENUM_LIST) -> { Enum } } +declare Enum: ENUM_LIST + +declare class Axes + Back: boolean + Bottom: boolean + Front: boolean + Left: boolean + Right: boolean + Top: boolean + X: boolean + Y: boolean + Z: boolean +end + +declare class CatalogSearchParams + AssetTypes: { EnumAssetType } + BundleType: { EnumBundleType } + CategoryFilter: EnumCatalogCategoryFilter + MaxPrice: number + MinPrice: number + SearchKeyword: string + SortType: EnumCatalogSortType +end + +declare class Color3 + B: number + G: number + R: number + function Lerp(self, color: Color3, alpha: number): Color3 + function ToHSV(self): (number, number, number) + function ToHex(self): string +end + +declare class BrickColor + Color: Color3 + Name: string + Number: number + b: number + g: number + r: number +end + +declare class ColorSequenceKeypoint + Time: number + Value: Color3 +end + +declare class ColorSequence + Keypoints: { ColorSequenceKeypoint } +end + +declare class DateTime + UnixTimestamp: number + UnixTimestampMillis: number + function FormatLocalTime(self, format: string, locale: string): string + function FormatUniversalTime(self, format: string, locale: string): string + function ToIsoDate(self): string + function ToLocalTime(self): { any } + function ToUniversalTime(self): { any } +end + +declare class DockWidgetPluginGuiInfo + FloatingXSize: number + FloatingYSize: number + InitialEnabled: boolean + InitialEnabledShouldOverrideRestore: boolean + MinHeight: number + MinWidth: number +end + + + + + +declare class Enums + function GetEnums(self): { Enum } +end + +declare class Faces + Back: boolean + Bottom: boolean + Front: boolean + Left: boolean + Right: boolean + Top: boolean +end + +declare class FloatCurveKey + Interpolation: EnumKeyInterpolationMode + LeftTangent: number + RightTangent: number + Time: number + Value: number +end + +declare class Font + Bold: boolean + Family: string + Style: EnumFontStyle + Weight: EnumFontWeight +end + +declare class NumberRange + Max: number + Min: number +end + +declare class NumberSequenceKeypoint + Envelope: number + Time: number + Value: number +end + +declare class NumberSequence + Keypoints: { NumberSequenceKeypoint } +end + +declare class OverlapParams + CollisionGroup: string + FilterDescendantsInstances: { Instance } + FilterType: EnumRaycastFilterType + MaxParts: number + RespectCanCollide: boolean +end + +declare class PhysicalProperties + Density: number + Elasticity: number + ElasticityWeight: number + Friction: number + FrictionWeight: number +end + +declare class RBXScriptConnection + Connected: boolean + function Disconnect(self): nil +end + + + +declare class RaycastParams + CollisionGroup: string + FilterDescendantsInstances: { Instance } + FilterType: EnumRaycastFilterType + IgnoreWater: boolean + RespectCanCollide: boolean +end + +declare class TweenInfo + DelayTime: number + EasingDirection: EnumEasingDirection + EasingStyle: EnumEasingStyle + RepeatCount: number + Reverses: boolean + Time: number +end + +declare class UDim + Offset: number + Scale: number + function __add(self, other: UDim): UDim + function __sub(self, other: UDim): UDim + function __unm(self): UDim +end + +declare class UDim2 + Height: UDim + Width: UDim + X: UDim + Y: UDim + function Lerp(self, goal: UDim2, alpha: number): UDim2 + function __add(self, other: UDim2): UDim2 + function __sub(self, other: UDim2): UDim2 + function __unm(self): UDim2 +end + +declare class Vector2 + Magnitude: number + magnitude: number + Unit: Vector2 + unit: Vector2 + X: number + Y: number + x: number + y: number + function Cross(self, other: Vector2): number + function Dot(self, v: Vector2): number + function Lerp(self, v: Vector2, alpha: number): Vector2 + function __add(self, other: Vector2): Vector2 + function __div(self, other: Vector2 | number): Vector2 + function __mul(self, other: Vector2 | number): Vector2 + function __sub(self, other: Vector2): Vector2 + function __unm(self): Vector2 +end + +declare class Rect + Height: number + Max: Vector2 + Min: Vector2 + Width: number +end + +declare class Vector2int16 + X: number + Y: number + function __add(self, other: Vector2int16): Vector2int16 + function __div(self, other: Vector2int16 | number): Vector2int16 + function __mul(self, other: Vector2int16 | number): Vector2int16 + function __sub(self, other: Vector2int16): Vector2int16 + function __unm(self): Vector2int16 +end + +declare class Vector3 + Magnitude: number + magnitude: number + Unit: Vector3 + unit: Vector3 + X: number + Y: number + Z: number + function Angle(self, other: Vector3, axis: Vector3?): number + function Cross(self, other: Vector3): Vector3 + function Dot(self, other: Vector3): number + function FuzzyEq(self, other: Vector3, epsilon: number): boolean + function Lerp(self, goal: Vector3, alpha: number): Vector3 + function __add(self, other: Vector3): Vector3 + function __div(self, other: Vector3 | number): Vector3 + function __mul(self, other: Vector3 | number): Vector3 + function __sub(self, other: Vector3): Vector3 + function __unm(self): Vector3 +end + +declare class RaycastResult + Distance: number + Instance: Instance + Material: EnumMaterial + Normal: Vector3 + Position: Vector3 +end + +declare class Ray + Direction: Vector3 + Origin: Vector3 + Unit: Ray + function ClosestPoint(self, point: Vector3): Vector3 + function Distance(self, point: Vector3): number +end + +declare class Random + function Clone(self): Random + function NextInteger(self, min: number, max: number): number + function NextNumber(self): number + function NextNumber(self, min: number, max: number): number + function NextUnitVector(self): Vector3 +end + +declare class PathWaypoint + Action: EnumPathWaypointAction + Position: Vector3 +end + +declare class CFrame + LookVector: Vector3 + Position: Vector3 + RightVector: Vector3 + Rotation: CFrame + UpVector: Vector3 + X: number + XVector: Vector3 + Y: number + YVector: Vector3 + Z: number + ZVector: Vector3 + function GetComponents(self): (number, number, number, number, number, number, number, number, number, number, number, number) + function Inverse(self): CFrame + function Lerp(self, goal: CFrame, alpha: number): CFrame + function Orthonormalize(self): CFrame + function PointToObjectSpace(self, v3: Vector3): Vector3 + function PointToWorldSpace(self, v3: Vector3): Vector3 + function ToAxisAngle(self): (Vector3, number) + function ToEulerAnglesXYZ(self): (number, number, number) + function ToEulerAnglesYXZ(self): (number, number, number) + function ToObjectSpace(self, cf: CFrame): CFrame + function ToOrientation(self): (number, number, number) + function ToWorldSpace(self, cf: CFrame): CFrame + function VectorToObjectSpace(self, v3: Vector3): Vector3 + function VectorToWorldSpace(self, v3: Vector3): Vector3 + function __add(self, other: Vector3): CFrame + function __mul(self, other: CFrame): CFrame + function __mul(self, other: Vector3): Vector3 + function __sub(self, other: Vector3): CFrame +end + +declare class RotationCurveKey + Interpolation: EnumKeyInterpolationMode + LeftTangent: number + RightTangent: number + Time: number + Value: CFrame +end + +declare class Region3 + CFrame: CFrame + Size: Vector3 + function ExpandToGrid(self, Region: number): Region3 +end + +declare class Vector3int16 + X: number + Y: number + Z: number + function __add(self, other: Vector3int16): Vector3int16 + function __div(self, other: Vector3int16 | number): Vector3int16 + function __mul(self, other: Vector3int16 | number): Vector3int16 + function __sub(self, other: Vector3int16): Vector3int16 + function __unm(self): Vector3int16 +end + +declare class Region3int16 + Max: Vector3int16 + Min: Vector3int16 +end + + +export type SharedTable = any +export type OpenCloudModel = any + +export type RBXScriptSignal = { + wait: (self: RBXScriptSignal) -> T..., + connect: (self: RBXScriptSignal, callback: (T...) -> ()) -> RBXScriptConnection, + connectParallel: (self: RBXScriptSignal, callback: (T...) -> ()) -> RBXScriptConnection, + once: (self: RBXScriptSignal, callback: (T...) -> ()) -> RBXScriptConnection, +} + +type HttpRequestOptions = { + Url: string, + Method: "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "CONNECT" | "OPTIONS" | "TRACE" | "PATCH" | nil, + Headers: { [string]: string }?, + Body: string?, +} + +type HttpResponseData = { + Success: boolean, + StatusCode: number, + StatusMessage: string, + Headers: { [string]: string }, + Body: string?, +} + +type HumanoidDescriptionAccessory = { + AssetId: number, + AccessoryType: EnumAccessoryType, + IsLayered: boolean, + Order: number?, + Puffiness: number?, +} + +type Hat = any +type AnalyticsService = any +type RocketPropulsion = any +type Skin = any +type Plane = any +type CustomEvent = any +type CustomEventReceiver = any +type BevelMesh = any +type CylinderMesh = any +type Hole = any +type MotorFeature = any +type FunctionalTest = any +type GuiMain = any +type FloorWire = any +type SelectionPartLasso = any +type SelectionPointLasso = any +type Hopper = any +type RotateP = any +type RotateV = any +type Glue = any +type ManualSurfaceJointInstance = any +type ManualGlue = any +type ManualWeld = any +type Rotate = any +type Snap = any +type JointsService = any +type Message = any +type Hint = any +type FlagStand = any +type SkateboardPlatform = any +type HopperBin = any +type Flag = any +type Status = any +type PointsService = any +type DoubleConstrainedValue = any +type IntConstrainedValue = any + +declare class Instance + AncestryChanged: RBXScriptSignal + Archivable: boolean + AttributeChanged: RBXScriptSignal + Changed: RBXScriptSignal + ChildAdded: RBXScriptSignal + ChildRemoved: RBXScriptSignal + ClassName: string + DescendantAdded: RBXScriptSignal + DescendantRemoving: RBXScriptSignal + Destroying: RBXScriptSignal<> + Name: string + Parent: Instance? + RobloxLocked: boolean + SourceAssetId: number + + VideoRecordingChangeRequest: RBXScriptSignal + + function AddTag(self, tag: string): nil + function ClearAllChildren(self): nil + function Clone(self): Instance + function Destroy(self): nil + function Remove(self): nil + function remove(self): nil + function FindFirstAncestor(self, name: string): Instance? + function FindFirstAncestorOfClass(self, className: string): Instance? + function FindFirstAncestorWhichIsA(self, className: string): Instance? + function FindFirstChild(self, name: string, recursive: boolean?): Instance? + function FindFirstChildOfClass(self, className: string): Instance? + function FindFirstChildWhichIsA(self, className: string, recursive: boolean?): Instance? + function FindFirstDescendant(self, name: string): Instance? + function GetActor(self): Actor? + function GetAttribute(self, attribute: string): any + function GetAttributeChangedSignal(self, attribute: string): RBXScriptSignal<> + function GetAttributes(self): { [string]: any } + function GetChildren(self): { Instance } + function GetDebugId(self, scopeLength: number?): string + function GetDescendants(self): { Instance } + function GetFullName(self): string + function GetPropertyChangedSignal(self, property: string): RBXScriptSignal<> + function GetTags(self): { any } + function HasTag(self, tag: string): boolean + function IsA(self, className: string): boolean + function IsAncestorOf(self, descendant: Instance): boolean + function IsDescendantOf(self, ancestor: Instance): boolean + function IsPropertyModified(self, name: string): boolean + function RemoveTag(self, tag: string): nil + function ResetPropertyToDefault(self, name: string): nil + function SetAttribute(self, attribute: string, value: any): nil + function WaitForChild(self, name: string): Instance + function WaitForChild(self, name: string, timeout: number): Instance? +end + +declare class Accoutrement extends Instance + AttachmentForward: Vector3 + AttachmentPoint: CFrame + AttachmentPos: Vector3 + AttachmentRight: Vector3 + AttachmentUp: Vector3 +end + +declare class Accessory extends Accoutrement + AccessoryType: EnumAccessoryType +end + + + +declare class AdPortal extends Instance + PortalInvalidReason: string + PortalVersion: number + Status: EnumAdUnitStatus + function TeleportConfirmed(self, placeId: number, player: Player): nil + function TeleportRejected(self, shouldCooldown: boolean, rejectedByDistance: boolean): nil +end + +declare class AdService extends Instance + AdTeleportEnded: RBXScriptSignal<> + AdTeleportInitiated: RBXScriptSignal<> + PortalPrompt: RBXScriptSignal + function GetAdTeleportInfo(self): any + function GetReportAdInfo(self): { any } + function ReturnToPublisherExperience(self, adTeleportMethod: EnumAdTeleportMethod): nil +end + +declare class AdvancedDragger extends Instance +end + + + +declare class Animation extends Instance + AnimationId: Content +end + +declare class AnimationClip extends Instance + Guid: string + Loop: boolean + Priority: EnumAnimationPriority +end + +declare class CurveAnimation extends AnimationClip +end + +declare class KeyframeSequence extends AnimationClip + AuthoredHipHeight: number + function AddKeyframe(self, keyframe: Keyframe): nil + function GetKeyframes(self): { Instance } + function RemoveKeyframe(self, keyframe: Keyframe): nil +end + +declare class AnimationClipProvider extends Instance + function GetAnimationClipAsync(self, assetId: Content): AnimationClip + function GetAnimations(self, userId: number): Instance + function GetMemStats(self): { [any]: any } + function RegisterActiveAnimationClip(self, animationClip: AnimationClip): Content + function RegisterAnimationClip(self, animationClip: AnimationClip): Content +end + +declare class AnimationController extends Instance +end + +declare class AnimationFromVideoCreatorService extends Instance + function CreateJob(self, filePath: string): string + function DownloadJobResult(self, jobId: string, outputFilePath: string): string + function FullProcess(self, videoFilePath: string, progressCallback: ((...any) -> ...any)): string + function GetJobStatus(self, jobId: string): string +end + +declare class AnimationFromVideoCreatorStudioService extends Instance + function CreateAnimationByUploadingVideo(self, progressCallback: ((...any) -> ...any)): string + function ImportVideoWithPrompt(self): string + function IsAgeRestricted(self): boolean +end + +declare class AnimationRigData extends Instance + function LoadFromHumanoid(self, humanoid: Instance): boolean +end + +declare class AnimationStreamTrack extends Instance + Animation: TrackerStreamAnimation + IsPlaying: boolean + Priority: EnumAnimationPriority + Stopped: RBXScriptSignal<> + WeightCurrent: number + WeightTarget: number + function AdjustWeight(self, weight: number?, fadeTime: number?): nil + function GetTrackerData(self): any + function Play(self, fadeTime: number?, weight: number?): nil + function Stop(self, fadeTime: number?): nil + function TogglePause(self, paused: boolean): nil +end + +declare class AnimationTrack extends Instance + Animation: Animation + DidLoop: RBXScriptSignal<> + Ended: RBXScriptSignal<> + IsPlaying: boolean + KeyframeReached: RBXScriptSignal + Length: number + Looped: boolean + Priority: EnumAnimationPriority + Speed: number + Stopped: RBXScriptSignal<> + TimePosition: number + WeightCurrent: number + WeightTarget: number + function AdjustSpeed(self, speed: number?): nil + function AdjustWeight(self, weight: number?, fadeTime: number?): nil + function GetMarkerReachedSignal(self, name: string): RBXScriptSignal + function GetTimeOfKeyframe(self, keyframeName: string): number + function Play(self, fadeTime: number?, weight: number?, speed: number?): nil + function Stop(self, fadeTime: number?): nil +end + +declare class Animator extends Instance + AnimationPlayed: RBXScriptSignal + AnimationPlayedCoreScript: RBXScriptSignal + AnimationStreamTrackPlayed: RBXScriptSignal + EvaluationThrottled: boolean + PreferLodEnabled: boolean + function ApplyJointVelocities(self, motors: any): nil + function GetPlayingAnimationTracks(self): { AnimationTrack } + function GetPlayingAnimationTracksCoreScript(self): { any } + function LoadAnimation(self, animation: Animation): AnimationTrack + function LoadAnimationCoreScript(self, animation: Animation): AnimationTrack + function LoadStreamAnimation(self, animation: TrackerStreamAnimation): AnimationStreamTrack + function LoadStreamAnimationForSelfieView_deprecated(self, animation: TrackerStreamAnimation, player: Player): AnimationStreamTrack + function StepAnimations(self, deltaTime: number): nil +end + +declare class AppUpdateService extends Instance + function CheckForUpdate(self, handler: ((...any) -> ...any)?): nil + function DisableDUAR(self): nil + function DisableDUARAndOpenSurvey(self, surveyUrl: string): nil + function PerformManagedUpdate(self): boolean +end + +declare class AssetCounterService extends Instance +end + +declare class AssetDeliveryProxy extends Instance + Interface: string + Port: number + StartServer: boolean +end + +declare class AssetImportService extends Instance + function GetAllTemplates(self): { [any]: any } + function GetTemplate(self, name: string): { [any]: any } + function PickFileWithPrompt(self): string + function PickMultipleFilesWithPrompt(self): { any } + function RemoveTemplate(self, name: string): nil + function SaveTemplate(self, name: string, importTemplate: { [any]: any }): nil + function StartSessionWithPath(self, filePath: string): AssetImportSession + function StartSessionWithPrompt(self): AssetImportSession +end + +declare class AssetImportSession extends Instance + UploadComplete: RBXScriptSignal<{ [any]: any }> + UploadCompleteDeprecated: RBXScriptSignal + UploadProgress: RBXScriptSignal + function ApplySettings(self): nil + function ApplyTemplate(self, template: { [any]: any }): nil + function Cancel(self): nil + function GetCurrentStatusTable(self): { [any]: any } + function GetFilename(self): string + function GetImportTree(self): Instance + function GetInstance(self, nodeId: number): Instance + function GetRigVisualization(self): Instance + function HasAnimation(self): boolean + function IsAvatar(self): boolean + function IsGltf(self): boolean + function IsR15(self): boolean + function Reset(self): nil + function Upload(self): nil + function usesCustomRestPoseLua(self): boolean +end + +declare class AssetManagerService extends Instance + AssetImportedSignal: RBXScriptSignal + ImportSessionFinished: RBXScriptSignal<> + ImportSessionStarted: RBXScriptSignal<> + MayBeLinkedSourceModified: RBXScriptSignal + function AddNewPlace(self): number + function CreateAlias(self, assetType: number, assetId: number, aliasName: string): nil + function DeleteAlias(self, aliasName: string): nil + function GetMeshIdFromAliasName(self, aliasName: string): number + function GetMeshIdFromAssetId(self, assetId: number): number + function GetTextureIdFromAliasName(self, aliasName: string): number + function GetTextureIdFromAssetId(self, assetId: number): number + function HasUnpublishedChangesForLinkedSource(self, aliasName: string): boolean + function InsertAudio(self, assetId: number, assetName: string): nil + function InsertImage(self, assetId: number): nil + function InsertLinkedSourceAsLocalScript(self, aliasName: string): nil + function InsertLinkedSourceAsModuleScript(self, aliasName: string): nil + function InsertLinkedSourceAsScript(self, aliasName: string): nil + function InsertMesh(self, aliasName: string, insertWithLocation: boolean): nil + function InsertMeshesWithLocation(self, aliasNames: { any }): nil + function InsertModel(self, modelId: number): nil + function InsertPackage(self, packageId: number): nil + function InsertVideo(self, assetId: number, assetName: string): nil + function OpenLinkedSource(self, aliasName: string): nil + function OpenPlace(self, placeId: number): nil + function PublishLinkedSource(self, assetId: number, aliasName: string): nil + function RefreshLinkedSource(self, aliasName: string): nil + function RemovePlace(self, placeId: number): nil + function RenameAlias(self, assetType: number, assetId: number, oldAliasName: string, newAliasName: string): nil + function RenameModel(self, modelId: number, newName: string): nil + function RenamePlace(self, placeId: number, newName: string): nil + function RevertLinkedSourceToLastPublishedVersion(self, aliasName: string): nil + function ShowPackageDetails(self, packageId: number): nil + function UpdateAllPackages(self, packageId: number): nil + function ViewPackageOnWebsite(self, packageId: number): nil +end + +declare class AssetPatchSettings extends Instance + ContentId: string + OutputPath: string + PatchId: string +end + +declare class AssetService extends Instance + OpenCreateResultModal: RBXScriptSignal + OpenPublishResultModal: RBXScriptSignal + function CreatePlaceAsync(self, placeName: string, templatePlaceID: number, description: string?): number + function CreatePlaceInPlayerInventoryAsync(self, player: Player, placeName: string, templatePlaceID: number, description: string?): number + function DeserializeInstance(self, serializedInstance: string): Instance + function GetAssetIdsForPackage(self, packageAssetId: number): { any } + function GetBundleDetailsAsync(self, bundleId: number): { [any]: any } + function GetBundleDetailsSync(self, bundleId: number): { [any]: any } + function GetGamePlacesAsync(self): Instance + function LoadImageAsync(self, textureId: Content): DynamicImage + function PromptCreateAssetAsync(self, player: Player, instance: Instance, assetType: EnumAssetType): any + function RegisterUGCValidationFunction(self, func: ((...any) -> ...any)): nil + function SavePlaceAsync(self): nil + function SearchAudio(self, searchParameters: AudioSearchParams): AudioPages +end + +declare class Atmosphere extends Instance + Color: Color3 + Decay: Color3 + Density: number + Glare: number + Haze: number + Offset: number +end + +declare class Attachment extends Instance + Axis: Vector3 + CFrame: CFrame + Orientation: Vector3 + Position: Vector3 + SecondaryAxis: Vector3 + Visible: boolean + WorldAxis: Vector3 + WorldCFrame: CFrame + WorldOrientation: Vector3 + WorldPosition: Vector3 + WorldSecondaryAxis: Vector3 + function GetConstraints(self): { Instance } +end + +declare class Bone extends Attachment + Transform: CFrame + TransformedCFrame: CFrame + TransformedWorldCFrame: CFrame +end + +declare class AudioAnalyzer extends Instance + PeakLevel: number + RmsLevel: number + function GetSpectrum(self): { any } +end + +declare class AudioChorus extends Instance + Depth: number + Mix: number + Rate: number +end + +declare class AudioCompressor extends Instance + Attack: number + MakeupGain: number + Ratio: number + Release: number + Threshold: number +end + +declare class AudioDeviceInput extends Instance + AccessType: EnumAccessModifierType + Active: boolean + IsReady: boolean + Muted: boolean + Player: Player + function GetUserIdAccessList(self): { any } + function SetUserIdAccessList(self, userIds: { any }): nil +end + +declare class AudioDeviceOutput extends Instance + Player: Player +end + +declare class AudioDistortion extends Instance + Level: number +end + +declare class AudioEcho extends Instance + DelayTime: number + DryLevel: number + Feedback: number + WetLevel: number +end + +declare class AudioEmitter extends Instance + AudioInteractionGroup: string +end + +declare class AudioEqualizer extends Instance + HighGain: number + LowGain: number + MidGain: number + MidRange: NumberRange +end + +declare class AudioFader extends Instance + Volume: number +end + +declare class AudioFlanger extends Instance + Depth: number + Mix: number + Rate: number +end + +declare class AudioListener extends Instance + AudioInteractionGroup: string +end + +declare class AudioPitchShifter extends Instance + Pitch: number +end + +declare class AudioPlayer extends Instance + AssetId: string + AutoLoad: boolean + IsPlaying: boolean + IsReady: boolean + LoopRegion: NumberRange + Looping: boolean + PlaybackRegion: NumberRange + PlaybackSpeed: number + TimeLength: number + TimePosition: number + function Play(self): nil + function Stop(self): nil +end + +declare class AudioReverb extends Instance + DecayRatio: number + DecayTime: number + Density: number + Diffusion: number + DryLevel: number + EarlyDelayTime: number + HighCutFrequency: number + LateDelayTime: number + LowShelfFrequency: number + LowShelfGain: number + ReferenceFrequency: number + WetLevel: number +end + +declare class AudioSearchParams extends Instance + Album: string + Artist: string + AudioSubType: EnumAudioSubType + MaxDuration: number + MinDuration: number + SearchKeyword: string + Tag: string + Title: string +end + +declare class AvatarChatService extends Instance + ClientFeatures: number + ClientFeaturesInitialized: boolean + ServerFeatures: number + function GetClientFeaturesAsync(self): number + function GetServerFeaturesAsync(self): number + function IsEnabled(self, mask: number, feature: EnumAvatarChatServiceFeature): boolean + function IsPlaceEnabled(self): boolean + function IsUniverseEnabled(self): boolean + function PollClientFeatures(self): number + function PollServerFeatures(self): number +end + +declare class AvatarEditorService extends Instance + OpenAllowInventoryReadAccess: RBXScriptSignal<> + OpenPromptCreateOufit: RBXScriptSignal + OpenPromptDeleteOutfit: RBXScriptSignal + OpenPromptRenameOutfit: RBXScriptSignal + OpenPromptSaveAvatar: RBXScriptSignal + OpenPromptSetFavorite: RBXScriptSignal + OpenPromptUpdateOutfit: RBXScriptSignal + PromptAllowInventoryReadAccessCompleted: RBXScriptSignal + PromptCreateOutfitCompleted: RBXScriptSignal + PromptDeleteOutfitCompleted: RBXScriptSignal + PromptRenameOutfitCompleted: RBXScriptSignal + PromptSaveAvatarCompleted: RBXScriptSignal + PromptSaveAvatarThumbnailCustomizationCompleted: RBXScriptSignal + PromptSetFavoriteCompleted: RBXScriptSignal + PromptUpdateOutfitCompleted: RBXScriptSignal + function CheckApplyDefaultClothing(self, humanoidDescription: HumanoidDescription): HumanoidDescription + function ConformToAvatarRules(self, humanoidDescription: HumanoidDescription): HumanoidDescription + function GetAccessoryType(self, avatarAssetType: EnumAvatarAssetType): EnumAccessoryType + function GetAvatarRules(self): { [any]: any } + function GetBatchItemDetails(self, itemIds: { any }, itemType: EnumAvatarItemType): { any } + function GetFavorite(self, itemId: number, itemType: EnumAvatarItemType): boolean + function GetInventory(self, assetTypes: { any }): InventoryPages + function GetItemDetails(self, itemId: number, itemType: EnumAvatarItemType): { [any]: any } + function GetOutfitDetails(self, outfitId: number): { [any]: any } + function GetOutfits(self, outfitSource: EnumOutfitSource?, outfitType: EnumOutfitType?): OutfitPages + function GetRecommendedAssets(self, assetType: EnumAvatarAssetType, contextAssetId: number?): { any } + function GetRecommendedBundles(self, bundleId: number): { any } + function NoPromptCreateOutfit(self, humanoidDescription: HumanoidDescription, rigType: EnumHumanoidRigType, name: string): boolean + function NoPromptDeleteOutfit(self, outfitId: number): boolean + function NoPromptRenameOutfit(self, outfitId: number, name: string): boolean + function NoPromptSaveAvatar(self, humanoidDescription: HumanoidDescription, rigType: EnumHumanoidRigType, saveDict: { [any]: any }, gearAssetId: number?): boolean + function NoPromptSaveAvatarThumbnailCustomization(self, thumbnailType: EnumAvatarThumbnailCustomizationType, emoteAssetId: number, cameraDistanceScale: number, yRotDeg: number, fieldOfViewDeg: number?): boolean + function NoPromptSetFavorite(self, itemId: number, itemType: EnumAvatarItemType, shouldFavorite: boolean): boolean + function NoPromptUpdateOutfit(self, outfitId: number, humanoidDescription: HumanoidDescription, rigType: EnumHumanoidRigType): boolean + function PerformCreateOutfitWithDescription(self, humanoidDescription: HumanoidDescription, name: string): nil + function PerformDeleteOutfit(self): nil + function PerformRenameOutfit(self, name: string): nil + function PerformSaveAvatarWithDescription(self, humanoidDescription: HumanoidDescription, addedAssets: { any }, removedAssets: { any }): nil + function PerformSetFavorite(self): nil + function PerformUpdateOutfit(self, humanoidDescription: HumanoidDescription): nil + function PromptAllowInventoryReadAccess(self): nil + function PromptCreateOutfit(self, outfit: HumanoidDescription, rigType: EnumHumanoidRigType): nil + function PromptDeleteOutfit(self, outfitId: number): nil + function PromptRenameOutfit(self, outfitId: number): nil + function PromptSaveAvatar(self, humanoidDescription: HumanoidDescription, rigType: EnumHumanoidRigType): nil + function PromptSetFavorite(self, itemId: number, itemType: EnumAvatarItemType, shouldFavorite: boolean): nil + function PromptUpdateOutfit(self, outfitId: number, updatedOutfit: HumanoidDescription, rigType: EnumHumanoidRigType): nil + function SearchCatalog(self, searchParameters: CatalogSearchParams): CatalogPages + function SetAllowInventoryReadAccess(self, inventoryReadAccessGranted: boolean): nil + function SignalCreateOutfitFailed(self): nil + function SignalCreateOutfitPermissionDenied(self): nil + function SignalDeleteOutfitFailed(self): nil + function SignalDeleteOutfitPermissionDenied(self): nil + function SignalRenameOutfitFailed(self): nil + function SignalRenameOutfitPermissionDenied(self): nil + function SignalSaveAvatarFailed(self): nil + function SignalSaveAvatarPermissionDenied(self): nil + function SignalSetFavoriteFailed(self): nil + function SignalSetFavoritePermissionDenied(self): nil + function SignalUpdateOutfitFailed(self): nil + function SignalUpdateOutfitPermissionDenied(self): nil +end + +declare class AvatarImportService extends Instance + function ImportFBXAnimationFromFilePathUserMayChooseModel(self, fbxFilePath: string, selectedRig: Instance, userChooseModelThenImportCB: ((...any) -> ...any)): Instance + function ImportFBXAnimationUserMayChooseModel(self, selectedRig: Instance, userChooseModelThenImportCB: ((...any) -> ...any)): Instance + function ImportFbxRigWithoutSceneLoad(self, isR15: boolean?): Instance + function ImportLoadedFBXAnimation(self, useFBXModel: boolean): Instance + function LoadRigAndDetectType(self, promptR15Callback: ((...any) -> ...any)): Instance +end + +declare class Backpack extends Instance + function SetOldSchoolBackpack(self, enabled: boolean): nil +end + +declare class BadgeService extends Instance + BadgeAwarded: RBXScriptSignal + OnBadgeAwarded: RBXScriptSignal + function AwardBadge(self, userId: number, badgeId: number): boolean + function GetBadgeInfoAsync(self, badgeId: number): { [any]: any } + function UserHasBadgeAsync(self, userId: number, badgeId: number): boolean +end + +declare class BaseImportData extends Instance + Id: string + ImportName: string + ShouldImport: boolean + function CreateTemplateFromData(self): { [any]: any } + function GetStatuses(self): { [any]: any } +end + +declare class AnimationImportData extends BaseImportData +end + +declare class FacsImportData extends BaseImportData +end + +declare class GroupImportData extends BaseImportData + Anchored: boolean + ImportAsModelAsset: boolean + InsertInWorkspace: boolean +end + +declare class JointImportData extends BaseImportData +end + +declare class MaterialImportData extends BaseImportData + DiffuseFilePath: string + IsPbr: boolean + MetalnessFilePath: string + NormalFilePath: string + RoughnessFilePath: string +end + +declare class MeshImportData extends BaseImportData + Anchored: boolean + CageManifold: boolean + CageMeshIntersectedPreview: boolean + CageMeshNotIntersected: boolean + CageNoOverlappingVertices: boolean + CageNonManifoldPreview: boolean + CageOverlappingVerticesPreview: boolean + CageUVMatched: boolean + CageUVMisMatchedPreview: boolean + Dimensions: Vector3 + DoubleSided: boolean + IgnoreVertexColors: boolean + IrrelevantCageModifiedPreview: boolean + MeshHoleDetectedPreview: boolean + MeshNoHoleDetected: boolean + NoIrrelevantCageModified: boolean + NoOuterCageFarExtendedFromMesh: boolean + OuterCageFarExtendedFromMeshPreview: boolean + PolygonCount: number + UseImportedPivot: boolean +end + +declare class RootImportData extends BaseImportData + AddModelToInventory: boolean + Anchored: boolean + AnimationIdForRestPose: number + ExistingPackageId: string + FileDimensions: Vector3 + ImportAsModelAsset: boolean + ImportAsPackage: boolean + InsertInWorkspace: boolean + InsertWithScenePosition: boolean + InvertNegativeFaces: boolean + MergeMeshes: boolean + PolygonCount: number + RestPose: EnumRestPose + RigScale: EnumRigScale + RigType: EnumRigType + RigVisualization: boolean + ScaleUnit: EnumMeshScaleUnit + UseSceneOriginAsCFrame: boolean + UseSceneOriginAsPivot: boolean + UsesCages: boolean + WorldForward: EnumNormalId + WorldUp: EnumNormalId +end + +declare class BasePlayerGui extends Instance + function GetGuiObjectsAtPosition(self, x: number, y: number): { GuiObject } + function GetGuiObjectsInCircle(self, position: Vector2, radius: number): { GuiObject } +end + +declare class CoreGui extends BasePlayerGui + SelectionImageObject: GuiObject + UserGuiRenderingChanged: RBXScriptSignal + Version: number + RobloxGui: any + function SetUserGuiRendering(self, enabled: boolean, guiAdornee: Instance, faceId: EnumNormalId, horizontalCurvature: number?): nil + function TakeScreenshot(self): nil + function ToggleRecording(self): nil +end + +declare class PlayerGui extends BasePlayerGui + CurrentScreenOrientation: EnumScreenOrientation + ScreenOrientation: EnumScreenOrientation + SelectionImageObject: GuiObject +end + +declare class StarterGui extends BasePlayerGui + CoreGuiChangedSignal: RBXScriptSignal + ProcessUserInput: boolean + RtlTextSupport: EnumRtlTextSupport + ScreenOrientation: EnumScreenOrientation + ShowDevelopmentGui: boolean + VirtualCursorMode: EnumVirtualCursorMode + function GetCore(self, parameterName: string): any + function GetCoreGuiEnabled(self, coreGuiType: EnumCoreGuiType): boolean + function RegisterGetCore(self, parameterName: string, getFunction: ((...any) -> ...any)): nil + function RegisterSetCore(self, parameterName: string, setFunction: ((...any) -> ...any)): nil + function SetCore(self, parameterName: string, value: any): nil + function SetCoreGuiEnabled(self, coreGuiType: EnumCoreGuiType, enabled: boolean): nil +end + +declare class BaseWrap extends Instance + CageMeshId: Content + CageOrigin: CFrame + CageOriginWorld: CFrame + HSRAssetId: Content + ImportOrigin: CFrame + ImportOriginWorld: CFrame + function GetFaces(self, cageType: EnumCageType): { any } + function GetVertices(self, cageType: EnumCageType): { any } + function IsHSRReady(self): boolean + function ModifyVertices(self, cageType: EnumCageType, vertices: { any }): nil +end + +declare class WrapLayer extends BaseWrap + AutoSkin: EnumWrapLayerAutoSkin + BindOffset: CFrame + Color: Color3 + DebugMode: EnumWrapLayerDebugMode + Enabled: boolean + Order: number + Puffiness: number + ReferenceMeshId: Content + ReferenceOrigin: CFrame + ReferenceOriginWorld: CFrame + ShrinkFactor: number +end + +declare class WrapTarget extends BaseWrap + Color: Color3 + DebugMode: EnumWrapTargetDebugMode + Stiffness: number +end + +declare class Beam extends Instance + Attachment0: Attachment + Attachment1: Attachment + Brightness: number + Color: ColorSequence + CurveSize0: number + CurveSize1: number + Enabled: boolean + FaceCamera: boolean + LightEmission: number + LightInfluence: number + Segments: number + Texture: Content + TextureLength: number + TextureMode: EnumTextureMode + TextureSpeed: number + Transparency: NumberSequence + Width0: number + Width1: number + ZOffset: number + function SetTextureOffset(self, offset: number?): nil +end + +declare class BindableEvent extends Instance + Event: RBXScriptSignal<...any> + function Fire(self, ...: any): () +end + +declare class BindableFunction extends Instance + OnInvoke: (...any) -> ...any + function Invoke(self, ...: any): ...any +end + +declare class BodyMover extends Instance +end + +declare class BodyAngularVelocity extends BodyMover + AngularVelocity: Vector3 + MaxTorque: Vector3 + P: number +end + +declare class BodyForce extends BodyMover + Force: Vector3 +end + +declare class BodyGyro extends BodyMover + CFrame: CFrame + D: number + MaxTorque: Vector3 + P: number +end + +declare class BodyPosition extends BodyMover + D: number + MaxForce: Vector3 + P: number + Position: Vector3 + ReachedTarget: RBXScriptSignal<> + function GetLastForce(self): Vector3 +end + +declare class BodyThrust extends BodyMover + Force: Vector3 + Location: Vector3 +end + +declare class BodyVelocity extends BodyMover + MaxForce: Vector3 + P: number + Velocity: Vector3 + function GetLastForce(self): Vector3 + function lastForce(self): Vector3 +end + + + +declare class Breakpoint extends Instance + Condition: string + ContinueExecution: boolean + Enabled: boolean + Id: number + Line: number + LogMessage: string + MetaBreakpointId: number + RemoveOnHit: boolean + Script: string + Valid: boolean + Verified: boolean +end + +declare class BrowserService extends Instance + AuthCookieCopiedToEngine: RBXScriptSignal<> + BrowserWindowClosed: RBXScriptSignal<> + BrowserWindowWillNavigate: RBXScriptSignal + JavaScriptCallback: RBXScriptSignal + function CloseBrowserWindow(self): nil + function CopyAuthCookieFromBrowserToEngine(self): nil + function EmitHybridEvent(self, moduleName: string, eventName: string, params: string): nil + function ExecuteJavaScript(self, javascript: string): nil + function OpenBrowserWindow(self, url: string): nil + function OpenNativeOverlay(self, title: string, url: string): nil + function OpenWeChatAuthWindow(self): nil + function ReturnToJavaScript(self, callbackId: string, success: boolean, params: string): nil + function SendCommand(self, command: string): nil +end + +declare class BubbleChatMessageProperties extends Instance + BackgroundColor3: Color3 + BackgroundTransparency: number + FontFace: Font + TextColor3: Color3 + TextSize: number +end + +declare class BulkImportService extends Instance + AssetImported: RBXScriptSignal + BulkImportFinished: RBXScriptSignal + BulkImportStarted: RBXScriptSignal<> + function LaunchBulkImport(self, assetTypeToImport: number): nil + function ShowBulkImportView(self): nil +end + +declare class CacheableContentProvider extends Instance +end + +declare class HSRDataContentProvider extends CacheableContentProvider +end + +declare class MeshContentProvider extends CacheableContentProvider + function GetContentMemoryData(self): { [any]: any } +end + +declare class SolidModelContentProvider extends CacheableContentProvider +end + +declare class CalloutService extends Instance + function AttachCallout(self, definitionId: string, locationId: string, target: Instance): nil + function DefineCallout(self, definitionId: string, title: string, description: string, learnMoreURL: string): nil + function DetachCalloutsByDefinitionId(self, definitionId: string): nil +end + +declare class Camera extends Instance + CFrame: CFrame + CameraSubject: Humanoid | BasePart | nil + CameraType: EnumCameraType + DiagonalFieldOfView: number + FieldOfView: number + FieldOfViewMode: EnumFieldOfViewMode + FirstPersonTransition: RBXScriptSignal + Focus: CFrame + HeadLocked: boolean + HeadScale: number + InterpolationFinished: RBXScriptSignal<> + MaxAxisFieldOfView: number + NearPlaneZ: number + VRTiltAndRollEnabled: boolean + ViewportSize: Vector2 + function GetPartsObscuringTarget(self, castPoints: { Vector3 }, ignoreList: { Instance }): { BasePart } + function GetRenderCFrame(self): CFrame + function GetRoll(self): number + function ScreenPointToRay(self, x: number, y: number, depth: number?): Ray + function SetCameraPanMode(self, mode: EnumCameraPanMode?): nil + function SetImageServerView(self, modelCoord: CFrame): nil + function SetRoll(self, rollAngle: number): nil + function ViewportPointToRay(self, x: number, y: number, depth: number?): Ray + function WorldToScreenPoint(self, worldPoint: Vector3): (Vector3, boolean) + function WorldToViewportPoint(self, worldPoint: Vector3): (Vector3, boolean) + function Zoom(self, distance: number): boolean + function ZoomToExtents(self, boundingBoxCFrame: CFrame, boundingBoxSize: Vector3): nil +end + +declare class CaptureService extends Instance + CaptureSaved: RBXScriptSignal<{ [any]: any }> + function GetCaptureSizeAsync(self, captureContentId: Content): Vector2 + function RetrieveCaptures(self): { any } + function SaveScreenshotCapture(self): nil +end + +declare class ChangeHistoryService extends Instance + OnRecordingFinished: RBXScriptSignal + OnRecordingStarted: RBXScriptSignal + OnRedo: RBXScriptSignal + OnUndo: RBXScriptSignal + function FinishRecording(self, identifier: string, operation: EnumFinishRecordingOperation, finalOptions: { [any]: any }?): nil + function GetCanRedo(self): any + function GetCanUndo(self): any + function IsRecordingInProgress(self, identifier: string?): boolean + function Redo(self): nil + function ResetWaypoints(self): nil + function SetEnabled(self, state: boolean): nil + function SetWaypoint(self, name: string): nil + function TryBeginRecording(self, name: string, displayName: string?): string? + function Undo(self): nil +end + +declare class CharacterAppearance extends Instance +end + +declare class BodyColors extends CharacterAppearance + HeadColor3: Color3 + HeadColor: BrickColor + LeftArmColor3: Color3 + LeftArmColor: BrickColor + LeftLegColor3: Color3 + LeftLegColor: BrickColor + RightArmColor3: Color3 + RightArmColor: BrickColor + RightLegColor3: Color3 + RightLegColor: BrickColor + TorsoColor3: Color3 + TorsoColor: BrickColor +end + +declare class CharacterMesh extends CharacterAppearance + BaseTextureId: number + BodyPart: EnumBodyPart + MeshId: number + OverlayTextureId: number +end + +declare class Clothing extends CharacterAppearance + Color3: Color3 +end + +declare class Pants extends Clothing + PantsTemplate: Content +end + +declare class Shirt extends Clothing + ShirtTemplate: Content +end + +declare class ShirtGraphic extends CharacterAppearance + Color3: Color3 + Graphic: Content +end + + + +declare class Chat extends Instance + BubbleChatEnabled: boolean + BubbleChatSettingsChanged: RBXScriptSignal + Chatted: RBXScriptSignal + LoadDefaultChat: boolean + function CanUserChatAsync(self, userId: number): boolean + function CanUsersChatAsync(self, userIdFrom: number, userIdTo: number): boolean + function Chat(self, partOrCharacter: Instance, message: string, color: EnumChatColor?): nil + function ChatLocal(self, partOrCharacter: Instance, message: string, color: EnumChatColor?): nil + function FilterStringAsync(self, stringToFilter: string, playerFrom: Player, playerTo: Player): string + function FilterStringForBroadcast(self, stringToFilter: string, playerFrom: Player): string + function GetShouldUseLuaChat(self): boolean + function InvokeChatCallback(self, callbackType: EnumChatCallbackType, callbackArguments: any): any + function RegisterChatCallback(self, callbackType: EnumChatCallbackType, callbackFunction: ((...any) -> ...any)): nil + function SetBubbleChatSettings(self, settings: any): nil +end + +declare class ChatbotUIService extends Instance +end + +declare class ClickDetector extends Instance + CursorIcon: Content + MaxActivationDistance: number + MouseClick: RBXScriptSignal + MouseHoverEnter: RBXScriptSignal + MouseHoverLeave: RBXScriptSignal + RightMouseClick: RBXScriptSignal +end + +declare class DragDetector extends ClickDetector + ActivatedCursorIcon: Content + ApplyAtCenterOfMass: boolean + Axis: Vector3 + DragContinue: RBXScriptSignal + DragEnd: RBXScriptSignal + DragFrame: CFrame + DragStart: RBXScriptSignal + DragStyle: EnumDragDetectorDragStyle + Enabled: boolean + GamepadModeSwitchKeyCode: EnumKeyCode + KeyboardModeSwitchKeyCode: EnumKeyCode + MaxDragAngle: number + MaxDragTranslation: Vector3 + MaxForce: number + MaxTorque: number + MinDragAngle: number + MinDragTranslation: Vector3 + Orientation: Vector3 + ReferenceInstance: Instance + ResponseStyle: EnumDragDetectorResponseStyle + Responsiveness: number + RunLocally: boolean + SecondaryAxis: Vector3 + TrackballRadialPullFactor: number + TrackballRollFactor: number + VRSwitchKeyCode: EnumKeyCode + WorldAxis: Vector3 + WorldSecondaryAxis: Vector3 + function AddConstraintFunction(self, priority: number, func: ((...any) -> ...any)): RBXScriptConnection + function GetReferenceFrame(self): CFrame + function RestartDrag(self): nil + function SetDragStyleFunction(self, func: ((...any) -> ...any)): nil +end + +declare class Clouds extends Instance + Color: Color3 + Cover: number + Density: number + Enabled: boolean +end + +declare class ClusterPacketCache extends Instance +end + +declare class Collaborator extends Instance + CFrame: CFrame + UserId: number + Username: string +end + +declare class CollaboratorsService extends Instance +end + +declare class CollectionService extends Instance + TagAdded: RBXScriptSignal + ItemAdded: RBXScriptSignal + TagRemoved: RBXScriptSignal + ItemRemoved: RBXScriptSignal + function AddTag(self, instance: Instance, tag: string): nil + function GetAllTags(self): { string } + function GetInstanceAddedSignal(self, tag: string): RBXScriptSignal + function GetInstanceRemovedSignal(self, tag: string): RBXScriptSignal + function GetCollection(self, tag: string): { Instance } + function GetTagged(self, tag: string): { Instance } + function GetTags(self, instance: Instance): { string } + function HasTag(self, instance: Instance, tag: string): boolean + function RemoveTag(self, instance: Instance, tag: string): nil +end + +declare class CommandInstance extends Instance + AllowGUIAccessPoints: boolean + Checked: boolean + DefaultShortcut: string + DisplayName: string + Enabled: boolean + Icon: string + Name: string + Permission: EnumCommandPermission + StatusTip: string + function EnableGuiAccess(self, displayName: string, statusTip: string, defaultShortcut: string): nil + function RegisterExecutionCallback(self, callbackFunction: ((...any) -> ...any)): nil +end + +declare class CommandService extends Instance + CommandExecuting: RBXScriptSignal + function Execute(self, name: string, params: any): any + function RegisterCommand(self, plugin: Plugin, name: string, context: string, permission: EnumCommandPermission?): CommandInstance +end + +declare class Configuration extends Instance +end + +declare class ConfigureServerService extends Instance +end + +declare class Constraint extends Instance + Active: boolean + Attachment0: Attachment + Attachment1: Attachment + Color: BrickColor + Enabled: boolean + Visible: boolean +end + +declare class AlignOrientation extends Constraint + AlignType: EnumAlignType + CFrame: CFrame + LookAtPosition: Vector3 + MaxAngularVelocity: number + MaxTorque: number + Mode: EnumOrientationAlignmentMode + PrimaryAxis: Vector3 + PrimaryAxisOnly: boolean + ReactionTorqueEnabled: boolean + Responsiveness: number + RigidityEnabled: boolean + SecondaryAxis: Vector3 +end + +declare class AlignPosition extends Constraint + ApplyAtCenterOfMass: boolean + ForceLimitMode: EnumForceLimitMode + ForceRelativeTo: EnumActuatorRelativeTo + MaxAxesForce: Vector3 + MaxForce: number + MaxVelocity: number + Mode: EnumPositionAlignmentMode + Position: Vector3 + ReactionForceEnabled: boolean + Responsiveness: number + RigidityEnabled: boolean +end + +declare class AngularVelocity extends Constraint + AngularVelocity: Vector3 + MaxTorque: number + ReactionTorqueEnabled: boolean + RelativeTo: EnumActuatorRelativeTo +end + +declare class AnimationConstraint extends Constraint + IsKinematic: boolean + MaxForce: number + MaxTorque: number + Transform: CFrame +end + +declare class BallSocketConstraint extends Constraint + LimitsEnabled: boolean + MaxFrictionTorque: number + Radius: number + Restitution: number + TwistLimitsEnabled: boolean + TwistLowerAngle: number + TwistUpperAngle: number + UpperAngle: number +end + +declare class HingeConstraint extends Constraint + ActuatorType: EnumActuatorType + AngularResponsiveness: number + AngularSpeed: number + AngularVelocity: number + CurrentAngle: number + LimitsEnabled: boolean + LowerAngle: number + MotorMaxAcceleration: number + MotorMaxTorque: number + Radius: number + Restitution: number + ServoMaxTorque: number + TargetAngle: number + UpperAngle: number +end + +declare class LineForce extends Constraint + ApplyAtCenterOfMass: boolean + InverseSquareLaw: boolean + Magnitude: number + MaxForce: number + ReactionForceEnabled: boolean +end + +declare class LinearVelocity extends Constraint + ForceLimitMode: EnumForceLimitMode + LineDirection: Vector3 + LineVelocity: number + MaxAxesForce: Vector3 + MaxForce: number + MaxPlanarAxesForce: Vector2 + PlaneVelocity: Vector2 + PrimaryTangentAxis: Vector3 + RelativeTo: EnumActuatorRelativeTo + SecondaryTangentAxis: Vector3 + VectorVelocity: Vector3 + VelocityConstraintMode: EnumVelocityConstraintMode +end + +declare class PlaneConstraint extends Constraint +end + + + +declare class RigidConstraint extends Constraint +end + +declare class RodConstraint extends Constraint + CurrentDistance: number + Length: number + LimitAngle0: number + LimitAngle1: number + LimitsEnabled: boolean + Thickness: number +end + +declare class RopeConstraint extends Constraint + CurrentDistance: number + Length: number + Restitution: number + Thickness: number + WinchEnabled: boolean + WinchForce: number + WinchResponsiveness: number + WinchSpeed: number + WinchTarget: number +end + +declare class SlidingBallConstraint extends Constraint + ActuatorType: EnumActuatorType + CurrentPosition: number + LimitsEnabled: boolean + LinearResponsiveness: number + LowerLimit: number + MotorMaxAcceleration: number + MotorMaxForce: number + Restitution: number + ServoMaxForce: number + Size: number + Speed: number + TargetPosition: number + UpperLimit: number + Velocity: number +end + +declare class CylindricalConstraint extends SlidingBallConstraint + AngularActuatorType: EnumActuatorType + AngularLimitsEnabled: boolean + AngularResponsiveness: number + AngularRestitution: number + AngularSpeed: number + AngularVelocity: number + CurrentAngle: number + InclinationAngle: number + LowerAngle: number + MotorMaxAngularAcceleration: number + MotorMaxTorque: number + RotationAxisVisible: boolean + ServoMaxTorque: number + TargetAngle: number + UpperAngle: number + WorldRotationAxis: Vector3 +end + +declare class PrismaticConstraint extends SlidingBallConstraint +end + +declare class SpringConstraint extends Constraint + Coils: number + CurrentLength: number + Damping: number + FreeLength: number + LimitsEnabled: boolean + MaxForce: number + MaxLength: number + MinLength: number + Radius: number + Stiffness: number + Thickness: number +end + +declare class Torque extends Constraint + RelativeTo: EnumActuatorRelativeTo + Torque: Vector3 +end + +declare class TorsionSpringConstraint extends Constraint + Coils: number + CurrentAngle: number + Damping: number + LimitsEnabled: boolean + MaxAngle: number + MaxTorque: number + Radius: number + Restitution: number + Stiffness: number +end + +declare class UniversalConstraint extends Constraint + LimitsEnabled: boolean + MaxAngle: number + Radius: number + Restitution: number +end + +declare class VectorForce extends Constraint + ApplyAtCenterOfMass: boolean + Force: Vector3 + RelativeTo: EnumActuatorRelativeTo +end + +declare class ContentProvider extends Instance + AssetFetchFailed: RBXScriptSignal + BaseUrl: string + RequestQueueSize: number + function CalculateNumTrianglesInMesh(self, meshId: string): number + function CalculateNumTrianglesInMeshSync(self, meshId: string): number + function GetAssetFetchStatus(self, contentId: Content): EnumAssetFetchStatus + function GetAssetFetchStatusChangedSignal(self, contentId: Content): RBXScriptSignal + function GetDetailedFailedRequests(self): { any } + function GetFailedRequests(self): { any } + function ListEncryptedAssets(self): { any } + function Preload(self, contentId: string): nil + function PreloadAsync(self, contentIdList: { any }, callbackFunction: ((...any) -> ...any)?): nil + function RegisterDefaultEncryptionKey(self, encryptionKey: string): nil + function RegisterDefaultSessionKey(self, sessionKey: string): nil + function RegisterEncryptedAsset(self, assetId: Content, encryptionKey: string): nil + function RegisterSessionEncryptedAsset(self, contentId: Content, sessionKey: string): nil + function SetBaseUrl(self, url: string): nil + function UnregisterDefaultEncryptionKey(self): nil + function UnregisterEncryptedAsset(self, assetId: Content): nil +end + +declare class ContextActionService extends Instance + BoundActionAdded: RBXScriptSignal + BoundActionChanged: RBXScriptSignal + BoundActionRemoved: RBXScriptSignal + GetActionButtonEvent: RBXScriptSignal + LocalToolEquipped: RBXScriptSignal + LocalToolUnequipped: RBXScriptSignal + function BindAction(self, actionName: string, functionToBind: (actionName: string, inputState: EnumUserInputState, inputObject: InputObject) -> EnumContextActionResult?, createTouchButton: boolean, ...: EnumUserInputType | EnumKeyCode): () + function BindActionAtPriority(self, actionName: string, functionToBind: (actionName: string, inputState: EnumUserInputState, inputObject: InputObject) -> EnumContextActionResult?, createTouchButton: boolean, priorityLevel: number, ...: EnumUserInputType | EnumKeyCode): () + function BindActivate(self, userInputTypeForActivation: EnumUserInputType, keyCodesForActivation: any): nil + function BindCoreAction(self, actionName: string, functionToBind: ((...any) -> ...any), createTouchButton: boolean, inputTypes: any): nil + function BindCoreActionAtPriority(self, actionName: string, functionToBind: ((...any) -> ...any), createTouchButton: boolean, priorityLevel: number, inputTypes: any): nil + function BindCoreActivate(self, userInputTypeForActivation: EnumUserInputType, keyCodesForActivation: any): nil + function CallFunction(self, actionName: string, state: EnumUserInputState, inputObject: Instance): any + function FireActionButtonFoundSignal(self, actionName: string, actionButton: Instance): nil + function GetAllBoundActionInfo(self): { [any]: any } + function GetAllBoundCoreActionInfo(self): { [any]: any } + function GetBoundActionInfo(self, actionName: string): { [any]: any } + function GetBoundCoreActionInfo(self, actionName: string): { [any]: any } + function GetButton(self, actionName: string): ImageButton + function GetCurrentLocalToolIcon(self): string + function SetDescription(self, actionName: string, description: string): nil + function SetImage(self, actionName: string, image: string): nil + function SetPosition(self, actionName: string, position: UDim2): nil + function SetTitle(self, actionName: string, title: string): nil + function UnbindAction(self, actionName: string): nil + function UnbindActivate(self, userInputTypeForActivation: EnumUserInputType, keyCodeForActivation: EnumKeyCode?): nil + function UnbindAllActions(self): nil + function UnbindCoreAction(self, actionName: string): nil + function UnbindCoreActivate(self, userInputTypeForActivation: EnumUserInputType, keyCodeForActivation: EnumKeyCode?): nil +end + +declare class Controller extends Instance + ButtonChanged: RBXScriptSignal + function BindButton(self, button: EnumButton, caption: string): nil + function GetButton(self, button: EnumButton): boolean + function UnbindButton(self, button: EnumButton): nil +end + +declare class HumanoidController extends Controller +end + +declare class SkateboardController extends Controller + AxisChanged: RBXScriptSignal + Steer: number + Throttle: number +end + +declare class VehicleController extends Controller +end + +declare class ControllerBase extends Instance + Active: boolean + BalanceRigidityEnabled: boolean + MoveSpeedFactor: number +end + +declare class AirController extends ControllerBase + BalanceMaxTorque: number + BalanceSpeed: number + LinearImpulse: Vector3 + MaintainAngularMomentum: boolean + MaintainLinearMomentum: boolean + MoveMaxForce: number + TurnMaxTorque: number + TurnSpeedFactor: number +end + +declare class ClimbController extends ControllerBase + AccelerationTime: number + BalanceMaxTorque: number + BalanceSpeed: number + MoveMaxForce: number +end + +declare class GroundController extends ControllerBase + AccelerationLean: number + AccelerationTime: number + BalanceMaxTorque: number + BalanceSpeed: number + DecelerationTime: number + Friction: number + FrictionWeight: number + GroundOffset: number + StandForce: number + StandSpeed: number + TurnSpeedFactor: number +end + +declare class SwimController extends ControllerBase + AccelerationTime: number + PitchMaxTorque: number + PitchSpeedFactor: number + RollMaxTorque: number + RollSpeedFactor: number +end + +declare class ControllerManager extends Instance + ActiveController: ControllerBase + BaseMoveSpeed: number + BaseTurnSpeed: number + ClimbSensor: ControllerSensor + FacingDirection: Vector3 + GroundSensor: ControllerSensor + MovingDirection: Vector3 + RootPart: BasePart +end + +declare class ControllerService extends Instance +end + +declare class CookiesService extends Instance +end + +declare class CorePackages extends Instance +end + +declare class CoreScriptDebuggingManagerHelper extends Instance +end + +declare class CoreScriptSyncService extends Instance + function GetScriptFilePath(self, script: Instance): any +end + +declare class CrossDMScriptChangeListener extends Instance + GuidLineContentsChanged: RBXScriptSignal + GuidNameChanged: RBXScriptSignal + function IsWatchingScriptLine(self, scriptRef: string, lineNumber: number): boolean + function StartWatchingScriptLine(self, scriptRef: string, debuggerConnectionId: number, lineNumber: number): nil +end + + + + + +declare class DataModelMesh extends Instance + Offset: Vector3 + Scale: Vector3 + VertexColor: Vector3 +end + + + + + +declare class DynamicMesh extends DataModelMesh + function AddTriangle(self, vertexId0: number, vertexId1: number, vertexId2: number): number + function AddVertex(self, p: Vector3): number + function CreateMeshPartAsync(self, collisionFidelity: EnumCollisionFidelity): MeshPart + function FindClosestPointOnSurface(self, point: Vector3): any + function FindClosestVertex(self, toThisPoint: Vector3): number + function FindVerticesWithinSphere(self, center: Vector3, radius: number): { any } + function GetAdjacentTriangles(self, triangleId: number): { any } + function GetAdjacentVertices(self, vertexId: number): { any } + function GetPosition(self, vertexId: number): Vector3 + function GetTriangleVertices(self, triangleId: number): any + function GetTriangles(self): { any } + function GetUV(self, vertexId: number): Vector2 + function GetVertexColor(self, vertexId: number): Color3 + function GetVertexColorAlpha(self, vertexId: number): number + function GetVertexNormal(self, vertexId: number): Vector3 + function GetVertices(self): { any } + function InitializeFromMeshIdAsync(self, meshId: Content): nil + function InitializeFromMeshPartAsync(self, meshPart: Instance): nil + function Raycast(self, origin: Vector3, direction: Vector3): any + function RemoveTriangle(self, triangleId: number): nil + function RemoveVertex(self, vertexId: number): nil + function SetPosition(self, vertexId: number, p: Vector3): nil + function SetUV(self, vertexId: number, uv: Vector2): nil + function SetVertexColor(self, vertexId: number, color: Color3): nil + function SetVertexColorAlpha(self, vertexId: number, alpha: number): nil + function SetVertexNormal(self, vertexId: number, vnormal: Vector3): nil +end + +declare class FileMesh extends DataModelMesh + MeshId: Content + TextureId: Content +end + +declare class SpecialMesh extends FileMesh + MeshType: EnumMeshType +end + +declare class DataModelPatchService extends Instance + function GetPatch(self, patchName: string): Instance + function RegisterPatch(self, patchName: string, behaviorName: string, localConfigPath: string, userId: number): nil + function UpdatePatch(self, userId: number, patchName: string, callbackFunction: ((...any) -> ...any)): nil +end + +declare class DataModelSession extends Instance + CurrentDataModelType: EnumStudioDataModelType + CurrentDataModelTypeAboutToChange: RBXScriptSignal + CurrentDataModelTypeChanged: RBXScriptSignal<> + DataModelCreated: RBXScriptSignal + DataModelWillBeDestroyed: RBXScriptSignal + SessionId: string +end + +declare class DataStoreIncrementOptions extends Instance + function GetMetadata(self): { [any]: any } + function SetMetadata(self, attributes: { [any]: any }): nil +end + +declare class DataStoreInfo extends Instance + CreatedTime: number + DataStoreName: string + UpdatedTime: number +end + +declare class DataStoreKey extends Instance + KeyName: string +end + +declare class DataStoreKeyInfo extends Instance + CreatedTime: number + UpdatedTime: number + Version: string + function GetMetadata(self): { [any]: any } + function GetUserIds(self): { number } +end + +declare class DataStoreObjectVersionInfo extends Instance + CreatedTime: number + IsDeleted: boolean + Version: string +end + +declare class DataStoreOptions extends Instance + AllScopes: boolean + function SetExperimentalFeatures(self, experimentalFeatures: { [any]: any }): nil +end + +declare class DataStoreService extends Instance + AutomaticRetry: boolean + function GetDataStore(self, name: string, scope: string?, options: Instance?): DataStore + function GetGlobalDataStore(self): GlobalDataStore + function GetOrderedDataStore(self, name: string, scope: string?): OrderedDataStore + function GetRequestBudgetForRequestType(self, requestType: EnumDataStoreRequestType): number + function ListDataStoresAsync(self, prefix: string?, pageSize: number?, cursor: string?): DataStoreListingPages +end + +declare class DataStoreSetOptions extends Instance + function GetMetadata(self): { [any]: any } + function SetMetadata(self, attributes: { [any]: any }): nil +end + +declare class Debris extends Instance + function AddItem(self, item: Instance, lifetime: number?): nil + function SetLegacyMaxItems(self, enabled: boolean): nil +end + +declare class DebugSettings extends Instance + DataModel: number + InstanceCount: number + IsScriptStackTracingEnabled: boolean + JobCount: number + PlayerCount: number + ReportSoundWarnings: boolean + RobloxVersion: string + TickCountPreciseOverride: EnumTickCountSampleMethod + + LuaRamLimit: number + + function LegacyScriptMode(self): nil +end + +declare class DebuggablePluginWatcher extends Instance +end + +declare class DebuggerBreakpoint extends Instance + Condition: string + ContinueExecution: boolean + IsEnabled: boolean + Line: number + LogExpression: string + isContextDependentBreakpoint: boolean +end + +declare class DebuggerConnection extends Instance + BreakpointAdded: RBXScriptSignal + BreakpointChanged: RBXScriptSignal + BreakpointRemoved: RBXScriptSignal + ErrorMessage: string + HasError: boolean + Id: number + IsPaused: boolean + Paused: RBXScriptSignal + Resumed: RBXScriptSignal + function AddBreakpoint(self, script: string, line: number, breakpoint: Breakpoint): nil + function Close(self): nil + function EvaluateWatch(self, expression: string, frame: StackFrame, callback: ((...any) -> ...any)): number + function GetFrameById(self, id: number): StackFrame + function GetSource(self, scriptRef: string, status: ((...any) -> ...any)): number + function GetThreadById(self, id: number): ThreadState + function GetThreads(self, callback: ((...any) -> ...any)): number + function GetVariableById(self, id: number): DebuggerVariable + function Pause(self, thread: ThreadState, status: ((...any) -> ...any)): number + function Populate(self, instance: Instance, callback: ((...any) -> ...any)): number + function RemoveBreakpoint(self, breakpoint: Breakpoint): nil + function Resume(self, thread: ThreadState, status: ((...any) -> ...any)): number + function SetExceptionBreakMode(self, breakMode: EnumDebuggerExceptionBreakMode, callback: ((...any) -> ...any)): number + function SetVariable(self, variable: DebuggerVariable, value: string, callback: ((...any) -> ...any)): number + function Step(self, thread: ThreadState, callback: ((...any) -> ...any)): number + function StepIn(self, thread: ThreadState, callback: ((...any) -> ...any)): number + function StepOut(self, thread: ThreadState, callback: ((...any) -> ...any)): number + function UpdateSelectedFrame(self, threadId: number, frameNumber: number): nil +end + +declare class LocalDebuggerConnection extends DebuggerConnection +end + +declare class DebuggerConnectionManager extends Instance + ConnectionEnded: RBXScriptSignal + ConnectionStarted: RBXScriptSignal + FocusChanged: RBXScriptSignal + Timeout: number + function ConnectLocal(self, dataModel: DataModel): number + function ConnectRemote(self, host: string, port: number): number + function FocusConnection(self, connection: DebuggerConnection): nil + function GetConnectionById(self, id: number): DebuggerConnection +end + +declare class DebuggerLuaResponse extends Instance + IsError: boolean + IsSuccess: boolean + Message: string + RequestId: number + Status: EnumDebuggerStatus + function GetArg(self): any +end + +declare class DebuggerManager extends Instance + DebuggerAdded: RBXScriptSignal + DebuggerRemoved: RBXScriptSignal + DebuggingEnabled: boolean + function AddDebugger(self, script: Instance): Instance + function EnableDebugging(self): nil + function GetDebuggers(self): { Instance } + function Resume(self): nil +end + +declare class DebuggerUIService extends Instance + ExpressionAdded: RBXScriptSignal + ExpressionsCleared: RBXScriptSignal<> + function EditBreakpoint(self, metaBreakpointId: number): nil + function EditWatch(self, expression: string): nil + function IsConnectionForPlayDataModel(self, debuggerConnectionId: number): boolean + function OpenExceptionMessagePopup(self, exceptionMessage: string, pausedLine: number): nil + function OpenScriptAtLine(self, guid: string, debuggerConnectionId: number, line: number, showErrorOnFail: boolean): nil + function Pause(self): nil + function RemoveScriptLineMarkers(self, debuggerConnectionId: number, allMarkers: boolean): nil + function Resume(self): nil + function SetCurrentThreadId(self, debuggerThreadId: number): nil + function SetScriptLineMarker(self, guid: string, debuggerConnectionId: number, line: number, lineMarkerType: boolean): nil + function SetWatchExpressions(self, expressions: { any }): nil +end + +declare class DebuggerVariable extends Instance + Name: string + Populated: boolean + Type: string + Value: string + VariableId: number + VariablesCount: number + function GetVariableByIndex(self, index: number): DebuggerVariable + function GetVariableByName(self, name: string): DebuggerVariable +end + +declare class DebuggerWatch extends Instance + Expression: string +end + +declare class DeviceIdService extends Instance + function GetDeviceId(self): string +end + +declare class Dialog extends Instance + BehaviorType: EnumDialogBehaviorType + ConversationDistance: number + DialogChoiceSelected: RBXScriptSignal + GoodbyeChoiceActive: boolean + GoodbyeDialog: string + InUse: boolean + InitialPrompt: string + Purpose: EnumDialogPurpose + Tone: EnumDialogTone + TriggerDistance: number + TriggerOffset: Vector3 + function GetCurrentPlayers(self): { Player } + function SetPlayerIsUsing(self, player: Instance, isUsing: boolean): nil + function SignalDialogChoiceSelected(self, player: Instance, dialogChoice: Instance): nil +end + +declare class DialogChoice extends Instance + GoodbyeChoiceActive: boolean + GoodbyeDialog: string + ResponseDialog: string + UserDialog: string +end + +declare class DraftsService extends Instance + CommitStatusChanged: RBXScriptSignal + DraftAdded: RBXScriptSignal + DraftRemoved: RBXScriptSignal + DraftStatusChanged: RBXScriptSignal + EditorsListChanged: RBXScriptSignal + UpdateStatusChanged: RBXScriptSignal + function CommitEdits(self, scripts: { Instance }): nil + function DiscardEdits(self, scripts: { Instance }): nil + function GetDraftStatus(self, script: Instance): EnumDraftStatusCode + function GetDrafts(self): { Instance } + function GetEditors(self, script: Instance): { Instance } + function RestoreScripts(self, scripts: { Instance }): nil + function ShowDiffsAgainstBase(self, scripts: { Instance }): nil + function ShowDiffsAgainstServer(self, scripts: { Instance }): nil + function UpdateToLatestVersion(self, scripts: { Instance }): nil +end + +declare class Dragger extends Instance + function AxisRotate(self, axis: EnumAxis?): nil + function MouseDown(self, mousePart: Instance, pointOnMousePart: Vector3, parts: { Instance }): nil + function MouseMove(self, mouseRay: Ray): nil + function MouseUp(self): nil +end + +declare class DraggerService extends Instance + AlignDraggedObjects: boolean + AngleSnapEnabled: boolean + AngleSnapIncrement: number + AnimateHover: boolean + CollisionsEnabled: boolean + DraggerCoordinateSpace: EnumDraggerCoordinateSpace + DraggerMovementMode: EnumDraggerMovementMode + GeometrySnapColor: Color3 + HoverAnimateFrequency: number + HoverLineThickness: number + HoverThickness: number + JointsEnabled: boolean + LinearSnapEnabled: boolean + LinearSnapIncrement: number + PivotSnapToGeometry: boolean + ShowHover: boolean + ShowPivotIndicator: boolean +end + +declare class DynamicImage extends Instance + Size: Vector2 + function Clear(self): nil + function DrawCircle(self, center: Vector2, radius: number, color: Color3, transparency: number): nil + function ReadPixels(self, position: Vector2, size: Vector2): { any } + function Resize(self, newSize: Vector2): nil + function Rotate(self, degrees: number, resizeCanvas: boolean?): nil + function WritePixels(self, position: Vector2, size: Vector2, pixels: { any }): nil +end + +declare class EulerRotationCurve extends Instance + RotationOrder: EnumRotationOrder + function GetAnglesAtTime(self, time: number): { any } + function GetRotationAtTime(self, time: number): CFrame + function X(self): FloatCurve + function Y(self): FloatCurve + function Z(self): FloatCurve +end + +declare class EventIngestService extends Instance + function SendEventDeferred(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil + function SendEventImmediately(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil + function SetRBXEvent(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil + function SetRBXEventStream(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil +end + +declare class ExperienceAuthService extends Instance + OpenAuthPrompt: RBXScriptSignal + function ScopeCheckUIComplete(self, guid: string, scopes: { any }, result: EnumScopeCheckResult, metadata: { [any]: any }): nil +end + +declare class ExperienceInviteOptions extends Instance + InviteMessageId: string + InviteUser: number + LaunchData: string + PromptMessage: string +end + +declare class Explosion extends Instance + BlastPressure: number + BlastRadius: number + DestroyJointRadiusPercent: number + ExplosionType: EnumExplosionType + Hit: RBXScriptSignal + Position: Vector3 + TimeScale: number + Visible: boolean +end + +declare class FaceAnimatorService extends Instance + AudioAnimationEnabled: boolean + FlipHeadOrientation: boolean + TrackerError: RBXScriptSignal + TrackerPrompt: RBXScriptSignal + VideoAnimationEnabled: boolean + function GetTrackerLodController(self): TrackerLodController + function Init(self, videoEnabled: boolean, audioEnabled: boolean): nil + function IsStarted(self): boolean + function Start(self): nil + function Step(self): nil + function Stop(self): nil +end + +declare class FaceControls extends Instance + ChinRaiser: number + ChinRaiserUpperLip: number + Corrugator: number + EyesLookDown: number + EyesLookLeft: number + EyesLookRight: number + EyesLookUp: number + FlatPucker: number + Funneler: number + JawDrop: number + JawLeft: number + JawRight: number + LeftBrowLowerer: number + LeftCheekPuff: number + LeftCheekRaiser: number + LeftDimpler: number + LeftEyeClosed: number + LeftEyeUpperLidRaiser: number + LeftInnerBrowRaiser: number + LeftLipCornerDown: number + LeftLipCornerPuller: number + LeftLipStretcher: number + LeftLowerLipDepressor: number + LeftNoseWrinkler: number + LeftOuterBrowRaiser: number + LeftUpperLipRaiser: number + LipPresser: number + LipsTogether: number + LowerLipSuck: number + MouthLeft: number + MouthRight: number + Pucker: number + RightBrowLowerer: number + RightCheekPuff: number + RightCheekRaiser: number + RightDimpler: number + RightEyeClosed: number + RightEyeUpperLidRaiser: number + RightInnerBrowRaiser: number + RightLipCornerDown: number + RightLipCornerPuller: number + RightLipStretcher: number + RightLowerLipDepressor: number + RightNoseWrinkler: number + RightOuterBrowRaiser: number + RightUpperLipRaiser: number + TongueDown: number + TongueOut: number + TongueUp: number + UpperLipSuck: number +end + +declare class FaceInstance extends Instance + Face: EnumNormalId +end + +declare class Decal extends FaceInstance + Color3: Color3 + LocalTransparencyModifier: number + Texture: Content + Transparency: number + ZIndex: number +end + +declare class Texture extends Decal + OffsetStudsU: number + OffsetStudsV: number + StudsPerTileU: number + StudsPerTileV: number +end + +declare class FacialAnimationRecordingService extends Instance + BiometricDataConsent: boolean + function CheckOrRequestCameraPermission(self): string + function IsAgeRestricted(self): boolean +end + +declare class FacialAnimationStreamingServiceStats extends Instance + function Get(self, label: string): number + function GetWithPlayerId(self, label: string, playerId: number): number +end + +declare class FacialAnimationStreamingServiceV2 extends Instance + ServiceState: number + function GetStats(self): FacialAnimationStreamingServiceStats + function IsAudioEnabled(self, mask: number): boolean + function IsPlaceEnabled(self, mask: number): boolean + function IsServerEnabled(self, mask: number): boolean + function IsVideoEnabled(self, mask: number): boolean + function ResolveStateForUser(self, userId: number): number +end + +declare class FacialAnimationStreamingSubsessionStats extends Instance +end + +declare class Feature extends Instance + FaceId: EnumNormalId + InOut: EnumInOut + LeftRight: EnumLeftRight + TopBottom: EnumTopBottom +end + + + + + +declare class File extends Instance + Size: number + function GetBinaryContents(self): string + function GetTemporaryId(self): Content +end + +declare class Fire extends Instance + Color: Color3 + Enabled: boolean + Heat: number + SecondaryColor: Color3 + Size: number + TimeScale: number + function FastForward(self, numFrames: number): nil +end + +declare class FlagStandService extends Instance +end + +declare class FloatCurve extends Instance + Length: number + function GetKeyAtIndex(self, index: number): FloatCurveKey + function GetKeyIndicesAtTime(self, time: number): { any } + function GetKeys(self): { any } + function GetValueAtTime(self, time: number): number? + function InsertKey(self, key: FloatCurveKey): { any } + function RemoveKeyAtIndex(self, startingIndex: number, count: number?): number + function SetKeys(self, keys: { any }): number +end + +declare class FlyweightService extends Instance +end + +declare class CSGDictionaryService extends FlyweightService +end + +declare class NonReplicatedCSGDictionaryService extends FlyweightService +end + +declare class Folder extends Instance +end + +declare class ForceField extends Instance + Visible: boolean +end + +declare class FriendService extends Instance + FriendsUpdated: RBXScriptSignal<{ any }> + function GetPlatformFriends(self): { any } +end + + + +declare class GamePassService extends Instance +end + +declare class GameSettings extends Instance + VideoCaptureEnabled: boolean + VideoRecording: boolean + VideoRecordingChangeRequest: RBXScriptSignal +end + +declare class GamepadService extends Instance + GamepadCursorEnabled: boolean + GamepadThumbstick1Changed: RBXScriptSignal + function DisableGamepadCursor(self): nil + function EnableGamepadCursor(self, guiObject: Instance): nil + function GetGamepadCursorPosition(self): Vector2 + function SetGamepadCursorPosition(self, position: Vector2): nil +end + +declare class Geometry extends Instance +end + +declare class GeometryService extends Instance + function CalculateConstraintsToPreserve(self, source: Instance, destination: { Instance }, options: any): { [any]: any } + function IntersectAsync(self, part: Instance, parts: { Instance }, options: any): { Instance } + function SubtractAsync(self, part: Instance, parts: { Instance }, options: any): { Instance } + function UnionAsync(self, part: Instance, parts: { Instance }, options: any): { Instance } +end + +declare class GetTextBoundsParams extends Instance + Font: Font + Size: number + Text: string + Width: number +end + +declare class GlobalDataStore extends Instance + function GetAsync(self, key: string): (any, DataStoreKeyInfo) + function IncrementAsync(self, key: string, delta: number?, userIds: { number }?, options: DataStoreIncrementOptions?): (number, DataStoreKeyInfo) + function RemoveAsync(self, key: string): (any, DataStoreKeyInfo) + function SetAsync(self, key: string, value: any, userIds: { number }?, options: DataStoreSetOptions?): string + function UpdateAsync(self, key: string, transformFunction: ((any, DataStoreKeyInfo) -> (any, { number }?, {}?))): (any, DataStoreKeyInfo) +end + +declare class DataStore extends GlobalDataStore + function GetVersionAsync(self, key: string, version: string): any + function ListKeysAsync(self, prefix: string?, pageSize: number?, cursor: string?, excludeDeleted: boolean?): DataStoreKeyPages + function ListVersionsAsync(self, key: string, sortDirection: EnumSortDirection?, minDate: number?, maxDate: number?, pageSize: number?): DataStoreVersionPages + function RemoveVersionAsync(self, key: string, version: string): nil +end + +declare class OrderedDataStore extends GlobalDataStore + function GetAsync(self, key: string): (number?, DataStoreKeyInfo) + function GetSortedAsync(self, ascending: boolean, pageSize: number, minValue: number, maxValue: number): DataStorePages + function RemoveAsync(self, key: string): (number?, DataStoreKeyInfo) + function SetAsync(self, key: string, value: number, userIds: { number }?, options: DataStoreSetOptions?): string + function UpdateAsync(self, key: string, transformFunction: ((number?, DataStoreKeyInfo) -> (number, { number }?, {}?))): (number?, DataStoreKeyInfo) +end + +declare class GoogleAnalyticsConfiguration extends Instance +end + +declare class GroupService extends Instance + function GetAlliesAsync(self, groupId: number): StandardPages + function GetEnemiesAsync(self, groupId: number): StandardPages + function GetGroupInfoAsync(self, groupId: number): any + function GetGroupsAsync(self, userId: number): { any } +end + +declare class GuiBase extends Instance +end + +declare class GuiBase2d extends GuiBase + AbsolutePosition: Vector2 + AbsoluteRotation: number + AbsoluteSize: Vector2 + AutoLocalize: boolean + ClippedRect: Rect + IsNotOccluded: boolean + RawRect2D: Rect + RootLocalizationTable: LocalizationTable + SelectionBehaviorDown: EnumSelectionBehavior + SelectionBehaviorLeft: EnumSelectionBehavior + SelectionBehaviorRight: EnumSelectionBehavior + SelectionBehaviorUp: EnumSelectionBehavior + SelectionChanged: RBXScriptSignal + SelectionGroup: boolean + TotalGroupScale: number +end + +declare class GuiObject extends GuiBase2d + Active: boolean + AnchorPoint: Vector2 + AutomaticSize: EnumAutomaticSize + BackgroundColor3: Color3 + BackgroundTransparency: number + BorderColor3: Color3 + BorderMode: EnumBorderMode + BorderSizePixel: number + ClipsDescendants: boolean + GuiState: EnumGuiState + InputBegan: RBXScriptSignal + InputChanged: RBXScriptSignal + InputEnded: RBXScriptSignal + Interactable: boolean + LayoutOrder: number + MouseEnter: RBXScriptSignal + MouseLeave: RBXScriptSignal + MouseMoved: RBXScriptSignal + MouseWheelBackward: RBXScriptSignal + MouseWheelForward: RBXScriptSignal + NextSelectionDown: GuiObject + NextSelectionLeft: GuiObject + NextSelectionRight: GuiObject + NextSelectionUp: GuiObject + Position: UDim2 + Rotation: number + Selectable: boolean + SelectionGained: RBXScriptSignal<> + SelectionImageObject: GuiObject + SelectionLost: RBXScriptSignal<> + SelectionOrder: number + Size: UDim2 + SizeConstraint: EnumSizeConstraint + TouchLongPress: RBXScriptSignal<{ Vector2 }, EnumUserInputState> + TouchPan: RBXScriptSignal<{ Vector2 }, Vector2, Vector2, EnumUserInputState> + TouchPinch: RBXScriptSignal<{ Vector2 }, number, number, EnumUserInputState> + TouchRotate: RBXScriptSignal<{ Vector2 }, number, number, EnumUserInputState> + TouchSwipe: RBXScriptSignal + TouchTap: RBXScriptSignal<{ Vector2 }> + Transparency: number + Visible: boolean + ZIndex: number + function TweenPosition(self, endPosition: UDim2, easingDirection: EnumEasingDirection?, easingStyle: EnumEasingStyle?, time: number?, override: boolean?, callback: ((...any) -> ...any)?): boolean + function TweenSize(self, endSize: UDim2, easingDirection: EnumEasingDirection?, easingStyle: EnumEasingStyle?, time: number?, override: boolean?, callback: ((...any) -> ...any)?): boolean + function TweenSizeAndPosition(self, endSize: UDim2, endPosition: UDim2, easingDirection: EnumEasingDirection?, easingStyle: EnumEasingStyle?, time: number?, override: boolean?, callback: ((...any) -> ...any)?): boolean +end + +declare class CanvasGroup extends GuiObject + GroupColor3: Color3 + GroupTransparency: number +end + +declare class Frame extends GuiObject + Style: EnumFrameStyle +end + +declare class GuiButton extends GuiObject + Activated: RBXScriptSignal + AutoButtonColor: boolean + Modal: boolean + MouseButton1Click: RBXScriptSignal<> + MouseButton1Down: RBXScriptSignal + MouseButton1Up: RBXScriptSignal + MouseButton2Click: RBXScriptSignal<> + MouseButton2Down: RBXScriptSignal + MouseButton2Up: RBXScriptSignal + Selected: boolean + Style: EnumButtonStyle +end + +declare class ImageButton extends GuiButton + ContentImageSize: Vector2 + HoverImage: Content + Image: Content + ImageColor3: Color3 + ImageRectOffset: Vector2 + ImageRectSize: Vector2 + ImageTransparency: number + IsLoaded: boolean + PressedImage: Content + ResampleMode: EnumResamplerMode + ScaleType: EnumScaleType + SliceCenter: Rect + SliceScale: number + TileSize: UDim2 + function SetEnableContentImageSizeChangedEvents(self, enabled: boolean): nil +end + +declare class TextButton extends GuiButton + ContentText: string + Font: EnumFont + FontFace: Font + LineHeight: number + LocalizedText: string + MaxVisibleGraphemes: number + RichText: boolean + Text: string + TextBounds: Vector2 + TextColor3: Color3 + TextDirection: EnumTextDirection + TextFits: boolean + TextScaled: boolean + TextSize: number + TextStrokeColor3: Color3 + TextStrokeTransparency: number + TextTransparency: number + TextTruncate: EnumTextTruncate + TextWrapped: boolean + TextXAlignment: EnumTextXAlignment + TextYAlignment: EnumTextYAlignment + function SetTextFromInput(self, text: string): nil +end + +declare class GuiLabel extends GuiObject +end + +declare class ImageLabel extends GuiLabel + ContentImageSize: Vector2 + Image: Content + ImageColor3: Color3 + ImageRectOffset: Vector2 + ImageRectSize: Vector2 + ImageTransparency: number + IsLoaded: boolean + ResampleMode: EnumResamplerMode + ScaleType: EnumScaleType + SliceCenter: Rect + SliceScale: number + TileSize: UDim2 + function SetEnableContentImageSizeChangedEvents(self, enabled: boolean): nil +end + +declare class TextLabel extends GuiLabel + ContentText: string + Font: EnumFont + FontFace: Font + LineHeight: number + LocalizedText: string + MaxVisibleGraphemes: number + RichText: boolean + Text: string + TextBounds: Vector2 + TextColor3: Color3 + TextDirection: EnumTextDirection + TextFits: boolean + TextScaled: boolean + TextSize: number + TextStrokeColor3: Color3 + TextStrokeTransparency: number + TextTransparency: number + TextTruncate: EnumTextTruncate + TextWrapped: boolean + TextXAlignment: EnumTextXAlignment + TextYAlignment: EnumTextYAlignment + function SetTextFromInput(self, text: string): nil +end + +declare class ScrollingFrame extends GuiObject + AbsoluteCanvasSize: Vector2 + AbsoluteWindowSize: Vector2 + AutomaticCanvasSize: EnumAutomaticSize + BottomImage: Content + CanvasPosition: Vector2 + CanvasSize: UDim2 + ElasticBehavior: EnumElasticBehavior + HorizontalBarRect: Rect + HorizontalScrollBarInset: EnumScrollBarInset + MaxCanvasPosition: Vector2 + MidImage: Content + ScrollBarImageColor3: Color3 + ScrollBarImageTransparency: number + ScrollBarThickness: number + ScrollVelocity: Vector2 + ScrollingDirection: EnumScrollingDirection + ScrollingEnabled: boolean + TopImage: Content + VerticalBarRect: Rect + VerticalScrollBarInset: EnumScrollBarInset + VerticalScrollBarPosition: EnumVerticalScrollBarPosition + function ClearInertialScrolling(self): nil + function GetSampledInertialVelocity(self): Vector2 + function ScrollToTop(self): nil +end + +declare class TextBox extends GuiObject + ClearTextOnFocus: boolean + ContentText: string + CursorPosition: number + FocusLost: RBXScriptSignal + Focused: RBXScriptSignal<> + Font: EnumFont + FontFace: Font + LineHeight: number + ManualFocusRelease: boolean + MaxVisibleGraphemes: number + MultiLine: boolean + OverlayNativeInput: boolean + PlaceholderColor3: Color3 + PlaceholderText: string + ReturnKeyType: EnumReturnKeyType + ReturnPressedFromOnScreenKeyboard: RBXScriptSignal<> + RichText: boolean + SelectionStart: number + ShowNativeInput: boolean + Text: string + TextBounds: Vector2 + TextColor3: Color3 + TextDirection: EnumTextDirection + TextEditable: boolean + TextFits: boolean + TextInputType: EnumTextInputType + TextScaled: boolean + TextSize: number + TextStrokeColor3: Color3 + TextStrokeTransparency: number + TextTransparency: number + TextTruncate: EnumTextTruncate + TextWrapped: boolean + TextXAlignment: EnumTextXAlignment + TextYAlignment: EnumTextYAlignment + function CaptureFocus(self): nil + function IsFocused(self): boolean + function ReleaseFocus(self, submitted: boolean?): nil + function ResetKeyboardMode(self): nil + function SetTextFromInput(self, text: string): nil +end + +declare class VideoFrame extends GuiObject + DidLoop: RBXScriptSignal + Ended: RBXScriptSignal + IsLoaded: boolean + Loaded: RBXScriptSignal + Looped: boolean + Paused: RBXScriptSignal + Played: RBXScriptSignal + Playing: boolean + Resolution: Vector2 + TimeLength: number + TimePosition: number + Video: Content + Volume: number + function Pause(self): nil + function Play(self): nil +end + +declare class ViewportFrame extends GuiObject + Ambient: Color3 + CurrentCamera: Camera + ImageColor3: Color3 + ImageTransparency: number + IsMirrored: boolean + LightColor: Color3 + LightDirection: Vector3 +end + +declare class LayerCollector extends GuiBase2d + Enabled: boolean + ResetOnSpawn: boolean + ZIndexBehavior: EnumZIndexBehavior +end + +declare class BillboardGui extends LayerCollector + Active: boolean + Adornee: Instance + AlwaysOnTop: boolean + Brightness: number + ClipsDescendants: boolean + CurrentDistance: number + DistanceLowerLimit: number + DistanceStep: number + DistanceUpperLimit: number + ExtentsOffset: Vector3 + ExtentsOffsetWorldSpace: Vector3 + LightInfluence: number + MaxDistance: number + PlayerToHideFrom: Instance + Size: UDim2 + SizeOffset: Vector2 + StudsOffset: Vector3 + StudsOffsetWorldSpace: Vector3 + function GetScreenSpaceBounds(self): any +end + +declare class PluginGui extends LayerCollector + PluginDragDropped: RBXScriptSignal<{ [any]: any }> + PluginDragEntered: RBXScriptSignal<{ [any]: any }> + PluginDragLeft: RBXScriptSignal<{ [any]: any }> + PluginDragMoved: RBXScriptSignal<{ [any]: any }> + Title: string + WindowFocusReleased: RBXScriptSignal<> + WindowFocused: RBXScriptSignal<> + function BindToClose(self, func: ((...any) -> ...any)?): nil + function GetRelativeMousePosition(self): Vector2 +end + +declare class DockWidgetPluginGui extends PluginGui + HostWidgetWasRestored: boolean + function RequestRaise(self): nil +end + +declare class QWidgetPluginGui extends PluginGui +end + +declare class ScreenGui extends LayerCollector + ClipToDeviceSafeArea: boolean + DisplayOrder: number + IgnoreGuiInset: boolean + OnTopOfCoreBlur: boolean + SafeAreaCompatibility: EnumSafeAreaCompatibility + ScreenInsets: EnumScreenInsets +end + + + +declare class SurfaceGuiBase extends LayerCollector + Active: boolean + Adornee: Instance + Face: EnumNormalId +end + +declare class AdGui extends SurfaceGuiBase + AdShape: EnumAdShape + FallbackImage: Content + Status: EnumAdUnitStatus +end + +declare class SurfaceGui extends SurfaceGuiBase + AlwaysOnTop: boolean + Brightness: number + CanvasSize: Vector2 + ClipsDescendants: boolean + HorizontalCurvature: number + LightInfluence: number + PixelsPerStud: number + Shape: EnumSurfaceGuiShape + SizingMode: EnumSurfaceGuiSizingMode + ToolPunchThroughDistance: number + ZOffset: number +end + +declare class GuiBase3d extends GuiBase + Color3: Color3 + Transparency: number + Visible: boolean +end + + + +declare class InstanceAdornment extends GuiBase3d + Adornee: Instance? +end + +declare class SelectionBox extends InstanceAdornment + LineThickness: number + StudioSelectionBox: boolean + SurfaceColor3: Color3 + SurfaceTransparency: number +end + +declare class PVAdornment extends GuiBase3d + Adornee: PVInstance +end + +declare class HandleAdornment extends PVAdornment + AdornCullingMode: EnumAdornCullingMode + AlwaysOnTop: boolean + CFrame: CFrame + MouseButton1Down: RBXScriptSignal<> + MouseButton1Up: RBXScriptSignal<> + MouseEnter: RBXScriptSignal<> + MouseLeave: RBXScriptSignal<> + SizeRelativeOffset: Vector3 + ZIndex: number +end + +declare class BoxHandleAdornment extends HandleAdornment + Size: Vector3 +end + +declare class ConeHandleAdornment extends HandleAdornment + Height: number + Radius: number +end + +declare class CylinderHandleAdornment extends HandleAdornment + Angle: number + Height: number + InnerRadius: number + Radius: number +end + +declare class ImageHandleAdornment extends HandleAdornment + Image: Content + Size: Vector2 +end + +declare class LineHandleAdornment extends HandleAdornment + Length: number + Thickness: number +end + +declare class SphereHandleAdornment extends HandleAdornment + Radius: number +end + +declare class WireframeHandleAdornment extends HandleAdornment + Scale: Vector3 + function AddLine(self, from: Vector3, to: Vector3): nil + function AddLines(self, points: { any }): nil + function AddPath(self, points: { any }, loop: boolean): nil + function Clear(self): nil +end + +declare class ParabolaAdornment extends PVAdornment + A: number + B: number + C: number + Range: number + Thickness: number + function FindPartOnParabola(self, ignoreDescendentsTable: { Instance }): any +end + +declare class SelectionSphere extends PVAdornment + SurfaceColor3: Color3 + SurfaceTransparency: number +end + +declare class PartAdornment extends GuiBase3d + Adornee: BasePart? +end + +declare class HandlesBase extends PartAdornment +end + +declare class ArcHandles extends HandlesBase + Axes: Axes + MouseButton1Down: RBXScriptSignal + MouseButton1Up: RBXScriptSignal + MouseDrag: RBXScriptSignal + MouseEnter: RBXScriptSignal + MouseLeave: RBXScriptSignal +end + +declare class Handles extends HandlesBase + Faces: Faces + MouseButton1Down: RBXScriptSignal + MouseButton1Up: RBXScriptSignal + MouseDrag: RBXScriptSignal + MouseEnter: RBXScriptSignal + MouseLeave: RBXScriptSignal + Style: EnumHandlesStyle +end + +declare class SurfaceSelection extends PartAdornment + TargetSurface: EnumNormalId +end + +declare class SelectionLasso extends GuiBase3d + Humanoid: Humanoid +end + + + + + +declare class GuiService extends Instance + AutoSelectGuiEnabled: boolean + CloseInspectMenuRequest: RBXScriptSignal<> + CoreEffectFolder: Folder + CoreGuiFolder: Folder + CoreGuiNavigationEnabled: boolean + CoreGuiRenderOverflowed: RBXScriptSignal<> + EmotesMenuOpenChanged: RBXScriptSignal + GuiNavigationEnabled: boolean + GuiVisibilityChangedSignal: RBXScriptSignal + InspectMenuEnabledChangedSignal: RBXScriptSignal + InspectPlayerFromHumanoidDescriptionRequest: RBXScriptSignal + InspectPlayerFromUserIdWithCtxRequest: RBXScriptSignal + KeyPressed: RBXScriptSignal + MenuClosed: RBXScriptSignal<> + MenuIsOpen: boolean + MenuOpened: RBXScriptSignal<> + NativeClose: RBXScriptSignal<> + NetworkPausedEnabledChanged: RBXScriptSignal + Open9SliceEditor: RBXScriptSignal + PreferredTransparency: number + PurchasePromptShown: RBXScriptSignal<> + ReducedMotionEnabled: boolean + SafeZoneOffsetsChanged: RBXScriptSignal<> + SelectedCoreObject: GuiObject + SelectedObject: GuiObject? + SendCoreUiNotification: (title: string, text: string) -> nil + SendNotification: (self: GuiService, title: string, text: string, text2: string, number: number, callback: (any) -> any) -> nil + ShowLeaveConfirmation: RBXScriptSignal<> + SpecialKeyPressed: RBXScriptSignal + TouchControlsEnabled: boolean + UiMessageChanged: RBXScriptSignal + + EscapeKeyPressed: RBXScriptSignal<> + BrowserWindowClosed: RBXScriptSignal<> + IsWindows: boolean + IsModalDialog: boolean + UseLuaChat: boolean + + function AddCenterDialog(self, dialog: Instance, centerDialogType: EnumCenterDialogType, showFunction: ((...any) -> ...any), hideFunction: ((...any) -> ...any)): nil + function AddKey(self, key: string): nil + function AddSelectionParent(self, selectionName: string, selectionParent: Instance): nil + function AddSelectionTuple(self, selectionName: string, selections: any): nil + function AddSpecialKey(self, key: EnumSpecialKey): nil + function BroadcastNotification(self, data: string, notificationType: number): nil + function ClearError(self): nil + function CloseInspectMenu(self): nil + function CloseStatsBasedOnInputString(self, input: string): boolean + function ForceTenFootInterface(self, isForced: boolean): nil + function GetBrickCount(self): number + function GetClosestDialogToPosition(self, position: Vector3): Instance + function GetEmotesMenuOpen(self): boolean + function GetErrorCode(self): EnumConnectionError + function GetErrorType(self): EnumConnectionError + function GetGameplayPausedNotificationEnabled(self): boolean + function GetGuiInset(self): (Vector2, Vector2) + function GetGuiIsVisible(self, guiType: EnumGuiType): boolean + function GetInspectMenuEnabled(self): boolean + function GetNotificationTypeList(self): { [any]: any } + function GetResolutionScale(self): number + function GetSafeZoneOffsets(self): { [any]: any } + function GetScreenResolution(self): Vector2 + function GetUiMessage(self): string + function InspectPlayerFromHumanoidDescription(self, humanoidDescription: HumanoidDescription, name: string): nil + function InspectPlayerFromUserId(self, userId: number): nil + function InspectPlayerFromUserIdWithCtx(self, userId: number, ctx: string): nil + function IsMemoryTrackerEnabled(self): boolean + function IsTenFootInterface(self): boolean + function RemoveCenterDialog(self, dialog: Instance): nil + function RemoveKey(self, key: string): nil + function RemoveSelectionGroup(self, selectionName: string): nil + function RemoveSpecialKey(self, key: EnumSpecialKey): nil + function Select(self, selectionParent: Instance): nil + function SetEmotesMenuOpen(self, isOpen: boolean): nil + function SetGameplayPausedNotificationEnabled(self, enabled: boolean): nil + function SetGlobalGuiInset(self, x1: number, y1: number, x2: number, y2: number): nil + function SetHardwareSafeAreaInsets(self, left: number, top: number, right: number, bottom: number): nil + function SetInspectMenuEnabled(self, enabled: boolean): nil + function SetMenuIsOpen(self, open: boolean, menuName: string?): nil + function SetPurchasePromptIsShown(self, isShown: boolean): nil + function SetSafeZoneOffsets(self, top: number, bottom: number, left: number, right: number): nil + function SetUiMessage(self, msgType: EnumUiMessageType, uiMessage: string?): nil + function ShowStatsBasedOnInputString(self, input: string): boolean + function ToggleFullscreen(self): nil + function ToggleGuiIsVisibleForCaptures(self, guiType: EnumGuiType): nil + function ToggleGuiIsVisibleIfAllowed(self, guiType: EnumGuiType): nil + + function OpenBrowserWindow(self, url: string): nil +end + +declare class GuidRegistryService extends Instance +end + +declare class HapticService extends Instance + function GetMotor(self, inputType: EnumUserInputType, vibrationMotor: EnumVibrationMotor): any + function IsMotorSupported(self, inputType: EnumUserInputType, vibrationMotor: EnumVibrationMotor): boolean + function IsVibrationSupported(self, inputType: EnumUserInputType): boolean + function SetMotor(self, inputType: EnumUserInputType, vibrationMotor: EnumVibrationMotor, vibrationValues: any): nil +end + +declare class HeightmapImporterService extends Instance + ColormapHasUnknownPixels: RBXScriptSignal<> + ProgressUpdate: RBXScriptSignal + function CancelImportHeightmap(self): nil + function GetHeightmapPreviewAsync(self, heightmapAssetId: Content): any + function ImportHeightmap(self, region: Region3, heightmapAssetId: Content, colormapAssetId: Content, defaultMaterial: EnumMaterial): nil + function IsValidColormap(self, colormapAssetId: Content): any + function IsValidHeightmap(self, heightmapAssetId: Content): any + function SetImportHeightmapPaused(self, paused: boolean): nil +end + +declare class HiddenSurfaceRemovalAsset extends Instance +end + +declare class Highlight extends Instance + Adornee: Instance? + DepthMode: EnumHighlightDepthMode + Enabled: boolean + FillColor: Color3 + FillTransparency: number + LineThickness: number + OutlineColor: Color3 + OutlineTransparency: number + ReservedId: EnumReservedHighlightId +end + + + +declare class HttpRbxApiService extends Instance + function GetAsync(self, apiUrlPath: string, priority: EnumThrottlingPriority?, httpRequestType: EnumHttpRequestType?): string + function GetAsyncFullUrl(self, apiUrl: string, priority: EnumThrottlingPriority?, httpRequestType: EnumHttpRequestType?): string + function GetDocumentationUrl(self, partialUrl: string): string + function PostAsync(self, apiUrlPath: string, data: string, priority: EnumThrottlingPriority?, content_type: EnumHttpContentType?, httpRequestType: EnumHttpRequestType?): string + function PostAsyncFullUrl(self, apiUrl: string, data: string, priority: EnumThrottlingPriority?, content_type: EnumHttpContentType?, httpRequestType: EnumHttpRequestType?): string + function RequestAsync(self, requestOptions: { [any]: any }, priority: EnumThrottlingPriority?, content_type: EnumHttpContentType?, httpRequestType: EnumHttpRequestType?): string + function RequestLimitedAsync(self, requestOptions: { [any]: any }, priority: EnumThrottlingPriority?, content_type: EnumHttpContentType?, httpRequestType: EnumHttpRequestType?): string +end + +declare class HttpRequest extends Instance + function Cancel(self): nil + function Start(self, callback: ((...any) -> ...any)): nil +end + +declare class HttpService extends Instance + HttpEnabled: boolean + function GenerateGUID(self, wrapInCurlyBraces: boolean?): string + function GetAsync(self, url: string, nocache: boolean?, headers: any): string + function GetHttpEnabled(self): boolean + function GetUserAgent(self): string + function JSONDecode(self, input: string): any + function JSONEncode(self, input: any): string + function PostAsync(self, url: string, data: string, content_type: EnumHttpContentType?, compress: boolean?, headers: any): string + function RequestAsync(self, options: HttpRequestOptions): HttpResponseData + function RequestInternal(self, options: { [any]: any }): Instance + function SetHttpEnabled(self, enabled: boolean): nil + function UrlEncode(self, input: string): string +end + +declare class Humanoid extends Instance + AutoJumpEnabled: boolean + AutoRotate: boolean + AutomaticScalingEnabled: boolean + BreakJointsOnDeath: boolean + CameraOffset: Vector3 + Climbing: RBXScriptSignal + ClusterCompositionFinished: RBXScriptSignal<> + Died: RBXScriptSignal<> + DisplayDistanceType: EnumHumanoidDisplayDistanceType + DisplayName: string + EmoteTriggered: RBXScriptSignal + EvaluateStateMachine: boolean + FallingDown: RBXScriptSignal + FloorMaterial: EnumMaterial + FreeFalling: RBXScriptSignal + GettingUp: RBXScriptSignal + Health: number + HealthChanged: RBXScriptSignal + HealthDisplayDistance: number + HealthDisplayType: EnumHumanoidHealthDisplayType + HipHeight: number + InternalDisplayName: string + Jump: boolean + JumpHeight: number + JumpPower: number + Jumping: RBXScriptSignal + MaxHealth: number + MaxSlopeAngle: number + MoveDirection: Vector3 + MoveToFinished: RBXScriptSignal + NameDisplayDistance: number + NameOcclusion: EnumNameOcclusion + PlatformStand: boolean + PlatformStanding: RBXScriptSignal + Ragdoll: RBXScriptSignal + RequiresNeck: boolean + RigType: EnumHumanoidRigType + RootPart: BasePart? + Running: RBXScriptSignal + SeatPart: Seat | VehicleSeat | nil + Seated: RBXScriptSignal + Sit: boolean + StateChanged: RBXScriptSignal + StateEnabledChanged: RBXScriptSignal + Strafing: RBXScriptSignal + Swimming: RBXScriptSignal + TargetPoint: Vector3 + Touched: RBXScriptSignal + UseJumpPower: boolean + WalkSpeed: number + WalkToPart: BasePart? + WalkToPoint: Vector3 + function AddAccessory(self, accessory: Accessory): nil + function ApplyDescription(self, humanoidDescription: HumanoidDescription, assetTypeVerification: EnumAssetTypeVerification?): nil + function ApplyDescriptionBlocking(self, humanoidDescription: HumanoidDescription): nil + function ApplyDescriptionClientServer(self, humanoidDescription: HumanoidDescription): nil + function ApplyDescriptionReset(self, humanoidDescription: HumanoidDescription, assetTypeVerification: EnumAssetTypeVerification?): nil + function BuildRigFromAttachments(self): nil + function CacheDefaults(self): nil + function ChangeState(self, state: EnumHumanoidStateType?): nil + function EquipTool(self, tool: Tool): nil + function GetAccessories(self): { Accessory } + function GetAccessoryHandleScale(self, instance: Instance, partType: EnumBodyPartR15): Vector3 + function GetAppliedDescription(self): HumanoidDescription + function GetBodyPartR15(self, part: BasePart): EnumBodyPartR15 + function GetLimb(self, part: BasePart): EnumLimb + function GetMoveVelocity(self): Vector3 + function GetState(self): EnumHumanoidStateType + function GetStateEnabled(self, state: EnumHumanoidStateType): boolean + function Move(self, moveDirection: Vector3, relativeToCamera: boolean?): nil + function MoveTo(self, location: Vector3, part: BasePart?): nil + function PlayEmote(self, emoteName: string): boolean + function PlayEmoteAndGetAnimTrackById(self, emoteId: number): any + function RemoveAccessories(self): nil + function ReplaceBodyPartR15(self, bodyPart: EnumBodyPartR15, part: BasePart): boolean + function SetClickToWalkEnabled(self, enabled: boolean): nil + function SetStateEnabled(self, state: EnumHumanoidStateType, enabled: boolean): nil + function TakeDamage(self, amount: number): nil + function UnequipTools(self): nil +end + +declare class HumanoidDescription extends Instance + AccessoryBlob: string + BackAccessory: string + BodyTypeScale: number + ClimbAnimation: number + DepthScale: number + EmotesChanged: RBXScriptSignal<{ [any]: any }> + EquippedEmotesChanged: RBXScriptSignal<{ any }> + Face: number + FaceAccessory: string + FallAnimation: number + FrontAccessory: string + GraphicTShirt: number + HairAccessory: string + HatAccessory: string + Head: number + HeadColor: Color3 + HeadScale: number + HeightScale: number + IdleAnimation: number + JumpAnimation: number + LeftArm: number + LeftArmColor: Color3 + LeftLeg: number + LeftLegColor: Color3 + MoodAnimation: number + NeckAccessory: string + NumberEmotesLoaded: number + Pants: number + ProportionScale: number + RightArm: number + RightArmColor: Color3 + RightLeg: number + RightLegColor: Color3 + RunAnimation: number + Shirt: number + ShouldersAccessory: string + SwimAnimation: number + Torso: number + TorsoColor: Color3 + WaistAccessory: string + WalkAnimation: number + WidthScale: number + function AddEmote(self, name: string, assetId: number): nil + function GetAccessories(self, includeRigidAccessories: boolean): { HumanoidDescriptionAccessory } + function GetEmotes(self): { [string]: { number } } + function GetEquippedEmotes(self): { { Slot: number, Name: string } } + function RemoveEmote(self, name: string): nil + function SetAccessories(self, accessories: { HumanoidDescriptionAccessory }, includeRigidAccessories: boolean): () + function SetEmotes(self, emotes: { [string]: { number } }): () + function SetEquippedEmotes(self, equippedEmotes: { string } | { Slot: number, Name: string }): () +end + +declare class IKControl extends Instance + ChainRoot: Instance + Enabled: boolean + EndEffector: Instance + EndEffectorOffset: CFrame + Offset: CFrame + Pole: Instance + Priority: number + SmoothTime: number + Target: Instance + Type: EnumIKControlType + Weight: number + function GetChainCount(self): number + function GetChainLength(self): number + function GetNodeLocalCFrame(self, index: number): CFrame + function GetNodeWorldCFrame(self, index: number): CFrame + function GetRawFinalTarget(self): CFrame + function GetSmoothedFinalTarget(self): CFrame +end + +declare class ILegacyStudioBridge extends Instance +end + +declare class LegacyStudioBridge extends ILegacyStudioBridge +end + +declare class IXPService extends Instance + OnBrowserTrackerLayerLoadingStatusChanged: RBXScriptSignal + OnUserLayerLoadingStatusChanged: RBXScriptSignal + function ClearUserLayers(self): nil + function GetBrowserTrackerLayerLoadingStatus(self): EnumIXPLoadingStatus + function GetBrowserTrackerLayerVariables(self, layerName: string): { [any]: any } + function GetBrowserTrackerStatusForLayer(self, layerName: string): EnumIXPLoadingStatus? + function GetRegisteredUserLayersToStatus(self): { [any]: any } + function GetUserLayerLoadingStatus(self): EnumIXPLoadingStatus + function GetUserLayerVariables(self, layerName: string): { [any]: any } + function GetUserStatusForLayer(self, layerName: string): EnumIXPLoadingStatus? + function InitializeUserLayers(self, userId: number): nil + function LogBrowserTrackerLayerExposure(self, layerName: string): nil + function LogUserLayerExposure(self, layerName: string): nil + function RegisterUserLayers(self, userLayers: any): nil +end + +declare class IncrementalPatchBuilder extends Instance + AddPathsToBundle: boolean + BuildDebouncePeriod: number + HighCompression: boolean + SerializePatch: boolean + ZstdCompression: boolean +end + +declare class InputObject extends Instance + Delta: Vector3 + KeyCode: EnumKeyCode + Position: Vector3 + UserInputState: EnumUserInputState + UserInputType: EnumUserInputType + function IsModifierKeyDown(self, modifierKey: EnumModifierKey): boolean +end + +declare class InsertService extends Instance + AllowClientInsertModels: boolean + function CreateMeshPartAsync(self, meshId: Content, collisionFidelity: EnumCollisionFidelity, renderFidelity: EnumRenderFidelity): MeshPart + function GetBaseSets(self): { any } + function GetCollection(self, categoryId: number): { any } + function GetFreeDecals(self, searchText: string, pageNum: number): { any } + function GetFreeModels(self, searchText: string, pageNum: number): { any } + function GetLatestAssetVersionAsync(self, assetId: number): number + function GetLocalFileContents(self, contentId: string): string + function GetUserSets(self, userId: number): { any } + function LoadAsset(self, assetId: number): Instance + function LoadAssetVersion(self, assetVersionId: number): Instance + function LoadAssetWithFormat(self, assetId: number, format: string): { Instance } + function LoadLocalAsset(self, assetPath: string): Instance + function LoadPackageAsset(self, url: Content): { Instance } + function LoadPackageAssetAsync(self, url: Content): { Instance } +end + +declare class JointInstance extends Instance + Active: boolean + C0: CFrame + C1: CFrame + Enabled: boolean + Part0: BasePart? + Part1: BasePart? +end + +declare class DynamicRotate extends JointInstance + BaseAngle: number +end + + + + + + + + + + + + + +declare class Motor extends JointInstance + CurrentAngle: number + DesiredAngle: number + MaxVelocity: number + function SetDesiredAngle(self, value: number): nil +end + +declare class Motor6D extends Motor + ChildName: string + ParentName: string + Transform: CFrame +end + + + + + +declare class VelocityMotor extends JointInstance + CurrentAngle: number + DesiredAngle: number + Hole: Hole + MaxVelocity: number +end + +declare class Weld extends JointInstance +end + + + +declare class KeyboardService extends Instance +end + +declare class Keyframe extends Instance + Time: number + function AddMarker(self, marker: KeyframeMarker): nil + function AddPose(self, pose: Pose): nil + function GetMarkers(self): { Instance } + function GetPoses(self): { Instance } + function RemoveMarker(self, marker: Instance): nil + function RemovePose(self, pose: Pose): nil +end + +declare class KeyframeMarker extends Instance + Value: string +end + +declare class KeyframeSequenceProvider extends Instance + function GetAnimations(self, userId: number): Instance + function GetKeyframeSequenceAsync(self, assetId: Content): Instance + function GetMemStats(self): { [any]: any } + function RegisterActiveKeyframeSequence(self, keyframeSequence: Instance): Content + function RegisterKeyframeSequence(self, keyframeSequence: Instance): Content +end + +declare class LSPFileSyncService extends Instance +end + +declare class LanguageService extends Instance +end + +declare class Light extends Instance + Brightness: number + Color: Color3 + Enabled: boolean + Shadows: boolean +end + +declare class PointLight extends Light + Range: number +end + +declare class SpotLight extends Light + Angle: number + Face: EnumNormalId + Range: number +end + +declare class SurfaceLight extends Light + Angle: number + Face: EnumNormalId + Range: number +end + +declare class Lighting extends Instance + Ambient: Color3 + Brightness: number + ClockTime: number + ColorShift_Bottom: Color3 + ColorShift_Top: Color3 + EnvironmentDiffuseScale: number + EnvironmentSpecularScale: number + ExposureCompensation: number + FogColor: Color3 + FogEnd: number + FogStart: number + GeographicLatitude: number + GlobalShadows: boolean + LightingChanged: RBXScriptSignal + OutdoorAmbient: Color3 + ShadowSoftness: number + Technology: EnumTechnology + TempUseNewSkyRemovalBehaviour: boolean + TimeOfDay: string + function GetMinutesAfterMidnight(self): number + function GetMoonDirection(self): Vector3 + function GetMoonPhase(self): number + function GetSunDirection(self): Vector3 + function SetMinutesAfterMidnight(self, minutes: number): nil +end + +declare class LiveScriptingService extends Instance +end + +declare class LocalStorageService extends Instance + ItemWasSet: RBXScriptSignal + StoreWasCleared: RBXScriptSignal<> + function Flush(self): nil + function GetItem(self, key: string): string + function SetItem(self, key: string, value: string): nil + function WhenLoaded(self, callback: ((...any) -> ...any)): nil +end + +declare class AppStorageService extends LocalStorageService +end + +declare class UserStorageService extends LocalStorageService +end + +declare class LocalizationService extends Instance + AutoTranslateWillRun: RBXScriptSignal<> + ForcePlayModeGameLocaleId: string + ForcePlayModeRobloxLocaleId: string + IsTextScraperRunning: boolean + RobloxForcePlayModeGameLocaleId: string + RobloxForcePlayModeRobloxLocaleId: string + RobloxLocaleId: string + SystemLocaleId: string + function GetCorescriptLocalizations(self): { Instance } + function GetCountryRegionForPlayerAsync(self, player: Player): string + function GetTableEntries(self, instance: Instance?): { any } + function GetTranslatorForLocaleAsync(self, locale: string): Translator + function GetTranslatorForPlayer(self, player: Player): Translator + function GetTranslatorForPlayerAsync(self, player: Player): Translator + function PromptDownloadGameTableToCSV(self, table: Instance): nil + function PromptExportToCSVs(self): nil + function PromptImportFromCSVs(self): nil + function PromptUploadCSVToGameTable(self): Instance + function SetRobloxLocaleId(self, locale: string): nil + function StartTextScraper(self): nil + function StopTextScraper(self): nil +end + +declare class LocalizationTable extends Instance + SourceLocaleId: string + function GetEntries(self): { any } + function GetTranslator(self, localeId: string): Translator + function RemoveEntry(self, key: string, source: string, context: string): nil + function RemoveEntryValue(self, key: string, source: string, context: string, localeId: string): nil + function RemoveTargetLocale(self, localeId: string): nil + function SetEntries(self, entries: any): nil + function SetEntryContext(self, key: string, source: string, context: string, newContext: string): nil + function SetEntryExample(self, key: string, source: string, context: string, example: string): nil + function SetEntryKey(self, key: string, source: string, context: string, newKey: string): nil + function SetEntrySource(self, key: string, source: string, context: string, newSource: string): nil + function SetEntryValue(self, key: string, source: string, context: string, localeId: string, text: string): nil + function SetIsExemptFromUGCAnalytics(self, value: boolean): nil +end + +declare class CloudLocalizationTable extends LocalizationTable +end + +declare class LodDataEntity extends Instance + EntityLodEnabled: boolean +end + +declare class LodDataService extends Instance +end + +declare class LogService extends Instance + HttpResultOut: RBXScriptSignal<{ [any]: any }> + MessageOut: RBXScriptSignal + OnHttpResultApproved: RBXScriptSignal + ServerHttpResultOut: RBXScriptSignal<{ [any]: any }> + ServerMessageOut: RBXScriptSignal + function ClearOutput(self): nil + function ExecuteScript(self, source: string): nil + function GetHttpResultHistory(self): { any } + function GetLogHistory(self): { any } + function RequestHttpResultApproved(self): nil + function RequestServerHttpResult(self): nil + function RequestServerOutput(self): nil +end + +declare class LoginService extends Instance + LoginFailed: RBXScriptSignal + LoginSucceeded: RBXScriptSignal + function Logout(self): nil + function PromptLogin(self): nil +end + +declare class LuaSettings extends Instance +end + +declare class LuaSourceContainer extends Instance + CurrentEditor: Instance + RuntimeSource: string +end + +declare class BaseScript extends LuaSourceContainer + Disabled: boolean + Enabled: boolean + LinkedSource: Content + RunContext: EnumRunContext +end + +declare class CoreScript extends BaseScript +end + +declare class Script extends BaseScript + Source: ProtectedString + function GetHash(self): string +end + +declare class LocalScript extends Script +end + +declare class ModuleScript extends LuaSourceContainer + LinkedSource: Content + Source: ProtectedString +end + +declare class LuaWebService extends Instance +end + +declare class LuauScriptAnalyzerService extends Instance +end + +declare class MarkerCurve extends Instance + Length: number + function GetMarkerAtIndex(self, index: number): { [any]: any } + function GetMarkers(self): { any } + function InsertMarkerAtTime(self, time: number, marker: string): { any } + function RemoveMarkerAtIndex(self, startingIndex: number, count: number?): number +end + +declare class MarketplaceService extends Instance + ClientLuaDialogRequested: RBXScriptSignal + ClientPurchaseSuccess: RBXScriptSignal + NativePurchaseFinished: RBXScriptSignal + NativePurchaseFinishedWithLocalPlayer: RBXScriptSignal + PrepareCollectiblesPurchaseRequested: RBXScriptSignal + ProcessReceipt: (receiptInfo: { [any]: any }) -> EnumProductPurchaseDecision + PromptBundlePurchaseFinished: RBXScriptSignal + PromptBundlePurchaseRequested: RBXScriptSignal + PromptCollectiblesPurchaseRequested: RBXScriptSignal + PromptGamePassPurchaseFinished: RBXScriptSignal + PromptGamePassPurchaseRequested: RBXScriptSignal + PromptPremiumPurchaseFinished: RBXScriptSignal<> + PromptPremiumPurchaseRequested: RBXScriptSignal + PromptProductPurchaseFinished: RBXScriptSignal + PromptProductPurchaseRequested: RBXScriptSignal + PromptPurchaseFinished: RBXScriptSignal + PromptPurchaseRequested: RBXScriptSignal + PromptPurchaseRequestedV2: RBXScriptSignal + PromptRobloxPurchaseRequested: RBXScriptSignal + PromptSubscriptionPurchaseRequested: RBXScriptSignal + ServerPurchaseVerification: RBXScriptSignal<{ [any]: any }> + ThirdPartyPurchaseFinished: RBXScriptSignal + function GetDeveloperProductsAsync(self): Pages + function GetProductInfo(self, assetId: number, infoType: EnumInfoType?): { [any]: any } + function GetRobuxBalance(self): number + function GetSubscriptionPurchaseInfoAsync(self, subscriptionId: string): { [any]: any } + function PerformPurchase(self, infoType: EnumInfoType, productId: number, expectedPrice: number, requestId: string, isRobloxPurchase: boolean, collectibleItemId: string?, collectibleProductId: string?, idempotencyKey: string?, purchaseAuthToken: string?): { [any]: any } + function PerformPurchaseV2(self, infoType: EnumInfoType, productId: number, expectedPrice: number, requestId: string, isRobloxPurchase: boolean, collectiblesProductDetails: { [any]: any }): { [any]: any } + function PlayerCanMakePurchases(self, player: Instance): boolean + function PlayerOwnsAsset(self, player: Player, assetId: number): boolean + function PlayerOwnsBundle(self, player: Player, bundleId: number): boolean + function PrepareCollectiblesPurchase(self, player: Instance, assetId: number, collectibleItemId: string, collectibleItemInstanceId: string, collectibleProductId: string, expectedPrice: number): nil + function PromptBundlePurchase(self, player: Player, bundleId: number): nil + function PromptCollectiblesPurchase(self, player: Instance, assetId: number, collectibleItemId: string, collectibleItemInstanceId: string, collectibleProductId: string, expectedPrice: number): nil + function PromptGamePassPurchase(self, player: Player, gamePassId: number): nil + function PromptNativePurchase(self, player: Instance, productId: string): nil + function PromptNativePurchaseWithLocalPlayer(self, productId: string): nil + function PromptPremiumPurchase(self, player: Player): nil + function PromptProductPurchase(self, player: Player, productId: number, equipIfPurchased: boolean?, currencyType: EnumCurrencyType?): nil + function PromptPurchase(self, player: Player, assetId: number, equipIfPurchased: boolean?, currencyType: EnumCurrencyType?): nil + function PromptRobloxPurchase(self, assetId: number, equipIfPurchased: boolean): nil + function PromptSubscriptionPurchaseFinished(self, subscriptionId: string, didTryPurchasing: boolean): nil + function PromptThirdPartyPurchase(self, player: Instance, productId: string): nil + function ReportAssetSale(self, assetId: string, robuxAmount: number): nil + function ReportRobuxUpsellStarted(self): nil + function SignalAssetTypePurchased(self, player: Instance, assetType: EnumAssetType): nil + function SignalClientPurchaseSuccess(self, ticket: string, playerId: number, productId: number): nil + function SignalMockPurchasePremium(self): nil + function SignalPromptBundlePurchaseFinished(self, player: Instance, bundleId: number, success: boolean): nil + function SignalPromptGamePassPurchaseFinished(self, player: Instance, gamePassId: number, success: boolean): nil + function SignalPromptPremiumPurchaseFinished(self, didTryPurchasing: boolean): nil + function SignalPromptProductPurchaseFinished(self, userId: number, productId: number, success: boolean): nil + function SignalPromptPurchaseFinished(self, player: Instance, assetId: number, success: boolean): nil + function SignalServerLuaDialogClosed(self, value: boolean): nil + function UserOwnsGamePassAsync(self, userId: number, gamePassId: number): boolean +end + +declare class MaterialGenerationService extends Instance + function GetAccountingBalanceAsync(self): number + function RefillAccountingBalanceAsync(self): number + function StartSession(self): MaterialGenerationSession +end + +declare class MaterialGenerationSession extends Instance + function GenerateImagesAsync(self, prompt: string, options: { [any]: any }): any + function GenerateMaterialMapsAsync(self, imageId: string): { [any]: any } + function UploadMaterialAsync(self, imageId: string): { [any]: any } +end + +declare class MaterialService extends Instance + AsphaltName: string + BasaltName: string + BrickName: string + CardboardName: string + CarpetName: string + CeramicTilesName: string + ClayRoofTilesName: string + CobblestoneName: string + ConcreteName: string + CorrodedMetalName: string + CrackedLavaName: string + DiamondPlateName: string + FabricName: string + FoilName: string + GlacierName: string + GraniteName: string + GrassName: string + GroundName: string + IceName: string + LeafyGrassName: string + LeatherName: string + LimestoneName: string + MarbleName: string + MetalName: string + MudName: string + OverrideStatusChanged: RBXScriptSignal + PavementName: string + PebbleName: string + PlasterName: string + PlasticName: string + RockName: string + RoofShinglesName: string + RubberName: string + SaltName: string + SandName: string + SandstoneName: string + SlateName: string + SmoothPlasticName: string + SnowName: string + Use2022Materials: boolean + WoodName: string + WoodPlanksName: string + function GetBaseMaterialOverride(self, material: EnumMaterial): string + function GetMaterialOverrideChanged(self, material: EnumMaterial): RBXScriptSignal + function GetMaterialVariant(self, material: EnumMaterial, name: string): MaterialVariant + function GetOverrideStatus(self, material: EnumMaterial): EnumPropertyStatus + function SetBaseMaterialOverride(self, material: EnumMaterial, name: string): nil +end + +declare class MaterialVariant extends Instance + BaseMaterial: EnumMaterial + ColorMap: Content + CustomPhysicalProperties: PhysicalProperties + MaterialPattern: EnumMaterialPattern + MetalnessMap: Content + NormalMap: Content + RoughnessMap: Content + StudsPerTile: number +end + +declare class MemStorageConnection extends Instance + function Disconnect(self): nil +end + +declare class MemStorageService extends Instance + function Bind(self, key: string, callback: ((...any) -> ...any)): MemStorageConnection + function BindAndFire(self, key: string, callback: ((...any) -> ...any)): MemStorageConnection + function Call(self, key: string, input: any): any + function Fire(self, key: string, value: string?): nil + function GetItem(self, key: string, defaultValue: string?): string + function HasItem(self, key: string): boolean + function RemoveItem(self, key: string): boolean + function SetItem(self, key: string, value: string?): nil +end + +declare class MemoryStoreQueue extends Instance + function AddAsync(self, value: any, expiration: number, priority: number?): nil + function ReadAsync(self, count: number, allOrNothing: boolean?, waitTimeout: number?): any + function RemoveAsync(self, id: string): nil +end + +declare class MemoryStoreService extends Instance + function GetQueue(self, name: string, invisibilityTimeout: number?): MemoryStoreQueue + function GetSortedMap(self, name: string): MemoryStoreSortedMap +end + +declare class MemoryStoreSortedMap extends Instance + function GetAsync(self, key: string): any + function GetRangeAsync(self, direction: EnumSortDirection, count: number, exclusiveLowerBound: string?, exclusiveUpperBound: string?): { any } + function RemoveAsync(self, key: string): nil + function SetAsync(self, key: string, value: any, expiration: number): boolean + function UpdateAsync(self, key: string, transformFunction: ((...any) -> ...any), expiration: number): any +end + + + + + +declare class MessageBusConnection extends Instance + function Disconnect(self): nil +end + +declare class MessageBusService extends Instance + function Call(self, key: string, input: any): any + function GetLast(self, mid: string): any + function GetMessageId(self, domainName: string, messageName: string): string + function GetProtocolMethodRequestMessageId(self, protocolName: string, methodName: string): string + function GetProtocolMethodResponseMessageId(self, protocolName: string, methodName: string): string + function MakeRequest(self, protocolName: string, methodName: string, message: any, callback: ((...any) -> ...any), customTelemetryData: any): nil + function Publish(self, mid: string, params: any): nil + function PublishProtocolMethodRequest(self, protocolName: string, methodName: string, message: any, customTelemetryData: any): nil + function PublishProtocolMethodResponse(self, protocolName: string, methodName: string, message: any, responseCode: number, customTelemetryData: any): nil + function SetRequestHandler(self, protocolName: string, methodName: string, callback: ((...any) -> ...any)): nil + function Subscribe(self, mid: string, callback: ((...any) -> ...any), once: boolean, sticky: boolean): Instance + function SubscribeToProtocolMethodRequest(self, protocolName: string, methodName: string, callback: ((...any) -> ...any), once: boolean, sticky: boolean): Instance + function SubscribeToProtocolMethodResponse(self, protocolName: string, methodName: string, callback: ((...any) -> ...any), once: boolean, sticky: boolean): Instance +end + +declare class MessagingService extends Instance + function PublishAsync(self, topic: string, message: any): nil + function SubscribeAsync(self, topic: string, callback: ((...any) -> ...any)): RBXScriptConnection +end + +declare class MetaBreakpoint extends Instance + Condition: string + ContinueExecution: boolean + Enabled: boolean + Id: number + IsLogpoint: boolean + Line: number + LogMessage: string + RemoveOnHit: boolean + Script: string + Valid: boolean + function GetContextBreakpoints(self): { [any]: any } + function Remove(self, status: ((...any) -> ...any)): number + function SetChildBreakpointEnabledByScriptAndContext(self, script: string, contextGST: number, enabled: boolean): nil + function SetContextEnabled(self, context: number, enabled: boolean): nil + function SetContinueExecution(self, enabled: boolean): nil + function SetEnabled(self, enabled: boolean): nil + function SetLine(self, line: number, status: ((...any) -> ...any)): number + function SetRemoveOnHit(self, enabled: boolean): nil +end + +declare class MetaBreakpointContext extends Instance +end + +declare class MetaBreakpointManager extends Instance + MetaBreakpointAdded: RBXScriptSignal + MetaBreakpointChanged: RBXScriptSignal + MetaBreakpointRemoved: RBXScriptSignal + MetaBreakpointSetChanged: RBXScriptSignal + function AddBreakpoint(self, script: Instance, line: number, condition: Instance): Instance + function GetBreakpointById(self, metaBreakpointId: number): MetaBreakpoint + function RemoveBreakpointById(self, metaBreakpointId: number): nil +end + +declare class Mouse extends Instance + Button1Down: RBXScriptSignal<> + Button1Up: RBXScriptSignal<> + Button2Down: RBXScriptSignal<> + Button2Up: RBXScriptSignal<> + Hit: CFrame + Icon: Content + Idle: RBXScriptSignal<> + Move: RBXScriptSignal<> + Origin: CFrame + Target: BasePart + TargetFilter: Instance + TargetSurface: EnumNormalId + UnitRay: Ray + ViewSizeX: number + ViewSizeY: number + WheelBackward: RBXScriptSignal<> + WheelForward: RBXScriptSignal<> + X: number + Y: number +end + +declare class PlayerMouse extends Mouse +end + +declare class PluginMouse extends Mouse + DragEnter: RBXScriptSignal<{ Instance }> +end + +declare class MouseService extends Instance + MouseEnterStudioViewport: RBXScriptSignal<> + MouseLeaveStudioViewport: RBXScriptSignal<> +end + +declare class MultipleDocumentInterfaceInstance extends Instance + DataModelSessionEnded: RBXScriptSignal + DataModelSessionStarted: RBXScriptSignal + FocusedDataModelSession: Instance +end + +declare class NetworkMarker extends Instance + Received: RBXScriptSignal<> +end + +declare class NetworkPeer extends Instance + function SetOutgoingKBPSLimit(self, limit: number): nil +end + +declare class NetworkClient extends NetworkPeer + ConnectionAccepted: RBXScriptSignal + ConnectionFailed: RBXScriptSignal +end + +declare class NetworkServer extends NetworkPeer + function EncryptStringForPlayerId(self, toEncrypt: string, playerId: number): string + function SetIsPlayerAuthenticationRequired(self, value: boolean): nil +end + +declare class NetworkReplicator extends Instance + function GetPlayer(self): Instance +end + +declare class ClientReplicator extends NetworkReplicator + RCCProfilerDataComplete: RBXScriptSignal + StatsReceived: RBXScriptSignal<{ [any]: any }> + function RequestRCCProfilerData(self, frameRate: number, timeFrame: number): nil + function RequestServerScriptProfiling(self, start: boolean, frequency: number?): nil + function RequestServerStats(self, request: boolean): nil +end + +declare class ServerReplicator extends NetworkReplicator +end + +declare class NetworkSettings extends Instance + EmulatedTotalMemoryInMB: number + FreeMemoryMBytes: number + HttpProxyEnabled: boolean + HttpProxyURL: string + IncomingReplicationLag: number + PrintJoinSizeBreakdown: boolean + PrintPhysicsErrors: boolean + PrintStreamInstanceQuota: boolean + RandomizeJoinInstanceOrder: boolean + RenderStreamedRegions: boolean + ShowActiveAnimationAsset: boolean + + PhysicsSend: number + WaitingForCharacterLogRate: number + ExperimentalPhysicsEnabled: boolean + UseInstancePacketCache: boolean + UsePhysicsPacketCache: boolean + MtuOverride: number +end + +declare class NoCollisionConstraint extends Instance + Enabled: boolean + Part0: BasePart + Part1: BasePart +end + +declare class NotificationService extends Instance + IsConnected: boolean + IsLuaChatEnabled: boolean + IsLuaGameDetailsEnabled: boolean + Roblox17sConnectionChanged: RBXScriptSignal + Roblox17sEventReceived: RBXScriptSignal<{ [any]: any }> + RobloxConnectionChanged: RBXScriptSignal + RobloxEventReceived: RBXScriptSignal<{ [any]: any }> + SelectedTheme: string + function ActionEnabled(self, actionType: EnumAppShellActionType): nil + function ActionTaken(self, actionType: EnumAppShellActionType): nil + function CancelAllNotification(self, userId: number): nil + function CancelNotification(self, userId: number, alertId: number): nil + function GetScheduledNotifications(self, userId: number): { any } + function ScheduleNotification(self, userId: number, alertId: number, alertMsg: string, minutesToFire: number): nil + function SwitchedToAppShellFeature(self, appShellFeature: EnumAppShellFeature): nil +end + +declare class OmniRecommendationsService extends Instance + function ClearSessionId(self): nil + function GetSessionId(self): string + function MakeRequest(self, nextPageToken: string): HttpRequest +end + +declare class OpenCloudApiV1 extends Instance + function CreateModel(self, name: string): OpenCloudModel + function CreateUserNotificationAsync(self, user: string, userNotification: OpenCloudModel): OpenCloudModel +end + +declare class OpenCloudService extends Instance + function GetApiV1(self): OpenCloudApiV1 +end + +declare class PVInstance extends Instance + Origin: CFrame + function GetPivot(self): CFrame + function PivotTo(self, targetCFrame: CFrame): nil +end + +declare class BasePart extends PVInstance + Anchored: boolean + AssemblyAngularVelocity: Vector3 + AssemblyCenterOfMass: Vector3 + AssemblyLinearVelocity: Vector3 + AssemblyMass: number + AssemblyRootPart: BasePart + BackSurface: EnumSurfaceType + BottomSurface: EnumSurfaceType + BrickColor: BrickColor + CFrame: CFrame + CanCollide: boolean + CanQuery: boolean + CanTouch: boolean + CastShadow: boolean + CenterOfMass: Vector3 + CollisionGroup: string + Color: Color3 + CurrentPhysicalProperties: PhysicalProperties + CustomPhysicalProperties: PhysicalProperties + EnableFluidForces: boolean + ExtentsCFrame: CFrame + ExtentsSize: Vector3 + FrontSurface: EnumSurfaceType + LeftSurface: EnumSurfaceType + LocalTransparencyModifier: number + Locked: boolean + Mass: number + Massless: boolean + Material: EnumMaterial + MaterialVariant: string + Orientation: Vector3 + PivotOffset: CFrame + Position: Vector3 + ReceiveAge: number + Reflectance: number + ResizeIncrement: number + ResizeableFaces: Faces + RightSurface: EnumSurfaceType + RootPriority: number + Rotation: Vector3 + Size: Vector3 + TopSurface: EnumSurfaceType + TouchEnded: RBXScriptSignal + Touched: RBXScriptSignal + Transparency: number + function ApplyAngularImpulse(self, impulse: Vector3): nil + function ApplyImpulse(self, impulse: Vector3): nil + function ApplyImpulseAtPosition(self, impulse: Vector3, position: Vector3): nil + function CanCollideWith(self, part: BasePart): boolean + function CanSetNetworkOwnership(self): (boolean, string) + function GetClosestPointOnSurface(self, position: Vector3): Vector3 + function GetConnectedParts(self, recursive: boolean?): { BasePart } + function GetJoints(self): { BasePart } + function GetMass(self): number + function GetNetworkOwner(self): Player? + function GetNetworkOwnershipAuto(self): boolean + function GetNoCollisionConstraints(self): { Instance } + function GetRootPart(self): BasePart + function GetTouchingParts(self): { BasePart } + function GetVelocityAtPosition(self, position: Vector3): Vector3 + function IntersectAsync(self, parts: { Instance }, collisionfidelity: EnumCollisionFidelity?, renderFidelity: EnumRenderFidelity?): Instance + function IsGrounded(self): boolean + function Resize(self, normalId: EnumNormalId, deltaAmount: number): boolean + function SetNetworkOwner(self, playerInstance: Player?): nil + function SetNetworkOwnershipAuto(self): nil + function SubtractAsync(self, parts: { BasePart }, collisionfidelity: EnumCollisionFidelity?, renderFidelity: EnumRenderFidelity?): UnionOperation + function UnionAsync(self, parts: { BasePart }, collisionfidelity: EnumCollisionFidelity?, renderFidelity: EnumRenderFidelity?): UnionOperation +end + +declare class CornerWedgePart extends BasePart +end + +declare class FormFactorPart extends BasePart +end + +declare class Part extends FormFactorPart + Shape: EnumPartType +end + + + +declare class Platform extends Part +end + +declare class Seat extends Part + Disabled: boolean + Occupant: Humanoid? + function Sit(self, humanoid: Humanoid): nil +end + + + +declare class SpawnLocation extends Part + AllowTeamChangeOnTouch: boolean + Duration: number + Enabled: boolean + Neutral: boolean + TeamColor: BrickColor +end + +declare class WedgePart extends FormFactorPart +end + +declare class Terrain extends BasePart + Decoration: boolean + LastUsedModificationMethod: EnumTerrainAcquisitionMethod + MaterialColors: BinaryString + MaxExtents: Region3int16 + ShorelinesUpgraded: boolean + SmoothVoxelsUpgraded: boolean + WaterColor: Color3 + WaterReflectance: number + WaterTransparency: number + WaterWaveSize: number + WaterWaveSpeed: number + function CanShorelinesBeUpgraded(self): boolean + function CanSmoothVoxelsBeUpgraded(self): boolean + function CellCenterToWorld(self, x: number, y: number, z: number): Vector3 + function CellCornerToWorld(self, x: number, y: number, z: number): Vector3 + function Clear(self): nil + function CopyRegion(self, region: Region3int16): TerrainRegion + function CountCells(self): number + function FillBall(self, center: Vector3, radius: number, material: EnumMaterial): nil + function FillBlock(self, cframe: CFrame, size: Vector3, material: EnumMaterial): nil + function FillCylinder(self, cframe: CFrame, height: number, radius: number, material: EnumMaterial): nil + function FillRegion(self, region: Region3, resolution: number, material: EnumMaterial): nil + function FillWedge(self, cframe: CFrame, size: Vector3, material: EnumMaterial): nil + function GetMaterialColor(self, material: EnumMaterial): Color3 + function GetTerrainWireframe(self, cframe: CFrame, size: Vector3): { any } + function PasteRegion(self, region: TerrainRegion, corner: Vector3int16, pasteEmptyCells: boolean): nil + function ReadVoxels(self, region: Region3, resolution: number): any + function ReplaceMaterial(self, region: Region3, resolution: number, sourceMaterial: EnumMaterial, targetMaterial: EnumMaterial): nil + function ReplaceMaterialInTransform(self, cframe: CFrame, size: Vector3, sourceMaterial: EnumMaterial, targetMaterial: EnumMaterial): nil + function ReplaceMaterialInTransformSubregion(self, cframe: CFrame, size: Vector3, sourceMaterial: EnumMaterial, targetMaterial: EnumMaterial, targetRegion: Region3int16): nil + function SetMaterialColor(self, material: EnumMaterial, value: Color3): nil + function SetMaterialInTransform(self, cframe: CFrame, size: Vector3, targetMaterial: EnumMaterial): nil + function SetMaterialInTransformSubregion(self, cframe: CFrame, size: Vector3, targetMaterial: EnumMaterial, targetRegion: Region3int16): nil + function SmoothRegion(self, region: Region3, resolution: number, strength: number): any + function WorldToCell(self, position: Vector3): Vector3 + function WorldToCellPreferEmpty(self, position: Vector3): Vector3 + function WorldToCellPreferSolid(self, position: Vector3): Vector3 + function WriteVoxels(self, region: Region3, resolution: number, materials: { any }, occupancy: { any }): nil + + function AutoWedgeCell(self, x: number, y: number, z: number): boolean +end + +declare class TriangleMeshPart extends BasePart + CollisionFidelity: EnumCollisionFidelity + MeshSize: Vector3 +end + +declare class MeshPart extends TriangleMeshPart + DoubleSided: boolean + HasJointOffset: boolean + HasSkinnedMesh: boolean + JointOffset: Vector3 + MeshId: Content + RenderFidelity: EnumRenderFidelity + TextureID: Content + function ApplyMesh(self, meshPart: MeshPart): nil +end + +declare class PartOperation extends TriangleMeshPart + RenderFidelity: EnumRenderFidelity + SmoothingAngle: number + TriangleCount: number + UsePartColor: boolean + function SubstituteGeometry(self, source: Instance): nil +end + +declare class IntersectOperation extends PartOperation +end + +declare class NegateOperation extends PartOperation +end + +declare class UnionOperation extends PartOperation +end + +declare class TrussPart extends BasePart + Style: EnumStyle +end + +declare class VehicleSeat extends BasePart + AreHingesDetected: number + Disabled: boolean + HeadsUpDisplay: boolean + MaxSpeed: number + Occupant: Humanoid? + Steer: number + SteerFloat: number + Throttle: number + ThrottleFloat: number + Torque: number + TurnSpeed: number + function Sit(self, humanoid: Humanoid): nil +end + +declare class Model extends PVInstance + LevelOfDetail: EnumModelLevelOfDetail + ModelStreamingMode: EnumModelStreamingMode + PrimaryPart: BasePart? + Scale: number + WorldPivot: CFrame + function AddPersistentPlayer(self, playerInstance: Player?): nil + function GetBoundingBox(self): (CFrame, Vector3) + function GetExtentsSize(self): Vector3 + function GetPersistentPlayers(self): { Instance } + function GetScale(self): number + function MoveTo(self, position: Vector3): nil + function RemovePersistentPlayer(self, playerInstance: Player?): nil + function ScaleTo(self, newScaleFactor: number): nil + function TranslateBy(self, delta: Vector3): nil +end + +declare class Actor extends Model + function BindToMessage(self, topic: string, func: ((...any) -> ...any)): RBXScriptConnection + function BindToMessageParallel(self, topic: string, func: ((...any) -> ...any)): RBXScriptConnection + function SendMessage(self, topic: string, ...: any): () +end + +declare class BackpackItem extends Model + TextureId: Content +end + + + +declare class Tool extends BackpackItem + Activated: RBXScriptSignal<> + CanBeDropped: boolean + Deactivated: RBXScriptSignal<> + Enabled: boolean + Equipped: RBXScriptSignal + Grip: CFrame + GripForward: Vector3 + GripPos: Vector3 + GripRight: Vector3 + GripUp: Vector3 + ManualActivationOnly: boolean + RequiresHandle: boolean + ToolTip: string + Unequipped: RBXScriptSignal<> + function Activate(self): nil + function Deactivate(self): nil +end + + + + + +declare class WorldRoot extends Model + function ArePartsTouchingOthers(self, partList: { BasePart }, overlapIgnored: number?): boolean + function Blockcast(self, cframe: CFrame, size: Vector3, direction: Vector3, params: RaycastParams?): RaycastResult + function BulkMoveTo(self, partList: { BasePart }, cframeList: { CFrame }, eventMode: EnumBulkMoveMode?): nil + function CacheCurrentTerrain(self, id: string, center: Vector3, radius: number): string + function ClearCachedTerrain(self, id: string): boolean + function GetPartBoundsInBox(self, cframe: CFrame, size: Vector3, overlapParams: OverlapParams?): { BasePart } + function GetPartBoundsInRadius(self, position: Vector3, radius: number, overlapParams: OverlapParams?): { BasePart } + function GetPartsInPart(self, part: BasePart, overlapParams: OverlapParams?): { BasePart } + function IKMoveTo(self, part: BasePart, target: CFrame, translateStiffness: number?, rotateStiffness: number?, collisionsMode: EnumIKCollisionsMode?): nil + function Raycast(self, origin: Vector3, direction: Vector3, raycastParams: RaycastParams?): RaycastResult? + function RaycastCachedTerrain(self, id: string, origin: Vector3, direction: Vector3, ignoreWater: boolean): RaycastResult + function SetInsertPoint(self, point: Vector3, ignoreGrid: boolean?): nil + function Spherecast(self, position: Vector3, radius: number, direction: Vector3, params: RaycastParams?): RaycastResult +end + +declare class Workspace extends WorldRoot + AirDensity: number + AllowThirdPartySales: boolean + AvatarUnificationMode: EnumAvatarUnificationMode + ClientAnimatorThrottling: EnumClientAnimatorThrottlingMode + CurrentCamera: Camera + DistributedGameTime: number + FallenPartsDestroyHeight: number + FluidForces: EnumFluidForces + GlobalWind: Vector3 + Gravity: number + HumanoidOnlySetCollisionsOnStateChange: EnumHumanoidOnlySetCollisionsOnStateChange + IKControlConstraintSupport: EnumIKControlConstraintSupport + InterpolationThrottling: EnumInterpolationThrottlingMode + MeshPartHeadsAndAccessories: EnumMeshPartHeadsAndAccessories + ModelStreamingBehavior: EnumModelStreamingBehavior + PersistentLoaded: RBXScriptSignal + PhysicsSteppingMethod: EnumPhysicsSteppingMethod + RejectCharacterDeletions: EnumRejectCharacterDeletions + ReplicateInstanceDestroySetting: EnumReplicateInstanceDestroySetting + Retargeting: EnumAnimatorRetargetingMode + SignalBehavior: EnumSignalBehavior + StreamOutBehavior: EnumStreamOutBehavior + StreamingEnabled: boolean + StreamingIntegrityMode: EnumStreamingIntegrityMode + StreamingMinRadius: number + StreamingTargetRadius: number + Terrain: Terrain + TouchesUseCollisionGroups: boolean + function CalculateJumpDistance(self, gravity: number, jumpPower: number, walkSpeed: number): number + function CalculateJumpHeight(self, gravity: number, jumpPower: number): number + function CalculateJumpPower(self, gravity: number, jumpHeight: number): number + function ExperimentalSolverIsEnabled(self): boolean + function GetNumAwakeParts(self): number + function GetPhysicsThrottling(self): number + function GetRealPhysicsFPS(self): number + function GetServerTimeNow(self): number + function JoinToOutsiders(self, objects: { Instance }, jointType: EnumJointCreationMode): nil + function PGSIsEnabled(self): boolean + function SetMeshPartHeadsAndAccessories(self, value: EnumMeshPartHeadsAndAccessories): nil + function SetPhysicsThrottleEnabled(self, value: boolean): nil + function UnjoinFromOutsiders(self, objects: { Instance }): nil + function ZoomToExtents(self): nil + + function FindPartsInRegion3(self, region: Region3, ignoreDescendantsInstance: Instance, maxParts: number): { BasePart } +end + +declare class WorldModel extends WorldRoot +end + +declare class PackageLink extends Instance + AutoUpdate: boolean + Creator: string + PackageAssetName: string + PackageId: Content + PermissionLevel: EnumPackagePermission + Status: string + VersionNumber: number +end + +declare class PackageService extends Instance +end + +declare class PackageUIService extends Instance + OnConvertToPackageResult: RBXScriptSignal + OnOpenConvertToPackagePlugin: RBXScriptSignal<{ Instance }, string, { Instance }> + function ConvertToPackageUpload(self, uploadUrl: string, cloneInstances: { Instance }, originalInstances: { Instance }): nil + function GetPackageInfo(self, packageAssetId: number): { [any]: any } + function PublishPackage(self, packageInstance: Instance): nil + function SetPackageVersion(self, packageInstance: Instance, versionNumber: number): Instance +end + +declare class Pages extends Instance + IsFinished: boolean + function AdvanceToNextPageAsync(self): nil + function GetCurrentPage(self): { any } +end + +declare class AudioPages extends Pages +end + +declare class CatalogPages extends Pages +end + +declare class DataStoreKeyPages extends Pages + Cursor: string +end + +declare class DataStoreListingPages extends Pages + Cursor: string +end + +declare class DataStorePages extends Pages +end + +declare class DataStoreVersionPages extends Pages +end + +declare class FriendPages extends Pages +end + +declare class InventoryPages extends Pages +end + +declare class EmotesPages extends InventoryPages +end + +declare class OutfitPages extends Pages +end + +declare class StandardPages extends Pages +end + +declare class PartOperationAsset extends Instance +end + +declare class ParticleEmitter extends Instance + Acceleration: Vector3 + Brightness: number + Color: ColorSequence + Drag: number + EmissionDirection: EnumNormalId + Enabled: boolean + FlipbookFramerate: NumberRange + FlipbookIncompatible: string + FlipbookLayout: EnumParticleFlipbookLayout + FlipbookMode: EnumParticleFlipbookMode + FlipbookStartRandom: boolean + Lifetime: NumberRange + LightEmission: number + LightInfluence: number + LockedToPart: boolean + Orientation: EnumParticleOrientation + Rate: number + RotSpeed: NumberRange + Rotation: NumberRange + Shape: EnumParticleEmitterShape + ShapeInOut: EnumParticleEmitterShapeInOut + ShapePartial: number + ShapeStyle: EnumParticleEmitterShapeStyle + Size: NumberSequence + Speed: NumberRange + SpreadAngle: Vector2 + Squash: NumberSequence + Texture: Content + TimeScale: number + Transparency: NumberSequence + VelocityInheritance: number + WindAffectsDrag: boolean + ZOffset: number + function Clear(self): nil + function Emit(self, particleCount: number?): nil + function FastForward(self, numFrames: number): nil +end + +declare class PatchBundlerFileWatch extends Instance +end + +declare class PatchMapping extends Instance + FlattenTree: boolean + PatchId: string + TargetPath: string +end + +declare class Path extends Instance + Blocked: RBXScriptSignal + Status: EnumPathStatus + Unblocked: RBXScriptSignal + function CheckOcclusionAsync(self, start: number): number + function ComputeAsync(self, start: Vector3, finish: Vector3): nil + function GetWaypoints(self): { PathWaypoint } +end + +declare class PathfindingLink extends Instance + Attachment0: Attachment + Attachment1: Attachment + IsBidirectional: boolean + Label: string +end + +declare class PathfindingModifier extends Instance + Label: string + PassThrough: boolean +end + +declare class PathfindingService extends Instance + function CreatePath(self, agentParameters: { [any]: any }?): Path + function FindPathAsync(self, start: Vector3, finish: Vector3): Path +end + +declare class PausedState extends Instance + AllThreadsPaused: boolean + Reason: EnumDebuggerPauseReason + ThreadId: number +end + +declare class PausedStateBreakpoint extends PausedState + Breakpoint: Breakpoint +end + +declare class PausedStateException extends PausedState + ExceptionText: string +end + +declare class PermissionsService extends Instance + function GetIsThirdPartyAssetAllowed(self): boolean + function GetIsThirdPartyPurchaseAllowed(self): boolean + function GetIsThirdPartyTeleportAllowed(self): boolean + function GetPermissions(self, assetId: string): { any } + function SetPermissions(self, assetId: string, permissions: { any }): nil +end + +declare class PhysicsService extends Instance + function CollisionGroupSetCollidable(self, name1: string, name2: string, collidable: boolean): nil + function CollisionGroupsAreCollidable(self, name1: string, name2: string): boolean + function GetMaxCollisionGroups(self): number + function GetRegisteredCollisionGroups(self): { any } + function IkSolve(self, part: BasePart, target: CFrame, translateStiffness: number, rotateStiffness: number): nil + function IsCollisionGroupRegistered(self, name: string): boolean + function LocalIkSolve(self, part: BasePart, target: CFrame, translateStiffness: number, rotateStiffness: number): nil + function RegisterCollisionGroup(self, name: string): nil + function RenameCollisionGroup(self, from: string, to: string): nil + function UnregisterCollisionGroup(self, name: string): nil +end + +declare class PhysicsSettings extends Instance + AllowSleep: boolean + AreAnchorsShown: boolean + AreAssembliesShown: boolean + AreAssemblyCentersOfMassShown: boolean + AreAwakePartsHighlighted: boolean + AreBodyTypesShown: boolean + AreCollisionCostsShown: boolean + AreConstraintForcesShownForSelectedOrHoveredInstances: boolean + AreConstraintTorquesShownForSelectedOrHoveredInstances: boolean + AreContactForcesShownForSelectedOrHoveredAssemblies: boolean + AreContactIslandsShown: boolean + AreContactPointsShown: boolean + AreJointCoordinatesShown: boolean + AreMagnitudesShownForDrawnForcesAndTorques: boolean + AreMechanismsShown: boolean + AreModelCoordsShown: boolean + AreOwnersShown: boolean + ArePartCoordsShown: boolean + AreRegionsShown: boolean + AreSolverIslandsShown: boolean + AreTerrainReplicationRegionsShown: boolean + AreTimestepsShown: boolean + AreUnalignedPartsShown: boolean + AreWorldCoordsShown: boolean + DisableCSGv2: boolean + DisableCSGv3ForPlugins: boolean + ForceCSGv2: boolean + ForceDrawScale: number + IsInterpolationThrottleShown: boolean + IsReceiveAgeShown: boolean + IsTreeShown: boolean + PhysicsEnvironmentalThrottle: EnumEnviromentalPhysicsThrottle + ShowDecompositionGeometry: boolean + SolverConvergenceVisualizationMode: EnumSolverConvergenceVisualizationMode + ThrottleAdjustTime: number + UseCSGv2: boolean + + Is30FpsThrottleEnabled: boolean +end + +declare class PlaceStatsService extends Instance +end + +declare class PlacesService extends Instance + function StartPlaySolo(self): nil +end + +declare class PlatformFriendsService extends Instance + function IsInviteFriendsEnabled(self): boolean + function ShowInviteFriendsUI(self): nil +end + +declare class Player extends Instance + AccountAge: number + AutoJumpEnabled: boolean + CameraMaxZoomDistance: number + CameraMinZoomDistance: number + CameraMode: EnumCameraMode + CanLoadCharacterAppearance: boolean + Character: Model? + CharacterAdded: RBXScriptSignal + CharacterAppearanceId: number + CharacterAppearanceLoaded: RBXScriptSignal + CharacterRemoving: RBXScriptSignal + ChatMode: EnumChatMode + Chatted: RBXScriptSignal + DevCameraOcclusionMode: EnumDevCameraOcclusionMode + DevComputerCameraMode: EnumDevComputerCameraMovementMode + DevComputerMovementMode: EnumDevComputerMovementMode + DevEnableMouseLock: boolean + DevTouchCameraMode: EnumDevTouchCameraMovementMode + DevTouchMovementMode: EnumDevTouchMovementMode + DisplayName: string + FollowUserId: number + FriendStatusChanged: RBXScriptSignal + GameplayPaused: boolean + Guest: boolean + HasVerifiedBadge: boolean + HealthDisplayDistance: number + Idled: RBXScriptSignal + LocaleId: string + MaximumSimulationRadius: number + MembershipType: EnumMembershipType + NameDisplayDistance: number + Neutral: boolean + OnTeleport: RBXScriptSignal + OsPlatform: string + PlatformName: string + ReplicationFocus: Instance + RespawnLocation: SpawnLocation + SimulationRadius: number + SimulationRadiusChanged: RBXScriptSignal + Team: Team + TeamColor: BrickColor + Teleported: boolean + TeleportedIn: boolean + UnfilteredChat: boolean + userId: number + VRDevice: string + VREnabled: boolean + + Backpack: Backpack + PlayerGui: PlayerGui + + function AddToBlockList(self, userIds: { any }): nil + function ClearCharacterAppearance(self): nil + function DistanceFromCharacter(self, point: Vector3): number + function GetFriendStatus(self, player: Player): EnumFriendStatus + function GetFriendsOnline(self, maxFriends: number?): { any } + function GetGameSessionID(self): string + function GetJoinData(self): { [any]: any } + function GetMouse(self): Mouse + function GetNetworkPing(self): number + function GetRankInGroup(self, groupId: number): number + function GetRoleInGroup(self, groupId: number): string + function GetUnder13(self): boolean + function HasAppearanceLoaded(self): boolean + function IsFriendsWith(self, userId: number): boolean + function IsInGroup(self, groupId: number): boolean + function IsVerified(self): boolean + function Kick(self, message: string?): nil + function LoadCharacter(self): nil + function LoadCharacterBlocking(self): nil + function LoadCharacterWithHumanoidDescription(self, humanoidDescription: HumanoidDescription): nil + function Move(self, walkDirection: Vector3, relativeToCamera: boolean?): nil + function RemoveCharacter(self): nil + function RequestFriendship(self, player: Player): nil + function RequestStreamAroundAsync(self, position: Vector3, timeOut: number?): nil + function RevokeFriendship(self, player: Player): nil + function SetAccountAge(self, accountAge: number): nil + function SetCharacterAppearanceJson(self, jsonBlob: string): nil + function SetExperienceSettingsLocaleId(self, locale: string): nil + function SetMembershipType(self, membershipType: EnumMembershipType): nil + function SetModerationAccessKey(self, moderationAccessKey: string): nil + function SetSuperSafeChat(self, value: boolean): nil + function UpdatePlayerBlocked(self, userId: number, blocked: boolean): nil +end + +declare class PlayerEmulatorService extends Instance + CustomPoliciesEnabled: boolean + EmulatedCountryCode: string + EmulatedGameLocale: string + PlayerEmulationEnabled: boolean + SerializedEmulatedPolicyInfo: BinaryString + function GetEmulatedPolicyInfo(self): { [any]: any } + function RegionCodeWillHaveAutomaticNonCustomPolicies(self, regionCode: string): boolean + function SetEmulatedPolicyInfo(self, emulatedPolicyInfo: { [any]: any }): nil +end + +declare class PlayerScripts extends Instance + ComputerCameraMovementModeRegistered: RBXScriptSignal<> + ComputerMovementModeRegistered: RBXScriptSignal<> + TouchCameraMovementModeRegistered: RBXScriptSignal<> + TouchMovementModeRegistered: RBXScriptSignal<> + function ClearComputerCameraMovementModes(self): nil + function ClearComputerMovementModes(self): nil + function ClearTouchCameraMovementModes(self): nil + function ClearTouchMovementModes(self): nil + function GetRegisteredComputerCameraMovementModes(self): { any } + function GetRegisteredComputerMovementModes(self): { any } + function GetRegisteredTouchCameraMovementModes(self): { any } + function GetRegisteredTouchMovementModes(self): { any } + function RegisterComputerCameraMovementMode(self, cameraMovementMode: EnumComputerCameraMovementMode): nil + function RegisterComputerMovementMode(self, movementMode: EnumComputerMovementMode): nil + function RegisterTouchCameraMovementMode(self, cameraMovementMode: EnumTouchCameraMovementMode): nil + function RegisterTouchMovementMode(self, movementMode: EnumTouchMovementMode): nil +end + +declare class Players extends Instance + BubbleChat: boolean + CharacterAutoLoads: boolean + ClassicChat: boolean + FriendRequestEvent: RBXScriptSignal + GameAnnounce: RBXScriptSignal + LocalPlayer: Player + MaxPlayers: number + MaxPlayersInternal: number + PlayerAdded: RBXScriptSignal + PlayerChatted: RBXScriptSignal + PlayerConnecting: RBXScriptSignal + PlayerDisconnecting: RBXScriptSignal + PlayerMembershipChanged: RBXScriptSignal + PlayerRejoining: RBXScriptSignal + PlayerRemoving: RBXScriptSignal + PreferredPlayers: number + PreferredPlayersInternal: number + RespawnTime: number + UseStrafingAnimations: boolean + function Chat(self, message: string): nil + function CreateHumanoidModelFromDescription(self, description: HumanoidDescription, rigType: EnumHumanoidRigType, assetTypeVerification: EnumAssetTypeVerification?): Model + function CreateHumanoidModelFromUserId(self, userId: number): Model + function CreateLocalPlayer(self, id: number): Player + function GetCharacterAppearanceInfoAsync(self, userId: number): { [any]: any } + function GetFriendsAsync(self, userId: number): FriendPages + function GetHumanoidDescriptionFromOutfitId(self, outfitId: number): HumanoidDescription + function GetHumanoidDescriptionFromUserId(self, userId: number): HumanoidDescription + function GetNameFromUserIdAsync(self, userId: number): string + function GetPlayerByUserId(self, userId: number): Player? + function GetPlayerFromCharacter(self, character: Model): Player? + function GetPlayers(self): { Player } + function GetUserIdFromNameAsync(self, userName: string): number + function GetUserThumbnailAsync(self, userId: number, thumbnailType: EnumThumbnailType, thumbnailSize: EnumThumbnailSize): (string, boolean) + function ReportAbuse(self, player: Player, reason: string, optionalMessage: string): nil + function ReportAbuseV3(self, player: Player, jsonTags: string): nil + function ResetLocalPlayer(self): nil + function SetChatStyle(self, style: EnumChatStyle?): nil + function SetLocalPlayerInfo(self, userId: number, userName: string, displayName: string, membershipType: EnumMembershipType, isUnder13: boolean): nil + function TeamChat(self, message: string): nil + function WhisperChat(self, message: string, player: Instance): nil + + function SetAbuseReportUrl(self, url: string): nil +end + +declare class Plugin extends Instance + CollisionEnabled: boolean + Deactivation: RBXScriptSignal<> + GridSize: number + HostDataModelType: EnumStudioDataModelType + HostDataModelTypeIsCurrent: boolean + MultipleDocumentInterfaceInstance: MultipleDocumentInterfaceInstance + ProcessAssetInsertionDrag: (assetId: string, assetTypeId: number, instances: { Instance }) -> { Instance } + ProcessAssetInsertionDrop: () -> nil + Ready: RBXScriptSignal<> + Unloading: RBXScriptSignal<> + UsesAssetInsertionDrag: boolean + function Activate(self, exclusiveMouse: boolean): nil + function CreateDockWidgetPluginGui(self, pluginGuiId: string, dockWidgetPluginGuiInfo: DockWidgetPluginGuiInfo): DockWidgetPluginGui + function CreatePluginAction(self, actionId: string, text: string, statusTip: string, iconName: string?, allowBinding: boolean?): PluginAction + function CreatePluginMenu(self, id: string, title: string?, icon: string?): PluginMenu + function CreateQWidgetPluginGui(self, pluginGuiId: string, pluginGuiOptions: { [any]: any }): QWidgetPluginGui + function CreateToolbar(self, name: string): PluginToolbar + function Deactivate(self): nil + function GetItem(self, key: string, defaultValue: any): any + function GetJoinMode(self): EnumJointCreationMode + function GetMouse(self): PluginMouse + function GetSelectedRibbonTool(self): EnumRibbonTool + function GetSetting(self, key: string): any + function ImportFbxAnimation(self, rigModel: Instance, isR15: boolean?): Instance + function ImportFbxRig(self, isR15: boolean?): Instance + function Intersect(self, objects: { Instance }): Instance + function Invoke(self, key: string, arguments: any): nil + function IsActivated(self): boolean + function IsActivatedWithExclusiveMouse(self): boolean + function Negate(self, objects: { Instance }): { NegateOperation } + function OnInvoke(self, key: string, callback: ((...any) -> ...any)): Instance + function OnSetItem(self, key: string, callback: ((...any) -> ...any)): Instance + function OpenScript(self, script: BaseScript, lineNumber: number?): nil + function OpenWikiPage(self, url: string): nil + function PauseSound(self, sound: Instance): nil + function PlaySound(self, sound: Instance, normalizedTimePosition: number?): nil + function PromptForExistingAssetId(self, assetType: string): number + function PromptSaveSelection(self, suggestedFileName: string?): boolean + function ResumeSound(self, sound: Instance): nil + function SaveSelectedToRoblox(self): nil + function SelectRibbonTool(self, tool: EnumRibbonTool, position: UDim2): nil + function Separate(self, objects: { Instance }): { UnionOperation } + function SetItem(self, key: string, value: any): nil + function SetReady(self): nil + function SetSetting(self, key: string, value: any): nil + function StartDecalDrag(self, decal: Instance): nil + function StartDrag(self, dragData: { [any]: any }): nil + function StopAllSounds(self): nil + function Union(self, objects: { Instance }): UnionOperation +end + +declare class PluginAction extends Instance + ActionId: string + AllowBinding: boolean + Checked: boolean + DefaultShortcut: string + Enabled: boolean + StatusTip: string + Text: string + Triggered: RBXScriptSignal<> +end + +declare class PluginCapabilities extends Instance + Manifest: string +end + +declare class PluginDebugService extends Instance +end + +declare class PluginDragEvent extends Instance + Data: string + MimeType: string + Position: Vector2 + Sender: string +end + +declare class PluginGuiService extends Instance +end + +declare class PluginManagementService extends Instance + function GetOTAPluginVersion(self, pluginName: string?): number + function SetAutoUpdate(self, pluginId: number, state: boolean): nil +end + +declare class PluginManager extends Instance + function ExportPlace(self, filePath: string?): nil + function ExportSelection(self, filePath: string?): nil +end + +declare class PluginManagerInterface extends Instance + function ExportPlace(self, filePath: string?): nil + function ExportSelection(self, filePath: string?): nil +end + +declare class PluginMenu extends Instance + Icon: string + Title: string + function AddAction(self, action: PluginAction): nil + function AddMenu(self, menu: PluginMenu): nil + function AddNewAction(self, actionId: string, text: string, icon: string?): PluginAction + function AddSeparator(self): nil + function Clear(self): nil + function ShowAsync(self): PluginAction +end + +declare class PluginPolicyService extends Instance + function GetPluginPolicy(self, pluginName: string): { [any]: any } +end + +declare class PluginToolbar extends Instance + function CreateButton(self, id: string, toolTip: string, iconAsset: string, text: string?): PluginToolbarButton + function CreatePopupButton(self, buttonId: string, tooltip: string, iconname: string, text: string?): Instance +end + +declare class PluginToolbarButton extends Instance + Click: RBXScriptSignal<> + ClickableWhenViewportHidden: boolean + DropdownClick: RBXScriptSignal<> + Enabled: boolean + Icon: Content + function SetActive(self, active: boolean): nil +end + + + +declare class PolicyService extends Instance + IsLuobuServer: EnumTriStateBoolean + LuobuWhitelisted: EnumTriStateBoolean + function GetPolicyInfoForPlayerAsync(self, player: Player): { [any]: any } + function GetPolicyInfoForServerRobloxOnlyAsync(self): { [any]: any } +end + +declare class PoseBase extends Instance + EasingDirection: EnumPoseEasingDirection + EasingStyle: EnumPoseEasingStyle + Weight: number +end + +declare class NumberPose extends PoseBase + Value: number +end + +declare class Pose extends PoseBase + CFrame: CFrame + function AddSubPose(self, pose: Pose): nil + function GetSubPoses(self): { Instance } + function RemoveSubPose(self, pose: Pose): nil +end + +declare class PostEffect extends Instance + Enabled: boolean +end + +declare class BloomEffect extends PostEffect + Intensity: number + Size: number + Threshold: number +end + +declare class BlurEffect extends PostEffect + Size: number +end + +declare class ColorCorrectionEffect extends PostEffect + Brightness: number + Contrast: number + Saturation: number + TintColor: Color3 +end + +declare class DepthOfFieldEffect extends PostEffect + FarIntensity: number + FocusDistance: number + InFocusRadius: number + NearIntensity: number +end + +declare class SunRaysEffect extends PostEffect + Intensity: number + Spread: number +end + +declare class ProcessInstancePhysicsService extends Instance +end + +declare class ProximityPrompt extends Instance + ActionText: string + AutoLocalize: boolean + ClickablePrompt: boolean + Enabled: boolean + Exclusivity: EnumProximityPromptExclusivity + GamepadKeyCode: EnumKeyCode + HoldDuration: number + KeyboardKeyCode: EnumKeyCode + MaxActivationDistance: number + ObjectText: string + PromptButtonHoldBegan: RBXScriptSignal + PromptButtonHoldEnded: RBXScriptSignal + PromptHidden: RBXScriptSignal<> + PromptShown: RBXScriptSignal + RequiresLineOfSight: boolean + RootLocalizationTable: LocalizationTable + Style: EnumProximityPromptStyle + TriggerEnded: RBXScriptSignal + Triggered: RBXScriptSignal + UIOffset: Vector2 + function InputHoldBegin(self): nil + function InputHoldEnd(self): nil +end + +declare class ProximityPromptService extends Instance + Enabled: boolean + MaxPromptsVisible: number + PromptButtonHoldBegan: RBXScriptSignal + PromptButtonHoldEnded: RBXScriptSignal + PromptHidden: RBXScriptSignal + PromptShown: RBXScriptSignal + PromptTriggerEnded: RBXScriptSignal + PromptTriggered: RBXScriptSignal +end + +declare class PublishService extends Instance + function CreateAssetAndWaitForAssetId(self, instances: { Instance }, operationId: string, creatorId: number, assetType: string, name: string, description: string): number + function PublishCageMeshAsync(self, wrap: Instance, cageType: EnumCageType): Content + function PublishDescendantAssets(self, instance: Instance): boolean +end + +declare class RbxAnalyticsService extends Instance + function AddGlobalPointsField(self, key: string, value: number): nil + function AddGlobalPointsTag(self, key: string, value: string): nil + function DEPRECATED_TrackEvent(self, category: string, action: string, label: string, value: number?): nil + function DEPRECATED_TrackEventWithArgs(self, category: string, action: string, label: string, args: { [any]: any }, value: number?): nil + function GetClientId(self): string + function GetPlaySessionId(self): string + function GetSessionId(self): string + function ReleaseRBXEventStream(self, target: string): nil + function RemoveGlobalPointsField(self, key: string): nil + function RemoveGlobalPointsTag(self, key: string): nil + function ReportCounter(self, counterName: string, amount: number?): nil + function ReportInfluxSeries(self, seriesName: string, points: { [any]: any }, throttlingPercentage: number): nil + function ReportStats(self, category: string, value: number): nil + function ReportToDiagByCountryCode(self, featureName: string, measureName: string, seconds: number): nil + function SendEventDeferred(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil + function SendEventImmediately(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil + function SetRBXEvent(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil + function SetRBXEventStream(self, target: string, eventContext: string, eventName: string, additionalArgs: { [any]: any }): nil + function TrackEvent(self, category: string, action: string, label: string, value: number?): nil + function TrackEventWithArgs(self, category: string, action: string, label: string, args: { [any]: any }, value: number?): nil + function UpdateHeartbeatObject(self, args: { [any]: any }): nil +end + +declare class ReflectionMetadata extends Instance +end + +declare class ReflectionMetadataCallbacks extends Instance +end + +declare class ReflectionMetadataClasses extends Instance +end + +declare class ReflectionMetadataEnums extends Instance +end + +declare class ReflectionMetadataEvents extends Instance +end + +declare class ReflectionMetadataFunctions extends Instance +end + +declare class ReflectionMetadataItem extends Instance + Browsable: boolean + ClassCategory: string + ClientOnly: boolean + Constraint: string + Deprecated: boolean + EditingDisabled: boolean + EditorType: string + FFlag: string + IsBackend: boolean + PropertyOrder: number + ScriptContext: string + ServerOnly: boolean + SliderScaling: string + UIMaximum: number + UIMinimum: number + UINumTicks: number +end + +declare class ReflectionMetadataClass extends ReflectionMetadataItem + ExplorerImageIndex: number + ExplorerOrder: number + Insertable: boolean + PreferredParent: string + ServiceVisibility: EnumServiceVisibility +end + +declare class ReflectionMetadataEnum extends ReflectionMetadataItem +end + +declare class ReflectionMetadataEnumItem extends ReflectionMetadataItem +end + +declare class ReflectionMetadataMember extends ReflectionMetadataItem +end + +declare class ReflectionMetadataProperties extends Instance +end + +declare class ReflectionMetadataYieldFunctions extends Instance +end + +declare class RemoteCursorService extends Instance +end + +declare class RemoteDebuggerServer extends Instance +end + +declare class RemoteEvent extends Instance + OnClientEvent: RBXScriptSignal<...any> + OnServerEvent: RBXScriptSignal<(Player, ...any)> + function FireAllClients(self, ...: any): () + function FireClient(self, player: Player, ...: any): () + function FireServer(self, ...: any): () +end + +declare class RemoteFunction extends Instance + OnClientInvoke: (...any) -> ...any + OnServerInvoke: (player: Player, ...any) -> ...any + function InvokeClient(self, player: Player, ...: any): ...any + function InvokeServer(self, ...: any): ...any +end + +declare class RenderSettings extends Instance + AutoFRMLevel: number + EagerBulkExecution: boolean + EditQualityLevel: EnumQualityLevel + EnableFRM: boolean + ExportMergeByMaterial: boolean + FrameRateManager: EnumFramerateManagerMode + GraphicsMode: EnumGraphicsMode + MeshCacheSize: number + MeshPartDetailLevel: EnumMeshPartDetailLevel + QualityLevel: EnumQualityLevel + ReloadAssets: boolean + RenderCSGTrianglesDebug: boolean + ShowBoundingBoxes: boolean + ViewMode: EnumViewMode + function GetMaxQualityLevel(self): number +end + +declare class RenderingTest extends Instance + CFrame: CFrame + ComparisonDiffThreshold: number + ComparisonMethod: EnumRenderingTestComparisonMethod + ComparisonPsnrThreshold: number + Description: string + FieldOfView: number + Orientation: Vector3 + PerfTest: boolean + Position: Vector3 + QualityLevel: number + ShouldSkip: boolean + Ticket: string + Timeout: number + function RenderdocTriggerCapture(self): nil +end + +declare class ReplicatedFirst extends Instance + DefaultLoadingGuiRemoved: RBXScriptSignal<> + FinishedReplicating: RBXScriptSignal<> + RemoveDefaultLoadingGuiSignal: RBXScriptSignal<> + function IsDefaultLoadingGuiRemoved(self): boolean + function IsFinishedReplicating(self): boolean + function RemoveDefaultLoadingScreen(self): nil + function SetDefaultLoadingGuiRemoved(self): nil +end + +declare class ReplicatedStorage extends Instance +end + +declare class RobloxPluginGuiService extends Instance +end + +declare class RobloxReplicatedStorage extends Instance +end + +declare class RobloxServerStorage extends Instance +end + +declare class RomarkService extends Instance + function EndRemoteRomarkTest(self): nil +end + +declare class RotationCurve extends Instance + Length: number + function GetKeyAtIndex(self, index: number): RotationCurveKey + function GetKeyIndicesAtTime(self, time: number): { any } + function GetKeys(self): { any } + function GetValueAtTime(self, time: number): CFrame? + function InsertKey(self, key: RotationCurveKey): { any } + function RemoveKeyAtIndex(self, startingIndex: number, count: number?): number + function SetKeys(self, keys: { any }): number +end + +declare class RtMessagingService extends Instance +end + +declare class RunService extends Instance + ClientGitHash: string + Heartbeat: RBXScriptSignal + PostSimulation: RBXScriptSignal + PreAnimation: RBXScriptSignal + PreRender: RBXScriptSignal + PreSimulation: RBXScriptSignal + RenderStepped: RBXScriptSignal + Stepped: RBXScriptSignal + function BindToRenderStep(self, name: string, priority: number, func: ((delta: number) -> ())): () + function GetCoreScriptVersion(self): string + function GetRobloxClientChannel(self): string + function GetRobloxVersion(self): string + function IsClient(self): boolean + function IsEdit(self): boolean + function IsRunMode(self): boolean + function IsRunning(self): boolean + function IsServer(self): boolean + function IsStudio(self): boolean + function Pause(self): nil + function Run(self): nil + function Set3dRenderingEnabled(self, enable: boolean): nil + function SetRobloxGuiFocused(self, focus: boolean): nil + function Stop(self): nil + function UnbindFromRenderStep(self, name: string): nil + function setThrottleFramerateEnabled(self, enable: boolean): nil +end + +declare class RuntimeScriptService extends Instance +end + +declare class SafetyService extends Instance + ScreenshotContentReady: RBXScriptSignal + ScreenshotUploaded: RBXScriptSignal + function TakeScreenshot(self, screenshotOptions: { [any]: any }): number +end + +declare class ScreenshotHud extends Instance + CameraButtonIcon: Content + CameraButtonPosition: UDim2 + CloseButtonPosition: UDim2 + CloseWhenScreenshotTaken: boolean + ExperienceNameOverlayEnabled: boolean + OverlayFont: EnumFont + UsernameOverlayEnabled: boolean + Visible: boolean +end + +declare class ScriptBuilder extends Instance +end + +declare class SyncScriptBuilder extends ScriptBuilder + CompileTarget: EnumCompileTarget + CoverageInfo: boolean + DebugInfo: boolean + PackAsSource: boolean +end + +declare class ScriptChangeService extends Instance + ScriptAdded: RBXScriptSignal + ScriptBeingRemoved: RBXScriptSignal + ScriptChanged: RBXScriptSignal + ScriptFullNameChanged: RBXScriptSignal + ScriptSourceChanged: RBXScriptSignal +end + +declare class ScriptCloneWatcher extends Instance +end + +declare class ScriptCloneWatcherHelper extends Instance +end + +declare class ScriptCommitService extends Instance +end + +declare class ScriptContext extends Instance + Error: RBXScriptSignal + ErrorDetailed: RBXScriptSignal + ScriptsDisabled: boolean + function AddCoreScriptLocal(self, name: string, parent: Instance): nil + function ClearScriptProfilingData(self): nil + function DeserializeScriptProfilerString(self, jsonString: string): { [any]: any } + function GetCoverageStats(self): { any } + function SaveScriptProfilingData(self, filename: string): nil + function SetTimeout(self, seconds: number): nil + function StartScriptProfiling(self, frequency: number?): nil + function StopScriptProfiling(self): string + + function AddCoreScript(self, id: number, player: Player, name: string): nil +end + +declare class ScriptDebugger extends Instance + BreakpointAdded: RBXScriptSignal + BreakpointRemoved: RBXScriptSignal + CurrentLine: number + EncounteredBreak: RBXScriptSignal + IsDebugging: boolean + IsPaused: boolean + Resuming: RBXScriptSignal<> + Script: Instance + WatchAdded: RBXScriptSignal + WatchRemoved: RBXScriptSignal + function AddWatch(self, expression: string): Instance + function GetBreakpoints(self): { Instance } + function GetGlobals(self, stackFrame: number?): { [any]: any } + function GetLocals(self, stackFrame: number?): { [any]: any } + function GetStack(self): { any } + function GetUpvalues(self, stackFrame: number?): { [any]: any } + function GetWatchValue(self, watch: Instance): any + function GetWatches(self): { Instance } + function SetBreakpoint(self, line: number, isContextDependentBreakpoint: boolean): Instance + function SetGlobal(self, name: string, value: any, stackFrame: number): nil + function SetLocal(self, name: string, value: any, stackFrame: number?): nil + function SetUpvalue(self, name: string, value: any, stackFrame: number?): nil +end + +declare class ScriptDocument extends Instance + SelectionChanged: RBXScriptSignal + ViewportChanged: RBXScriptSignal + function CloseAsync(self): any + function EditTextAsync(self, newText: string, startLine: number, startCharacter: number, endLine: number, endCharacter: number): any + function ForceSetSelectionAsync(self, cursorLine: number, cursorCharacter: number, anchorLine: number?, anchorCharacter: number?): any + function GetInternalUri(self): string + function GetLine(self, lineIndex: number?): string + function GetLineCount(self): number + function GetScript(self): LuaSourceContainer + function GetSelectedText(self): string + function GetSelection(self): any + function GetSelectionEnd(self): any + function GetSelectionStart(self): any + function GetText(self, startLine: number?, startCharacter: number?, endLine: number?, endCharacter: number?): string + function GetViewport(self): any + function HasSelectedText(self): boolean + function IsCommandBar(self): boolean + function RequestSetSelectionAsync(self, cursorLine: number, cursorCharacter: number, anchorLine: number?, anchorCharacter: number?): any +end + +declare class ScriptEditorService extends Instance + TextDocumentDidChange: RBXScriptSignal + TextDocumentDidClose: RBXScriptSignal + TextDocumentDidOpen: RBXScriptSignal + function DeregisterAutocompleteCallback(self, name: string): nil + function DeregisterScriptAnalysisCallback(self, name: string): nil + function FindScriptDocument(self, script: LuaSourceContainer): ScriptDocument + function ForceReloadSource(self, uri: string, newsrc: string): nil + function GetEditorSource(self, script: LuaSourceContainer): string + function GetScriptDocuments(self): { Instance } + function OpenScriptDocumentAsync(self, script: LuaSourceContainer): any + function RegisterAutocompleteCallback(self, name: string, priority: number, callbackFunction: ((...any) -> ...any)): nil + function RegisterScriptAnalysisCallback(self, name: string, priority: number, callbackFunction: ((...any) -> ...any)): nil +end + +declare class ScriptRegistrationService extends Instance + function GetSourceContainerByScriptGuid(self, guid: string): LuaSourceContainer +end + +declare class ScriptRuntime extends Instance +end + +declare class ScriptService extends Instance +end + +declare class Selection extends Instance + ActiveInstance: Instance + RenderMode: EnumSelectionRenderMode + SelectionBoxThickness: number + SelectionChanged: RBXScriptSignal<> + SelectionLineThickness: number + SelectionThickness: number + ShowActiveInstanceHighlight: boolean + function Add(self, instancesToAdd: { Instance }): nil + function ClearTerrainSelectionHack(self): nil + function Get(self): { Instance } + function Remove(self, instancesToRemove: { Instance }): nil + function Set(self, selection: { Instance }): nil + function SetTerrainSelectionHack(self, center: Vector3, size: Vector3): nil +end + +declare class SelectionHighlightManager extends Instance +end + +declare class SensorBase extends Instance + OnSensorOutputChanged: RBXScriptSignal<> + UpdateType: EnumSensorUpdateType +end + +declare class BuoyancySensor extends SensorBase + FullySubmerged: boolean + TouchingSurface: boolean +end + +declare class ControllerSensor extends SensorBase +end + +declare class ControllerPartSensor extends ControllerSensor + HitFrame: CFrame + HitNormal: Vector3 + SearchDistance: number + SensedPart: BasePart + SensorMode: EnumSensorMode +end + +declare class ServerScriptService extends Instance + LoadStringEnabled: boolean +end + +declare class ServerStorage extends Instance +end + +declare class ServiceProvider extends Instance + Close: RBXScriptSignal<> + CloseLate: RBXScriptSignal<> + ServiceAdded: RBXScriptSignal + ServiceRemoving: RBXScriptSignal + + AdService: AdService + AnimationClipProvider: AnimationClipProvider + AnimationFromVideoCreatorService: AnimationFromVideoCreatorService + AnimationFromVideoCreatorStudioService: AnimationFromVideoCreatorStudioService + AppStorageService: AppStorageService + AppUpdateService: AppUpdateService + AssetCounterService: AssetCounterService + AssetDeliveryProxy: AssetDeliveryProxy + AssetImportService: AssetImportService + AssetManagerService: AssetManagerService + AssetService: AssetService + AvatarChatService: AvatarChatService + AvatarEditorService: AvatarEditorService + AvatarImportService: AvatarImportService + BadgeService: BadgeService + BrowserService: BrowserService + BulkImportService: BulkImportService + CSGDictionaryService: CSGDictionaryService + CacheableContentProvider: CacheableContentProvider + CalloutService: CalloutService + CaptureService: CaptureService + ChangeHistoryService: ChangeHistoryService + Chat: Chat + ChatbotUIService: ChatbotUIService + ClusterPacketCache: ClusterPacketCache + CollaboratorsService: CollaboratorsService + CollectionService: CollectionService + CommandService: CommandService + ConfigureServerService: ConfigureServerService + ContentProvider: ContentProvider + ContextActionService: ContextActionService + ControllerService: ControllerService + CookiesService: CookiesService + CoreGui: CoreGui + CorePackages: CorePackages + CoreScriptDebuggingManagerHelper: CoreScriptDebuggingManagerHelper + CoreScriptSyncService: CoreScriptSyncService + CrossDMScriptChangeListener: CrossDMScriptChangeListener + DataModelPatchService: DataModelPatchService + DataStoreService: DataStoreService + Debris: Debris + DebuggablePluginWatcher: DebuggablePluginWatcher + DebuggerConnectionManager: DebuggerConnectionManager + DebuggerManager: DebuggerManager + DebuggerUIService: DebuggerUIService + DeviceIdService: DeviceIdService + DraftsService: DraftsService + DraggerService: DraggerService + EventIngestService: EventIngestService + ExperienceAuthService: ExperienceAuthService + FaceAnimatorService: FaceAnimatorService + FacialAnimationRecordingService: FacialAnimationRecordingService + FacialAnimationStreamingServiceV2: FacialAnimationStreamingServiceV2 + FlagStandService: FlagStandService + FlyweightService: FlyweightService + FriendService: FriendService + GamePassService: GamePassService + GamepadService: GamepadService + Geometry: Geometry + GeometryService: GeometryService + GoogleAnalyticsConfiguration: GoogleAnalyticsConfiguration + GroupService: GroupService + GuiService: GuiService + GuidRegistryService: GuidRegistryService + HSRDataContentProvider: HSRDataContentProvider + HapticService: HapticService + HeightmapImporterService: HeightmapImporterService + HttpRbxApiService: HttpRbxApiService + HttpService: HttpService + ILegacyStudioBridge: ILegacyStudioBridge + IXPService: IXPService + IncrementalPatchBuilder: IncrementalPatchBuilder + InsertService: InsertService + KeyboardService: KeyboardService + KeyframeSequenceProvider: KeyframeSequenceProvider + LSPFileSyncService: LSPFileSyncService + LanguageService: LanguageService + LegacyStudioBridge: LegacyStudioBridge + Lighting: Lighting + LiveScriptingService: LiveScriptingService + LocalStorageService: LocalStorageService + LocalizationService: LocalizationService + LodDataService: LodDataService + LogService: LogService + LoginService: LoginService + LuaWebService: LuaWebService + LuauScriptAnalyzerService: LuauScriptAnalyzerService + MarketplaceService: MarketplaceService + MaterialGenerationService: MaterialGenerationService + MaterialService: MaterialService + MemStorageService: MemStorageService + MemoryStoreService: MemoryStoreService + MeshContentProvider: MeshContentProvider + MessageBusService: MessageBusService + MessagingService: MessagingService + MetaBreakpointManager: MetaBreakpointManager + MouseService: MouseService + NetworkClient: NetworkClient + NetworkServer: NetworkServer + NetworkSettings: NetworkSettings + NonReplicatedCSGDictionaryService: NonReplicatedCSGDictionaryService + NotificationService: NotificationService + OmniRecommendationsService: OmniRecommendationsService + OpenCloudService: OpenCloudService + PackageService: PackageService + PackageUIService: PackageUIService + PatchBundlerFileWatch: PatchBundlerFileWatch + PathfindingService: PathfindingService + PermissionsService: PermissionsService + PhysicsService: PhysicsService + PlaceStatsService: PlaceStatsService + PlacesService: PlacesService + PlatformFriendsService: PlatformFriendsService + PlayerEmulatorService: PlayerEmulatorService + Players: Players + PluginDebugService: PluginDebugService + PluginGuiService: PluginGuiService + PluginManagementService: PluginManagementService + PluginPolicyService: PluginPolicyService + PolicyService: PolicyService + ProcessInstancePhysicsService: ProcessInstancePhysicsService + ProximityPromptService: ProximityPromptService + PublishService: PublishService + RbxAnalyticsService: RbxAnalyticsService + RemoteCursorService: RemoteCursorService + RemoteDebuggerServer: RemoteDebuggerServer + RenderSettings: RenderSettings + ReplicatedFirst: ReplicatedFirst + ReplicatedStorage: ReplicatedStorage + RobloxPluginGuiService: RobloxPluginGuiService + RobloxReplicatedStorage: RobloxReplicatedStorage + RobloxServerStorage: RobloxServerStorage + RomarkService: RomarkService + RtMessagingService: RtMessagingService + RunService: RunService + RuntimeScriptService: RuntimeScriptService + SafetyService: SafetyService + ScriptChangeService: ScriptChangeService + ScriptCloneWatcher: ScriptCloneWatcher + ScriptCloneWatcherHelper: ScriptCloneWatcherHelper + ScriptCommitService: ScriptCommitService + ScriptContext: ScriptContext + ScriptEditorService: ScriptEditorService + ScriptRegistrationService: ScriptRegistrationService + ScriptService: ScriptService + Selection: Selection + SelectionHighlightManager: SelectionHighlightManager + ServerScriptService: ServerScriptService + ServerStorage: ServerStorage + ServiceVisibilityService: ServiceVisibilityService + SessionService: SessionService + SharedTableRegistry: SharedTableRegistry + ShorelineUpgraderService: ShorelineUpgraderService + SmoothVoxelsUpgraderService: SmoothVoxelsUpgraderService + SnippetService: SnippetService + SocialService: SocialService + SolidModelContentProvider: SolidModelContentProvider + SoundService: SoundService + SpawnerService: SpawnerService + StarterGui: StarterGui + StarterPack: StarterPack + StarterPlayer: StarterPlayer + Stats: Stats + StopWatchReporter: StopWatchReporter + Studio: Studio + StudioAssetService: StudioAssetService + StudioData: StudioData + StudioDeviceEmulatorService: StudioDeviceEmulatorService + StudioPublishService: StudioPublishService + StudioScriptDebugEventListener: StudioScriptDebugEventListener + StudioSdkService: StudioSdkService + StudioService: StudioService + StylingService: StylingService + TaskScheduler: TaskScheduler + TeamCreateData: TeamCreateData + TeamCreatePublishService: TeamCreatePublishService + TeamCreateService: TeamCreateService + Teams: Teams + TeleportService: TeleportService + TemporaryCageMeshProvider: TemporaryCageMeshProvider + TemporaryScriptService: TemporaryScriptService + TestService: TestService + TextBoxService: TextBoxService + TextChatService: TextChatService + TextService: TextService + ThirdPartyUserService: ThirdPartyUserService + TimerService: TimerService + ToastNotificationService: ToastNotificationService + TouchInputService: TouchInputService + TracerService: TracerService + TutorialService: TutorialService + TweenService: TweenService + UGCAvatarService: UGCAvatarService + UGCValidationService: UGCValidationService + UnvalidatedAssetService: UnvalidatedAssetService + UserInputService: UserInputService + UserService: UserService + UserStorageService: UserStorageService + VRService: VRService + VRStatusService: VRStatusService + VersionControlService: VersionControlService + VideoCaptureService: VideoCaptureService + VideoService: VideoService + VirtualInputManager: VirtualInputManager + VirtualUser: VirtualUser + VisibilityCheckDispatcher: VisibilityCheckDispatcher + VisibilityService: VisibilityService + Visit: Visit + VoiceChatInternal: VoiceChatInternal + VoiceChatService: VoiceChatService + Workspace: Workspace + + LoadingGuiService: any + ScriptInformationProvider: ScriptInformationProvider + JointsService: JointsService + + function FindService(self, className: string): Instance + function GetService(self, service: "AdService"): AdService + function GetService(self, service: "AnalyticsService"): AnalyticsService + function GetService(self, service: "AnimationClipProvider"): AnimationClipProvider + function GetService(self, service: "AnimationFromVideoCreatorService"): AnimationFromVideoCreatorService + function GetService(self, service: "AnimationFromVideoCreatorStudioService"): AnimationFromVideoCreatorStudioService + function GetService(self, service: "AppStorageService"): AppStorageService + function GetService(self, service: "AppUpdateService"): AppUpdateService + function GetService(self, service: "AssetCounterService"): AssetCounterService + function GetService(self, service: "AssetDeliveryProxy"): AssetDeliveryProxy + function GetService(self, service: "AssetImportService"): AssetImportService + function GetService(self, service: "AssetManagerService"): AssetManagerService + function GetService(self, service: "AssetService"): AssetService + function GetService(self, service: "AvatarChatService"): AvatarChatService + function GetService(self, service: "AvatarEditorService"): AvatarEditorService + function GetService(self, service: "AvatarImportService"): AvatarImportService + function GetService(self, service: "BadgeService"): BadgeService + function GetService(self, service: "BrowserService"): BrowserService + function GetService(self, service: "BulkImportService"): BulkImportService + function GetService(self, service: "CSGDictionaryService"): CSGDictionaryService + function GetService(self, service: "CacheableContentProvider"): CacheableContentProvider + function GetService(self, service: "CalloutService"): CalloutService + function GetService(self, service: "CaptureService"): CaptureService + function GetService(self, service: "ChangeHistoryService"): ChangeHistoryService + function GetService(self, service: "Chat"): Chat + function GetService(self, service: "ChatbotUIService"): ChatbotUIService + function GetService(self, service: "ClusterPacketCache"): ClusterPacketCache + function GetService(self, service: "CollaboratorsService"): CollaboratorsService + function GetService(self, service: "CollectionService"): CollectionService + function GetService(self, service: "CommandService"): CommandService + function GetService(self, service: "ConfigureServerService"): ConfigureServerService + function GetService(self, service: "ContentProvider"): ContentProvider + function GetService(self, service: "ContextActionService"): ContextActionService + function GetService(self, service: "ControllerService"): ControllerService + function GetService(self, service: "CookiesService"): CookiesService + function GetService(self, service: "CoreGui"): CoreGui + function GetService(self, service: "CorePackages"): CorePackages + function GetService(self, service: "CoreScriptDebuggingManagerHelper"): CoreScriptDebuggingManagerHelper + function GetService(self, service: "CoreScriptSyncService"): CoreScriptSyncService + function GetService(self, service: "CrossDMScriptChangeListener"): CrossDMScriptChangeListener + function GetService(self, service: "DataModelPatchService"): DataModelPatchService + function GetService(self, service: "DataStoreService"): DataStoreService + function GetService(self, service: "Debris"): Debris + function GetService(self, service: "DebuggablePluginWatcher"): DebuggablePluginWatcher + function GetService(self, service: "DebuggerConnectionManager"): DebuggerConnectionManager + function GetService(self, service: "DebuggerManager"): DebuggerManager + function GetService(self, service: "DebuggerUIService"): DebuggerUIService + function GetService(self, service: "DeviceIdService"): DeviceIdService + function GetService(self, service: "DraftsService"): DraftsService + function GetService(self, service: "DraggerService"): DraggerService + function GetService(self, service: "EventIngestService"): EventIngestService + function GetService(self, service: "ExperienceAuthService"): ExperienceAuthService + function GetService(self, service: "FaceAnimatorService"): FaceAnimatorService + function GetService(self, service: "FacialAnimationRecordingService"): FacialAnimationRecordingService + function GetService(self, service: "FacialAnimationStreamingServiceV2"): FacialAnimationStreamingServiceV2 + function GetService(self, service: "FlagStandService"): FlagStandService + function GetService(self, service: "FlyweightService"): FlyweightService + function GetService(self, service: "FriendService"): FriendService + function GetService(self, service: "GamePassService"): GamePassService + function GetService(self, service: "GamepadService"): GamepadService + function GetService(self, service: "Geometry"): Geometry + function GetService(self, service: "GeometryService"): GeometryService + function GetService(self, service: "GoogleAnalyticsConfiguration"): GoogleAnalyticsConfiguration + function GetService(self, service: "GroupService"): GroupService + function GetService(self, service: "GuiService"): GuiService + function GetService(self, service: "GuidRegistryService"): GuidRegistryService + function GetService(self, service: "HSRDataContentProvider"): HSRDataContentProvider + function GetService(self, service: "HapticService"): HapticService + function GetService(self, service: "HeightmapImporterService"): HeightmapImporterService + function GetService(self, service: "Hopper"): Hopper + function GetService(self, service: "HttpRbxApiService"): HttpRbxApiService + function GetService(self, service: "HttpService"): HttpService + function GetService(self, service: "ILegacyStudioBridge"): ILegacyStudioBridge + function GetService(self, service: "IXPService"): IXPService + function GetService(self, service: "IncrementalPatchBuilder"): IncrementalPatchBuilder + function GetService(self, service: "InsertService"): InsertService + function GetService(self, service: "JointsService"): JointsService + function GetService(self, service: "KeyboardService"): KeyboardService + function GetService(self, service: "KeyframeSequenceProvider"): KeyframeSequenceProvider + function GetService(self, service: "LSPFileSyncService"): LSPFileSyncService + function GetService(self, service: "LanguageService"): LanguageService + function GetService(self, service: "LegacyStudioBridge"): LegacyStudioBridge + function GetService(self, service: "Lighting"): Lighting + function GetService(self, service: "LiveScriptingService"): LiveScriptingService + function GetService(self, service: "LocalStorageService"): LocalStorageService + function GetService(self, service: "LocalizationService"): LocalizationService + function GetService(self, service: "LodDataService"): LodDataService + function GetService(self, service: "LogService"): LogService + function GetService(self, service: "LoginService"): LoginService + function GetService(self, service: "LuaWebService"): LuaWebService + function GetService(self, service: "LuauScriptAnalyzerService"): LuauScriptAnalyzerService + function GetService(self, service: "MarketplaceService"): MarketplaceService + function GetService(self, service: "MaterialGenerationService"): MaterialGenerationService + function GetService(self, service: "MaterialService"): MaterialService + function GetService(self, service: "MemStorageService"): MemStorageService + function GetService(self, service: "MemoryStoreService"): MemoryStoreService + function GetService(self, service: "MeshContentProvider"): MeshContentProvider + function GetService(self, service: "MessageBusService"): MessageBusService + function GetService(self, service: "MessagingService"): MessagingService + function GetService(self, service: "MetaBreakpointManager"): MetaBreakpointManager + function GetService(self, service: "MouseService"): MouseService + function GetService(self, service: "NetworkClient"): NetworkClient + function GetService(self, service: "NetworkServer"): NetworkServer + function GetService(self, service: "NetworkSettings"): NetworkSettings + function GetService(self, service: "NonReplicatedCSGDictionaryService"): NonReplicatedCSGDictionaryService + function GetService(self, service: "NotificationService"): NotificationService + function GetService(self, service: "OmniRecommendationsService"): OmniRecommendationsService + function GetService(self, service: "OpenCloudService"): OpenCloudService + function GetService(self, service: "PackageService"): PackageService + function GetService(self, service: "PackageUIService"): PackageUIService + function GetService(self, service: "PatchBundlerFileWatch"): PatchBundlerFileWatch + function GetService(self, service: "PathfindingService"): PathfindingService + function GetService(self, service: "PermissionsService"): PermissionsService + function GetService(self, service: "PhysicsService"): PhysicsService + function GetService(self, service: "PlaceStatsService"): PlaceStatsService + function GetService(self, service: "PlacesService"): PlacesService + function GetService(self, service: "PlatformFriendsService"): PlatformFriendsService + function GetService(self, service: "PlayerEmulatorService"): PlayerEmulatorService + function GetService(self, service: "Players"): Players + function GetService(self, service: "PluginDebugService"): PluginDebugService + function GetService(self, service: "PluginGuiService"): PluginGuiService + function GetService(self, service: "PluginManagementService"): PluginManagementService + function GetService(self, service: "PluginPolicyService"): PluginPolicyService + function GetService(self, service: "PointsService"): PointsService + function GetService(self, service: "PolicyService"): PolicyService + function GetService(self, service: "ProcessInstancePhysicsService"): ProcessInstancePhysicsService + function GetService(self, service: "ProximityPromptService"): ProximityPromptService + function GetService(self, service: "PublishService"): PublishService + function GetService(self, service: "RbxAnalyticsService"): RbxAnalyticsService + function GetService(self, service: "RemoteCursorService"): RemoteCursorService + function GetService(self, service: "RemoteDebuggerServer"): RemoteDebuggerServer + function GetService(self, service: "RenderSettings"): RenderSettings + function GetService(self, service: "ReplicatedFirst"): ReplicatedFirst + function GetService(self, service: "ReplicatedStorage"): ReplicatedStorage + function GetService(self, service: "RobloxPluginGuiService"): RobloxPluginGuiService + function GetService(self, service: "RobloxReplicatedStorage"): RobloxReplicatedStorage + function GetService(self, service: "RobloxServerStorage"): RobloxServerStorage + function GetService(self, service: "RomarkService"): RomarkService + function GetService(self, service: "RtMessagingService"): RtMessagingService + function GetService(self, service: "RunService"): RunService + function GetService(self, service: "RuntimeScriptService"): RuntimeScriptService + function GetService(self, service: "SafetyService"): SafetyService + function GetService(self, service: "ScriptChangeService"): ScriptChangeService + function GetService(self, service: "ScriptCloneWatcher"): ScriptCloneWatcher + function GetService(self, service: "ScriptCloneWatcherHelper"): ScriptCloneWatcherHelper + function GetService(self, service: "ScriptCommitService"): ScriptCommitService + function GetService(self, service: "ScriptContext"): ScriptContext + function GetService(self, service: "ScriptEditorService"): ScriptEditorService + function GetService(self, service: "ScriptRegistrationService"): ScriptRegistrationService + function GetService(self, service: "ScriptService"): ScriptService + function GetService(self, service: "Selection"): Selection + function GetService(self, service: "SelectionHighlightManager"): SelectionHighlightManager + function GetService(self, service: "ServerScriptService"): ServerScriptService + function GetService(self, service: "ServerStorage"): ServerStorage + function GetService(self, service: "ServiceVisibilityService"): ServiceVisibilityService + function GetService(self, service: "SessionService"): SessionService + function GetService(self, service: "SharedTableRegistry"): SharedTableRegistry + function GetService(self, service: "ShorelineUpgraderService"): ShorelineUpgraderService + function GetService(self, service: "SmoothVoxelsUpgraderService"): SmoothVoxelsUpgraderService + function GetService(self, service: "SnippetService"): SnippetService + function GetService(self, service: "SocialService"): SocialService + function GetService(self, service: "SolidModelContentProvider"): SolidModelContentProvider + function GetService(self, service: "SoundService"): SoundService + function GetService(self, service: "SpawnerService"): SpawnerService + function GetService(self, service: "StarterGui"): StarterGui + function GetService(self, service: "StarterPack"): StarterPack + function GetService(self, service: "StarterPlayer"): StarterPlayer + function GetService(self, service: "Stats"): Stats + function GetService(self, service: "StopWatchReporter"): StopWatchReporter + function GetService(self, service: "Studio"): Studio + function GetService(self, service: "StudioAssetService"): StudioAssetService + function GetService(self, service: "StudioData"): StudioData + function GetService(self, service: "StudioDeviceEmulatorService"): StudioDeviceEmulatorService + function GetService(self, service: "StudioPublishService"): StudioPublishService + function GetService(self, service: "StudioScriptDebugEventListener"): StudioScriptDebugEventListener + function GetService(self, service: "StudioSdkService"): StudioSdkService + function GetService(self, service: "StudioService"): StudioService + function GetService(self, service: "StylingService"): StylingService + function GetService(self, service: "TaskScheduler"): TaskScheduler + function GetService(self, service: "TeamCreateData"): TeamCreateData + function GetService(self, service: "TeamCreatePublishService"): TeamCreatePublishService + function GetService(self, service: "TeamCreateService"): TeamCreateService + function GetService(self, service: "Teams"): Teams + function GetService(self, service: "TeleportService"): TeleportService + function GetService(self, service: "TemporaryCageMeshProvider"): TemporaryCageMeshProvider + function GetService(self, service: "TemporaryScriptService"): TemporaryScriptService + function GetService(self, service: "TestService"): TestService + function GetService(self, service: "TextBoxService"): TextBoxService + function GetService(self, service: "TextChatService"): TextChatService + function GetService(self, service: "TextService"): TextService + function GetService(self, service: "ThirdPartyUserService"): ThirdPartyUserService + function GetService(self, service: "TimerService"): TimerService + function GetService(self, service: "ToastNotificationService"): ToastNotificationService + function GetService(self, service: "TouchInputService"): TouchInputService + function GetService(self, service: "TracerService"): TracerService + function GetService(self, service: "TutorialService"): TutorialService + function GetService(self, service: "TweenService"): TweenService + function GetService(self, service: "UGCAvatarService"): UGCAvatarService + function GetService(self, service: "UGCValidationService"): UGCValidationService + function GetService(self, service: "UnvalidatedAssetService"): UnvalidatedAssetService + function GetService(self, service: "UserInputService"): UserInputService + function GetService(self, service: "UserService"): UserService + function GetService(self, service: "UserStorageService"): UserStorageService + function GetService(self, service: "VRService"): VRService + function GetService(self, service: "VRStatusService"): VRStatusService + function GetService(self, service: "VersionControlService"): VersionControlService + function GetService(self, service: "VideoCaptureService"): VideoCaptureService + function GetService(self, service: "VideoService"): VideoService + function GetService(self, service: "VirtualInputManager"): VirtualInputManager + function GetService(self, service: "VirtualUser"): VirtualUser + function GetService(self, service: "VisibilityCheckDispatcher"): VisibilityCheckDispatcher + function GetService(self, service: "VisibilityService"): VisibilityService + function GetService(self, service: "Visit"): Visit + function GetService(self, service: "VoiceChatInternal"): VoiceChatInternal + function GetService(self, service: "VoiceChatService"): VoiceChatService + function GetService(self, service: "Workspace"): Workspace + + function GetService(self, service: "ScriptInformationProvider"): ScriptInformationProvider + function GetService(self, service: "LoadingGuiService"): any + function GetService(self, service: "PersonalServerService"): PersonalServerService + function GetService(self, service: "Terrain"): Terrain +end + +declare class DataModel extends ServiceProvider + CreatorId: number + CreatorType: EnumCreatorType + GameId: number + Genre: EnumGenre + GraphicsQualityChangeRequest: RBXScriptSignal + IsSFFlagsLoaded: boolean + JobId: string + Loaded: RBXScriptSignal<> + PlaceId: number + PlaceVersion: number + PrivateServerId: string + PrivateServerOwnerId: number + ScreenshotReady: RBXScriptSignal + ScreenshotSavedToAlbum: RBXScriptSignal + UniverseMetadataLoaded: RBXScriptSignal<> + Workspace: Workspace + + LocalSaveEnabled: boolean + RequestShutdown: (...any) -> ...any + LocalBackpack: Backpack + + function BindToClose(self, func: ((...any) -> ...any)): nil + function DefineFastFlag(self, name: string, defaultValue: boolean): boolean + function DefineFastInt(self, name: string, defaultValue: number): number + function DefineFastString(self, name: string, defaultValue: string): string + function GetEngineFeature(self, name: string): boolean + function GetFastFlag(self, name: string): boolean + function GetFastInt(self, name: string): number + function GetFastString(self, name: string): string + function GetJobsInfo(self): { any } + function GetObjects(self, url: Content): { Instance } + function GetObjectsAllOrNone(self, url: Content, binaryFormatOnly: boolean?): { Instance } + function GetObjectsAsync(self, url: Content): { Instance } + function GetObjectsList(self, urls: { any }): { any } + function GetPlaySessionId(self): string + function HttpGet(self, url: string, httpRequestType: EnumHttpRequestType?): string + function HttpGetAsync(self, url: string, httpRequestType: EnumHttpRequestType?): string + function HttpPost(self, url: string, data: string, contentType: string?, httpRequestType: EnumHttpRequestType?): string + function HttpPostAsync(self, url: string, data: string, contentType: string?, httpRequestType: EnumHttpRequestType?): string + function InsertObjectsAndJoinIfLegacyAsync(self, url: Content): { Instance } + function IsContentLoaded(self): boolean + function IsLoaded(self): boolean + function IsUniverseMetadataLoaded(self): boolean + function Load(self, url: Content): nil + function OpenScreenshotsFolder(self): nil + function OpenVideosFolder(self): nil + function ReportInGoogleAnalytics(self, category: string, action: string?, label: string?, value: number?): nil + function SetFastFlagForTesting(self, name: string, newValue: boolean): boolean + function SetFastIntForTesting(self, name: string, newValue: number): number + function SetFastStringForTesting(self, name: string, newValue: string): string + function SetFlagVersion(self, name: string, version: number): nil + function SetIsLoaded(self, value: boolean, placeSizeInBytes: number?): nil + function SetPlaceId(self, placeId: number, idk: boolean): nil + function SetPlaceID(self, placeId: number, idk: boolean): nil + function SetUniverseId(self, universeId: number): nil + function Shutdown(self): nil + + function SaveToRoblox(self): nil + function FinishShutdown(self, idk: boolean): nil + function SetScreenshotInfo(self, info: string): nil + function SetVideoInfo(self, info: string): nil + function SetRemoteBuildMode(self, value: boolean): nil + function SetMessage(self, message: string): nil + function SetMessageBrickCount(self): nil + function ClearMessage(self): nil + function SetCreatorID(self, id: number, creatorType: EnumCreatorType): nil +end + +declare class GenericSettings extends ServiceProvider +end + +declare class AnalysticsSettings extends GenericSettings +end + +declare class UserSettings extends GenericSettings + GameSettings: UserGameSettings + function GetService(self, service: "UserGameSettings"): UserGameSettings + function IsUserFeatureEnabled(self, name: string): boolean + function Reset(self): nil + function SaveState(self): nil +end + +declare class ServiceVisibilityService extends Instance + HiddenServices: BinaryString + VisibleServices: BinaryString +end + +declare class SessionService extends Instance + function GetCreatedTimestampUtcMs(self, sid: string): number + function GetMetadata(self, sid: string, key: string): any + function GetRootSID(self): string + function RemoveMetadata(self, sid: string, key: string): nil + function RemoveSession(self, sid: string): nil + function RemoveSessionsWithMetadataKey(self, key: string): nil + function ReplaceSession(self, sid: string, tag: string): nil + function SessionExists(self, sid: string): boolean + function SetMetadata(self, sid: string, key: string, value: any): nil + function SetSession(self, parentSid: string, childSid: string, tag: string): nil +end + +declare class SharedTableRegistry extends Instance + function GetSharedTable(self, name: string): SharedTable + function SetSharedTable(self, name: string, st: SharedTable?): nil +end + +declare class ShorelineUpgraderService extends Instance + Status: RBXScriptSignal + function Cancel(self): nil + function Start(self): nil +end + +declare class Sky extends Instance + CelestialBodiesShown: boolean + MoonAngularSize: number + MoonTextureId: Content + SkyboxBk: Content + SkyboxDn: Content + SkyboxFt: Content + SkyboxLf: Content + SkyboxRt: Content + SkyboxUp: Content + StarCount: number + SunAngularSize: number + SunTextureId: Content +end + +declare class Smoke extends Instance + Color: Color3 + Enabled: boolean + Opacity: number + RiseVelocity: number + Size: number + TimeScale: number + function FastForward(self, numFrames: number): nil +end + +declare class SmoothVoxelsUpgraderService extends Instance + Status: RBXScriptSignal + function Cancel(self): nil + function Start(self): nil +end + +declare class SnippetService extends Instance +end + +declare class SocialService extends Instance + GameInvitePromptClosed: RBXScriptSignal + IrisInvitePromptClosed: RBXScriptSignal + OnIrisInviteInvoked: (tag: string, irisParticipantIds: { any }) -> Instance + PromptInviteRequested: RBXScriptSignal + PromptIrisInviteRequested: RBXScriptSignal + SelfViewHidden: RBXScriptSignal<> + SelfViewVisible: RBXScriptSignal + function CanSendGameInviteAsync(self, player: Player, recipientId: number?): boolean + function CanSendIrisInviteAsync(self, player: Instance): boolean + function HideSelfView(self): nil + function InvokeGameInvitePromptClosed(self, player: Instance, recipientIds: { any }): nil + function InvokeIrisInvite(self, player: Instance, tag: string, irisParticipantIds: { any }): nil + function InvokeIrisInvitePromptClosed(self, player: Instance): nil + function PromptGameInvite(self, player: Player, experienceInviteOptions: Instance?): nil + function PromptIrisInvite(self, player: Instance, tag: string): nil + function ShowSelfView(self, selfViewPosition: EnumSelfViewPosition?): nil +end + +declare class Sound extends Instance + ChannelCount: number + DidLoop: RBXScriptSignal + Ended: RBXScriptSignal + IsLoaded: boolean + IsPaused: boolean + IsPlaying: boolean + IsSpatial: boolean + Loaded: RBXScriptSignal + LoopRegion: NumberRange + Looped: boolean + Paused: RBXScriptSignal + PlayOnRemove: boolean + PlaybackLoudness: number + PlaybackRegion: NumberRange + PlaybackRegionsEnabled: boolean + PlaybackSpeed: number + Played: RBXScriptSignal + Playing: boolean + Resumed: RBXScriptSignal + RollOffGain: number + RollOffMaxDistance: number + RollOffMinDistance: number + RollOffMode: EnumRollOffMode + SoundGroup: SoundGroup + SoundId: Content + Stopped: RBXScriptSignal + TimeLength: number + TimePosition: number + UsageContextPermission: EnumUsageContext + Volume: number + function Pause(self): nil + function Play(self): nil + function Resume(self): nil + function Stop(self): nil +end + +declare class SoundEffect extends Instance + Enabled: boolean + Priority: number +end + +declare class ChorusSoundEffect extends SoundEffect + Depth: number + Mix: number + Rate: number +end + +declare class CompressorSoundEffect extends SoundEffect + Attack: number + GainMakeup: number + Ratio: number + Release: number + SideChain: Instance + Threshold: number +end + +declare class CustomSoundEffect extends SoundEffect +end + +declare class AssetSoundEffect extends CustomSoundEffect +end + +declare class ChannelSelectorSoundEffect extends CustomSoundEffect + Channel: number +end + +declare class DistortionSoundEffect extends SoundEffect + Level: number +end + +declare class EchoSoundEffect extends SoundEffect + Delay: number + DryLevel: number + Feedback: number + WetLevel: number +end + +declare class EqualizerSoundEffect extends SoundEffect + HighGain: number + LowGain: number + MidGain: number +end + +declare class FlangeSoundEffect extends SoundEffect + Depth: number + Mix: number + Rate: number +end + +declare class PitchShiftSoundEffect extends SoundEffect + Octave: number +end + +declare class ReverbSoundEffect extends SoundEffect + DecayTime: number + Density: number + Diffusion: number + DryLevel: number + WetLevel: number +end + +declare class TremoloSoundEffect extends SoundEffect + Depth: number + Duty: number + Frequency: number +end + +declare class SoundGroup extends Instance + Volume: number +end + +declare class SoundService extends Instance + AmbientReverb: EnumReverbType + DeviceListChanged: RBXScriptSignal + DistanceFactor: number + DopplerScale: number + RespectFilteringEnabled: boolean + RolloffScale: number + VolumetricAudio: EnumVolumetricAudio + function BeginRecording(self): boolean + function EndRecording(self): { [any]: any } + function GetInputDevice(self): any + function GetInputDevices(self): any + function GetListener(self): (EnumListenerType, any) + function GetOutputDevice(self): any + function GetOutputDevices(self): any + function GetRecordingDevices(self): { [any]: any } + function GetSoundMemoryData(self): { [any]: any } + function PlayLocalSound(self, sound: Sound): nil + function SetInputDevice(self, name: string, guid: string): nil + function SetListener(self, listenerType: EnumListenerType, listener: any): nil + function SetOutputDevice(self, name: string, guid: string): nil + function SetRecordingDevice(self, deviceIndex: number): boolean +end + +declare class Sparkles extends Instance + Color: Color3 + Enabled: boolean + SparkleColor: Color3 + TimeScale: number + function FastForward(self, numFrames: number): nil +end + +declare class SpawnerService extends Instance +end + +declare class StackFrame extends Instance + FrameId: number + FrameName: string + FrameType: EnumDebuggerFrameType + Globals: DebuggerVariable + Line: number + Locals: DebuggerVariable + Populated: boolean + Script: string + Upvalues: DebuggerVariable +end + +declare class StandalonePluginScripts extends Instance +end + +declare class StarterGear extends Instance +end + +declare class StarterPack extends Instance +end + +declare class StarterPlayer extends Instance + AllowCustomAnimations: boolean + AutoJumpEnabled: boolean + AvatarJointUpgrade: EnumAvatarJointUpgrade + CameraMaxZoomDistance: number + CameraMinZoomDistance: number + CameraMode: EnumCameraMode + CharacterJumpHeight: number + CharacterJumpPower: number + CharacterMaxSlopeAngle: number + CharacterUseJumpPower: boolean + CharacterWalkSpeed: number + DeathStyle: EnumDeathStyle + DevCameraOcclusionMode: EnumDevCameraOcclusionMode + DevComputerCameraMovementMode: EnumDevComputerCameraMovementMode + DevComputerMovementMode: EnumDevComputerMovementMode + DevTouchCameraMovementMode: EnumDevTouchCameraMovementMode + DevTouchMovementMode: EnumDevTouchMovementMode + EnableDynamicHeads: EnumLoadDynamicHeads + EnableMouseLockOption: boolean + GameSettingsAssetIDFace: number + GameSettingsAssetIDHead: number + GameSettingsAssetIDLeftArm: number + GameSettingsAssetIDLeftLeg: number + GameSettingsAssetIDPants: number + GameSettingsAssetIDRightArm: number + GameSettingsAssetIDRightLeg: number + GameSettingsAssetIDShirt: number + GameSettingsAssetIDTeeShirt: number + GameSettingsAssetIDTorso: number + GameSettingsAvatar: EnumGameAvatarType + GameSettingsR15Collision: EnumR15CollisionType + GameSettingsScaleRangeBodyType: NumberRange + GameSettingsScaleRangeHead: NumberRange + GameSettingsScaleRangeHeight: NumberRange + GameSettingsScaleRangeProportion: NumberRange + GameSettingsScaleRangeWidth: NumberRange + HealthDisplayDistance: number + HumanoidStateMachineMode: EnumHumanoidStateMachineMode + LoadCharacterAppearance: boolean + NameDisplayDistance: number + UserEmotesEnabled: boolean + function ClearDefaults(self): nil +end + +declare class StarterPlayerScripts extends Instance +end + +declare class StarterCharacterScripts extends StarterPlayerScripts +end + +declare class Stats extends Instance + ContactsCount: number + DataReceiveKbps: number + DataSendKbps: number + HeartbeatTimeMs: number + InstanceCount: number + MovingPrimitivesCount: number + PhysicsReceiveKbps: number + PhysicsSendKbps: number + PhysicsStepTimeMs: number + PrimitivesCount: number + function GetBrowserTrackerId(self): string + function GetMemoryUsageMbForTag(self, tag: EnumDeveloperMemoryTag): number + function GetPaginatedMemoryByTexture(self, queryType: EnumTextureQueryType, pageIndex: number, pageSize: number): { [any]: any } + function GetTotalMemoryUsageMb(self): number +end + +declare class StatsItem extends Instance + DisplayName: string + function GetValue(self): number + function GetValueString(self): string +end + +declare class RunningAverageItemDouble extends StatsItem +end + +declare class RunningAverageItemInt extends StatsItem +end + +declare class RunningAverageTimeIntervalItem extends StatsItem +end + +declare class TotalCountTimeIntervalItem extends StatsItem +end + +declare class StopWatchReporter extends Instance + function FinishTask(self, taskId: number): nil + function SendReport(self, reportName: string): nil + function StartTask(self, reportName: string, taskName: string): number +end + +declare class Studio extends Instance + CommandBarLocalState: boolean + DefaultScriptFileDir: QDir + DeprecatedObjectsShown: boolean + DisplayLanguage: string + EnableIndentationRulers: boolean + EnableOnTypeAutocomplete: boolean + Font: QFont + HintColor: Color3 + IconOverrideDir: QDir + IndentationRulerColor: Color3 + InformationColor: Color3 + LocalAssetsFolder: QDir + LuaDebuggerEnabled: boolean + LuaDebuggerEnabledAtStartup: boolean + PermissionLevelShown: EnumPermissionLevelShown + PluginDebuggingEnabled: boolean + PluginsDir: QDir + ReloadBuiltinPluginsOnChange: boolean + ReloadLocalPluginsOnChange: boolean + Rulers: string + RuntimeUndoBehavior: EnumRuntimeUndoBehavior + ScriptEditorMenuBorderColor: Color3 + ScriptEditorShouldShowPluginMethods: boolean + ScriptTimeoutLength: number + ShowCorePackagesInExplorer: boolean + Theme: StudioTheme + ThemeChanged: RBXScriptSignal<> + function GetAvailableThemes(self): { any } +end + +declare class StudioAssetService extends Instance + OnConvertToPackageResult: RBXScriptSignal + OnPublishPackageResult: RBXScriptSignal<{ [any]: any }, string> + OnSaveToRoblox: RBXScriptSignal<{ Instance }, any> + function ConvertToPackageUpload(self, uploadUrl: string, cloneInstances: { Instance }, originalInstances: { Instance }): nil + function PublishPackage(self, instance: Instance, publishInfo: { [any]: any }): nil + function SerializeInstances(self, instances: { Instance }): string + function ShowSaveToRoblox(self, instances: { Instance }, assetType: any): nil +end + +declare class StudioCallout extends Instance + AnchorPoint: Vector2 + IsArrowVisible: boolean + IsNextVisible: boolean + RowName: string + Text: string + Title: string + function SetOnNextClicked(self, onClick: ((...any) -> ...any)): nil +end + +declare class StudioData extends Instance + EnableScriptCollabByDefaultOnLoad: boolean +end + +declare class StudioDeviceEmulatorService extends Instance + CurrentDeviceIdChanged: RBXScriptSignal<> + HasMultiTouchStarted: boolean + IsMultiTouchEmulationOn: boolean + IsMultiTouchEnabled: boolean + OrientationChanged: RBXScriptSignal<> + PivotPosition: Vector2 + TouchInBoundsChanged: RBXScriptSignal<> + TouchPositionsChanged: RBXScriptSignal<> + function EmulatePCDeviceWithResolution(self, deviceId: string, resolution: Vector2): boolean + function GetCurrentDeviceId(self): string + function GetCurrentOrientation(self): EnumScreenOrientation + function GetMaxNumTouches(self): number + function GetTouchInBounds(self, index: number): boolean + function GetTouchPosition(self, index: number): Vector2 + function HasDeviceWithId(self, deviceId: string): boolean + function SetCurrentDeviceId(self, deviceId: string): nil + function SetCurrentOrientation(self, orientation: EnumScreenOrientation): nil +end + +declare class StudioObjectBase extends Instance +end + +declare class StudioWidget extends StudioObjectBase +end + +declare class StudioPublishService extends Instance + GameNameUpdated: RBXScriptSignal + GamePublishCancelled: RBXScriptSignal<> + GamePublishFinished: RBXScriptSignal + OnSaveOrPublishPlaceToRoblox: RBXScriptSignal + function ClearUploadNames(self): nil + function PublishAs(self, universeId: number, placeId: number, groupId: number, isPublish: boolean, publishParameters: any): nil + function PublishThenTurnOnTeamCreate(self): nil + function RefreshDocumentDisplayName(self): nil + function SetTeamCreateOnPublishInfo(self, shouldTurnOnTcOnPublish: boolean, newPlaceName: string): nil + function SetUniverseDisplayName(self, newName: string): nil + function SetUploadNames(self, placeName: string, universeName: string): nil + function ShowSaveOrPublishPlaceToRoblox(self, showGameSelect: boolean, isPublish: boolean, closeMode: EnumStudioCloseMode): nil +end + +declare class StudioScriptDebugEventListener extends Instance +end + +declare class StudioSdkService extends Instance + function GetSdk(self): Instance + function SetSdk(self, sdk: Instance): nil +end + +declare class StudioService extends Instance + ActiveScript: Instance + AlignDraggedObjects: boolean + DraggerSolveConstraints: boolean + GridSize: number + HoverInstance: Instance + InstalledPluginData: string + OnImportFromRoblox: RBXScriptSignal<> + OnOpenGameSettings: RBXScriptSignal + OnOpenManagePackagePlugin: RBXScriptSignal + OnPluginInstalledFromToolbox: RBXScriptSignal<> + OnPluginInstalledFromWeb: RBXScriptSignal + OnPublishAsPlugin: RBXScriptSignal<{ Instance }> + OnSaveToRoblox: RBXScriptSignal<{ Instance }> + PivotSnapToGeometry: boolean + PromptTransformPluginCheckEnable: RBXScriptSignal<> + RotateIncrement: number + SaveLocallyAsComplete: RBXScriptSignal + ShowConstraintDetails: boolean + StudioLocaleId: string + UseLocalSpace: boolean + function AnimationIdSelected(self, id: number): nil + function CopyToClipboard(self, stringToCopy: string): nil + function GetBadgeConfigureUrl(self, badgeId: number): string + function GetBadgeUploadUrl(self): string + function GetClassIcon(self, className: string): { [any]: any } + function GetPlaceIsPersistedToCloud(self): boolean + function GetResourceByCategory(self, category: string): { [any]: any } + function GetStartupAssetId(self): string + function GetStartupPluginId(self): string + function GetTermsOfUseUrl(self): string + function GetUserId(self): number + function GizmoRaycast(self, origin: Vector3, direction: Vector3, raycastParams: RaycastParams?): RaycastResult + function HasInternalPermission(self): boolean + function IsPluginInstalled(self, assetId: number): boolean + function IsPluginUpToDate(self, assetId: number, currentAssetVersion: number): boolean + function OpenInBrowser_DONOTUSE(self, url: string): nil + function PromptImportFile(self, fileTypeFilter: { any }?): Instance + function PromptImportFiles(self, fileTypeFilter: { any }?): { Instance } + function RequestClose(self, closeMode: EnumStudioCloseMode): nil + function SetPluginEnabled(self, assetId: number, state: boolean): nil + function ShowPlaceVersionHistoryDialog(self, placeId: number): nil + function ShowPublishToRoblox(self): nil + function TryInstallPlugin(self, assetId: number, assetVersionId: number): nil + function UninstallPlugin(self, assetId: number): nil + function UpdatePluginManagement(self): nil +end + +declare class StudioTheme extends Instance + function GetColor(self, styleguideitem: EnumStudioStyleGuideColor, modifier: EnumStudioStyleGuideModifier?): Color3 +end + +declare class StyleBase extends Instance + StyleRulesChanged: RBXScriptSignal<> + function GetStyleRules(self): { Instance } + function InsertStyleRule(self, rule: StyleRule, index: number?): nil + function SetStyleRules(self, rules: { Instance }): nil +end + +declare class StyleRule extends StyleBase + Selector: string + SelectorError: string + function GetProperties(self): { [any]: any } + function GetPropertiesResolved(self): { [any]: any } + function GetProperty(self, name: string): any + function GetPropertyResolved(self, name: string): any + function SetProperties(self, table: { [any]: any }): nil + function SetProperty(self, name: string, value: any): nil +end + +declare class StyleSheet extends StyleBase + function GetDerives(self): { Instance } + function SetDerives(self, derives: { Instance }): nil +end + +declare class StyleDerive extends Instance + StyleSheet: StyleSheet +end + +declare class StyleLink extends Instance + StyleSheet: StyleSheet +end + +declare class StylingService extends Instance + function GetAppliedStyles(self, instance: Instance): { any } + function GetStyleInfo(self, style: StyleRule): { [any]: any } + function GetStyleSheetDerivesChain(self, styleSheet: StyleSheet): { Instance } + function GetStyleSheetInfo(self, styleSheet: StyleSheet): { [any]: any } +end + +declare class SurfaceAppearance extends Instance + AlphaMode: EnumAlphaMode + ColorMap: Content + MetalnessMap: Content + NormalMap: Content + RoughnessMap: Content + TexturePack: Content +end + +declare class TaskScheduler extends Instance + SchedulerDutyCycle: number + SchedulerRate: number + ThreadPoolConfig: EnumThreadPoolConfig + ThreadPoolSize: number +end + +declare class Team extends Instance + AutoAssignable: boolean + ChildOrder: number + PlayerAdded: RBXScriptSignal + PlayerRemoved: RBXScriptSignal + TeamColor: BrickColor + function GetPlayers(self): { Player } +end + +declare class TeamCreateData extends Instance +end + +declare class TeamCreatePublishService extends Instance +end + +declare class TeamCreateService extends Instance + ToggleManageCollaborators: RBXScriptSignal<> + function CloseGameIfUserDoesntHavePerms(self): nil +end + +declare class Teams extends Instance + function GetTeams(self): { Team } +end + +declare class TeleportAsyncResult extends Instance + PrivateServerId: string + ReservedServerAccessCode: string +end + +declare class TeleportOptions extends Instance + ReservedServerAccessCode: string + ServerInstanceId: string + ShouldReserveServer: boolean + function GetTeleportData(self): any + function SetTeleportData(self, teleportData: any): nil +end + +declare class TeleportService extends Instance + LocalPlayerArrivedFromTeleport: RBXScriptSignal + MenuTeleportAttempt: RBXScriptSignal<> + TeleportInitFailed: RBXScriptSignal + function Block(self): nil + function GetArrivingTeleportGui(self): ScreenGui + function GetLocalPlayerTeleportData(self): any + function GetPlayerPlaceInstanceAsync(self, userId: number): (boolean, string, number, string) + function GetTeleportSetting(self, setting: string): any + function ReserveServer(self, placeId: number): (string, string) + function SetTeleportGui(self, gui: GuiObject): nil + function SetTeleportSetting(self, setting: string, value: any): nil + function Teleport(self, placeId: number, player: Player?, teleportData: any, customLoadingScreen: GuiObject?): nil + function TeleportAsync(self, placeId: number, players: { Player }, teleportOptions: TeleportOptions?): TeleportAsyncResult + function TeleportCancel(self): nil + function TeleportPartyAsync(self, placeId: number, players: { Player }, teleportData: any, customLoadingScreen: GuiObject?): string + function TeleportToPlaceInstance(self, placeId: number, instanceId: string, player: Player?, spawnName: string?, teleportData: any, customLoadingScreen: GuiObject?): nil + function TeleportToPrivateServer(self, placeId: number, reservedServerAccessCode: string, players: { Player }, spawnName: string?, teleportData: any, customLoadingScreen: GuiObject?): nil + function TeleportToSpawnByName(self, placeId: number, spawnName: string, player: Player?, teleportData: any, customLoadingScreen: GuiObject?): nil + function UnblockAsync(self): any +end + +declare class TemporaryCageMeshProvider extends Instance +end + +declare class TemporaryScriptService extends Instance +end + +declare class TerrainDetail extends Instance + ColorMap: Content + Face: EnumTerrainFace + MaterialPattern: EnumMaterialPattern + MetalnessMap: Content + NormalMap: Content + RoughnessMap: Content + StudsPerTile: number +end + +declare class TerrainRegion extends Instance + SizeInCells: Vector3 + function ApplyTransform(self, rotation: CFrame, size: Vector3): nil + function ApplyTransformSubregion(self, rotation: CFrame, size: Vector3, region: Region3int16): TerrainRegion + function GetRegionWireframe(self): { any } +end + +declare class TestService extends Instance + AutoRuns: boolean + Description: string + ErrorCount: number + ExecuteWithStudioRun: boolean + Is30FpsThrottleEnabled: boolean + IsPhysicsEnvironmentalThrottled: boolean + IsSleepAllowed: boolean + NumberOfPlayers: number + ServerCollectConditionalResult: RBXScriptSignal + ServerCollectResult: RBXScriptSignal + SimulateSecondsLag: number + TestCount: number + Timeout: number + WarnCount: number + function Check(self, condition: boolean, description: string, source: Instance?, line: number?): nil + function Checkpoint(self, text: string, source: Instance?, line: number?): nil + function Done(self): nil + function Error(self, description: string, source: Instance?, line: number?): nil + function Fail(self, description: string, source: Instance?, line: number?): nil + function Message(self, text: string, source: Instance?, line: number?): nil + function Require(self, condition: boolean, description: string, source: Instance?, line: number?): nil + function Run(self): nil + function ScopeTime(self): { [any]: any } + function Warn(self, condition: boolean, description: string, source: Instance?, line: number?): nil + function isFeatureEnabled(self, name: string): boolean +end + +declare class TextBoxService extends Instance +end + +declare class TextChannel extends Instance + MessageReceived: RBXScriptSignal + OnIncomingMessage: (message: TextChatMessage) -> any + ShouldDeliverCallback: (message: TextChatMessage, textSource: TextSource) -> any + function AddUserAsync(self, userId: number): any + function DisplaySystemMessage(self, systemMessage: string, metadata: string?): TextChatMessage + function SendAsync(self, message: string, metadata: string?): TextChatMessage +end + +declare class TextChatCommand extends Instance + Enabled: boolean + PrimaryAlias: string + SecondaryAlias: string + Triggered: RBXScriptSignal +end + +declare class TextChatConfigurations extends Instance +end + +declare class BubbleChatConfiguration extends TextChatConfigurations + AdorneeName: string + BackgroundColor3: Color3 + BackgroundTransparency: number + BubbleDuration: number + BubblesSpacing: number + Enabled: boolean + Font: EnumFont + FontFace: Font + LocalPlayerStudsOffset: Vector3 + MaxBubbles: number + MaxDistance: number + MinimizeDistance: number + TailVisible: boolean + TextColor3: Color3 + TextSize: number + VerticalStudsOffset: number +end + +declare class ChatInputBarConfiguration extends TextChatConfigurations + AbsolutePosition: Vector2 + AbsolutePositionWrite: Vector2 + AbsoluteSize: Vector2 + AbsoluteSizeWrite: Vector2 + AutocompleteEnabled: boolean + BackgroundColor3: Color3 + BackgroundTransparency: number + Enabled: boolean + FontFace: Font + IsFocused: boolean + IsFocusedWrite: boolean + KeyboardKeyCode: EnumKeyCode + PlaceholderColor3: Color3 + TargetTextChannel: TextChannel + TextBox: TextBox + TextColor3: Color3 + TextSize: number + TextStrokeColor3: Color3 + TextStrokeTransparency: number +end + +declare class ChatWindowConfiguration extends TextChatConfigurations + AbsolutePosition: Vector2 + AbsolutePositionWrite: Vector2 + AbsoluteSize: Vector2 + AbsoluteSizeWrite: Vector2 + BackgroundColor3: Color3 + BackgroundTransparency: number + Enabled: boolean + FontFace: Font + HeightScale: number + HorizontalAlignment: EnumHorizontalAlignment + TextColor3: Color3 + TextSize: number + TextStrokeColor3: Color3 + TextStrokeTransparency: number + VerticalAlignment: EnumVerticalAlignment + WidthScale: number +end + +declare class TextChatMessage extends Instance + BubbleChatMessageProperties: BubbleChatMessageProperties + MessageId: string + Metadata: string + PrefixText: string + Status: EnumTextChatMessageStatus + Text: string + TextChannel: TextChannel + TextSource: TextSource + Timestamp: DateTime +end + +declare class TextChatMessageProperties extends Instance + PrefixText: string + Text: string +end + +declare class TextChatService extends Instance + BubbleDisplayed: RBXScriptSignal + ChatVersion: EnumChatVersion + CreateDefaultCommands: boolean + CreateDefaultTextChannels: boolean + MessageReceived: RBXScriptSignal + OnBubbleAdded: (message: TextChatMessage, adornee: Instance) -> any + OnIncomingMessage: (message: TextChatMessage) -> any + SendingMessage: RBXScriptSignal + function CanUserChatAsync(self, userId: number): boolean + function CanUsersChatAsync(self, userIdFrom: number, userIdTo: number): boolean + function DisplayBubble(self, partOrCharacter: Instance, message: string): nil +end + +declare class TextFilterResult extends Instance + function GetChatForUserAsync(self, toUserId: number): string + function GetNonChatStringForBroadcastAsync(self): string + function GetNonChatStringForUserAsync(self, toUserId: number): string +end + +declare class TextFilterTranslatedResult extends Instance + SourceLanguage: string + SourceText: TextFilterResult + function GetTranslationForLocale(self, locale: string): TextFilterResult + function GetTranslations(self): { [any]: any } +end + +declare class TextService extends Instance + function FilterAndTranslateStringAsync(self, stringToFilter: string, fromUserId: number, targetLocales: { any }, textContext: EnumTextFilterContext?): Instance + function FilterStringAsync(self, stringToFilter: string, fromUserId: number, textContext: EnumTextFilterContext?): Instance + function GetFamilyInfoAsync(self, assetId: Content): { [any]: any } + function GetFontMemoryData(self): { [any]: any } + function GetTextBoundsAsync(self, params: GetTextBoundsParams): Vector2 + function GetTextSize(self, string: string, fontSize: number, font: EnumFont, frameSize: Vector2): Vector2 + function SetResolutionScale(self, scale: number): nil +end + +declare class TextSource extends Instance + CanSend: boolean + UserId: number +end + +declare class ThirdPartyUserService extends Instance + ActiveUserSignedOut: RBXScriptSignal + function GetUserPlatformId(self): string + function GetUserPlatformName(self): string + function HaveActiveUser(self): boolean + function IsOver13(self): boolean + function RegisterActiveUser(self, gamepadId: EnumUserInputType): number + function ReturnToEngagement(self): nil + function ShowAccountPicker(self): nil +end + +declare class ThreadState extends Instance + FrameCount: number + Populated: boolean + ThreadId: number + ThreadName: string + function GetFrame(self, index: number): Instance +end + +declare class TimerService extends Instance +end + +declare class ToastNotificationService extends Instance + function HideNotification(self, notificationId: string): nil + function ShowNotification(self, message: string, notificationId: string): nil +end + +declare class TouchInputService extends Instance +end + +declare class TouchTransmitter extends Instance +end + +declare class TracerService extends Instance + function FinishSpan(self, spanId: string): nil + function StartSpan(self, name: string, parentId: string): string +end + +declare class TrackerLodController extends Instance + AudioMode: EnumTrackerLodFlagMode + UpdateState: RBXScriptSignal<> + VideoExtrapolationMode: EnumTrackerExtrapolationFlagMode + VideoLodMode: EnumTrackerLodValueMode + VideoMode: EnumTrackerLodFlagMode + function getExtrapolation(self): number + function getVideoLod(self): number + function isAudioEnabled(self): boolean + function isVideoEnabled(self): boolean +end + +declare class TrackerStreamAnimation extends Instance +end + +declare class Trail extends Instance + Attachment0: Attachment + Attachment1: Attachment + Brightness: number + Color: ColorSequence + Enabled: boolean + FaceCamera: boolean + Lifetime: number + LightEmission: number + LightInfluence: number + MaxLength: number + MinLength: number + Texture: Content + TextureLength: number + TextureMode: EnumTextureMode + Transparency: NumberSequence + WidthScale: NumberSequence + function Clear(self): nil +end + +declare class Translator extends Instance + LocaleId: string + function FormatByKey(self, key: string, args: any): string + function RobloxOnlyTranslate(self, context: Instance, text: string): string + function Translate(self, context: Instance, text: string): string +end + +declare class TutorialService extends Instance + function GetMainViewSessionId(self): string + function GetStudioWidgetFromLabel(self, label: string): StudioWidget + function HasUserCompletedTutorial(self): boolean + function PromptClosePlace(self): nil + function SetTutorialCompletionStatus(self, completed: boolean): nil + function ShouldLaunchTutorial(self): boolean +end + +declare class TweenBase extends Instance + Completed: RBXScriptSignal + PlaybackState: EnumPlaybackState + function Cancel(self): nil + function Pause(self): nil + function Play(self): nil +end + +declare class Tween extends TweenBase + Instance: Instance + TweenInfo: TweenInfo +end + +declare class TweenService extends Instance + function Create(self, instance: Instance, tweenInfo: TweenInfo, propertyTable: { [any]: any }): Tween + function GetValue(self, alpha: number, easingStyle: EnumEasingStyle, easingDirection: EnumEasingDirection): number +end + +declare class UGCAvatarService extends Instance +end + +declare class UGCValidationService extends Instance + function CalculateUniqueUVCount(self, meshId: string): number + function CanLoadAsset(self, assetId: string): boolean + function FetchAssetWithFormat(self, url: Content, assetFormat: string): { Instance } + function GetMeshTriCount(self, meshId: string): number + function GetMeshVertColors(self, meshId: string): { any } + function GetMeshVerts(self, meshId: string): { any } + function GetPropertyValue(self, instance: Instance, property: string): any + function GetTextureSize(self, textureId: string): Vector2 + function ResetCollisionFidelity(self, meshPart: Instance): nil + function SetMeshIdBlocking(self, meshPart: Instance, meshId: string): nil + function ValidateCageMeshIntersection(self, innerCageMeshId: string, outerCageMeshId: string, refMeshId: string): any + function ValidateCageNonManifoldAndHoles(self, meshId: string): any + function ValidateDynamicHeadMesh(self, meshId: string): boolean + function ValidateFullBodyCageDeletion(self, meshId: string): boolean + function ValidateMeshBounds(self, meshId: string, meshScale: Vector3, boundsOffset: Vector3, attachmentCF: CFrame, handleCF: CFrame): boolean + function ValidateMeshTriangles(self, meshId: string): boolean + function ValidateMeshVertColors(self, meshId: string, includeAlpha: boolean?): boolean + function ValidateMisMatchUV(self, innerCageMeshId: string, outerCageMeshId: string): boolean + function ValidateNumTextureChannels(self, textureId: string, numChannelsRequired: number): boolean + function ValidateOverlappingVertices(self, meshId: string): boolean + function ValidateSkinnedMesh(self, meshId: string): boolean + function ValidateTextureSize(self, textureId: string): boolean + function ValidateUVSpace(self, meshId: string): boolean + function ValidateUniqueUVCount(self, meshId: string, numRequired: number): boolean +end + +declare class UIBase extends Instance +end + +declare class UIComponent extends UIBase +end + +declare class UIConstraint extends UIComponent +end + +declare class UIAspectRatioConstraint extends UIConstraint + AspectRatio: number + AspectType: EnumAspectType + DominantAxis: EnumDominantAxis +end + +declare class UISizeConstraint extends UIConstraint + MaxSize: Vector2 + MinSize: Vector2 +end + +declare class UITextSizeConstraint extends UIConstraint + MaxTextSize: number + MinTextSize: number +end + +declare class UICorner extends UIComponent + CornerRadius: UDim +end + +declare class UIGradient extends UIComponent + Color: ColorSequence + Enabled: boolean + Offset: Vector2 + Rotation: number + Transparency: NumberSequence +end + +declare class UILayout extends UIComponent +end + +declare class UIGridStyleLayout extends UILayout + AbsoluteContentSize: Vector2 + FillDirection: EnumFillDirection + HorizontalAlignment: EnumHorizontalAlignment + SortOrder: EnumSortOrder + VerticalAlignment: EnumVerticalAlignment +end + +declare class UIGridLayout extends UIGridStyleLayout + AbsoluteCellCount: Vector2 + AbsoluteCellSize: Vector2 + CellPadding: UDim2 + CellSize: UDim2 + FillDirectionMaxCells: number + StartCorner: EnumStartCorner +end + +declare class UIListLayout extends UIGridStyleLayout + Padding: UDim +end + +declare class UIPageLayout extends UIGridStyleLayout + Animated: boolean + Circular: boolean + CurrentPage: GuiObject + EasingDirection: EnumEasingDirection + EasingStyle: EnumEasingStyle + GamepadInputEnabled: boolean + Padding: UDim + PageEnter: RBXScriptSignal + PageLeave: RBXScriptSignal + ScrollWheelInputEnabled: boolean + Stopped: RBXScriptSignal + TouchInputEnabled: boolean + TweenTime: number + function JumpTo(self, page: Instance): nil + function JumpToIndex(self, index: number): nil + function Next(self): nil + function Previous(self): nil +end + +declare class UITableLayout extends UIGridStyleLayout + FillEmptySpaceColumns: boolean + FillEmptySpaceRows: boolean + MajorAxis: EnumTableMajorAxis + Padding: UDim2 +end + +declare class UIPadding extends UIComponent + PaddingBottom: UDim + PaddingLeft: UDim + PaddingRight: UDim + PaddingTop: UDim +end + +declare class UIScale extends UIComponent + Scale: number +end + +declare class UIStroke extends UIComponent + ApplyStrokeMode: EnumApplyStrokeMode + Color: Color3 + Enabled: boolean + LineJoinMode: EnumLineJoinMode + Thickness: number + Transparency: number +end + +declare class UnvalidatedAssetService extends Instance + function AppendTempAssetId(self, userId: number, id: number, lookAt: Vector3, camPos: Vector3, usage: string): nil + function AppendVantagePoint(self, userId: number, id: number, lookAt: Vector3, camPos: Vector3): boolean + function UpgradeTempAssetId(self, userId: number, tempId: number, assetId: number): boolean +end + +declare class UserGameSettings extends Instance + AllTutorialsDisabled: boolean + CameraMode: EnumCustomCameraMode + CameraYInverted: boolean + ChatVisible: boolean + ComputerCameraMovementMode: EnumComputerCameraMovementMode + ComputerMovementMode: EnumComputerMovementMode + ControlMode: EnumControlMode + DefaultCameraID: string + Fullscreen: boolean + FullscreenChanged: RBXScriptSignal + GamepadCameraSensitivity: number + GraphicsQualityLevel: number + HasEverUsedVR: boolean + IsUsingCameraYInverted: boolean + IsUsingGamepadCameraSensitivity: boolean + MasterVolume: number + MicroProfilerWebServerEnabled: boolean + MicroProfilerWebServerIP: string + MicroProfilerWebServerPort: number + MouseSensitivity: number + MouseSensitivityFirstPerson: Vector2 + MouseSensitivityThirdPerson: Vector2 + OnScreenProfilerEnabled: boolean + OnboardingsCompleted: string + PerformanceStatsVisible: boolean + PerformanceStatsVisibleChanged: RBXScriptSignal + PlayerHeight: number + PreferredTransparency: number + RCCProfilerRecordFrameRate: number + RCCProfilerRecordTimeFrame: number + ReducedMotion: boolean + RotationType: EnumRotationType + SavedQualityLevel: EnumSavedQualitySetting + StartMaximized: boolean + StartScreenPosition: Vector2 + StartScreenSize: Vector2 + StudioModeChanged: RBXScriptSignal + TouchCameraMovementMode: EnumTouchCameraMovementMode + TouchMovementMode: EnumTouchMovementMode + UiNavigationKeyBindEnabled: boolean + UsedCoreGuiIsVisibleToggle: boolean + UsedCustomGuiIsVisibleToggle: boolean + UsedHideHudShortcut: boolean + VREnabled: boolean + VRRotationIntensity: number + VRSafetyBubbleMode: EnumVRSafetyBubbleMode + VRSmoothRotationEnabled: boolean + VignetteEnabled: boolean + + VideoUploadPromptBehavior: EnumUploadSetting + + function GetCameraYInvertValue(self): number + function GetOnboardingCompleted(self, onboardingId: string): boolean + function GetTutorialState(self, tutorialId: string): boolean + function InFullScreen(self): boolean + function InStudioMode(self): boolean + function ResetOnboardingCompleted(self, onboardingId: string): nil + function SetCameraYInvertVisible(self): nil + function SetGamepadCameraSensitivityVisible(self): nil + function SetOnboardingCompleted(self, onboardingId: string): nil + function SetTutorialState(self, tutorialId: string, value: boolean): nil +end + +declare class UserInputService extends Instance + AccelerometerEnabled: boolean + BottomBarSize: Vector2 + DeviceAccelerationChanged: RBXScriptSignal + DeviceGravityChanged: RBXScriptSignal + DeviceRotationChanged: RBXScriptSignal + GamepadConnected: RBXScriptSignal + GamepadDisconnected: RBXScriptSignal + GamepadEnabled: boolean + GyroscopeEnabled: boolean + InputBegan: RBXScriptSignal + InputChanged: RBXScriptSignal + InputEnded: RBXScriptSignal + JumpRequest: RBXScriptSignal<> + KeyboardEnabled: boolean + LastInputTypeChanged: RBXScriptSignal + LegacyInputEventsEnabled: boolean + MouseBehavior: EnumMouseBehavior + MouseDeltaSensitivity: number + MouseEnabled: boolean + MouseIcon: Content + MouseIconEnabled: boolean + NavBarSize: Vector2 + OnScreenKeyboardAnimationDuration: number + OnScreenKeyboardPosition: Vector2 + OnScreenKeyboardSize: Vector2 + OnScreenKeyboardVisible: boolean + OverrideMouseIconBehavior: EnumOverrideMouseIconBehavior + PointerAction: RBXScriptSignal + RightBarSize: Vector2 + StatusBarSize: Vector2 + StatusBarTapped: RBXScriptSignal + TextBoxFocusReleased: RBXScriptSignal + TextBoxFocused: RBXScriptSignal + TouchEnabled: boolean + TouchEnded: RBXScriptSignal + TouchLongPress: RBXScriptSignal<{ Vector2 }, EnumUserInputState, boolean> + TouchMoved: RBXScriptSignal + TouchPan: RBXScriptSignal<{ Vector2 }, Vector2, Vector2, EnumUserInputState, boolean> + TouchPinch: RBXScriptSignal<{ Vector2 }, number, number, EnumUserInputState, boolean> + TouchRotate: RBXScriptSignal<{ Vector2 }, number, number, EnumUserInputState, boolean> + TouchStarted: RBXScriptSignal + TouchSwipe: RBXScriptSignal + TouchTap: RBXScriptSignal<{ Vector2 }, boolean> + TouchTapInWorld: RBXScriptSignal + UserCFrameChanged: RBXScriptSignal + VREnabled: boolean + WindowFocusReleased: RBXScriptSignal<> + WindowFocused: RBXScriptSignal<> + function GamepadSupports(self, gamepadNum: EnumUserInputType, gamepadKeyCode: EnumKeyCode): boolean + function GetConnectedGamepads(self): { EnumUserInputType } + function GetDeviceAcceleration(self): InputObject + function GetDeviceGravity(self): InputObject + function GetDeviceRotation(self): (number, CFrame) + function GetDeviceType(self): EnumDeviceType + function GetFocusedTextBox(self): TextBox + function GetGamepadConnected(self, gamepadNum: EnumUserInputType): boolean + function GetGamepadState(self, gamepadNum: EnumUserInputType): { InputObject } + function GetKeysPressed(self): { InputObject } + function GetLastInputType(self): EnumUserInputType + function GetMouseButtonsPressed(self): { InputObject } + function GetMouseDelta(self): Vector2 + function GetMouseLocation(self): Vector2 + function GetNavigationGamepads(self): { EnumUserInputType } + function GetPlatform(self): EnumPlatform + function GetStringForKeyCode(self, keyCode: EnumKeyCode): string + function GetSupportedGamepadKeyCodes(self, gamepadNum: EnumUserInputType): { EnumKeyCode } + function GetUserCFrame(self, type: EnumUserCFrame): CFrame + function IsGamepadButtonDown(self, gamepadNum: EnumUserInputType, gamepadKeyCode: EnumKeyCode): boolean + function IsKeyDown(self, keyCode: EnumKeyCode): boolean + function IsMouseButtonPressed(self, mouseButton: EnumUserInputType): boolean + function IsNavigationGamepad(self, gamepadEnum: EnumUserInputType): boolean + function RecenterUserHeadCFrame(self): nil + function SendAppUISizes(self, statusBarSize: Vector2, navBarSize: Vector2, bottomBarSize: Vector2, rightBarSize: Vector2): nil + function SetNavigationGamepad(self, gamepadEnum: EnumUserInputType, enabled: boolean): nil +end + +declare class UserService extends Instance + function GetUserInfosByUserIdsAsync(self, userIds: { number }): { { Id: number, Username: string, DisplayName: string } } +end + +declare class VRService extends Instance + AutomaticScaling: EnumVRScaling + DidPointerHit: boolean + FadeOutViewOnCollision: boolean + GuiInputUserCFrame: EnumUserCFrame + LaserDistance: number + LaserPointerTriggered: RBXScriptSignal + NavigationRequested: RBXScriptSignal + PointerHitCFrame: CFrame + TouchpadModeChanged: RBXScriptSignal + UserCFrameChanged: RBXScriptSignal + UserCFrameEnabled: RBXScriptSignal + VRDeviceAvailable: boolean + VRDeviceName: string + VREnabled: boolean + VRSessionState: EnumVRSessionState + function GetTouchpadMode(self, pad: EnumVRTouchpad): EnumVRTouchpadMode + function GetUserCFrame(self, type: EnumUserCFrame): CFrame + function GetUserCFrameEnabled(self, type: EnumUserCFrame): boolean + function IsMaquettes(self): boolean + function IsVRAppBuild(self): boolean + function RecenterUserHeadCFrame(self): nil + function RequestNavigation(self, cframe: CFrame, inputUserCFrame: EnumUserCFrame): nil + function SetTouchpadMode(self, pad: EnumVRTouchpad, mode: EnumVRTouchpadMode): nil +end + +declare class VRStatusService extends Instance +end + +declare class ValueBase extends Instance +end + +declare class BinaryStringValue extends ValueBase + Changed: RBXScriptSignal +end + +declare class BoolValue extends ValueBase + Changed: RBXScriptSignal + Value: boolean +end + +declare class BrickColorValue extends ValueBase + Changed: RBXScriptSignal + Value: BrickColor +end + +declare class CFrameValue extends ValueBase + Changed: RBXScriptSignal + Value: CFrame +end + +declare class Color3Value extends ValueBase + Changed: RBXScriptSignal + Value: Color3 +end + + +declare class ScriptInformationProvider extends Instance + function SetAssetUrl(self, url: string): nil +end + +declare class PersonalServerService extends Instance + function Promote(self, player: Player): nil + function Demote(self, player: Player): nil +end + + +declare class IntValue extends ValueBase + Changed: RBXScriptSignal + Value: number +end + +declare class NumberValue extends ValueBase + Changed: RBXScriptSignal + Value: number +end + +declare class ObjectValue extends ValueBase + Changed: RBXScriptSignal + Value: Instance? +end + +declare class RayValue extends ValueBase + Changed: RBXScriptSignal + Value: Ray +end + +declare class StringValue extends ValueBase + Changed: RBXScriptSignal + Value: string +end + +declare class Vector3Value extends ValueBase + Changed: RBXScriptSignal + Value: Vector3 +end + +declare class Vector3Curve extends Instance + function GetValueAtTime(self, time: number): { any } + function X(self): FloatCurve + function Y(self): FloatCurve + function Z(self): FloatCurve +end + +declare class VersionControlService extends Instance + ScriptCollabEnabled: boolean +end + +declare class VideoCaptureService extends Instance + Active: boolean + CameraID: string + DevicesChanged: RBXScriptSignal<> + Error: RBXScriptSignal + Started: RBXScriptSignal + Stopped: RBXScriptSignal + function GetCameraDevices(self): { [any]: any } +end + +declare class VideoService extends Instance +end + +declare class VirtualInputManager extends Instance + AdditionalLuaState: string + PlaybackCompleted: RBXScriptSignal + RecordingCompleted: RBXScriptSignal + function Dump(self): nil + function HandleGamepadAxisInput(self, objectId: number, keyCode: EnumKeyCode, x: number, y: number, z: number): nil + function HandleGamepadButtonInput(self, deviceId: number, keyCode: EnumKeyCode, buttonState: number): nil + function HandleGamepadConnect(self, deviceId: number): nil + function HandleGamepadDisconnect(self, deviceId: number): nil + function SendAccelerometerEvent(self, x: number, y: number, z: number): nil + function SendGravityEvent(self, x: number, y: number, z: number): nil + function SendGyroscopeEvent(self, quatX: number, quatY: number, quatZ: number, quatW: number): nil + function SendKeyEvent(self, isPressed: boolean, keyCode: EnumKeyCode, isRepeatedKey: boolean, layerCollector: Instance): nil + function SendMouseButtonEvent(self, x: number, y: number, mouseButton: number, isDown: boolean, layerCollector: Instance, repeatCount: number): nil + function SendMouseMoveEvent(self, x: number, y: number, layerCollector: Instance): nil + function SendMouseWheelEvent(self, x: number, y: number, isForwardScroll: boolean, layerCollector: Instance): nil + function SendTextInputCharacterEvent(self, str: string, layerCollector: Instance): nil + function SendTouchEvent(self, touchId: number, state: number, x: number, y: number): nil + function SetInputTypesToIgnore(self, inputTypesToIgnore: any): nil + function StartPlaying(self, fileName: string): nil + function StartPlayingJSON(self, string: string): nil + function StartRecording(self): nil + function StopPlaying(self): nil + function StopRecording(self): nil + function WaitForInputEventsProcessed(self): nil + function sendRobloxEvent(self, namespace: string, detail: string, detailType: string): nil + function sendThemeChangeEvent(self, themeName: string): nil +end + +declare class VirtualUser extends Instance + function Button1Down(self, position: Vector2, camera: CFrame?): nil + function Button1Up(self, position: Vector2, camera: CFrame?): nil + function Button2Down(self, position: Vector2, camera: CFrame?): nil + function Button2Up(self, position: Vector2, camera: CFrame?): nil + function CaptureController(self): nil + function ClickButton1(self, position: Vector2, camera: CFrame?): nil + function ClickButton2(self, position: Vector2, camera: CFrame?): nil + function MoveMouse(self, position: Vector2, camera: CFrame?): nil + function SetKeyDown(self, key: string): nil + function SetKeyUp(self, key: string): nil + function StartRecording(self): nil + function StopRecording(self): string + function TypeKey(self, key: string): nil +end + +declare class VisibilityCheckDispatcher extends Instance +end + +declare class VisibilityService extends Instance +end + +declare class Visit extends Instance + function SetPing(self, url: string, interval: number): nil +end + +declare class VoiceChatInternal extends Instance + LocalPlayerModerated: RBXScriptSignal<> + function GetChannelId(self): string + function GetGroupId(self): string + function GetSessionId(self): string + function GetVoiceExperienceId(self): string + function IsContextVoiceEnabled(self): boolean + function IsVoiceEnabledForUserIdAsync(self, userId: number): boolean + function LogPublisherWebRTCStats(self): boolean + function LogSubscriptionWebRTCStats(self): boolean + function SubscribeBlock(self, userId: number): boolean + function SubscribeRetry(self, userId: number): boolean + function SubscribeUnblock(self, userId: number): boolean +end + +declare class VoiceChatService extends Instance + EnableDefaultVoice: boolean + UseNewJoinFlow: boolean + VoiceChatEnabledForPlaceOnRcc: boolean + VoiceChatEnabledForUniverseOnRcc: boolean + function IsVoiceEnabledForUserIdAsync(self, userId: number): boolean +end + +declare class WeldConstraint extends Instance + Active: boolean + Enabled: boolean + Part0: BasePart + Part1: BasePart +end + +declare class Wire extends Instance + Connected: boolean + SourceInstance: Instance + SourceName: string + TargetInstance: Instance + TargetName: string +end + +declare Instance: { + new: ((className: "Accoutrement", parent: Instance?) -> Accoutrement) & ((className: "Accessory", parent: Instance?) -> Accessory) & ((className: "Hat", parent: Instance?) -> Hat) & ((className: "AdPortal", parent: Instance?) -> AdPortal) & ((className: "AdvancedDragger", parent: Instance?) -> AdvancedDragger) & ((className: "AnalyticsService", parent: Instance?) -> AnalyticsService) & ((className: "Animation", parent: Instance?) -> Animation) & ((className: "CurveAnimation", parent: Instance?) -> CurveAnimation) & ((className: "KeyframeSequence", parent: Instance?) -> KeyframeSequence) & ((className: "AnimationController", parent: Instance?) -> AnimationController) & ((className: "AnimationRigData", parent: Instance?) -> AnimationRigData) & ((className: "Animator", parent: Instance?) -> Animator) & ((className: "Atmosphere", parent: Instance?) -> Atmosphere) & ((className: "Attachment", parent: Instance?) -> Attachment) & ((className: "Bone", parent: Instance?) -> Bone) & ((className: "AudioAnalyzer", parent: Instance?) -> AudioAnalyzer) & ((className: "AudioChorus", parent: Instance?) -> AudioChorus) & ((className: "AudioCompressor", parent: Instance?) -> AudioCompressor) & ((className: "AudioDeviceInput", parent: Instance?) -> AudioDeviceInput) & ((className: "AudioDeviceOutput", parent: Instance?) -> AudioDeviceOutput) & ((className: "AudioDistortion", parent: Instance?) -> AudioDistortion) & ((className: "AudioEcho", parent: Instance?) -> AudioEcho) & ((className: "AudioEmitter", parent: Instance?) -> AudioEmitter) & ((className: "AudioEqualizer", parent: Instance?) -> AudioEqualizer) & ((className: "AudioFader", parent: Instance?) -> AudioFader) & ((className: "AudioFlanger", parent: Instance?) -> AudioFlanger) & ((className: "AudioListener", parent: Instance?) -> AudioListener) & ((className: "AudioPitchShifter", parent: Instance?) -> AudioPitchShifter) & ((className: "AudioPlayer", parent: Instance?) -> AudioPlayer) & ((className: "AudioReverb", parent: Instance?) -> AudioReverb) & ((className: "AudioSearchParams", parent: Instance?) -> AudioSearchParams) & ((className: "Backpack", parent: Instance?) -> Backpack) & ((className: "WrapLayer", parent: Instance?) -> WrapLayer) & ((className: "WrapTarget", parent: Instance?) -> WrapTarget) & ((className: "Beam", parent: Instance?) -> Beam) & ((className: "BindableEvent", parent: Instance?) -> BindableEvent) & ((className: "BindableFunction", parent: Instance?) -> BindableFunction) & ((className: "BodyAngularVelocity", parent: Instance?) -> BodyAngularVelocity) & ((className: "BodyForce", parent: Instance?) -> BodyForce) & ((className: "BodyGyro", parent: Instance?) -> BodyGyro) & ((className: "BodyPosition", parent: Instance?) -> BodyPosition) & ((className: "BodyThrust", parent: Instance?) -> BodyThrust) & ((className: "BodyVelocity", parent: Instance?) -> BodyVelocity) & ((className: "RocketPropulsion", parent: Instance?) -> RocketPropulsion) & ((className: "Breakpoint", parent: Instance?) -> Breakpoint) & ((className: "BubbleChatMessageProperties", parent: Instance?) -> BubbleChatMessageProperties) & ((className: "Camera", parent: Instance?) -> Camera) & ((className: "BodyColors", parent: Instance?) -> BodyColors) & ((className: "CharacterMesh", parent: Instance?) -> CharacterMesh) & ((className: "Pants", parent: Instance?) -> Pants) & ((className: "Shirt", parent: Instance?) -> Shirt) & ((className: "ShirtGraphic", parent: Instance?) -> ShirtGraphic) & ((className: "Skin", parent: Instance?) -> Skin) & ((className: "ClickDetector", parent: Instance?) -> ClickDetector) & ((className: "DragDetector", parent: Instance?) -> DragDetector) & ((className: "Clouds", parent: Instance?) -> Clouds) & ((className: "Configuration", parent: Instance?) -> Configuration) & ((className: "AlignOrientation", parent: Instance?) -> AlignOrientation) & ((className: "AlignPosition", parent: Instance?) -> AlignPosition) & ((className: "AngularVelocity", parent: Instance?) -> AngularVelocity) & ((className: "AnimationConstraint", parent: Instance?) -> AnimationConstraint) & ((className: "BallSocketConstraint", parent: Instance?) -> BallSocketConstraint) & ((className: "HingeConstraint", parent: Instance?) -> HingeConstraint) & ((className: "LineForce", parent: Instance?) -> LineForce) & ((className: "LinearVelocity", parent: Instance?) -> LinearVelocity) & ((className: "PlaneConstraint", parent: Instance?) -> PlaneConstraint) & ((className: "Plane", parent: Instance?) -> Plane) & ((className: "RigidConstraint", parent: Instance?) -> RigidConstraint) & ((className: "RodConstraint", parent: Instance?) -> RodConstraint) & ((className: "RopeConstraint", parent: Instance?) -> RopeConstraint) & ((className: "CylindricalConstraint", parent: Instance?) -> CylindricalConstraint) & ((className: "PrismaticConstraint", parent: Instance?) -> PrismaticConstraint) & ((className: "SpringConstraint", parent: Instance?) -> SpringConstraint) & ((className: "Torque", parent: Instance?) -> Torque) & ((className: "TorsionSpringConstraint", parent: Instance?) -> TorsionSpringConstraint) & ((className: "UniversalConstraint", parent: Instance?) -> UniversalConstraint) & ((className: "VectorForce", parent: Instance?) -> VectorForce) & ((className: "HumanoidController", parent: Instance?) -> HumanoidController) & ((className: "SkateboardController", parent: Instance?) -> SkateboardController) & ((className: "VehicleController", parent: Instance?) -> VehicleController) & ((className: "AirController", parent: Instance?) -> AirController) & ((className: "ClimbController", parent: Instance?) -> ClimbController) & ((className: "GroundController", parent: Instance?) -> GroundController) & ((className: "SwimController", parent: Instance?) -> SwimController) & ((className: "ControllerManager", parent: Instance?) -> ControllerManager) & ((className: "CustomEvent", parent: Instance?) -> CustomEvent) & ((className: "CustomEventReceiver", parent: Instance?) -> CustomEventReceiver) & ((className: "CylinderMesh", parent: Instance?) -> CylinderMesh) & ((className: "DynamicMesh", parent: Instance?) -> DynamicMesh) & ((className: "FileMesh", parent: Instance?) -> FileMesh) & ((className: "SpecialMesh", parent: Instance?) -> SpecialMesh) & ((className: "DataStoreIncrementOptions", parent: Instance?) -> DataStoreIncrementOptions) & ((className: "DataStoreOptions", parent: Instance?) -> DataStoreOptions) & ((className: "DataStoreSetOptions", parent: Instance?) -> DataStoreSetOptions) & ((className: "DebuggerWatch", parent: Instance?) -> DebuggerWatch) & ((className: "Dialog", parent: Instance?) -> Dialog) & ((className: "DialogChoice", parent: Instance?) -> DialogChoice) & ((className: "Dragger", parent: Instance?) -> Dragger) & ((className: "EulerRotationCurve", parent: Instance?) -> EulerRotationCurve) & ((className: "ExperienceInviteOptions", parent: Instance?) -> ExperienceInviteOptions) & ((className: "Explosion", parent: Instance?) -> Explosion) & ((className: "FaceControls", parent: Instance?) -> FaceControls) & ((className: "Decal", parent: Instance?) -> Decal) & ((className: "Texture", parent: Instance?) -> Texture) & ((className: "Hole", parent: Instance?) -> Hole) & ((className: "MotorFeature", parent: Instance?) -> MotorFeature) & ((className: "Fire", parent: Instance?) -> Fire) & ((className: "FloatCurve", parent: Instance?) -> FloatCurve) & ((className: "FlyweightService", parent: Instance?) -> FlyweightService) & ((className: "CSGDictionaryService", parent: Instance?) -> CSGDictionaryService) & ((className: "NonReplicatedCSGDictionaryService", parent: Instance?) -> NonReplicatedCSGDictionaryService) & ((className: "Folder", parent: Instance?) -> Folder) & ((className: "ForceField", parent: Instance?) -> ForceField) & ((className: "FunctionalTest", parent: Instance?) -> FunctionalTest) & ((className: "GetTextBoundsParams", parent: Instance?) -> GetTextBoundsParams) & ((className: "CanvasGroup", parent: Instance?) -> CanvasGroup) & ((className: "Frame", parent: Instance?) -> Frame) & ((className: "ImageButton", parent: Instance?) -> ImageButton) & ((className: "TextButton", parent: Instance?) -> TextButton) & ((className: "ImageLabel", parent: Instance?) -> ImageLabel) & ((className: "TextLabel", parent: Instance?) -> TextLabel) & ((className: "ScrollingFrame", parent: Instance?) -> ScrollingFrame) & ((className: "TextBox", parent: Instance?) -> TextBox) & ((className: "VideoFrame", parent: Instance?) -> VideoFrame) & ((className: "ViewportFrame", parent: Instance?) -> ViewportFrame) & ((className: "BillboardGui", parent: Instance?) -> BillboardGui) & ((className: "ScreenGui", parent: Instance?) -> ScreenGui) & ((className: "GuiMain", parent: Instance?) -> GuiMain) & ((className: "AdGui", parent: Instance?) -> AdGui) & ((className: "SurfaceGui", parent: Instance?) -> SurfaceGui) & ((className: "FloorWire", parent: Instance?) -> FloorWire) & ((className: "SelectionBox", parent: Instance?) -> SelectionBox) & ((className: "BoxHandleAdornment", parent: Instance?) -> BoxHandleAdornment) & ((className: "ConeHandleAdornment", parent: Instance?) -> ConeHandleAdornment) & ((className: "CylinderHandleAdornment", parent: Instance?) -> CylinderHandleAdornment) & ((className: "ImageHandleAdornment", parent: Instance?) -> ImageHandleAdornment) & ((className: "LineHandleAdornment", parent: Instance?) -> LineHandleAdornment) & ((className: "SphereHandleAdornment", parent: Instance?) -> SphereHandleAdornment) & ((className: "WireframeHandleAdornment", parent: Instance?) -> WireframeHandleAdornment) & ((className: "ParabolaAdornment", parent: Instance?) -> ParabolaAdornment) & ((className: "SelectionSphere", parent: Instance?) -> SelectionSphere) & ((className: "ArcHandles", parent: Instance?) -> ArcHandles) & ((className: "Handles", parent: Instance?) -> Handles) & ((className: "SurfaceSelection", parent: Instance?) -> SurfaceSelection) & ((className: "SelectionPartLasso", parent: Instance?) -> SelectionPartLasso) & ((className: "SelectionPointLasso", parent: Instance?) -> SelectionPointLasso) & ((className: "HeightmapImporterService", parent: Instance?) -> HeightmapImporterService) & ((className: "HiddenSurfaceRemovalAsset", parent: Instance?) -> HiddenSurfaceRemovalAsset) & ((className: "Highlight", parent: Instance?) -> Highlight) & ((className: "Humanoid", parent: Instance?) -> Humanoid) & ((className: "HumanoidDescription", parent: Instance?) -> HumanoidDescription) & ((className: "IKControl", parent: Instance?) -> IKControl) & ((className: "RotateP", parent: Instance?) -> RotateP) & ((className: "RotateV", parent: Instance?) -> RotateV) & ((className: "Glue", parent: Instance?) -> Glue) & ((className: "ManualGlue", parent: Instance?) -> ManualGlue) & ((className: "ManualWeld", parent: Instance?) -> ManualWeld) & ((className: "Motor", parent: Instance?) -> Motor) & ((className: "Motor6D", parent: Instance?) -> Motor6D) & ((className: "Rotate", parent: Instance?) -> Rotate) & ((className: "Snap", parent: Instance?) -> Snap) & ((className: "VelocityMotor", parent: Instance?) -> VelocityMotor) & ((className: "Weld", parent: Instance?) -> Weld) & ((className: "Keyframe", parent: Instance?) -> Keyframe) & ((className: "KeyframeMarker", parent: Instance?) -> KeyframeMarker) & ((className: "PointLight", parent: Instance?) -> PointLight) & ((className: "SpotLight", parent: Instance?) -> SpotLight) & ((className: "SurfaceLight", parent: Instance?) -> SurfaceLight) & ((className: "LocalizationTable", parent: Instance?) -> LocalizationTable) & ((className: "Script", parent: Instance?) -> Script) & ((className: "LocalScript", parent: Instance?) -> LocalScript) & ((className: "ModuleScript", parent: Instance?) -> ModuleScript) & ((className: "MarkerCurve", parent: Instance?) -> MarkerCurve) & ((className: "MaterialVariant", parent: Instance?) -> MaterialVariant) & ((className: "MemoryStoreService", parent: Instance?) -> MemoryStoreService) & ((className: "Message", parent: Instance?) -> Message) & ((className: "Hint", parent: Instance?) -> Hint) & ((className: "NoCollisionConstraint", parent: Instance?) -> NoCollisionConstraint) & ((className: "CornerWedgePart", parent: Instance?) -> CornerWedgePart) & ((className: "Part", parent: Instance?) -> Part) & ((className: "FlagStand", parent: Instance?) -> FlagStand) & ((className: "Seat", parent: Instance?) -> Seat) & ((className: "SkateboardPlatform", parent: Instance?) -> SkateboardPlatform) & ((className: "SpawnLocation", parent: Instance?) -> SpawnLocation) & ((className: "WedgePart", parent: Instance?) -> WedgePart) & ((className: "MeshPart", parent: Instance?) -> MeshPart) & ((className: "PartOperation", parent: Instance?) -> PartOperation) & ((className: "IntersectOperation", parent: Instance?) -> IntersectOperation) & ((className: "NegateOperation", parent: Instance?) -> NegateOperation) & ((className: "UnionOperation", parent: Instance?) -> UnionOperation) & ((className: "TrussPart", parent: Instance?) -> TrussPart) & ((className: "VehicleSeat", parent: Instance?) -> VehicleSeat) & ((className: "Model", parent: Instance?) -> Model) & ((className: "Actor", parent: Instance?) -> Actor) & ((className: "HopperBin", parent: Instance?) -> HopperBin) & ((className: "Tool", parent: Instance?) -> Tool) & ((className: "Flag", parent: Instance?) -> Flag) & ((className: "WorldModel", parent: Instance?) -> WorldModel) & ((className: "PartOperationAsset", parent: Instance?) -> PartOperationAsset) & ((className: "ParticleEmitter", parent: Instance?) -> ParticleEmitter) & ((className: "PathfindingLink", parent: Instance?) -> PathfindingLink) & ((className: "PathfindingModifier", parent: Instance?) -> PathfindingModifier) & ((className: "Player", parent: Instance?) -> Player) & ((className: "PluginAction", parent: Instance?) -> PluginAction) & ((className: "PluginCapabilities", parent: Instance?) -> PluginCapabilities) & ((className: "NumberPose", parent: Instance?) -> NumberPose) & ((className: "Pose", parent: Instance?) -> Pose) & ((className: "BloomEffect", parent: Instance?) -> BloomEffect) & ((className: "BlurEffect", parent: Instance?) -> BlurEffect) & ((className: "ColorCorrectionEffect", parent: Instance?) -> ColorCorrectionEffect) & ((className: "DepthOfFieldEffect", parent: Instance?) -> DepthOfFieldEffect) & ((className: "SunRaysEffect", parent: Instance?) -> SunRaysEffect) & ((className: "ProximityPrompt", parent: Instance?) -> ProximityPrompt) & ((className: "ProximityPromptService", parent: Instance?) -> ProximityPromptService) & ((className: "ReflectionMetadata", parent: Instance?) -> ReflectionMetadata) & ((className: "ReflectionMetadataCallbacks", parent: Instance?) -> ReflectionMetadataCallbacks) & ((className: "ReflectionMetadataClasses", parent: Instance?) -> ReflectionMetadataClasses) & ((className: "ReflectionMetadataEnums", parent: Instance?) -> ReflectionMetadataEnums) & ((className: "ReflectionMetadataEvents", parent: Instance?) -> ReflectionMetadataEvents) & ((className: "ReflectionMetadataFunctions", parent: Instance?) -> ReflectionMetadataFunctions) & ((className: "ReflectionMetadataClass", parent: Instance?) -> ReflectionMetadataClass) & ((className: "ReflectionMetadataEnum", parent: Instance?) -> ReflectionMetadataEnum) & ((className: "ReflectionMetadataEnumItem", parent: Instance?) -> ReflectionMetadataEnumItem) & ((className: "ReflectionMetadataMember", parent: Instance?) -> ReflectionMetadataMember) & ((className: "ReflectionMetadataProperties", parent: Instance?) -> ReflectionMetadataProperties) & ((className: "ReflectionMetadataYieldFunctions", parent: Instance?) -> ReflectionMetadataYieldFunctions) & ((className: "RemoteEvent", parent: Instance?) -> RemoteEvent) & ((className: "RemoteFunction", parent: Instance?) -> RemoteFunction) & ((className: "RenderingTest", parent: Instance?) -> RenderingTest) & ((className: "RotationCurve", parent: Instance?) -> RotationCurve) & ((className: "BuoyancySensor", parent: Instance?) -> BuoyancySensor) & ((className: "ControllerPartSensor", parent: Instance?) -> ControllerPartSensor) & ((className: "Sky", parent: Instance?) -> Sky) & ((className: "Smoke", parent: Instance?) -> Smoke) & ((className: "Sound", parent: Instance?) -> Sound) & ((className: "ChorusSoundEffect", parent: Instance?) -> ChorusSoundEffect) & ((className: "CompressorSoundEffect", parent: Instance?) -> CompressorSoundEffect) & ((className: "DistortionSoundEffect", parent: Instance?) -> DistortionSoundEffect) & ((className: "EchoSoundEffect", parent: Instance?) -> EchoSoundEffect) & ((className: "EqualizerSoundEffect", parent: Instance?) -> EqualizerSoundEffect) & ((className: "FlangeSoundEffect", parent: Instance?) -> FlangeSoundEffect) & ((className: "PitchShiftSoundEffect", parent: Instance?) -> PitchShiftSoundEffect) & ((className: "ReverbSoundEffect", parent: Instance?) -> ReverbSoundEffect) & ((className: "TremoloSoundEffect", parent: Instance?) -> TremoloSoundEffect) & ((className: "SoundGroup", parent: Instance?) -> SoundGroup) & ((className: "Sparkles", parent: Instance?) -> Sparkles) & ((className: "StandalonePluginScripts", parent: Instance?) -> StandalonePluginScripts) & ((className: "StarterGear", parent: Instance?) -> StarterGear) & ((className: "StudioCallout", parent: Instance?) -> StudioCallout) & ((className: "StudioObjectBase", parent: Instance?) -> StudioObjectBase) & ((className: "StudioWidget", parent: Instance?) -> StudioWidget) & ((className: "StyleRule", parent: Instance?) -> StyleRule) & ((className: "StyleSheet", parent: Instance?) -> StyleSheet) & ((className: "StyleDerive", parent: Instance?) -> StyleDerive) & ((className: "StyleLink", parent: Instance?) -> StyleLink) & ((className: "SurfaceAppearance", parent: Instance?) -> SurfaceAppearance) & ((className: "Team", parent: Instance?) -> Team) & ((className: "TeleportOptions", parent: Instance?) -> TeleportOptions) & ((className: "TerrainDetail", parent: Instance?) -> TerrainDetail) & ((className: "TerrainRegion", parent: Instance?) -> TerrainRegion) & ((className: "TestService", parent: Instance?) -> TestService) & ((className: "TextChannel", parent: Instance?) -> TextChannel) & ((className: "TextChatCommand", parent: Instance?) -> TextChatCommand) & ((className: "TextChatMessageProperties", parent: Instance?) -> TextChatMessageProperties) & ((className: "TrackerStreamAnimation", parent: Instance?) -> TrackerStreamAnimation) & ((className: "Trail", parent: Instance?) -> Trail) & ((className: "Tween", parent: Instance?) -> Tween) & ((className: "UIAspectRatioConstraint", parent: Instance?) -> UIAspectRatioConstraint) & ((className: "UISizeConstraint", parent: Instance?) -> UISizeConstraint) & ((className: "UITextSizeConstraint", parent: Instance?) -> UITextSizeConstraint) & ((className: "UICorner", parent: Instance?) -> UICorner) & ((className: "UIGradient", parent: Instance?) -> UIGradient) & ((className: "UIGridLayout", parent: Instance?) -> UIGridLayout) & ((className: "UIListLayout", parent: Instance?) -> UIListLayout) & ((className: "UIPageLayout", parent: Instance?) -> UIPageLayout) & ((className: "UITableLayout", parent: Instance?) -> UITableLayout) & ((className: "UIPadding", parent: Instance?) -> UIPadding) & ((className: "UIScale", parent: Instance?) -> UIScale) & ((className: "UIStroke", parent: Instance?) -> UIStroke) & ((className: "BinaryStringValue", parent: Instance?) -> BinaryStringValue) & ((className: "BoolValue", parent: Instance?) -> BoolValue) & ((className: "BrickColorValue", parent: Instance?) -> BrickColorValue) & ((className: "CFrameValue", parent: Instance?) -> CFrameValue) & ((className: "Color3Value", parent: Instance?) -> Color3Value) & ((className: "DoubleConstrainedValue", parent: Instance?) -> DoubleConstrainedValue) & ((className: "IntConstrainedValue", parent: Instance?) -> IntConstrainedValue) & ((className: "IntValue", parent: Instance?) -> IntValue) & ((className: "NumberValue", parent: Instance?) -> NumberValue) & ((className: "ObjectValue", parent: Instance?) -> ObjectValue) & ((className: "RayValue", parent: Instance?) -> RayValue) & ((className: "StringValue", parent: Instance?) -> StringValue) & ((className: "Vector3Value", parent: Instance?) -> Vector3Value) & ((className: "Vector3Curve", parent: Instance?) -> Vector3Curve) & ((className: "VirtualInputManager", parent: Instance?) -> VirtualInputManager) & ((className: "WeldConstraint", parent: Instance?) -> WeldConstraint) & ((className: "Wire", parent: Instance?) -> Wire) & ((className: string, parent: Instance?) -> Instance), + + Lock: (instance: Instance, player: Player) -> nil, + Unlock: (instance: Instance) -> nil, +} + +declare Ray: { + new: ((Origin: Vector3, Direction: Vector3) -> Ray), +} + +declare NumberRange: { + new: ((value: number) -> NumberRange) & ((min: number, max: number) -> NumberRange), +} + +declare PathWaypoint: { + new: ((position: Vector3, action: EnumPathWaypointAction) -> PathWaypoint), +} + +declare BrickColor: { + Red: (() -> BrickColor), + Yellow: (() -> BrickColor), + Blue: (() -> BrickColor), + Gray: (() -> BrickColor), + DarkGray: (() -> BrickColor), + White: (() -> BrickColor), + random: (() -> BrickColor), + Green: (() -> BrickColor), + Black: (() -> BrickColor), + palette: ((paletteValue: number) -> BrickColor), + new: ((val: number) -> BrickColor) & ((r: number, g: number, b: number) -> BrickColor) & ((color: Color3) -> BrickColor) & ((name: "Alder" | "Artichoke" | "Baby blue" | "Beige" | "Black" | "Black metallic" | "Br. reddish orange" | "Br. yellowish green" | "Br. yellowish orange" | "Brick yellow" | "Bright blue" | "Bright bluish green" | "Bright bluish violet" | "Bright green" | "Bright orange" | "Bright purple" | "Bright red" | "Bright reddish lilac" | "Bright reddish violet" | "Bright violet" | "Bright yellow" | "Bronze" | "Brown" | "Burgundy" | "Burlap" | "Burnt Sienna" | "Buttermilk" | "CGA brown" | "Cadet blue" | "Camo" | "Carnation pink" | "Cashmere" | "Cloudy grey" | "Cocoa" | "Cool yellow" | "Copper" | "Cork" | "Crimson" | "Curry" | "Cyan" | "Daisy orange" | "Dark Curry" | "Dark Royal blue" | "Dark blue" | "Dark green" | "Dark grey" | "Dark grey metallic" | "Dark indigo" | "Dark nougat" | "Dark orange" | "Dark red" | "Dark stone grey" | "Dark taupe" | "Deep blue" | "Deep orange" | "Dirt brown" | "Dove blue" | "Dusty Rose" | "Earth blue" | "Earth green" | "Earth orange" | "Earth yellow" | "Eggplant" | "Electric blue" | "Faded green" | "Fawn brown" | "Fire Yellow" | "Flame reddish orange" | "Flame yellowish orange" | "Flint" | "Fog" | "Forest green" | "Fossil" | "Ghost grey" | "Gold" | "Grey" | "Grime" | "Gun metallic" | "Hot pink" | "Hurricane grey" | "Institutional white" | "Khaki" | "Lapis" | "Laurel green" | "Lavender" | "Lemon metalic" | "Lig. Yellowich orange" | "Lig. yellowish green" | "Light Royal blue" | "Light blue" | "Light bluish green" | "Light bluish violet" | "Light brick yellow" | "Light green (Mint)" | "Light grey" | "Light grey metallic" | "Light lilac" | "Light orange" | "Light orange brown" | "Light pink" | "Light purple" | "Light red" | "Light reddish violet" | "Light stone grey" | "Light yellow" | "Lilac" | "Lily white" | "Lime green" | "Linen" | "Magenta" | "Maroon" | "Mauve" | "Med. bluish green" | "Med. reddish violet" | "Med. yellowish green" | "Med. yellowish orange" | "Medium Royal blue" | "Medium blue" | "Medium bluish violet" | "Medium green" | "Medium lilac" | "Medium orange" | "Medium red" | "Medium stone grey" | "Mid gray" | "Mint" | "Moss" | "Mulberry" | "Navy blue" | "Neon green" | "Neon orange" | "New Yeller" | "Nougat" | "Olive" | "Olivine" | "Oyster" | "Parsley green" | "Pastel Blue" | "Pastel blue-green" | "Pastel brown" | "Pastel green" | "Pastel light blue" | "Pastel orange" | "Pastel violet" | "Pastel yellow" | "Pearl" | "Persimmon" | "Phosph. White" | "Pine Cone" | "Pink" | "Plum" | "Quill grey" | "Really black" | "Really blue" | "Really red" | "Red flip/flop" | "Reddish brown" | "Reddish lilac" | "Royal blue" | "Royal purple" | "Rust" | "Sage green" | "Salmon" | "Sand blue" | "Sand blue metallic" | "Sand green" | "Sand red" | "Sand violet" | "Sand violet metallic" | "Sand yellow" | "Sand yellow metallic" | "Sea green" | "Seashell" | "Shamrock" | "Silver" | "Silver flip/flop" | "Slime green" | "Smoky grey" | "Steel blue" | "Storm blue" | "Sunrise" | "Tawny" | "Teal" | "Terra Cotta" | "Toothpaste" | "Tr. Blue" | "Tr. Bright bluish violet" | "Tr. Brown" | "Tr. Flu. Blue" | "Tr. Flu. Green" | "Tr. Flu. Red" | "Tr. Flu. Reddish orange" | "Tr. Flu. Yellow" | "Tr. Green" | "Tr. Lg blue" | "Tr. Medi. reddish violet" | "Tr. Red" | "Tr. Yellow" | "Transparent" | "Turquoise" | "Warm yellowish orange" | "Wheat" | "White" | "Yellow flip/flop") -> BrickColor), +} + +declare Vector2: { + zero: Vector2, + one: Vector2, + xAxis: Vector2, + yAxis: Vector2, + new: ((x: number?, y: number?) -> Vector2), +} + +declare Vector2int16: { + new: ((x: number, y: number) -> Vector2int16), +} + +declare Color3: { + fromRGB: ((red: number?, green: number?, blue: number?) -> Color3), + fromHSV: ((hue: number, saturation: number, value: number) -> Color3), + toHSV: ((color: Color3) -> (number, number, number)), + new: ((red: number?, green: number?, blue: number?) -> Color3), + fromHex: ((hex: string) -> Color3), +} + +declare UDim: { + new: ((Scale: number?, Offset: number?) -> UDim), +} + +declare PhysicalProperties: { + new: ((material: EnumMaterial) -> PhysicalProperties) & ((density: number, friction: number, elasticy: number, frictionWeight: number?, elasticyWeight: number?) -> PhysicalProperties), +} + +declare Axes: { + new: ((axes: any) -> Axes), +} + +declare Region3: { + new: ((min: Vector3, max: Vector3) -> Region3), +} + +declare Region3int16: { + new: ((min: Vector3int16, max: Vector3int16) -> Region3int16), +} + +declare UDim2: { + fromScale: ((xScale: number, yScale: number) -> UDim2), + fromOffset: ((xOffset: number, yOffset: number) -> UDim2), + new: ((x: UDim, y: UDim) -> UDim2) & ((xScale: number?, xOffset: number?, yScale: number?, yOffset: number?) -> UDim2), +} + +declare CFrame: { + identity: CFrame, + fromEulerAnglesYXZ: ((rx: number, ry: number, rz: number) -> CFrame), + Angles: ((rx: number, ry: number, rz: number) -> CFrame), + fromMatrix: ((pos: Vector3, vX: Vector3, vY: Vector3, vZ: Vector3?) -> CFrame), + fromAxisAngle: ((v: Vector3, r: number) -> CFrame), + fromOrientation: ((rx: number, ry: number, rz: number) -> CFrame), + fromEulerAnglesXYZ: ((rx: number, ry: number, rz: number) -> CFrame), + lookAt: ((at: Vector3, target: Vector3, up: Vector3?) -> CFrame), + new: (() -> CFrame) & ((pos: Vector3) -> CFrame) & ((pos: Vector3, lookAt: Vector3) -> CFrame) & ((x: number, y: number, z: number) -> CFrame) & ((x: number, y: number, z: number, qX: number, qY: number, qZ: number, qW: number) -> CFrame) & ((x: number, y: number, z: number, R00: number, R01: number, R02: number, R10: number, R11: number, R12: number, R20: number, R21: number, R22: number) -> CFrame), +} + +declare Faces: { + new: ((normalIds: any) -> Faces), +} + +declare Rect: { + new: ((min: Vector2, max: Vector2) -> Rect) & ((minX: number, minY: number, maxX: number, maxY: number) -> Rect), +} + +declare Vector3: { + zero: Vector3, + one: Vector3, + xAxis: Vector3, + yAxis: Vector3, + zAxis: Vector3, + fromNormalId: ((normal: EnumNormalId) -> Vector3), + fromAxis: ((axis: EnumAxis) -> Vector3), + FromNormalId: ((normal: EnumNormalId) -> Vector3), + FromAxis: ((axis: EnumAxis) -> Vector3), + new: ((x: number?, y: number?, z: number?) -> Vector3), +} + +declare Vector3int16: { + new: ((x: number?, y: number?, z: number?) -> Vector3int16), +} + +declare Random: { + new: ((seed: number?) -> Random), +} + +declare TweenInfo: { + new: ((time: number?, easingStyle: EnumEasingStyle?, easingDirection: EnumEasingDirection?, repeatCount: number?, reverses: boolean?, delayTime: number?) -> TweenInfo), +} + +declare DateTime: { + now: (() -> DateTime), + fromUnixTimestamp: ((unixTimestamp: number) -> DateTime), + fromUnixTimestampMillis: ((unixTimestampMillis: number) -> DateTime), + fromUniversalTime: ((year: number?, month: number?, day: number?, hour: number?, minute: number?, second: number?, millisecond: number?) -> DateTime), + fromLocalTime: ((year: number?, month: number?, day: number?, hour: number?, minute: number?, second: number?, millisecond: number?) -> DateTime), + fromIsoDate: ((isoDate: string) -> DateTime), +} + +declare NumberSequence: { + new: ((n: number) -> NumberSequence) & ((n0: number, n1: number) -> NumberSequence) & ((keypoints: { NumberSequenceKeypoint }) -> NumberSequence), +} + +declare ColorSequence: { + new: ((c: Color3) -> ColorSequence) & ((c0: Color3, c1: Color3) -> ColorSequence) & ((keypoints: { ColorSequenceKeypoint }) -> ColorSequence), +} + +declare NumberSequenceKeypoint: { + new: ((time: number, value: number, envelop: number?) -> NumberSequenceKeypoint), +} + +declare ColorSequenceKeypoint: { + new: ((time: number, color: Color3) -> ColorSequenceKeypoint), +} + +declare RaycastParams: { + new: (() -> RaycastParams), +} + +declare OverlapParams: { + new: (() -> OverlapParams), +} + +declare DockWidgetPluginGuiInfo: { + new: ((initDockState: EnumInitialDockState?, initEnabled: boolean?, overrideEnabledRestore: boolean?, floatXSize: number?, floatYSize: number?, minWidth: number?, minHeight: number?) -> DockWidgetPluginGuiInfo), +} + +declare CatalogSearchParams: { + new: (() -> CatalogSearchParams), +} + +declare Font: { + new: ((family: string, weight: EnumFontWeight?, style: EnumFontStyle?) -> Font), + fromEnum: ((font: EnumFont) -> Font), + fromName: ((name: string, weight: EnumFontWeight?, style: EnumFontStyle?) -> Font), + fromId: ((id: number, weight: EnumFontWeight?, style: EnumFontStyle?) -> Font), +} + +declare FloatCurveKey: { + new: ((time: number, value: number, Interpolation: EnumKeyInterpolationMode) -> FloatCurveKey), +} + +declare RotationCurveKey: { + new: ((time: number, value: CFrame, Interpolation: EnumKeyInterpolationMode) -> RotationCurveKey), +} + + +declare class GlobalSettings extends GenericSettings + Lua: LuaSettings + Game: GameSettings + Studio: Studio + Network: NetworkSettings + Physics: PhysicsSettings + Rendering: RenderSettings + Diagnostics: DebugSettings + ["Task Scheduler"]: any + ["Game Options"]: any + function GetFFlag(self, name: string): boolean + function GetFVariable(self, name: string): string +end + +declare SharedTable: { + new: () -> SharedTable, + new: (t: { [any]: any }) -> SharedTable, + clear: (st: SharedTable) -> (), + clone: (st: SharedTable, deep: boolean?) -> SharedTable, + cloneAndFreeze: (st: SharedTable, deep: boolean?) -> SharedTable, + increment: (st: SharedTable, key: string | number, delta: number) -> number, + isFrozen: (st: SharedTable) -> boolean, + size: (st: SharedTable) -> number, + update: (st: SharedTable, key: string | number, f: (any) -> any) -> (), +} + +declare _PLACE_ID: number +declare _IS_STUDIO_JOIN: string +declare _SERVER_ADDRESS: any +declare _SERVER_PORT: string +declare _CREATOR_ID: number +declare _USER_ID: string +declare _USER_NAME: any +declare _MEMBERSHIP_TYPE: any +declare _CHAR_APPEARANCE: string +declare _PING_URL: string + +declare _BASE_URL: string +declare _MAP_LOCATION_EXISTS: boolean +declare _MAP_LOCATION: any +declare _SERVER_PORT: number +declare _SERVER_PRESENCE_URL: string + +declare _GUEST_NUMBER: number + +declare game: DataModel +declare Game: DataModel +declare workspace: Workspace +declare Workspace: Workspace +declare TeleportService: TeleportService +declare plugin: Plugin +declare script: LuaSourceContainer +declare function loadfile(file: string): any +declare function LoadLibrary(libraryName: string): { any } +declare function settings(): GlobalSettings +declare function UserSettings(): UserSettings +declare function ypcall(f: () -> any, ...: any): (boolean, any) diff --git a/luau/107893730.luau b/luau/107893730.luau index 2bd94f1..1b96b38 100644 --- a/luau/107893730.luau +++ b/luau/107893730.luau @@ -1,12 +1,15 @@ print "[Mercury]: Loaded corescript 107893730" -- this script creates the gui and sends the web requests for in game purchase prompts +local MarketplaceService = game:GetService "MarketplaceService" + -- wait for important items to appear while not Game do wait(0.1) end -while not game:GetService "MarketplaceService" do +while not MarketplaceService do wait(0.1) + MarketplaceService = game:GetService "MarketplaceService" end while not game:FindFirstChild "CoreGui" do wait(0.1) @@ -138,7 +141,7 @@ function closePurchasePrompt() ) end -function userPurchaseActionsEnded(isSuccess) +function userPurchaseActionsEnded(isSuccess: boolean) checkingPlayerFunds = false if isSuccess then -- show the user we bought the item successfully, when they close this dialog we will call signalPromptEnded @@ -527,7 +530,7 @@ end ---------------------------------------------- Currency Functions --------------------------------------------- -- enums have no implicit conversion to numbers in lua, has to have a function to do this -function currencyEnumToInt(currencyEnum) +function currencyEnumToInt(currencyEnum: Enum.CurrencyType) if currencyEnum == Enum.CurrencyType.Robux or currencyEnum == Enum.CurrencyType.Default diff --git a/luau/157877000.luau b/luau/157877000.luau index 629a47f..85ae392 100644 --- a/luau/157877000.luau +++ b/luau/157877000.luau @@ -1,6 +1,7 @@ print "[Mercury]: Loaded corescript 157877000" --Include -local Create = assert(LoadLibrary "RbxUtility").Create +local Create: (instance: string) -> ({ [string]: any }) -> Instance = + assert(LoadLibrary "RbxUtility").Create -- A Few Script Globals local gui diff --git a/luau/45284430.luau b/luau/45284430.luau index 47876ac..b7286ff 100644 --- a/luau/45284430.luau +++ b/luau/45284430.luau @@ -787,7 +787,7 @@ t.LayoutGuiObjects = function(frame, guiObjects, settingsTable) frame.Changed:connect(function(prop) if prop == "AbsoluteSize" then --Wait a heartbeat for it to sync in - recalculate(nil) + recalculate() end end) frame.AncestryChanged:connect(recalculate) @@ -1914,12 +1914,12 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) if scrollPosition < 1 then scrollPosition = 1 end - recalculate(nil) + recalculate() end local doScrollDown = function() scrollPosition += rowSize - recalculate(nil) + recalculate() end local scrollUp = function(mouseYPos) @@ -2036,7 +2036,7 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) end scrollPosition = newScrollPosition - recalculate(nil) + recalculate() end) upCon = mouseDrag.MouseButton1Up:connect(function() scrollStamp = tick() @@ -2078,21 +2078,21 @@ t.CreateScrollingFrame = function(orderList, scrollStyle) end) frame.ChildAdded:connect(function() - recalculate(nil) + recalculate() end) frame.ChildRemoved:connect(function() - recalculate(nil) + recalculate() end) frame.Changed:connect(function(prop) if prop == "AbsoluteSize" then --Wait a heartbeat for it to sync in - recalculate(nil) + recalculate() end end) frame.AncestryChanged:connect(function() - recalculate(nil) + recalculate() end) return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar @@ -4017,12 +4017,12 @@ t.CreateLoadingFrame = function(name, size, position) cancelButtonClicked:Fire() end) - local updateLoadingGuiPercent = function(percent, tweenAction, tweenLength) + local updateLoadingGuiPercent = function(percent: number, tweenAction, tweenLength) if percent and type(percent) ~= "number" then error( - "updateLoadingGuiPercent expects number as argument, got", - type(percent), - "instead" + "updateLoadingGuiPercent expects number as argument, got " + .. type(percent) + .. " instead" ) end diff --git a/luau/46295863.luau b/luau/46295863.luau index aa5378c..9e31e34 100644 --- a/luau/46295863.luau +++ b/luau/46295863.luau @@ -1639,7 +1639,7 @@ if LoadLibrary then end ) - function localPlayerChange() + local function localPlayerChange() gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer if game.Players.LocalPlayer then settings().Rendering.EnableFRM = true diff --git a/luau/48488398.luau b/luau/48488398.luau index 9374322..3bc1a29 100644 --- a/luau/48488398.luau +++ b/luau/48488398.luau @@ -1,4 +1,7 @@ print "[Mercury]: Loaded corescript 48488398" + +local TeleportService = TeleportService + function waitForProperty(instance, property) while not instance[property] do instance.Changed:wait() @@ -183,7 +186,7 @@ function showTeleportUI(message, timer) end function onTeleport(teleportState, _, _) - if game:GetService("TeleportService").CustomizedTeleportUI == false then + if TeleportService.CustomizedTeleportUI == false then if teleportState == Enum.TeleportState.Started then showTeleportUI("Teleport started...", 0) elseif teleportState == Enum.TeleportState.WaitingForServer then @@ -202,13 +205,13 @@ end if teleportEnabled then localPlayer.OnTeleport:connect(onTeleport) - game:GetService("TeleportService").ErrorCallback = function(message) + TeleportService.ErrorCallback = function(message) local popup = script.Parent:FindFirstChild "Popup" showOneButton() popup.PopupText.Text = message local clickCon clickCon = popup.OKButton.MouseButton1Click:connect(function() - game:GetService("TeleportService"):TeleportCancel() + TeleportService:TeleportCancel() if clickCon then clickCon:disconnect() end @@ -252,11 +255,7 @@ if teleportEnabled then end ) end - game:GetService("TeleportService").ConfirmationCallback = function( - message, - placeId, - spawnName - ) + TeleportService.ConfirmationCallback = function(message, placeId, spawnName) local popup = script.Parent:FindFirstChild "Popup" popup.PopupText.Text = message popup.PopupImage.Image = "" @@ -286,8 +285,7 @@ if teleportEnabled then yesCon = popup.AcceptButton.MouseButton1Click:connect(function() killCons() local success, err = pcall(function() - game:GetService("TeleportService") - :TeleportImpl(placeId, spawnName) + TeleportService:TeleportImpl(placeId, spawnName) end) if not success then showOneButton() @@ -342,7 +340,7 @@ if teleportEnabled then noCon = popup.DeclineButton.MouseButton1Click:connect(function() killCons() pcall(function() - game:GetService("TeleportService"):TeleportCancel() + TeleportService:TeleportCancel() end) end) diff --git a/luau/53878047.luau b/luau/53878047.luau index e9a6f25..b0a5f46 100644 --- a/luau/53878047.luau +++ b/luau/53878047.luau @@ -6,6 +6,9 @@ if game.CoreGui.Version < 3 then return end -- peace out if we aren't using the right client +local ContentProvider = game:GetService "ContentProvider" +local UserInputService = game:GetService "UserInputService" + local gui = script.Parent -- A couple of necessary functions @@ -23,7 +26,7 @@ end local function IsTouchDevice() local touchEnabled = false pcall(function() - touchEnabled = Game:GetService("UserInputService").TouchEnabled + touchEnabled = UserInputService.TouchEnabled end) return touchEnabled end @@ -334,8 +337,7 @@ closeButton.Modal = true local XImage = Instance.new "ImageLabel" XImage.RobloxLocked = true XImage.Name = "XImage" -game:GetService("ContentProvider") - :Preload "http://banland.xyz/asset/?id=75547445" +ContentProvider:Preload "http://banland.xyz/asset/?id=75547445" XImage.Image = "http://banland.xyz/asset/?id=75547445" --TODO: move to rbxasset XImage.BackgroundTransparency = 1 XImage.Position = UDim2.new(-0.25, -1, -0.25, -1) @@ -767,8 +769,7 @@ CharacterPane.Parent = Wardrobe --CharacterPane Children local FaceFrame = makeCharFrame("FacesFrame", CharacterPane) -game:GetService("ContentProvider") - :Preload "http://banland.xyz/asset/?id=75460621" +ContentProvider:Preload "http://banland.xyz/asset/?id=75460621" makeZone( "FaceZone", "http://banland.xyz/asset/?id=75460621", @@ -799,8 +800,7 @@ makeStyledButton( ) local HatsFrame = makeCharFrame("HatsFrame", CharacterPane) -game:GetService("ContentProvider") - :Preload "http://banland.xyz/asset/?id=75457888" +ContentProvider:Preload "http://banland.xyz/asset/?id=75457888" local HatsZone = makeZone( "HatsZone", "http://banland.xyz/asset/?id=75457888", @@ -831,8 +831,7 @@ makeStyledButton( ) local PantsFrame = makeCharFrame("PantsFrame", CharacterPane) -game:GetService("ContentProvider") - :Preload "http://banland.xyz/asset/?id=75457920" +ContentProvider:Preload "http://banland.xyz/asset/?id=75457920" makeZone( "PantsZone", "http://banland.xyz/asset/?id=75457920", @@ -927,8 +926,7 @@ makeTextLabel( ) local TShirtFrame = makeCharFrame("T-ShirtsFrame", CharacterPane) -game:GetService("ContentProvider") - :Preload "http://banland.xyz/asset/?id=75460642" +ContentProvider:Preload "http://banland.xyz/asset/?id=75460642" makeZone( "TShirtZone", "http://banland.xyz/asset/?id=75460642", @@ -959,8 +957,7 @@ makeStyledButton( ) local ColorFrame = makeCharFrame("ColorFrame", CharacterPane) -game:GetService("ContentProvider") - :Preload "http://banland.xyz/asset/?id=76049888" +ContentProvider:Preload "http://banland.xyz/asset/?id=76049888" local ColorZone = makeZone( "ColorZone", "http://banland.xyz/asset/?id=76049888", diff --git a/luau/53878057.luau b/luau/53878057.luau index 4137e9f..10dbc92 100644 --- a/luau/53878057.luau +++ b/luau/53878057.luau @@ -22,6 +22,8 @@ local backpackEnabled = true local robloxGui = game:GetService("CoreGui"):FindFirstChild "RobloxGui" assert(robloxGui) +local GuiService = game:GetService "GuiService" + local controlFrame = waitForChild(robloxGui, "ControlFrame") local backpackButton = waitForChild(controlFrame, "BackpackButton") local backpack = waitForChild(robloxGui, "Backpack") @@ -133,14 +135,14 @@ end function registerNumberKeys() for i = 0, 9 do - game:GetService("GuiService"):AddKey(tostring(i)) + GuiService:AddKey(tostring(i)) end end function unregisterNumberKeys() pcall(function() for i = 0, 9 do - game:GetService("GuiService"):RemoveKey(tostring(i)) + GuiService:RemoveKey(tostring(i)) end end) end @@ -1227,6 +1229,7 @@ characterChildAddedCon = player.Character.ChildAdded:connect(function(child) end) waitForChild(player.Character, "Humanoid") +local humanoidDiedCon humanoidDiedCon = player.Character.Humanoid.Died:connect(function() if humanoidDiedCon then humanoidDiedCon:disconnect() @@ -1348,7 +1351,7 @@ guiBackpack.SwapSlot.Changed:connect(function() end end) -game:GetService("GuiService").KeyPressed:connect(function(key) +GuiService.KeyPressed:connect(function(key) if characterInWorkspace() then activateGear(key) end diff --git a/luau/60595411.luau b/luau/60595411.luau index 9666814..a1db4bd 100644 --- a/luau/60595411.luau +++ b/luau/60595411.luau @@ -520,16 +520,16 @@ t.SelectTerrainRegion = function( assert(regionToSelect) assert(color) - if not type(regionToSelect) == "Region3" then + if type(regionToSelect) ~= "Region3" then error( - "regionToSelect (first arg), should be of type Region3, but is type", - type(regionToSelect) + "regionToSelect (first arg), should be of type Region3, but is type " + .. type(regionToSelect) ) end - if not type(color) == "BrickColor" then + if type(color) ~= "BrickColor" then error( - "color (second arg), should be of type BrickColor, but is type", - type(color) + "color (second arg), should be of type BrickColor, but is type " + .. type(color) ) end @@ -581,7 +581,7 @@ t.SelectTerrainRegion = function( -- end -- helper function that creates the basis for a selection box - function createAdornment(theColor) + local function createAdornment(theColor) local selectionPartClone local selectionBoxClone diff --git a/luau/73157242.luau b/luau/73157242.luau index 188b02b..4c8f44b 100644 --- a/luau/73157242.luau +++ b/luau/73157242.luau @@ -1,4 +1,7 @@ print "[Mercury]: Loaded corescript 73157242" + +local ChangeHistoryService = game:GetService "ChangeHistoryService" + local t = {} -- function waitForChild(instance, name) @@ -1106,7 +1109,7 @@ t.SetupStamperDragger = function( local function DoHighScalabilityRegionSelect() local megaCube = stampData.CurrentParts:FindFirstChild "MegaClusterCube" if not megaCube then - if not stampData.CurrentParts.Name == "MegaClusterCube" then + if stampData.CurrentParts.Name ~= "MegaClusterCube" then return else megaCube = stampData.CurrentParts @@ -1253,9 +1256,9 @@ t.SetupStamperDragger = function( end if not Mouse:IsA "Mouse" then error( - "Error: RbxStamper.DoStamperMouseMove: Mouse is of type", - Mouse.className, - "should be of type Mouse" + "Error: RbxStamper.DoStamperMouseMove: Mouse is of type " + .. Mouse.className + .. " should be of type Mouse" ) return end @@ -2229,8 +2232,7 @@ t.SetupStamperDragger = function( if cellSet then stampData.CurrentParts.Parent = nil pcall(function() - game:GetService("ChangeHistoryService") - :SetWaypoint "StamperMulti" + ChangeHistoryService:SetWaypoint "StamperMulti" end) end @@ -2529,8 +2531,7 @@ t.SetupStamperDragger = function( -- Mark for undo. It has to happen here or the selection display will come back also. pcall(function() - game:GetService("ChangeHistoryService") - :SetWaypoint "StamperSingle" + ChangeHistoryService:SetWaypoint "StamperSingle" end) return true end @@ -2688,7 +2689,7 @@ t.SetupStamperDragger = function( stampData.CurrentParts = nil pcall(function() - game:GetService("ChangeHistoryService"):SetWaypoint "StampedObject" + ChangeHistoryService:SetWaypoint "StampedObject" end) return true end diff --git a/luau/89449093.luau b/luau/89449093.luau index cb4aefd..e003b4a 100644 --- a/luau/89449093.luau +++ b/luau/89449093.luau @@ -4,6 +4,8 @@ if game.CoreGui.Version < 7 then return end -- peace out if we aren't using the right client +local GuiService = game:GetService "GuiService" + -- basic functions local function waitForChild(instance, name) while not instance:FindFirstChild(name) do @@ -395,12 +397,12 @@ function coreGuiChanged(coreGuiType, enabled) if disabledByDeveloper then pcall(function() - game:GetService("GuiService"):RemoveKey(tilde) - game:GetService("GuiService"):RemoveKey(backquote) + GuiService:RemoveKey(tilde) + GuiService:RemoveKey(backquote) end) else - game:GetService("GuiService"):AddKey(tilde) - game:GetService("GuiService"):AddKey(backquote) + GuiService:AddKey(tilde) + GuiService:AddKey(backquote) end resetSearch() @@ -460,9 +462,9 @@ screen.Changed:connect(function(prop) end) -- GuiService key setup -game:GetService("GuiService"):AddKey(tilde) -game:GetService("GuiService"):AddKey(backquote) -game:GetService("GuiService").KeyPressed:connect(function(key) +GuiService:AddKey(tilde) +GuiService:AddKey(backquote) +GuiService.KeyPressed:connect(function(key) if not active or disabledByDeveloper then return end diff --git a/luau/97188756.luau b/luau/97188756.luau index 0c68380..3501a32 100644 --- a/luau/97188756.luau +++ b/luau/97188756.luau @@ -1690,7 +1690,7 @@ function Input:OnMouseScroll() if Chat:CheckIfInBounds(Input.Speed) then return end - Chat:ScrollQueue() + -- Chat:ScrollQueue() end function Input:ApplySpeed(value) diff --git a/luau/host.luau b/luau/host.luau index c121fba..d6e4e74 100644 --- a/luau/host.luau +++ b/luau/host.luau @@ -2,6 +2,10 @@ print "[Mercury]: Loaded Host corescript" -- Start Game Script Arguments local placeId, sleeptime, access, url, killID, deathID, timeout, injectScriptAssetID, servicesUrl, libraryRegistrationScriptAssetID +local InsertService = game:GetService "InsertService" +local BadgeService = game:GetService "BadgeService" +local FriendService = game:GetService "FriendService" + -- StartGame -- pcall(function() game:GetService("ScriptContext"):AddStarterScript(injectScriptAssetID) @@ -112,48 +116,48 @@ if url ~= nil then end) -- pcall(function() game:GetService("Players"):SetChatFilterUrl(url .. "/Game/ChatFilter.ashx") end) - -- game:GetService("BadgeService"):SetPlaceId(placeId) + -- BadgeService:SetPlaceId(placeId) if access ~= nil then - game:GetService("BadgeService"):SetAwardBadgeUrl( + BadgeService:SetAwardBadgeUrl( url .. "/Game/Badge/AwardBadge.ashx?UserID=%d&BadgeID=%d&PlaceID=%d&" .. access ) - game:GetService("BadgeService"):SetHasBadgeUrl( + BadgeService:SetHasBadgeUrl( url .. "/Game/Badge/HasBadge.ashx?UserID=%d&BadgeID=%d&" .. access ) - game:GetService("BadgeService"):SetIsBadgeDisabledUrl( + BadgeService:SetIsBadgeDisabledUrl( url .. "/Game/Badge/IsBadgeDisabled.ashx?BadgeID=%d&PlaceID=%d&" .. access ) - game:GetService("FriendService"):SetMakeFriendUrl( + FriendService:SetMakeFriendUrl( servicesUrl .. "/Friend/CreateFriend?firstUserId=%d&secondUserId=%d&" .. access ) - game:GetService("FriendService"):SetBreakFriendUrl( + FriendService:SetBreakFriendUrl( servicesUrl .. "/Friend/BreakFriend?firstUserId=%d&secondUserId=%d&" .. access ) - game:GetService("FriendService"):SetGetFriendsUrl( + FriendService:SetGetFriendsUrl( servicesUrl .. "/Friend/AreFriends?userId=%d&" .. access ) end - game:GetService("BadgeService"):SetIsBadgeLegalUrl "" - game:GetService("InsertService") + BadgeService:SetIsBadgeLegalUrl "" + InsertService :SetBaseSetsUrl( url .. "/Game/Tools/InsertAsset.ashx?nsets=10&type=base" ) - game:GetService("InsertService"):SetUserSetsUrl( + InsertService:SetUserSetsUrl( url .. "/Game/Tools/InsertAsset.ashx?nsets=20&type=user&userid=%d" ) - game:GetService("InsertService") + InsertService :SetCollectionUrl(url .. "/Game/Tools/InsertAsset.ashx?sid=%d") - game:GetService("InsertService"):SetAssetUrl(url .. "/Asset/?id=%d") - game:GetService("InsertService") + InsertService:SetAssetUrl(url .. "/Asset/?id=%d") + InsertService :SetAssetVersionUrl(url .. "/Asset/?assetversionid=%d") pcall(function() diff --git a/luau/join.luau b/luau/join.luau index 762b93f..0292cfc 100644 --- a/luau/join.luau +++ b/luau/join.luau @@ -88,7 +88,7 @@ pcall(function() Players:SetChatStyle(Enum.ChatStyle.ClassicAndBubble) end) -local waitingForCharacter = false +waitingForCharacter = false pcall(function() if settings().Network.MtuOverride == 0 then settings().Network.MtuOverride = 1400 @@ -96,7 +96,7 @@ pcall(function() end) -- functions --------------------------------------- -function setMessage(message) +function setMessage(message: string) -- todo: animated "..." game:SetMessage(message) end @@ -241,7 +241,7 @@ local success, err = pcall(function() connectionFailed = Client.ConnectionFailed:connect(onConnectionFailed) Client.Ticket = "" - playerConnectSucces, player = pcall(function() + local playerConnectSuccess, player = pcall(function() return Client:PlayerConnect( _USER_ID, "_SERVER_ADDRESS", @@ -250,7 +250,7 @@ local success, err = pcall(function() threadSleepTime ) end) - if not playerConnectSucces then + if not playerConnectSuccess then --Old player connection scheme player = Players:CreateLocalPlayer(_USER_ID) Client:Connect("_SERVER_ADDRESS", _SERVER_PORT, 0, threadSleepTime) diff --git a/luau/visit.luau b/luau/visit.luau index 803ebf5..74cf9f5 100644 --- a/luau/visit.luau +++ b/luau/visit.luau @@ -122,7 +122,7 @@ function doVisit() end) end -success, err = pcall(doVisit) +local success, err = pcall(doVisit) if not addedBuildTools then local playerName = Instance.new "StringValue" diff --git a/mercury.yml b/mercury.yml index ca81ebb..d2deed7 100644 --- a/mercury.yml +++ b/mercury.yml @@ -235,6 +235,12 @@ globals: type: number - required: false type: number + + Enum.UploadSetting.Never: + struct: EnumItem + Enum.PriorityMethod.Ask me first: + struct: EnumItem + Enum.PriorityMethod.AccumulatedError: struct: EnumItem Enum.PhysicsSendMethod.ErrorComputation2: @@ -5586,6 +5592,10 @@ globals: math.sign: args: - type: number + math.nan: + property: read-only + math.inf: + property: read-only module: removed: true os.execute: @@ -6939,6 +6949,9 @@ structs: args: - required: false type: any + SetMessageBrickCount: + method: true + args: [] GetService: args: - type: From 29f87521aba1d8cb4ba82ed7e281a5292b20e093 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Thu, 17 Aug 2023 22:03:30 +0100 Subject: [PATCH 07/14] Fix global variables in corescripts and joinscripts to load correctly --- defs.d.lua | 4 ++-- lines.json5 | 5 +++++ luau/152908679.luau | 4 ++-- luau/join.luau | 7 +++++-- luau/visit.luau | 10 +++++----- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/defs.d.lua b/defs.d.lua index f4953d9..c5b0002 100644 --- a/defs.d.lua +++ b/defs.d.lua @@ -9463,8 +9463,8 @@ declare class DataModel extends ServiceProvider function SetFastStringForTesting(self, name: string, newValue: string): string function SetFlagVersion(self, name: string, version: number): nil function SetIsLoaded(self, value: boolean, placeSizeInBytes: number?): nil - function SetPlaceId(self, placeId: number, idk: boolean): nil - function SetPlaceID(self, placeId: number, idk: boolean): nil + function SetPlaceId(self, placeId: number, idk: boolean?): nil + function SetPlaceID(self, placeId: number, idk: boolean?): nil function SetUniverseId(self, universeId: number): nil function Shutdown(self): nil diff --git a/lines.json5 b/lines.json5 index 6128b94..ce31eb2 100644 --- a/lines.json5 +++ b/lines.json5 @@ -1,6 +1,7 @@ { rules: [ "remove_spaces", + "remove_compound_assignment", "group_local_assignment", // "compute_expression", "remove_unused_if_branch", @@ -9,5 +10,9 @@ // "remove_method_definition", "remove_function_call_parens", "filter_after_early_return", + { + rule: "rename_variables", + globals: ["$default", "$roblox"], + }, ], } diff --git a/luau/152908679.luau b/luau/152908679.luau index 81c67fe..edff8f5 100644 --- a/luau/152908679.luau +++ b/luau/152908679.luau @@ -11,8 +11,8 @@ local functionTable = {} local buttonVector = {} local buttonScreenGui, buttonFrame -local ContextDownImage = "http://www.banland.xyz/asset/?id=97166756" -local ContextUpImage = "http://www.banland.xyz/asset/?id=97166444" +local ContextDownImage = "http://banland.xyz/asset/?id=97166756" +local ContextUpImage = "http://banland.xyz/asset/?id=97166444" local oldTouches = {} diff --git a/luau/join.luau b/luau/join.luau index 0292cfc..52b91d7 100644 --- a/luau/join.luau +++ b/luau/join.luau @@ -10,6 +10,8 @@ local Players = game:GetService "Players" local Client = game:GetService "NetworkClient" local Visit = game:GetService "Visit" +local player, connectionFailed + -- MultiplayerSharedScript.lua inserted here ------ Prepended to Join.lua -- pcall(function() @@ -154,7 +156,7 @@ function requestCharacter(replicator) end -- called when the client connection is established -function onConnectionAccepted(url, replicator) +function onConnectionAccepted(_, replicator) connectResolved = true local waitingForMarker = true @@ -241,7 +243,8 @@ local success, err = pcall(function() connectionFailed = Client.ConnectionFailed:connect(onConnectionFailed) Client.Ticket = "" - local playerConnectSuccess, player = pcall(function() + local playerConnectSuccess + playerConnectSuccess, player = pcall(function() return Client:PlayerConnect( _USER_ID, "_SERVER_ADDRESS", diff --git a/luau/visit.luau b/luau/visit.luau index 74cf9f5..8360b7c 100644 --- a/luau/visit.luau +++ b/luau/visit.luau @@ -11,13 +11,13 @@ local GamePassService = game:GetService "GamePassService" local Visit = game:GetService "Visit" local ScriptContext = game:GetService "ScriptContext" +local player + -- Prepended to Edit.lua and Visit.lua and Studio.lua and PlaySolo.lua-- -do - pcall(function() - return game:SetPlaceID(_PLACE_ID) - end) -end +pcall(function() + return game:SetPlaceID(_PLACE_ID) +end) local message = Instance.new "Message" From 215aea24ee25230aa9f23ec1c0d08a025beb0665 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Thu, 31 Aug 2023 07:58:55 +0100 Subject: [PATCH 08/14] Improve documentation for corescripts and add filename comments --- luau/107893730.luau | 2 ++ luau/152908679.luau | 6 ++++++ luau/153556783.luau | 6 ++++++ luau/157877000.luau | 6 ++++++ luau/36868950.luau | 2 ++ luau/37801172.luau | 2 ++ luau/38037565.luau | 6 ++++++ luau/39250920.luau | 2 ++ luau/45284430.luau | 8 +++++++- luau/45374389.luau | 2 ++ luau/46295863.luau | 2 ++ luau/48488235.luau | 2 ++ luau/48488398.luau | 1 + luau/48488451.luau | 2 ++ luau/53878047.luau | 2 ++ luau/53878057.luau | 2 ++ luau/59002209.luau | 1 + luau/60595411.luau | 22 ++++++++++++++++++++++ luau/60595695.luau | 10 ++++++---- luau/73157242.luau | 1 + luau/89449008.luau | 2 ++ luau/89449093.luau | 2 ++ luau/97188756.luau | 2 ++ mercury.yml | 5 +++++ 24 files changed, 93 insertions(+), 5 deletions(-) diff --git a/luau/107893730.luau b/luau/107893730.luau index 1b96b38..f625434 100644 --- a/luau/107893730.luau +++ b/luau/107893730.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/PurchasePromptScript print "[Mercury]: Loaded corescript 107893730" + -- this script creates the gui and sends the web requests for in game purchase prompts local MarketplaceService = game:GetService "MarketplaceService" diff --git a/luau/152908679.luau b/luau/152908679.luau index edff8f5..775483e 100644 --- a/luau/152908679.luau +++ b/luau/152908679.luau @@ -1,4 +1,10 @@ +-- CoreGui.RobloxGui.CoreScripts/ContextActionTouch +-- Unused by Mercury print "[Mercury]: Loaded corescript 152908679" +for _ = 1, 4 do + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" +end -- ContextActionTouch.lua -- this script controls ui and firing of lua functions that are bound in ContextActionService for touch inputs diff --git a/luau/153556783.luau b/luau/153556783.luau index f723014..3729a60 100644 --- a/luau/153556783.luau +++ b/luau/153556783.luau @@ -1,4 +1,10 @@ +-- CoreGui.RobloxGui.CoreScripts/TouchControls +-- Unused by Mercury print "[Mercury]: Loaded corescript 153556783" +for _ = 1, 4 do + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" +end -- This is responsible for all touch controls we show (as of this writing, only on iOS) -- this includes character move thumbsticks, and buttons for jump, use of items, camera, etc. diff --git a/luau/157877000.luau b/luau/157877000.luau index 85ae392..17740ea 100644 --- a/luau/157877000.luau +++ b/luau/157877000.luau @@ -1,4 +1,10 @@ +-- Unused by Mercury print "[Mercury]: Loaded corescript 157877000" +for _ = 1, 4 do + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" +end + --Include local Create: (instance: string) -> ({ [string]: any }) -> Instance = assert(LoadLibrary "RbxUtility").Create diff --git a/luau/36868950.luau b/luau/36868950.luau index 1bcd706..1ebb1c0 100644 --- a/luau/36868950.luau +++ b/luau/36868950.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/ToolTip print "[Mercury]: Loaded corescript 36868950" + local controlFrame = script.Parent:FindFirstChild "ControlFrame" if not controlFrame then diff --git a/luau/37801172.luau b/luau/37801172.luau index 8f4dcd6..51b82f5 100644 --- a/luau/37801172.luau +++ b/luau/37801172.luau @@ -1,4 +1,6 @@ +-- Script Context.StarterScript print "[Mercury]: Loaded corescript 37801172" + local scriptContext = game:GetService "ScriptContext" -- Creates all neccessary scripts for the gui on initial load, everything except build tools diff --git a/luau/38037565.luau b/luau/38037565.luau index 1fb94f5..bd94bb0 100644 --- a/luau/38037565.luau +++ b/luau/38037565.luau @@ -1,4 +1,10 @@ +-- Unused by Mercury print "[Mercury]: Loaded corescript 38037565" +for _ = 1, 4 do + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" +end + local damageGuiWidth = 5.0 local damageGuiHeight = 5.0 diff --git a/luau/39250920.luau b/luau/39250920.luau index b90b0d8..adc5afb 100644 --- a/luau/39250920.luau +++ b/luau/39250920.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/MainBotChatScript print "[Mercury]: Loaded corescript 39250920" + function waitForProperty(instance, name) while not instance[name] do instance.Changed:wait() diff --git a/luau/45284430.luau b/luau/45284430.luau index b7286ff..f63e079 100644 --- a/luau/45284430.luau +++ b/luau/45284430.luau @@ -1,4 +1,6 @@ +-- RbxGui print "[Mercury]: Loaded corescript 45284430" + local t = {} local function ScopedConnect( @@ -4017,7 +4019,11 @@ t.CreateLoadingFrame = function(name, size, position) cancelButtonClicked:Fire() end) - local updateLoadingGuiPercent = function(percent: number, tweenAction, tweenLength) + local updateLoadingGuiPercent = function( + percent: number, + tweenAction, + tweenLength + ) if percent and type(percent) ~= "number" then error( "updateLoadingGuiPercent expects number as argument, got " diff --git a/luau/45374389.luau b/luau/45374389.luau index 1d97400..159de50 100644 --- a/luau/45374389.luau +++ b/luau/45374389.luau @@ -1,4 +1,6 @@ +-- RbxGear (unused) print "[Mercury]: Loaded corescript 45374389" + local t = {} t.Foo = function() diff --git a/luau/46295863.luau b/luau/46295863.luau index 9e31e34..ccb1e1f 100644 --- a/luau/46295863.luau +++ b/luau/46295863.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/Settings print "[Mercury]: Loaded corescript 46295863" + local function waitForChild(instance, name) while not instance:FindFirstChild(name) do instance.ChildAdded:wait() diff --git a/luau/48488235.luau b/luau/48488235.luau index 44bf27f..43442fd 100644 --- a/luau/48488235.luau +++ b/luau/48488235.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/PlayerListScript print "[Mercury]: Loaded corescript 48488235" + --new playerlist by Zach Lindblad (fusroblox) --contact him for any revisions/issues -------------------- diff --git a/luau/48488398.luau b/luau/48488398.luau index 3bc1a29..3bdde1c 100644 --- a/luau/48488398.luau +++ b/luau/48488398.luau @@ -1,3 +1,4 @@ +-- CoreGui.RobloxGui.CoreScripts/NotificationScript print "[Mercury]: Loaded corescript 48488398" local TeleportService = TeleportService diff --git a/luau/48488451.luau b/luau/48488451.luau index 76f8558..f97f1fa 100644 --- a/luau/48488451.luau +++ b/luau/48488451.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/PopupScript print "[Mercury]: Loaded corescript 48488451" + --build our gui local popupFrame = Instance.new "Frame" diff --git a/luau/53878047.luau b/luau/53878047.luau index b0a5f46..afda5bb 100644 --- a/luau/53878047.luau +++ b/luau/53878047.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/BackpackScripts/BackpackBuild print "[Mercury]: Loaded corescript 53878047" + -- This script creates almost all gui elements found in the backpack (warning: there are a lot!) -- TODO: automate this process diff --git a/luau/53878057.luau b/luau/53878057.luau index 10dbc92..4a3d712 100644 --- a/luau/53878057.luau +++ b/luau/53878057.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CurrentLoadout.CoreScripts/BackpackScript print "[Mercury]: Loaded corescript 53878057" + if game.CoreGui.Version < 3 then return end -- peace out if we aren't using the right client diff --git a/luau/59002209.luau b/luau/59002209.luau index e1963bd..369c052 100644 --- a/luau/59002209.luau +++ b/luau/59002209.luau @@ -1 +1,2 @@ +-- Script Context.CoreScripts/Sections print "[Mercury]: Loaded corescript 59002209" diff --git a/luau/60595411.luau b/luau/60595411.luau index a1db4bd..1bb1471 100644 --- a/luau/60595411.luau +++ b/luau/60595411.luau @@ -1,4 +1,6 @@ +-- RbxUtility print "[Mercury]: Loaded corescript 60595411" + local t = {} ------------------------------------------------------------------------------------------------------------------------ @@ -1037,6 +1039,26 @@ end -------------------------------------------------Create function End---------------------------------------------------- +-- Lmao time - Heliodex + +function t.HttpGet(url: string) + return game:HttpGet(url) +end + +function t.HttpGetAsync(url: string) + return game:HttpGetAsync(url) +end + +function t.HttpPost(url: string) + return game:HttpPost(url) +end + +function t.HttpPostAsync(url: string) + return game:HttpPostAsync(url) +end + +-- Lmao time end + ------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------ diff --git a/luau/60595695.luau b/luau/60595695.luau index 9b773b0..f2a057a 100644 --- a/luau/60595695.luau +++ b/luau/60595695.luau @@ -1,9 +1,11 @@ +-- Script Context./Libraries/LibraryRegistration/LibraryRegist print "[Mercury]: Loaded corescript 60595695" + -- Library Registration Script -- This script is used to register RbxLua libraries on game servers, so game scripts have -- access to all of the libraries (otherwise only local scripts do) -local deepakTestingPlace = 3569749 +-- local deepakTestingPlace = 3569749 local sc = game:GetService "ScriptContext" local tries = 0 @@ -16,9 +18,9 @@ end if sc then sc:RegisterLibrary("Libraries/RbxGui", "45284430") sc:RegisterLibrary("Libraries/RbxGear", "45374389") - if game.PlaceId == deepakTestingPlace then - sc:RegisterLibrary("Libraries/RbxStatus", "52177566") - end + -- if game.PlaceId == deepakTestingPlace then + -- sc:RegisterLibrary("Libraries/RbxStatus", "52177566") + -- end sc:RegisterLibrary("Libraries/RbxUtility", "60595411") sc:RegisterLibrary("Libraries/RbxStamper", "73157242") sc:LibraryRegistrationComplete() diff --git a/luau/73157242.luau b/luau/73157242.luau index 4c8f44b..7627545 100644 --- a/luau/73157242.luau +++ b/luau/73157242.luau @@ -1,3 +1,4 @@ +-- RbxStamper print "[Mercury]: Loaded corescript 73157242" local ChangeHistoryService = game:GetService "ChangeHistoryService" diff --git a/luau/89449008.luau b/luau/89449008.luau index bf7b33e..d7a6448 100644 --- a/luau/89449008.luau +++ b/luau/89449008.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.Backpack.CoreScripts/BackpackScripts/Back (1?) print "[Mercury]: Loaded corescript 89449008" + -- A couple of necessary functions local function waitForChild(instance, name) assert(instance) diff --git a/luau/89449093.luau b/luau/89449093.luau index e003b4a..f40fc96 100644 --- a/luau/89449093.luau +++ b/luau/89449093.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.Backpack.CoreScripts/BackpackScripts/Back (2?) print "[Mercury]: Loaded corescript 89449093" + -- This script manages context switches in the backpack (Gear to Wardrobe, etc.) and player state changes. Also manages global functions across different tabs (currently only search) if game.CoreGui.Version < 7 then return diff --git a/luau/97188756.luau b/luau/97188756.luau index 3501a32..9604455 100644 --- a/luau/97188756.luau +++ b/luau/97188756.luau @@ -1,4 +1,6 @@ +-- CoreGui.RobloxGui.CoreScripts/ChatScript print "[Mercury]: Loaded corescript 97188756" + --[[ //FileName: ChatScript.LUA //Written by: Sorcus diff --git a/mercury.yml b/mercury.yml index d2deed7..633d454 100644 --- a/mercury.yml +++ b/mercury.yml @@ -25,6 +25,11 @@ globals: _CHAR_APPEARANCE: args: [] + assert: + args: + - type: any + - required: false + type: string ypcall: args: - type: function From 487e85fdf7deb27f3ca6c3a21efa41b700e2dbf9 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Thu, 31 Aug 2023 08:18:02 +0100 Subject: [PATCH 09/14] Fix error in notification corescript --- luau/48488398.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luau/48488398.luau b/luau/48488398.luau index 3bdde1c..22d727d 100644 --- a/luau/48488398.luau +++ b/luau/48488398.luau @@ -1,7 +1,7 @@ -- CoreGui.RobloxGui.CoreScripts/NotificationScript print "[Mercury]: Loaded corescript 48488398" -local TeleportService = TeleportService +local TeleportService = game:GetService "TeleportService" function waitForProperty(instance, property) while not instance[property] do From 0db973e8a9cf4c41ed23a7fc9cb0cca1c8009ebb Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Fri, 1 Sep 2023 01:50:28 +0100 Subject: [PATCH 10/14] Update definitions file to remove some unused definitions --- defs.d.lua | 409 +---------------------------------------------------- 1 file changed, 6 insertions(+), 403 deletions(-) diff --git a/defs.d.lua b/defs.d.lua index c5b0002..fa7cb75 100644 --- a/defs.d.lua +++ b/defs.d.lua @@ -1,4 +1,3 @@ -local JointsService = game:GetService("JointsService") -- Based on https://github.com/JohnnyMorganz/luau-lsp/blob/2bd0fb8a122932be67a16412591089e482bc3209/scripts/globalTypes.d.lua type Content = string @@ -61,8 +60,8 @@ declare function elapsedTime(): number declare function wait(seconds: number?): (number, number) declare function delay(delayTime: number?, callback: (T...) -> ()) declare function Delay(delayTime: number?, callback: (T...) -> ()) -declare function spawn(callback: (T...) -> ()) -declare function Spawn(callback: (T...) -> ()) +declare function spawn(callback: (T...) -> (), ...: any) +declare function Spawn(callback: (T...) -> (), ...: any) declare function version(): string declare function printidentity(prefix: string?) @@ -3753,9 +3752,9 @@ declare class CatalogSearchParams end declare class Color3 - B: number - G: number - R: number + b: number + g: number + r: number function Lerp(self, color: Color3, alpha: number): Color3 function ToHSV(self): (number, number, number) function ToHex(self): string @@ -4187,16 +4186,6 @@ declare class Accessory extends Accoutrement AccessoryType: EnumAccessoryType end - - -declare class AdPortal extends Instance - PortalInvalidReason: string - PortalVersion: number - Status: EnumAdUnitStatus - function TeleportConfirmed(self, placeId: number, player: Player): nil - function TeleportRejected(self, shouldCooldown: boolean, rejectedByDistance: boolean): nil -end - declare class AdService extends Instance AdTeleportEnded: RBXScriptSignal<> AdTeleportInitiated: RBXScriptSignal<> @@ -4419,56 +4408,6 @@ declare class AssetService extends Instance function SearchAudio(self, searchParameters: AudioSearchParams): AudioPages end -declare class Atmosphere extends Instance - Color: Color3 - Decay: Color3 - Density: number - Glare: number - Haze: number - Offset: number -end - -declare class Attachment extends Instance - Axis: Vector3 - CFrame: CFrame - Orientation: Vector3 - Position: Vector3 - SecondaryAxis: Vector3 - Visible: boolean - WorldAxis: Vector3 - WorldCFrame: CFrame - WorldOrientation: Vector3 - WorldPosition: Vector3 - WorldSecondaryAxis: Vector3 - function GetConstraints(self): { Instance } -end - -declare class Bone extends Attachment - Transform: CFrame - TransformedCFrame: CFrame - TransformedWorldCFrame: CFrame -end - -declare class AudioAnalyzer extends Instance - PeakLevel: number - RmsLevel: number - function GetSpectrum(self): { any } -end - -declare class AudioChorus extends Instance - Depth: number - Mix: number - Rate: number -end - -declare class AudioCompressor extends Instance - Attack: number - MakeupGain: number - Ratio: number - Release: number - Threshold: number -end - declare class AudioDeviceInput extends Instance AccessType: EnumAccessModifierType Active: boolean @@ -4809,29 +4748,6 @@ declare class WrapTarget extends BaseWrap Stiffness: number end -declare class Beam extends Instance - Attachment0: Attachment - Attachment1: Attachment - Brightness: number - Color: ColorSequence - CurveSize0: number - CurveSize1: number - Enabled: boolean - FaceCamera: boolean - LightEmission: number - LightInfluence: number - Segments: number - Texture: Content - TextureLength: number - TextureMode: EnumTextureMode - TextureSpeed: number - Transparency: NumberSequence - Width0: number - Width1: number - ZOffset: number - function SetTextureOffset(self, offset: number?): nil -end - declare class BindableEvent extends Instance Event: RBXScriptSignal<...any> function Fire(self, ...: any): () @@ -5113,22 +5029,9 @@ declare class DragDetector extends ClickDetector function SetDragStyleFunction(self, func: ((...any) -> ...any)): nil end -declare class Clouds extends Instance - Color: Color3 - Cover: number - Density: number - Enabled: boolean -end - declare class ClusterPacketCache extends Instance end -declare class Collaborator extends Instance - CFrame: CFrame - UserId: number - Username: string -end - declare class CollaboratorsService extends Instance end @@ -5174,15 +5077,6 @@ end declare class ConfigureServerService extends Instance end -declare class Constraint extends Instance - Active: boolean - Attachment0: Attachment - Attachment1: Attachment - Color: BrickColor - Enabled: boolean - Visible: boolean -end - declare class AlignOrientation extends Constraint AlignType: EnumAlignType CFrame: CFrame @@ -5811,24 +5705,6 @@ declare class DialogChoice extends Instance UserDialog: string end -declare class DraftsService extends Instance - CommitStatusChanged: RBXScriptSignal - DraftAdded: RBXScriptSignal - DraftRemoved: RBXScriptSignal - DraftStatusChanged: RBXScriptSignal - EditorsListChanged: RBXScriptSignal - UpdateStatusChanged: RBXScriptSignal - function CommitEdits(self, scripts: { Instance }): nil - function DiscardEdits(self, scripts: { Instance }): nil - function GetDraftStatus(self, script: Instance): EnumDraftStatusCode - function GetDrafts(self): { Instance } - function GetEditors(self, script: Instance): { Instance } - function RestoreScripts(self, scripts: { Instance }): nil - function ShowDiffsAgainstBase(self, scripts: { Instance }): nil - function ShowDiffsAgainstServer(self, scripts: { Instance }): nil - function UpdateToLatestVersion(self, scripts: { Instance }): nil -end - declare class Dragger extends Instance function AxisRotate(self, axis: EnumAxis?): nil function MouseDown(self, mousePart: Instance, pointOnMousePart: Vector3, parts: { Instance }): nil @@ -5836,26 +5712,6 @@ declare class Dragger extends Instance function MouseUp(self): nil end -declare class DraggerService extends Instance - AlignDraggedObjects: boolean - AngleSnapEnabled: boolean - AngleSnapIncrement: number - AnimateHover: boolean - CollisionsEnabled: boolean - DraggerCoordinateSpace: EnumDraggerCoordinateSpace - DraggerMovementMode: EnumDraggerMovementMode - GeometrySnapColor: Color3 - HoverAnimateFrequency: number - HoverLineThickness: number - HoverThickness: number - JointsEnabled: boolean - LinearSnapEnabled: boolean - LinearSnapIncrement: number - PivotSnapToGeometry: boolean - ShowHover: boolean - ShowPivotIndicator: boolean -end - declare class DynamicImage extends Instance Size: Vector2 function Clear(self): nil @@ -5919,59 +5775,6 @@ declare class FaceAnimatorService extends Instance function Stop(self): nil end -declare class FaceControls extends Instance - ChinRaiser: number - ChinRaiserUpperLip: number - Corrugator: number - EyesLookDown: number - EyesLookLeft: number - EyesLookRight: number - EyesLookUp: number - FlatPucker: number - Funneler: number - JawDrop: number - JawLeft: number - JawRight: number - LeftBrowLowerer: number - LeftCheekPuff: number - LeftCheekRaiser: number - LeftDimpler: number - LeftEyeClosed: number - LeftEyeUpperLidRaiser: number - LeftInnerBrowRaiser: number - LeftLipCornerDown: number - LeftLipCornerPuller: number - LeftLipStretcher: number - LeftLowerLipDepressor: number - LeftNoseWrinkler: number - LeftOuterBrowRaiser: number - LeftUpperLipRaiser: number - LipPresser: number - LipsTogether: number - LowerLipSuck: number - MouthLeft: number - MouthRight: number - Pucker: number - RightBrowLowerer: number - RightCheekPuff: number - RightCheekRaiser: number - RightDimpler: number - RightEyeClosed: number - RightEyeUpperLidRaiser: number - RightInnerBrowRaiser: number - RightLipCornerDown: number - RightLipCornerPuller: number - RightLipStretcher: number - RightLowerLipDepressor: number - RightNoseWrinkler: number - RightOuterBrowRaiser: number - RightUpperLipRaiser: number - TongueDown: number - TongueOut: number - TongueUp: number - UpperLipSuck: number -end - declare class FaceInstance extends Instance Face: EnumNormalId end @@ -6056,18 +5859,6 @@ declare class FloatCurve extends Instance function SetKeys(self, keys: { any }): number end -declare class FlyweightService extends Instance -end - -declare class CSGDictionaryService extends FlyweightService -end - -declare class NonReplicatedCSGDictionaryService extends FlyweightService -end - -declare class Folder extends Instance -end - declare class ForceField extends Instance Visible: boolean end @@ -6216,11 +6007,6 @@ declare class GuiObject extends GuiBase2d function TweenSizeAndPosition(self, endSize: UDim2, endPosition: UDim2, easingDirection: EnumEasingDirection?, easingStyle: EnumEasingStyle?, time: number?, override: boolean?, callback: ((...any) -> ...any)?): boolean end -declare class CanvasGroup extends GuiObject - GroupColor3: Color3 - GroupTransparency: number -end - declare class Frame extends GuiObject Style: EnumFrameStyle end @@ -6637,8 +6423,6 @@ end declare class GuiService extends Instance AutoSelectGuiEnabled: boolean CloseInspectMenuRequest: RBXScriptSignal<> - CoreEffectFolder: Folder - CoreGuiFolder: Folder CoreGuiNavigationEnabled: boolean CoreGuiRenderOverflowed: RBXScriptSignal<> EmotesMenuOpenChanged: RBXScriptSignal @@ -8082,13 +7866,6 @@ declare class Path extends Instance function GetWaypoints(self): { PathWaypoint } end -declare class PathfindingLink extends Instance - Attachment0: Attachment - Attachment1: Attachment - IsBidirectional: boolean - Label: string -end - declare class PathfindingModifier extends Instance Label: string PassThrough: boolean @@ -9017,15 +8794,12 @@ declare class ServiceProvider extends Instance DebuggerManager: DebuggerManager DebuggerUIService: DebuggerUIService DeviceIdService: DeviceIdService - DraftsService: DraftsService - DraggerService: DraggerService EventIngestService: EventIngestService ExperienceAuthService: ExperienceAuthService FaceAnimatorService: FaceAnimatorService FacialAnimationRecordingService: FacialAnimationRecordingService FacialAnimationStreamingServiceV2: FacialAnimationStreamingServiceV2 FlagStandService: FlagStandService - FlyweightService: FlyweightService FriendService: FriendService GamePassService: GamePassService GamepadService: GamepadService @@ -9160,7 +8934,6 @@ declare class ServiceProvider extends Instance TimerService: TimerService ToastNotificationService: ToastNotificationService TouchInputService: TouchInputService - TracerService: TracerService TutorialService: TutorialService TweenService: TweenService UGCAvatarService: UGCAvatarService @@ -9169,8 +8942,6 @@ declare class ServiceProvider extends Instance UserInputService: UserInputService UserService: UserService UserStorageService: UserStorageService - VRService: VRService - VRStatusService: VRStatusService VersionControlService: VersionControlService VideoCaptureService: VideoCaptureService VideoService: VideoService @@ -9235,15 +9006,12 @@ declare class ServiceProvider extends Instance function GetService(self, service: "DebuggerManager"): DebuggerManager function GetService(self, service: "DebuggerUIService"): DebuggerUIService function GetService(self, service: "DeviceIdService"): DeviceIdService - function GetService(self, service: "DraftsService"): DraftsService - function GetService(self, service: "DraggerService"): DraggerService function GetService(self, service: "EventIngestService"): EventIngestService function GetService(self, service: "ExperienceAuthService"): ExperienceAuthService function GetService(self, service: "FaceAnimatorService"): FaceAnimatorService function GetService(self, service: "FacialAnimationRecordingService"): FacialAnimationRecordingService function GetService(self, service: "FacialAnimationStreamingServiceV2"): FacialAnimationStreamingServiceV2 function GetService(self, service: "FlagStandService"): FlagStandService - function GetService(self, service: "FlyweightService"): FlyweightService function GetService(self, service: "FriendService"): FriendService function GetService(self, service: "GamePassService"): GamePassService function GetService(self, service: "GamepadService"): GamepadService @@ -9381,7 +9149,6 @@ declare class ServiceProvider extends Instance function GetService(self, service: "TimerService"): TimerService function GetService(self, service: "ToastNotificationService"): ToastNotificationService function GetService(self, service: "TouchInputService"): TouchInputService - function GetService(self, service: "TracerService"): TracerService function GetService(self, service: "TutorialService"): TutorialService function GetService(self, service: "TweenService"): TweenService function GetService(self, service: "UGCAvatarService"): UGCAvatarService @@ -9390,8 +9157,6 @@ declare class ServiceProvider extends Instance function GetService(self, service: "UserInputService"): UserInputService function GetService(self, service: "UserService"): UserService function GetService(self, service: "UserStorageService"): UserStorageService - function GetService(self, service: "VRService"): VRService - function GetService(self, service: "VRStatusService"): VRStatusService function GetService(self, service: "VersionControlService"): VersionControlService function GetService(self, service: "VideoCaptureService"): VideoCaptureService function GetService(self, service: "VideoService"): VideoService @@ -10329,11 +10094,6 @@ end declare class TouchTransmitter extends Instance end -declare class TracerService extends Instance - function FinishSpan(self, spanId: string): nil - function StartSpan(self, name: string, parentId: string): string -end - declare class TrackerLodController extends Instance AudioMode: EnumTrackerLodFlagMode UpdateState: RBXScriptSignal<> @@ -10349,26 +10109,6 @@ end declare class TrackerStreamAnimation extends Instance end -declare class Trail extends Instance - Attachment0: Attachment - Attachment1: Attachment - Brightness: number - Color: ColorSequence - Enabled: boolean - FaceCamera: boolean - Lifetime: number - LightEmission: number - LightInfluence: number - MaxLength: number - MinLength: number - Texture: Content - TextureLength: number - TextureMode: EnumTextureMode - Transparency: NumberSequence - WidthScale: NumberSequence - function Clear(self): nil -end - declare class Translator extends Instance LocaleId: string function FormatByKey(self, key: string, args: any): string @@ -10433,114 +10173,6 @@ declare class UGCValidationService extends Instance function ValidateUniqueUVCount(self, meshId: string, numRequired: number): boolean end -declare class UIBase extends Instance -end - -declare class UIComponent extends UIBase -end - -declare class UIConstraint extends UIComponent -end - -declare class UIAspectRatioConstraint extends UIConstraint - AspectRatio: number - AspectType: EnumAspectType - DominantAxis: EnumDominantAxis -end - -declare class UISizeConstraint extends UIConstraint - MaxSize: Vector2 - MinSize: Vector2 -end - -declare class UITextSizeConstraint extends UIConstraint - MaxTextSize: number - MinTextSize: number -end - -declare class UICorner extends UIComponent - CornerRadius: UDim -end - -declare class UIGradient extends UIComponent - Color: ColorSequence - Enabled: boolean - Offset: Vector2 - Rotation: number - Transparency: NumberSequence -end - -declare class UILayout extends UIComponent -end - -declare class UIGridStyleLayout extends UILayout - AbsoluteContentSize: Vector2 - FillDirection: EnumFillDirection - HorizontalAlignment: EnumHorizontalAlignment - SortOrder: EnumSortOrder - VerticalAlignment: EnumVerticalAlignment -end - -declare class UIGridLayout extends UIGridStyleLayout - AbsoluteCellCount: Vector2 - AbsoluteCellSize: Vector2 - CellPadding: UDim2 - CellSize: UDim2 - FillDirectionMaxCells: number - StartCorner: EnumStartCorner -end - -declare class UIListLayout extends UIGridStyleLayout - Padding: UDim -end - -declare class UIPageLayout extends UIGridStyleLayout - Animated: boolean - Circular: boolean - CurrentPage: GuiObject - EasingDirection: EnumEasingDirection - EasingStyle: EnumEasingStyle - GamepadInputEnabled: boolean - Padding: UDim - PageEnter: RBXScriptSignal - PageLeave: RBXScriptSignal - ScrollWheelInputEnabled: boolean - Stopped: RBXScriptSignal - TouchInputEnabled: boolean - TweenTime: number - function JumpTo(self, page: Instance): nil - function JumpToIndex(self, index: number): nil - function Next(self): nil - function Previous(self): nil -end - -declare class UITableLayout extends UIGridStyleLayout - FillEmptySpaceColumns: boolean - FillEmptySpaceRows: boolean - MajorAxis: EnumTableMajorAxis - Padding: UDim2 -end - -declare class UIPadding extends UIComponent - PaddingBottom: UDim - PaddingLeft: UDim - PaddingRight: UDim - PaddingTop: UDim -end - -declare class UIScale extends UIComponent - Scale: number -end - -declare class UIStroke extends UIComponent - ApplyStrokeMode: EnumApplyStrokeMode - Color: Color3 - Enabled: boolean - LineJoinMode: EnumLineJoinMode - Thickness: number - Transparency: number -end - declare class UnvalidatedAssetService extends Instance function AppendTempAssetId(self, userId: number, id: number, lookAt: Vector3, camPos: Vector3, usage: string): nil function AppendVantagePoint(self, userId: number, id: number, lookAt: Vector3, camPos: Vector3): boolean @@ -10692,35 +10324,6 @@ declare class UserService extends Instance function GetUserInfosByUserIdsAsync(self, userIds: { number }): { { Id: number, Username: string, DisplayName: string } } end -declare class VRService extends Instance - AutomaticScaling: EnumVRScaling - DidPointerHit: boolean - FadeOutViewOnCollision: boolean - GuiInputUserCFrame: EnumUserCFrame - LaserDistance: number - LaserPointerTriggered: RBXScriptSignal - NavigationRequested: RBXScriptSignal - PointerHitCFrame: CFrame - TouchpadModeChanged: RBXScriptSignal - UserCFrameChanged: RBXScriptSignal - UserCFrameEnabled: RBXScriptSignal - VRDeviceAvailable: boolean - VRDeviceName: string - VREnabled: boolean - VRSessionState: EnumVRSessionState - function GetTouchpadMode(self, pad: EnumVRTouchpad): EnumVRTouchpadMode - function GetUserCFrame(self, type: EnumUserCFrame): CFrame - function GetUserCFrameEnabled(self, type: EnumUserCFrame): boolean - function IsMaquettes(self): boolean - function IsVRAppBuild(self): boolean - function RecenterUserHeadCFrame(self): nil - function RequestNavigation(self, cframe: CFrame, inputUserCFrame: EnumUserCFrame): nil - function SetTouchpadMode(self, pad: EnumVRTouchpad, mode: EnumVRTouchpadMode): nil -end - -declare class VRStatusService extends Instance -end - declare class ValueBase extends Instance end @@ -10907,7 +10510,7 @@ declare class Wire extends Instance end declare Instance: { - new: ((className: "Accoutrement", parent: Instance?) -> Accoutrement) & ((className: "Accessory", parent: Instance?) -> Accessory) & ((className: "Hat", parent: Instance?) -> Hat) & ((className: "AdPortal", parent: Instance?) -> AdPortal) & ((className: "AdvancedDragger", parent: Instance?) -> AdvancedDragger) & ((className: "AnalyticsService", parent: Instance?) -> AnalyticsService) & ((className: "Animation", parent: Instance?) -> Animation) & ((className: "CurveAnimation", parent: Instance?) -> CurveAnimation) & ((className: "KeyframeSequence", parent: Instance?) -> KeyframeSequence) & ((className: "AnimationController", parent: Instance?) -> AnimationController) & ((className: "AnimationRigData", parent: Instance?) -> AnimationRigData) & ((className: "Animator", parent: Instance?) -> Animator) & ((className: "Atmosphere", parent: Instance?) -> Atmosphere) & ((className: "Attachment", parent: Instance?) -> Attachment) & ((className: "Bone", parent: Instance?) -> Bone) & ((className: "AudioAnalyzer", parent: Instance?) -> AudioAnalyzer) & ((className: "AudioChorus", parent: Instance?) -> AudioChorus) & ((className: "AudioCompressor", parent: Instance?) -> AudioCompressor) & ((className: "AudioDeviceInput", parent: Instance?) -> AudioDeviceInput) & ((className: "AudioDeviceOutput", parent: Instance?) -> AudioDeviceOutput) & ((className: "AudioDistortion", parent: Instance?) -> AudioDistortion) & ((className: "AudioEcho", parent: Instance?) -> AudioEcho) & ((className: "AudioEmitter", parent: Instance?) -> AudioEmitter) & ((className: "AudioEqualizer", parent: Instance?) -> AudioEqualizer) & ((className: "AudioFader", parent: Instance?) -> AudioFader) & ((className: "AudioFlanger", parent: Instance?) -> AudioFlanger) & ((className: "AudioListener", parent: Instance?) -> AudioListener) & ((className: "AudioPitchShifter", parent: Instance?) -> AudioPitchShifter) & ((className: "AudioPlayer", parent: Instance?) -> AudioPlayer) & ((className: "AudioReverb", parent: Instance?) -> AudioReverb) & ((className: "AudioSearchParams", parent: Instance?) -> AudioSearchParams) & ((className: "Backpack", parent: Instance?) -> Backpack) & ((className: "WrapLayer", parent: Instance?) -> WrapLayer) & ((className: "WrapTarget", parent: Instance?) -> WrapTarget) & ((className: "Beam", parent: Instance?) -> Beam) & ((className: "BindableEvent", parent: Instance?) -> BindableEvent) & ((className: "BindableFunction", parent: Instance?) -> BindableFunction) & ((className: "BodyAngularVelocity", parent: Instance?) -> BodyAngularVelocity) & ((className: "BodyForce", parent: Instance?) -> BodyForce) & ((className: "BodyGyro", parent: Instance?) -> BodyGyro) & ((className: "BodyPosition", parent: Instance?) -> BodyPosition) & ((className: "BodyThrust", parent: Instance?) -> BodyThrust) & ((className: "BodyVelocity", parent: Instance?) -> BodyVelocity) & ((className: "RocketPropulsion", parent: Instance?) -> RocketPropulsion) & ((className: "Breakpoint", parent: Instance?) -> Breakpoint) & ((className: "BubbleChatMessageProperties", parent: Instance?) -> BubbleChatMessageProperties) & ((className: "Camera", parent: Instance?) -> Camera) & ((className: "BodyColors", parent: Instance?) -> BodyColors) & ((className: "CharacterMesh", parent: Instance?) -> CharacterMesh) & ((className: "Pants", parent: Instance?) -> Pants) & ((className: "Shirt", parent: Instance?) -> Shirt) & ((className: "ShirtGraphic", parent: Instance?) -> ShirtGraphic) & ((className: "Skin", parent: Instance?) -> Skin) & ((className: "ClickDetector", parent: Instance?) -> ClickDetector) & ((className: "DragDetector", parent: Instance?) -> DragDetector) & ((className: "Clouds", parent: Instance?) -> Clouds) & ((className: "Configuration", parent: Instance?) -> Configuration) & ((className: "AlignOrientation", parent: Instance?) -> AlignOrientation) & ((className: "AlignPosition", parent: Instance?) -> AlignPosition) & ((className: "AngularVelocity", parent: Instance?) -> AngularVelocity) & ((className: "AnimationConstraint", parent: Instance?) -> AnimationConstraint) & ((className: "BallSocketConstraint", parent: Instance?) -> BallSocketConstraint) & ((className: "HingeConstraint", parent: Instance?) -> HingeConstraint) & ((className: "LineForce", parent: Instance?) -> LineForce) & ((className: "LinearVelocity", parent: Instance?) -> LinearVelocity) & ((className: "PlaneConstraint", parent: Instance?) -> PlaneConstraint) & ((className: "Plane", parent: Instance?) -> Plane) & ((className: "RigidConstraint", parent: Instance?) -> RigidConstraint) & ((className: "RodConstraint", parent: Instance?) -> RodConstraint) & ((className: "RopeConstraint", parent: Instance?) -> RopeConstraint) & ((className: "CylindricalConstraint", parent: Instance?) -> CylindricalConstraint) & ((className: "PrismaticConstraint", parent: Instance?) -> PrismaticConstraint) & ((className: "SpringConstraint", parent: Instance?) -> SpringConstraint) & ((className: "Torque", parent: Instance?) -> Torque) & ((className: "TorsionSpringConstraint", parent: Instance?) -> TorsionSpringConstraint) & ((className: "UniversalConstraint", parent: Instance?) -> UniversalConstraint) & ((className: "VectorForce", parent: Instance?) -> VectorForce) & ((className: "HumanoidController", parent: Instance?) -> HumanoidController) & ((className: "SkateboardController", parent: Instance?) -> SkateboardController) & ((className: "VehicleController", parent: Instance?) -> VehicleController) & ((className: "AirController", parent: Instance?) -> AirController) & ((className: "ClimbController", parent: Instance?) -> ClimbController) & ((className: "GroundController", parent: Instance?) -> GroundController) & ((className: "SwimController", parent: Instance?) -> SwimController) & ((className: "ControllerManager", parent: Instance?) -> ControllerManager) & ((className: "CustomEvent", parent: Instance?) -> CustomEvent) & ((className: "CustomEventReceiver", parent: Instance?) -> CustomEventReceiver) & ((className: "CylinderMesh", parent: Instance?) -> CylinderMesh) & ((className: "DynamicMesh", parent: Instance?) -> DynamicMesh) & ((className: "FileMesh", parent: Instance?) -> FileMesh) & ((className: "SpecialMesh", parent: Instance?) -> SpecialMesh) & ((className: "DataStoreIncrementOptions", parent: Instance?) -> DataStoreIncrementOptions) & ((className: "DataStoreOptions", parent: Instance?) -> DataStoreOptions) & ((className: "DataStoreSetOptions", parent: Instance?) -> DataStoreSetOptions) & ((className: "DebuggerWatch", parent: Instance?) -> DebuggerWatch) & ((className: "Dialog", parent: Instance?) -> Dialog) & ((className: "DialogChoice", parent: Instance?) -> DialogChoice) & ((className: "Dragger", parent: Instance?) -> Dragger) & ((className: "EulerRotationCurve", parent: Instance?) -> EulerRotationCurve) & ((className: "ExperienceInviteOptions", parent: Instance?) -> ExperienceInviteOptions) & ((className: "Explosion", parent: Instance?) -> Explosion) & ((className: "FaceControls", parent: Instance?) -> FaceControls) & ((className: "Decal", parent: Instance?) -> Decal) & ((className: "Texture", parent: Instance?) -> Texture) & ((className: "Hole", parent: Instance?) -> Hole) & ((className: "MotorFeature", parent: Instance?) -> MotorFeature) & ((className: "Fire", parent: Instance?) -> Fire) & ((className: "FloatCurve", parent: Instance?) -> FloatCurve) & ((className: "FlyweightService", parent: Instance?) -> FlyweightService) & ((className: "CSGDictionaryService", parent: Instance?) -> CSGDictionaryService) & ((className: "NonReplicatedCSGDictionaryService", parent: Instance?) -> NonReplicatedCSGDictionaryService) & ((className: "Folder", parent: Instance?) -> Folder) & ((className: "ForceField", parent: Instance?) -> ForceField) & ((className: "FunctionalTest", parent: Instance?) -> FunctionalTest) & ((className: "GetTextBoundsParams", parent: Instance?) -> GetTextBoundsParams) & ((className: "CanvasGroup", parent: Instance?) -> CanvasGroup) & ((className: "Frame", parent: Instance?) -> Frame) & ((className: "ImageButton", parent: Instance?) -> ImageButton) & ((className: "TextButton", parent: Instance?) -> TextButton) & ((className: "ImageLabel", parent: Instance?) -> ImageLabel) & ((className: "TextLabel", parent: Instance?) -> TextLabel) & ((className: "ScrollingFrame", parent: Instance?) -> ScrollingFrame) & ((className: "TextBox", parent: Instance?) -> TextBox) & ((className: "VideoFrame", parent: Instance?) -> VideoFrame) & ((className: "ViewportFrame", parent: Instance?) -> ViewportFrame) & ((className: "BillboardGui", parent: Instance?) -> BillboardGui) & ((className: "ScreenGui", parent: Instance?) -> ScreenGui) & ((className: "GuiMain", parent: Instance?) -> GuiMain) & ((className: "AdGui", parent: Instance?) -> AdGui) & ((className: "SurfaceGui", parent: Instance?) -> SurfaceGui) & ((className: "FloorWire", parent: Instance?) -> FloorWire) & ((className: "SelectionBox", parent: Instance?) -> SelectionBox) & ((className: "BoxHandleAdornment", parent: Instance?) -> BoxHandleAdornment) & ((className: "ConeHandleAdornment", parent: Instance?) -> ConeHandleAdornment) & ((className: "CylinderHandleAdornment", parent: Instance?) -> CylinderHandleAdornment) & ((className: "ImageHandleAdornment", parent: Instance?) -> ImageHandleAdornment) & ((className: "LineHandleAdornment", parent: Instance?) -> LineHandleAdornment) & ((className: "SphereHandleAdornment", parent: Instance?) -> SphereHandleAdornment) & ((className: "WireframeHandleAdornment", parent: Instance?) -> WireframeHandleAdornment) & ((className: "ParabolaAdornment", parent: Instance?) -> ParabolaAdornment) & ((className: "SelectionSphere", parent: Instance?) -> SelectionSphere) & ((className: "ArcHandles", parent: Instance?) -> ArcHandles) & ((className: "Handles", parent: Instance?) -> Handles) & ((className: "SurfaceSelection", parent: Instance?) -> SurfaceSelection) & ((className: "SelectionPartLasso", parent: Instance?) -> SelectionPartLasso) & ((className: "SelectionPointLasso", parent: Instance?) -> SelectionPointLasso) & ((className: "HeightmapImporterService", parent: Instance?) -> HeightmapImporterService) & ((className: "HiddenSurfaceRemovalAsset", parent: Instance?) -> HiddenSurfaceRemovalAsset) & ((className: "Highlight", parent: Instance?) -> Highlight) & ((className: "Humanoid", parent: Instance?) -> Humanoid) & ((className: "HumanoidDescription", parent: Instance?) -> HumanoidDescription) & ((className: "IKControl", parent: Instance?) -> IKControl) & ((className: "RotateP", parent: Instance?) -> RotateP) & ((className: "RotateV", parent: Instance?) -> RotateV) & ((className: "Glue", parent: Instance?) -> Glue) & ((className: "ManualGlue", parent: Instance?) -> ManualGlue) & ((className: "ManualWeld", parent: Instance?) -> ManualWeld) & ((className: "Motor", parent: Instance?) -> Motor) & ((className: "Motor6D", parent: Instance?) -> Motor6D) & ((className: "Rotate", parent: Instance?) -> Rotate) & ((className: "Snap", parent: Instance?) -> Snap) & ((className: "VelocityMotor", parent: Instance?) -> VelocityMotor) & ((className: "Weld", parent: Instance?) -> Weld) & ((className: "Keyframe", parent: Instance?) -> Keyframe) & ((className: "KeyframeMarker", parent: Instance?) -> KeyframeMarker) & ((className: "PointLight", parent: Instance?) -> PointLight) & ((className: "SpotLight", parent: Instance?) -> SpotLight) & ((className: "SurfaceLight", parent: Instance?) -> SurfaceLight) & ((className: "LocalizationTable", parent: Instance?) -> LocalizationTable) & ((className: "Script", parent: Instance?) -> Script) & ((className: "LocalScript", parent: Instance?) -> LocalScript) & ((className: "ModuleScript", parent: Instance?) -> ModuleScript) & ((className: "MarkerCurve", parent: Instance?) -> MarkerCurve) & ((className: "MaterialVariant", parent: Instance?) -> MaterialVariant) & ((className: "MemoryStoreService", parent: Instance?) -> MemoryStoreService) & ((className: "Message", parent: Instance?) -> Message) & ((className: "Hint", parent: Instance?) -> Hint) & ((className: "NoCollisionConstraint", parent: Instance?) -> NoCollisionConstraint) & ((className: "CornerWedgePart", parent: Instance?) -> CornerWedgePart) & ((className: "Part", parent: Instance?) -> Part) & ((className: "FlagStand", parent: Instance?) -> FlagStand) & ((className: "Seat", parent: Instance?) -> Seat) & ((className: "SkateboardPlatform", parent: Instance?) -> SkateboardPlatform) & ((className: "SpawnLocation", parent: Instance?) -> SpawnLocation) & ((className: "WedgePart", parent: Instance?) -> WedgePart) & ((className: "MeshPart", parent: Instance?) -> MeshPart) & ((className: "PartOperation", parent: Instance?) -> PartOperation) & ((className: "IntersectOperation", parent: Instance?) -> IntersectOperation) & ((className: "NegateOperation", parent: Instance?) -> NegateOperation) & ((className: "UnionOperation", parent: Instance?) -> UnionOperation) & ((className: "TrussPart", parent: Instance?) -> TrussPart) & ((className: "VehicleSeat", parent: Instance?) -> VehicleSeat) & ((className: "Model", parent: Instance?) -> Model) & ((className: "Actor", parent: Instance?) -> Actor) & ((className: "HopperBin", parent: Instance?) -> HopperBin) & ((className: "Tool", parent: Instance?) -> Tool) & ((className: "Flag", parent: Instance?) -> Flag) & ((className: "WorldModel", parent: Instance?) -> WorldModel) & ((className: "PartOperationAsset", parent: Instance?) -> PartOperationAsset) & ((className: "ParticleEmitter", parent: Instance?) -> ParticleEmitter) & ((className: "PathfindingLink", parent: Instance?) -> PathfindingLink) & ((className: "PathfindingModifier", parent: Instance?) -> PathfindingModifier) & ((className: "Player", parent: Instance?) -> Player) & ((className: "PluginAction", parent: Instance?) -> PluginAction) & ((className: "PluginCapabilities", parent: Instance?) -> PluginCapabilities) & ((className: "NumberPose", parent: Instance?) -> NumberPose) & ((className: "Pose", parent: Instance?) -> Pose) & ((className: "BloomEffect", parent: Instance?) -> BloomEffect) & ((className: "BlurEffect", parent: Instance?) -> BlurEffect) & ((className: "ColorCorrectionEffect", parent: Instance?) -> ColorCorrectionEffect) & ((className: "DepthOfFieldEffect", parent: Instance?) -> DepthOfFieldEffect) & ((className: "SunRaysEffect", parent: Instance?) -> SunRaysEffect) & ((className: "ProximityPrompt", parent: Instance?) -> ProximityPrompt) & ((className: "ProximityPromptService", parent: Instance?) -> ProximityPromptService) & ((className: "ReflectionMetadata", parent: Instance?) -> ReflectionMetadata) & ((className: "ReflectionMetadataCallbacks", parent: Instance?) -> ReflectionMetadataCallbacks) & ((className: "ReflectionMetadataClasses", parent: Instance?) -> ReflectionMetadataClasses) & ((className: "ReflectionMetadataEnums", parent: Instance?) -> ReflectionMetadataEnums) & ((className: "ReflectionMetadataEvents", parent: Instance?) -> ReflectionMetadataEvents) & ((className: "ReflectionMetadataFunctions", parent: Instance?) -> ReflectionMetadataFunctions) & ((className: "ReflectionMetadataClass", parent: Instance?) -> ReflectionMetadataClass) & ((className: "ReflectionMetadataEnum", parent: Instance?) -> ReflectionMetadataEnum) & ((className: "ReflectionMetadataEnumItem", parent: Instance?) -> ReflectionMetadataEnumItem) & ((className: "ReflectionMetadataMember", parent: Instance?) -> ReflectionMetadataMember) & ((className: "ReflectionMetadataProperties", parent: Instance?) -> ReflectionMetadataProperties) & ((className: "ReflectionMetadataYieldFunctions", parent: Instance?) -> ReflectionMetadataYieldFunctions) & ((className: "RemoteEvent", parent: Instance?) -> RemoteEvent) & ((className: "RemoteFunction", parent: Instance?) -> RemoteFunction) & ((className: "RenderingTest", parent: Instance?) -> RenderingTest) & ((className: "RotationCurve", parent: Instance?) -> RotationCurve) & ((className: "BuoyancySensor", parent: Instance?) -> BuoyancySensor) & ((className: "ControllerPartSensor", parent: Instance?) -> ControllerPartSensor) & ((className: "Sky", parent: Instance?) -> Sky) & ((className: "Smoke", parent: Instance?) -> Smoke) & ((className: "Sound", parent: Instance?) -> Sound) & ((className: "ChorusSoundEffect", parent: Instance?) -> ChorusSoundEffect) & ((className: "CompressorSoundEffect", parent: Instance?) -> CompressorSoundEffect) & ((className: "DistortionSoundEffect", parent: Instance?) -> DistortionSoundEffect) & ((className: "EchoSoundEffect", parent: Instance?) -> EchoSoundEffect) & ((className: "EqualizerSoundEffect", parent: Instance?) -> EqualizerSoundEffect) & ((className: "FlangeSoundEffect", parent: Instance?) -> FlangeSoundEffect) & ((className: "PitchShiftSoundEffect", parent: Instance?) -> PitchShiftSoundEffect) & ((className: "ReverbSoundEffect", parent: Instance?) -> ReverbSoundEffect) & ((className: "TremoloSoundEffect", parent: Instance?) -> TremoloSoundEffect) & ((className: "SoundGroup", parent: Instance?) -> SoundGroup) & ((className: "Sparkles", parent: Instance?) -> Sparkles) & ((className: "StandalonePluginScripts", parent: Instance?) -> StandalonePluginScripts) & ((className: "StarterGear", parent: Instance?) -> StarterGear) & ((className: "StudioCallout", parent: Instance?) -> StudioCallout) & ((className: "StudioObjectBase", parent: Instance?) -> StudioObjectBase) & ((className: "StudioWidget", parent: Instance?) -> StudioWidget) & ((className: "StyleRule", parent: Instance?) -> StyleRule) & ((className: "StyleSheet", parent: Instance?) -> StyleSheet) & ((className: "StyleDerive", parent: Instance?) -> StyleDerive) & ((className: "StyleLink", parent: Instance?) -> StyleLink) & ((className: "SurfaceAppearance", parent: Instance?) -> SurfaceAppearance) & ((className: "Team", parent: Instance?) -> Team) & ((className: "TeleportOptions", parent: Instance?) -> TeleportOptions) & ((className: "TerrainDetail", parent: Instance?) -> TerrainDetail) & ((className: "TerrainRegion", parent: Instance?) -> TerrainRegion) & ((className: "TestService", parent: Instance?) -> TestService) & ((className: "TextChannel", parent: Instance?) -> TextChannel) & ((className: "TextChatCommand", parent: Instance?) -> TextChatCommand) & ((className: "TextChatMessageProperties", parent: Instance?) -> TextChatMessageProperties) & ((className: "TrackerStreamAnimation", parent: Instance?) -> TrackerStreamAnimation) & ((className: "Trail", parent: Instance?) -> Trail) & ((className: "Tween", parent: Instance?) -> Tween) & ((className: "UIAspectRatioConstraint", parent: Instance?) -> UIAspectRatioConstraint) & ((className: "UISizeConstraint", parent: Instance?) -> UISizeConstraint) & ((className: "UITextSizeConstraint", parent: Instance?) -> UITextSizeConstraint) & ((className: "UICorner", parent: Instance?) -> UICorner) & ((className: "UIGradient", parent: Instance?) -> UIGradient) & ((className: "UIGridLayout", parent: Instance?) -> UIGridLayout) & ((className: "UIListLayout", parent: Instance?) -> UIListLayout) & ((className: "UIPageLayout", parent: Instance?) -> UIPageLayout) & ((className: "UITableLayout", parent: Instance?) -> UITableLayout) & ((className: "UIPadding", parent: Instance?) -> UIPadding) & ((className: "UIScale", parent: Instance?) -> UIScale) & ((className: "UIStroke", parent: Instance?) -> UIStroke) & ((className: "BinaryStringValue", parent: Instance?) -> BinaryStringValue) & ((className: "BoolValue", parent: Instance?) -> BoolValue) & ((className: "BrickColorValue", parent: Instance?) -> BrickColorValue) & ((className: "CFrameValue", parent: Instance?) -> CFrameValue) & ((className: "Color3Value", parent: Instance?) -> Color3Value) & ((className: "DoubleConstrainedValue", parent: Instance?) -> DoubleConstrainedValue) & ((className: "IntConstrainedValue", parent: Instance?) -> IntConstrainedValue) & ((className: "IntValue", parent: Instance?) -> IntValue) & ((className: "NumberValue", parent: Instance?) -> NumberValue) & ((className: "ObjectValue", parent: Instance?) -> ObjectValue) & ((className: "RayValue", parent: Instance?) -> RayValue) & ((className: "StringValue", parent: Instance?) -> StringValue) & ((className: "Vector3Value", parent: Instance?) -> Vector3Value) & ((className: "Vector3Curve", parent: Instance?) -> Vector3Curve) & ((className: "VirtualInputManager", parent: Instance?) -> VirtualInputManager) & ((className: "WeldConstraint", parent: Instance?) -> WeldConstraint) & ((className: "Wire", parent: Instance?) -> Wire) & ((className: string, parent: Instance?) -> Instance), + new: ((className: "Accoutrement", parent: Instance?) -> Accoutrement) & ((className: "Accessory", parent: Instance?) -> Accessory) & ((className: "Hat", parent: Instance?) -> Hat) & ((className: "AdvancedDragger", parent: Instance?) -> AdvancedDragger) & ((className: "AnalyticsService", parent: Instance?) -> AnalyticsService) & ((className: "Animation", parent: Instance?) -> Animation) & ((className: "CurveAnimation", parent: Instance?) -> CurveAnimation) & ((className: "KeyframeSequence", parent: Instance?) -> KeyframeSequence) & ((className: "AnimationController", parent: Instance?) -> AnimationController) & ((className: "AnimationRigData", parent: Instance?) -> AnimationRigData) & ((className: "Animator", parent: Instance?) -> Animator) & ((className: "AudioDeviceInput", parent: Instance?) -> AudioDeviceInput) & ((className: "AudioDeviceOutput", parent: Instance?) -> AudioDeviceOutput) & ((className: "AudioDistortion", parent: Instance?) -> AudioDistortion) & ((className: "AudioEcho", parent: Instance?) -> AudioEcho) & ((className: "AudioEmitter", parent: Instance?) -> AudioEmitter) & ((className: "AudioEqualizer", parent: Instance?) -> AudioEqualizer) & ((className: "AudioFader", parent: Instance?) -> AudioFader) & ((className: "AudioFlanger", parent: Instance?) -> AudioFlanger) & ((className: "AudioListener", parent: Instance?) -> AudioListener) & ((className: "AudioPitchShifter", parent: Instance?) -> AudioPitchShifter) & ((className: "AudioPlayer", parent: Instance?) -> AudioPlayer) & ((className: "AudioReverb", parent: Instance?) -> AudioReverb) & ((className: "AudioSearchParams", parent: Instance?) -> AudioSearchParams) & ((className: "Backpack", parent: Instance?) -> Backpack) & ((className: "WrapLayer", parent: Instance?) -> WrapLayer) & ((className: "WrapTarget", parent: Instance?) -> WrapTarget) & ((className: "BindableEvent", parent: Instance?) -> BindableEvent) & ((className: "BindableFunction", parent: Instance?) -> BindableFunction) & ((className: "BodyAngularVelocity", parent: Instance?) -> BodyAngularVelocity) & ((className: "BodyForce", parent: Instance?) -> BodyForce) & ((className: "BodyGyro", parent: Instance?) -> BodyGyro) & ((className: "BodyPosition", parent: Instance?) -> BodyPosition) & ((className: "BodyThrust", parent: Instance?) -> BodyThrust) & ((className: "BodyVelocity", parent: Instance?) -> BodyVelocity) & ((className: "RocketPropulsion", parent: Instance?) -> RocketPropulsion) & ((className: "Breakpoint", parent: Instance?) -> Breakpoint) & ((className: "BubbleChatMessageProperties", parent: Instance?) -> BubbleChatMessageProperties) & ((className: "Camera", parent: Instance?) -> Camera) & ((className: "BodyColors", parent: Instance?) -> BodyColors) & ((className: "CharacterMesh", parent: Instance?) -> CharacterMesh) & ((className: "Pants", parent: Instance?) -> Pants) & ((className: "Shirt", parent: Instance?) -> Shirt) & ((className: "ShirtGraphic", parent: Instance?) -> ShirtGraphic) & ((className: "Skin", parent: Instance?) -> Skin) & ((className: "ClickDetector", parent: Instance?) -> ClickDetector) & ((className: "DragDetector", parent: Instance?) -> DragDetector) & ((className: "Configuration", parent: Instance?) -> Configuration) & ((className: "AlignOrientation", parent: Instance?) -> AlignOrientation) & ((className: "AlignPosition", parent: Instance?) -> AlignPosition) & ((className: "AngularVelocity", parent: Instance?) -> AngularVelocity) & ((className: "AnimationConstraint", parent: Instance?) -> AnimationConstraint) & ((className: "BallSocketConstraint", parent: Instance?) -> BallSocketConstraint) & ((className: "HingeConstraint", parent: Instance?) -> HingeConstraint) & ((className: "LineForce", parent: Instance?) -> LineForce) & ((className: "LinearVelocity", parent: Instance?) -> LinearVelocity) & ((className: "PlaneConstraint", parent: Instance?) -> PlaneConstraint) & ((className: "Plane", parent: Instance?) -> Plane) & ((className: "RigidConstraint", parent: Instance?) -> RigidConstraint) & ((className: "RodConstraint", parent: Instance?) -> RodConstraint) & ((className: "RopeConstraint", parent: Instance?) -> RopeConstraint) & ((className: "CylindricalConstraint", parent: Instance?) -> CylindricalConstraint) & ((className: "PrismaticConstraint", parent: Instance?) -> PrismaticConstraint) & ((className: "SpringConstraint", parent: Instance?) -> SpringConstraint) & ((className: "Torque", parent: Instance?) -> Torque) & ((className: "TorsionSpringConstraint", parent: Instance?) -> TorsionSpringConstraint) & ((className: "UniversalConstraint", parent: Instance?) -> UniversalConstraint) & ((className: "VectorForce", parent: Instance?) -> VectorForce) & ((className: "HumanoidController", parent: Instance?) -> HumanoidController) & ((className: "SkateboardController", parent: Instance?) -> SkateboardController) & ((className: "VehicleController", parent: Instance?) -> VehicleController) & ((className: "AirController", parent: Instance?) -> AirController) & ((className: "ClimbController", parent: Instance?) -> ClimbController) & ((className: "GroundController", parent: Instance?) -> GroundController) & ((className: "SwimController", parent: Instance?) -> SwimController) & ((className: "ControllerManager", parent: Instance?) -> ControllerManager) & ((className: "CustomEvent", parent: Instance?) -> CustomEvent) & ((className: "CustomEventReceiver", parent: Instance?) -> CustomEventReceiver) & ((className: "CylinderMesh", parent: Instance?) -> CylinderMesh) & ((className: "DynamicMesh", parent: Instance?) -> DynamicMesh) & ((className: "FileMesh", parent: Instance?) -> FileMesh) & ((className: "SpecialMesh", parent: Instance?) -> SpecialMesh) & ((className: "DataStoreIncrementOptions", parent: Instance?) -> DataStoreIncrementOptions) & ((className: "DataStoreOptions", parent: Instance?) -> DataStoreOptions) & ((className: "DataStoreSetOptions", parent: Instance?) -> DataStoreSetOptions) & ((className: "DebuggerWatch", parent: Instance?) -> DebuggerWatch) & ((className: "Dialog", parent: Instance?) -> Dialog) & ((className: "DialogChoice", parent: Instance?) -> DialogChoice) & ((className: "Dragger", parent: Instance?) -> Dragger) & ((className: "EulerRotationCurve", parent: Instance?) -> EulerRotationCurve) & ((className: "ExperienceInviteOptions", parent: Instance?) -> ExperienceInviteOptions) & ((className: "Explosion", parent: Instance?) -> Explosion) & ((className: "Decal", parent: Instance?) -> Decal) & ((className: "Texture", parent: Instance?) -> Texture) & ((className: "Hole", parent: Instance?) -> Hole) & ((className: "MotorFeature", parent: Instance?) -> MotorFeature) & ((className: "Fire", parent: Instance?) -> Fire) & ((className: "FloatCurve", parent: Instance?) -> FloatCurve) & ((className: "CSGDictionaryService", parent: Instance?) -> CSGDictionaryService) & ((className: "NonReplicatedCSGDictionaryService", parent: Instance?) -> NonReplicatedCSGDictionaryService) & ((className: "ForceField", parent: Instance?) -> ForceField) & ((className: "FunctionalTest", parent: Instance?) -> FunctionalTest) & ((className: "GetTextBoundsParams", parent: Instance?) -> GetTextBoundsParams) & ((className: "Frame", parent: Instance?) -> Frame) & ((className: "ImageButton", parent: Instance?) -> ImageButton) & ((className: "TextButton", parent: Instance?) -> TextButton) & ((className: "ImageLabel", parent: Instance?) -> ImageLabel) & ((className: "TextLabel", parent: Instance?) -> TextLabel) & ((className: "ScrollingFrame", parent: Instance?) -> ScrollingFrame) & ((className: "TextBox", parent: Instance?) -> TextBox) & ((className: "VideoFrame", parent: Instance?) -> VideoFrame) & ((className: "ViewportFrame", parent: Instance?) -> ViewportFrame) & ((className: "BillboardGui", parent: Instance?) -> BillboardGui) & ((className: "ScreenGui", parent: Instance?) -> ScreenGui) & ((className: "GuiMain", parent: Instance?) -> GuiMain) & ((className: "AdGui", parent: Instance?) -> AdGui) & ((className: "SurfaceGui", parent: Instance?) -> SurfaceGui) & ((className: "FloorWire", parent: Instance?) -> FloorWire) & ((className: "SelectionBox", parent: Instance?) -> SelectionBox) & ((className: "BoxHandleAdornment", parent: Instance?) -> BoxHandleAdornment) & ((className: "ConeHandleAdornment", parent: Instance?) -> ConeHandleAdornment) & ((className: "CylinderHandleAdornment", parent: Instance?) -> CylinderHandleAdornment) & ((className: "ImageHandleAdornment", parent: Instance?) -> ImageHandleAdornment) & ((className: "LineHandleAdornment", parent: Instance?) -> LineHandleAdornment) & ((className: "SphereHandleAdornment", parent: Instance?) -> SphereHandleAdornment) & ((className: "WireframeHandleAdornment", parent: Instance?) -> WireframeHandleAdornment) & ((className: "ParabolaAdornment", parent: Instance?) -> ParabolaAdornment) & ((className: "SelectionSphere", parent: Instance?) -> SelectionSphere) & ((className: "ArcHandles", parent: Instance?) -> ArcHandles) & ((className: "Handles", parent: Instance?) -> Handles) & ((className: "SurfaceSelection", parent: Instance?) -> SurfaceSelection) & ((className: "SelectionPartLasso", parent: Instance?) -> SelectionPartLasso) & ((className: "SelectionPointLasso", parent: Instance?) -> SelectionPointLasso) & ((className: "HeightmapImporterService", parent: Instance?) -> HeightmapImporterService) & ((className: "HiddenSurfaceRemovalAsset", parent: Instance?) -> HiddenSurfaceRemovalAsset) & ((className: "Highlight", parent: Instance?) -> Highlight) & ((className: "Humanoid", parent: Instance?) -> Humanoid) & ((className: "HumanoidDescription", parent: Instance?) -> HumanoidDescription) & ((className: "IKControl", parent: Instance?) -> IKControl) & ((className: "RotateP", parent: Instance?) -> RotateP) & ((className: "RotateV", parent: Instance?) -> RotateV) & ((className: "Glue", parent: Instance?) -> Glue) & ((className: "ManualGlue", parent: Instance?) -> ManualGlue) & ((className: "ManualWeld", parent: Instance?) -> ManualWeld) & ((className: "Motor", parent: Instance?) -> Motor) & ((className: "Motor6D", parent: Instance?) -> Motor6D) & ((className: "Rotate", parent: Instance?) -> Rotate) & ((className: "Snap", parent: Instance?) -> Snap) & ((className: "VelocityMotor", parent: Instance?) -> VelocityMotor) & ((className: "Weld", parent: Instance?) -> Weld) & ((className: "Keyframe", parent: Instance?) -> Keyframe) & ((className: "KeyframeMarker", parent: Instance?) -> KeyframeMarker) & ((className: "PointLight", parent: Instance?) -> PointLight) & ((className: "SpotLight", parent: Instance?) -> SpotLight) & ((className: "SurfaceLight", parent: Instance?) -> SurfaceLight) & ((className: "LocalizationTable", parent: Instance?) -> LocalizationTable) & ((className: "Script", parent: Instance?) -> Script) & ((className: "LocalScript", parent: Instance?) -> LocalScript) & ((className: "ModuleScript", parent: Instance?) -> ModuleScript) & ((className: "MarkerCurve", parent: Instance?) -> MarkerCurve) & ((className: "MaterialVariant", parent: Instance?) -> MaterialVariant) & ((className: "MemoryStoreService", parent: Instance?) -> MemoryStoreService) & ((className: "Message", parent: Instance?) -> Message) & ((className: "Hint", parent: Instance?) -> Hint) & ((className: "NoCollisionConstraint", parent: Instance?) -> NoCollisionConstraint) & ((className: "CornerWedgePart", parent: Instance?) -> CornerWedgePart) & ((className: "Part", parent: Instance?) -> Part) & ((className: "FlagStand", parent: Instance?) -> FlagStand) & ((className: "Seat", parent: Instance?) -> Seat) & ((className: "SkateboardPlatform", parent: Instance?) -> SkateboardPlatform) & ((className: "SpawnLocation", parent: Instance?) -> SpawnLocation) & ((className: "WedgePart", parent: Instance?) -> WedgePart) & ((className: "MeshPart", parent: Instance?) -> MeshPart) & ((className: "PartOperation", parent: Instance?) -> PartOperation) & ((className: "IntersectOperation", parent: Instance?) -> IntersectOperation) & ((className: "NegateOperation", parent: Instance?) -> NegateOperation) & ((className: "UnionOperation", parent: Instance?) -> UnionOperation) & ((className: "TrussPart", parent: Instance?) -> TrussPart) & ((className: "VehicleSeat", parent: Instance?) -> VehicleSeat) & ((className: "Model", parent: Instance?) -> Model) & ((className: "Actor", parent: Instance?) -> Actor) & ((className: "HopperBin", parent: Instance?) -> HopperBin) & ((className: "Tool", parent: Instance?) -> Tool) & ((className: "Flag", parent: Instance?) -> Flag) & ((className: "WorldModel", parent: Instance?) -> WorldModel) & ((className: "PartOperationAsset", parent: Instance?) -> PartOperationAsset) & ((className: "ParticleEmitter", parent: Instance?) -> ParticleEmitter) & ((className: "PathfindingLink", parent: Instance?) -> PathfindingLink) & ((className: "PathfindingModifier", parent: Instance?) -> PathfindingModifier) & ((className: "Player", parent: Instance?) -> Player) & ((className: "PluginAction", parent: Instance?) -> PluginAction) & ((className: "PluginCapabilities", parent: Instance?) -> PluginCapabilities) & ((className: "NumberPose", parent: Instance?) -> NumberPose) & ((className: "Pose", parent: Instance?) -> Pose) & ((className: "BloomEffect", parent: Instance?) -> BloomEffect) & ((className: "BlurEffect", parent: Instance?) -> BlurEffect) & ((className: "ColorCorrectionEffect", parent: Instance?) -> ColorCorrectionEffect) & ((className: "DepthOfFieldEffect", parent: Instance?) -> DepthOfFieldEffect) & ((className: "SunRaysEffect", parent: Instance?) -> SunRaysEffect) & ((className: "ProximityPrompt", parent: Instance?) -> ProximityPrompt) & ((className: "ProximityPromptService", parent: Instance?) -> ProximityPromptService) & ((className: "ReflectionMetadata", parent: Instance?) -> ReflectionMetadata) & ((className: "ReflectionMetadataCallbacks", parent: Instance?) -> ReflectionMetadataCallbacks) & ((className: "ReflectionMetadataClasses", parent: Instance?) -> ReflectionMetadataClasses) & ((className: "ReflectionMetadataEnums", parent: Instance?) -> ReflectionMetadataEnums) & ((className: "ReflectionMetadataEvents", parent: Instance?) -> ReflectionMetadataEvents) & ((className: "ReflectionMetadataFunctions", parent: Instance?) -> ReflectionMetadataFunctions) & ((className: "ReflectionMetadataClass", parent: Instance?) -> ReflectionMetadataClass) & ((className: "ReflectionMetadataEnum", parent: Instance?) -> ReflectionMetadataEnum) & ((className: "ReflectionMetadataEnumItem", parent: Instance?) -> ReflectionMetadataEnumItem) & ((className: "ReflectionMetadataMember", parent: Instance?) -> ReflectionMetadataMember) & ((className: "ReflectionMetadataProperties", parent: Instance?) -> ReflectionMetadataProperties) & ((className: "ReflectionMetadataYieldFunctions", parent: Instance?) -> ReflectionMetadataYieldFunctions) & ((className: "RemoteEvent", parent: Instance?) -> RemoteEvent) & ((className: "RemoteFunction", parent: Instance?) -> RemoteFunction) & ((className: "RenderingTest", parent: Instance?) -> RenderingTest) & ((className: "RotationCurve", parent: Instance?) -> RotationCurve) & ((className: "BuoyancySensor", parent: Instance?) -> BuoyancySensor) & ((className: "ControllerPartSensor", parent: Instance?) -> ControllerPartSensor) & ((className: "Sky", parent: Instance?) -> Sky) & ((className: "Smoke", parent: Instance?) -> Smoke) & ((className: "Sound", parent: Instance?) -> Sound) & ((className: "ChorusSoundEffect", parent: Instance?) -> ChorusSoundEffect) & ((className: "CompressorSoundEffect", parent: Instance?) -> CompressorSoundEffect) & ((className: "DistortionSoundEffect", parent: Instance?) -> DistortionSoundEffect) & ((className: "EchoSoundEffect", parent: Instance?) -> EchoSoundEffect) & ((className: "EqualizerSoundEffect", parent: Instance?) -> EqualizerSoundEffect) & ((className: "FlangeSoundEffect", parent: Instance?) -> FlangeSoundEffect) & ((className: "PitchShiftSoundEffect", parent: Instance?) -> PitchShiftSoundEffect) & ((className: "ReverbSoundEffect", parent: Instance?) -> ReverbSoundEffect) & ((className: "TremoloSoundEffect", parent: Instance?) -> TremoloSoundEffect) & ((className: "SoundGroup", parent: Instance?) -> SoundGroup) & ((className: "Sparkles", parent: Instance?) -> Sparkles) & ((className: "StandalonePluginScripts", parent: Instance?) -> StandalonePluginScripts) & ((className: "StarterGear", parent: Instance?) -> StarterGear) & ((className: "StudioCallout", parent: Instance?) -> StudioCallout) & ((className: "StudioObjectBase", parent: Instance?) -> StudioObjectBase) & ((className: "StudioWidget", parent: Instance?) -> StudioWidget) & ((className: "StyleRule", parent: Instance?) -> StyleRule) & ((className: "StyleSheet", parent: Instance?) -> StyleSheet) & ((className: "StyleDerive", parent: Instance?) -> StyleDerive) & ((className: "StyleLink", parent: Instance?) -> StyleLink) & ((className: "SurfaceAppearance", parent: Instance?) -> SurfaceAppearance) & ((className: "Team", parent: Instance?) -> Team) & ((className: "TeleportOptions", parent: Instance?) -> TeleportOptions) & ((className: "TerrainDetail", parent: Instance?) -> TerrainDetail) & ((className: "TerrainRegion", parent: Instance?) -> TerrainRegion) & ((className: "TestService", parent: Instance?) -> TestService) & ((className: "TextChannel", parent: Instance?) -> TextChannel) & ((className: "TextChatCommand", parent: Instance?) -> TextChatCommand) & ((className: "TextChatMessageProperties", parent: Instance?) -> TextChatMessageProperties) & ((className: "TrackerStreamAnimation", parent: Instance?) -> TrackerStreamAnimation) & ((className: "Tween", parent: Instance?) -> Tween) & ((className: "BinaryStringValue", parent: Instance?) -> BinaryStringValue) & ((className: "BoolValue", parent: Instance?) -> BoolValue) & ((className: "BrickColorValue", parent: Instance?) -> BrickColorValue) & ((className: "CFrameValue", parent: Instance?) -> CFrameValue) & ((className: "Color3Value", parent: Instance?) -> Color3Value) & ((className: "DoubleConstrainedValue", parent: Instance?) -> DoubleConstrainedValue) & ((className: "IntConstrainedValue", parent: Instance?) -> IntConstrainedValue) & ((className: "IntValue", parent: Instance?) -> IntValue) & ((className: "NumberValue", parent: Instance?) -> NumberValue) & ((className: "ObjectValue", parent: Instance?) -> ObjectValue) & ((className: "RayValue", parent: Instance?) -> RayValue) & ((className: "StringValue", parent: Instance?) -> StringValue) & ((className: "Vector3Value", parent: Instance?) -> Vector3Value) & ((className: "Vector3Curve", parent: Instance?) -> Vector3Curve) & ((className: "VirtualInputManager", parent: Instance?) -> VirtualInputManager) & ((className: "WeldConstraint", parent: Instance?) -> WeldConstraint) & ((className: "Wire", parent: Instance?) -> Wire) & ((className: string, parent: Instance?) -> Instance), Lock: (instance: Instance, player: Player) -> nil, Unlock: (instance: Instance) -> nil, From f9924be72e2f147b7a711b6238162450cf6bf6e7 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Sat, 2 Sep 2023 23:33:47 +0100 Subject: [PATCH 11/14] Add heliodex/1filefusion as a library, loadable by LoadLibrary "RbxFusion", and remove more unused type definitions --- defs.d.lua | 454 +----- luau/10000001.luau | 3316 ++++++++++++++++++++++++++++++++++++++++++++ luau/60595695.luau | 1 + 3 files changed, 3319 insertions(+), 452 deletions(-) create mode 100644 luau/10000001.luau diff --git a/defs.d.lua b/defs.d.lua index fa7cb75..85274dc 100644 --- a/defs.d.lua +++ b/defs.d.lua @@ -2236,23 +2236,6 @@ declare class EnumPropertyStatus_INTERNAL extends Enum Warning: EnumPropertyStatus Error: EnumPropertyStatus end -declare class EnumProximityPromptExclusivity extends EnumItem end -declare class EnumProximityPromptExclusivity_INTERNAL extends Enum - OnePerButton: EnumProximityPromptExclusivity - OneGlobally: EnumProximityPromptExclusivity - AlwaysShow: EnumProximityPromptExclusivity -end -declare class EnumProximityPromptInputType extends EnumItem end -declare class EnumProximityPromptInputType_INTERNAL extends Enum - Keyboard: EnumProximityPromptInputType - Gamepad: EnumProximityPromptInputType - Touch: EnumProximityPromptInputType -end -declare class EnumProximityPromptStyle extends EnumItem end -declare class EnumProximityPromptStyle_INTERNAL extends Enum - Default: EnumProximityPromptStyle - Custom: EnumProximityPromptStyle -end declare class EnumQualityLevel extends EnumItem end declare class EnumQualityLevel_INTERNAL extends Enum Automatic: EnumQualityLevel @@ -3594,9 +3577,6 @@ type ENUM_LIST = { PromptCreateAssetResult: EnumPromptCreateAssetResult_INTERNAL, PromptPublishAssetResult: EnumPromptPublishAssetResult_INTERNAL, PropertyStatus: EnumPropertyStatus_INTERNAL, - ProximityPromptExclusivity: EnumProximityPromptExclusivity_INTERNAL, - ProximityPromptInputType: EnumProximityPromptInputType_INTERNAL, - ProximityPromptStyle: EnumProximityPromptStyle_INTERNAL, QualityLevel: EnumQualityLevel_INTERNAL, R15CollisionType: EnumR15CollisionType_INTERNAL, RaycastFilterType: EnumRaycastFilterType_INTERNAL, @@ -3875,15 +3855,6 @@ declare class RaycastParams RespectCanCollide: boolean end -declare class TweenInfo - DelayTime: number - EasingDirection: EnumEasingDirection - EasingStyle: EnumEasingStyle - RepeatCount: number - Reverses: boolean - Time: number -end - declare class UDim Offset: number Scale: number @@ -4085,7 +4056,6 @@ type HumanoidDescriptionAccessory = { } type Hat = any -type AnalyticsService = any type RocketPropulsion = any type Skin = any type Plane = any @@ -4186,15 +4156,6 @@ declare class Accessory extends Accoutrement AccessoryType: EnumAccessoryType end -declare class AdService extends Instance - AdTeleportEnded: RBXScriptSignal<> - AdTeleportInitiated: RBXScriptSignal<> - PortalPrompt: RBXScriptSignal - function GetAdTeleportInfo(self): any - function GetReportAdInfo(self): { any } - function ReturnToPublisherExperience(self, adTeleportMethod: EnumAdTeleportMethod): nil -end - declare class AdvancedDragger extends Instance end @@ -4800,22 +4761,6 @@ declare class BodyVelocity extends BodyMover function lastForce(self): Vector3 end - - -declare class Breakpoint extends Instance - Condition: string - ContinueExecution: boolean - Enabled: boolean - Id: number - Line: number - LogMessage: string - MetaBreakpointId: number - RemoveOnHit: boolean - Script: string - Valid: boolean - Verified: boolean -end - declare class BrowserService extends Instance AuthCookieCopiedToEngine: RBXScriptSignal<> BrowserWindowClosed: RBXScriptSignal<> @@ -5032,9 +4977,6 @@ end declare class ClusterPacketCache extends Instance end -declare class CollaboratorsService extends Instance -end - declare class CollectionService extends Instance TagAdded: RBXScriptSignal ItemAdded: RBXScriptSignal @@ -5277,12 +5219,6 @@ declare class UniversalConstraint extends Constraint Restitution: number end -declare class VectorForce extends Constraint - ApplyAtCenterOfMass: boolean - Force: Vector3 - RelativeTo: EnumActuatorRelativeTo -end - declare class ContentProvider extends Instance AssetFetchFailed: RBXScriptSignal BaseUrl: string @@ -5453,7 +5389,6 @@ end declare class DynamicMesh extends DataModelMesh function AddTriangle(self, vertexId0: number, vertexId1: number, vertexId2: number): number function AddVertex(self, p: Vector3): number - function CreateMeshPartAsync(self, collisionFidelity: EnumCollisionFidelity): MeshPart function FindClosestPointOnSurface(self, point: Vector3): any function FindClosestVertex(self, toThisPoint: Vector3): number function FindVerticesWithinSphere(self, center: Vector3, radius: number): { any } @@ -5949,7 +5884,6 @@ declare class GuiBase2d extends GuiBase ClippedRect: Rect IsNotOccluded: boolean RawRect2D: Rect - RootLocalizationTable: LocalizationTable SelectionBehaviorDown: EnumSelectionBehavior SelectionBehaviorLeft: EnumSelectionBehavior SelectionBehaviorRight: EnumSelectionBehavior @@ -6112,33 +6046,6 @@ declare class TextLabel extends GuiLabel function SetTextFromInput(self, text: string): nil end -declare class ScrollingFrame extends GuiObject - AbsoluteCanvasSize: Vector2 - AbsoluteWindowSize: Vector2 - AutomaticCanvasSize: EnumAutomaticSize - BottomImage: Content - CanvasPosition: Vector2 - CanvasSize: UDim2 - ElasticBehavior: EnumElasticBehavior - HorizontalBarRect: Rect - HorizontalScrollBarInset: EnumScrollBarInset - MaxCanvasPosition: Vector2 - MidImage: Content - ScrollBarImageColor3: Color3 - ScrollBarImageTransparency: number - ScrollBarThickness: number - ScrollVelocity: Vector2 - ScrollingDirection: EnumScrollingDirection - ScrollingEnabled: boolean - TopImage: Content - VerticalBarRect: Rect - VerticalScrollBarInset: EnumScrollBarInset - VerticalScrollBarPosition: EnumVerticalScrollBarPosition - function ClearInertialScrolling(self): nil - function GetSampledInertialVelocity(self): Vector2 - function ScrollToTop(self): nil -end - declare class TextBox extends GuiObject ClearTextOnFocus: boolean ContentText: string @@ -6532,20 +6439,6 @@ end declare class HiddenSurfaceRemovalAsset extends Instance end -declare class Highlight extends Instance - Adornee: Instance? - DepthMode: EnumHighlightDepthMode - Enabled: boolean - FillColor: Color3 - FillTransparency: number - LineThickness: number - OutlineColor: Color3 - OutlineTransparency: number - ReservedId: EnumReservedHighlightId -end - - - declare class HttpRbxApiService extends Instance function GetAsync(self, apiUrlPath: string, priority: EnumThrottlingPriority?, httpRequestType: EnumHttpRequestType?): string function GetAsyncFullUrl(self, apiUrl: string, priority: EnumThrottlingPriority?, httpRequestType: EnumHttpRequestType?): string @@ -6731,12 +6624,6 @@ declare class IKControl extends Instance function GetSmoothedFinalTarget(self): CFrame end -declare class ILegacyStudioBridge extends Instance -end - -declare class LegacyStudioBridge extends ILegacyStudioBridge -end - declare class IXPService extends Instance OnBrowserTrackerLayerLoadingStatusChanged: RBXScriptSignal OnUserLayerLoadingStatusChanged: RBXScriptSignal @@ -6773,7 +6660,6 @@ end declare class InsertService extends Instance AllowClientInsertModels: boolean - function CreateMeshPartAsync(self, meshId: Content, collisionFidelity: EnumCollisionFidelity, renderFidelity: EnumRenderFidelity): MeshPart function GetBaseSets(self): { any } function GetCollection(self, categoryId: number): { any } function GetFreeDecals(self, searchText: string, pageNum: number): { any } @@ -6868,9 +6754,6 @@ declare class KeyframeSequenceProvider extends Instance function RegisterKeyframeSequence(self, keyframeSequence: Instance): Content end -declare class LSPFileSyncService extends Instance -end - declare class LanguageService extends Instance end @@ -6942,49 +6825,6 @@ end declare class UserStorageService extends LocalStorageService end -declare class LocalizationService extends Instance - AutoTranslateWillRun: RBXScriptSignal<> - ForcePlayModeGameLocaleId: string - ForcePlayModeRobloxLocaleId: string - IsTextScraperRunning: boolean - RobloxForcePlayModeGameLocaleId: string - RobloxForcePlayModeRobloxLocaleId: string - RobloxLocaleId: string - SystemLocaleId: string - function GetCorescriptLocalizations(self): { Instance } - function GetCountryRegionForPlayerAsync(self, player: Player): string - function GetTableEntries(self, instance: Instance?): { any } - function GetTranslatorForLocaleAsync(self, locale: string): Translator - function GetTranslatorForPlayer(self, player: Player): Translator - function GetTranslatorForPlayerAsync(self, player: Player): Translator - function PromptDownloadGameTableToCSV(self, table: Instance): nil - function PromptExportToCSVs(self): nil - function PromptImportFromCSVs(self): nil - function PromptUploadCSVToGameTable(self): Instance - function SetRobloxLocaleId(self, locale: string): nil - function StartTextScraper(self): nil - function StopTextScraper(self): nil -end - -declare class LocalizationTable extends Instance - SourceLocaleId: string - function GetEntries(self): { any } - function GetTranslator(self, localeId: string): Translator - function RemoveEntry(self, key: string, source: string, context: string): nil - function RemoveEntryValue(self, key: string, source: string, context: string, localeId: string): nil - function RemoveTargetLocale(self, localeId: string): nil - function SetEntries(self, entries: any): nil - function SetEntryContext(self, key: string, source: string, context: string, newContext: string): nil - function SetEntryExample(self, key: string, source: string, context: string, example: string): nil - function SetEntryKey(self, key: string, source: string, context: string, newKey: string): nil - function SetEntrySource(self, key: string, source: string, context: string, newSource: string): nil - function SetEntryValue(self, key: string, source: string, context: string, localeId: string, text: string): nil - function SetIsExemptFromUGCAnalytics(self, value: boolean): nil -end - -declare class CloudLocalizationTable extends LocalizationTable -end - declare class LodDataEntity extends Instance EntityLodEnabled: boolean end @@ -7129,67 +6969,6 @@ declare class MaterialGenerationSession extends Instance function UploadMaterialAsync(self, imageId: string): { [any]: any } end -declare class MaterialService extends Instance - AsphaltName: string - BasaltName: string - BrickName: string - CardboardName: string - CarpetName: string - CeramicTilesName: string - ClayRoofTilesName: string - CobblestoneName: string - ConcreteName: string - CorrodedMetalName: string - CrackedLavaName: string - DiamondPlateName: string - FabricName: string - FoilName: string - GlacierName: string - GraniteName: string - GrassName: string - GroundName: string - IceName: string - LeafyGrassName: string - LeatherName: string - LimestoneName: string - MarbleName: string - MetalName: string - MudName: string - OverrideStatusChanged: RBXScriptSignal - PavementName: string - PebbleName: string - PlasterName: string - PlasticName: string - RockName: string - RoofShinglesName: string - RubberName: string - SaltName: string - SandName: string - SandstoneName: string - SlateName: string - SmoothPlasticName: string - SnowName: string - Use2022Materials: boolean - WoodName: string - WoodPlanksName: string - function GetBaseMaterialOverride(self, material: EnumMaterial): string - function GetMaterialOverrideChanged(self, material: EnumMaterial): RBXScriptSignal - function GetMaterialVariant(self, material: EnumMaterial, name: string): MaterialVariant - function GetOverrideStatus(self, material: EnumMaterial): EnumPropertyStatus - function SetBaseMaterialOverride(self, material: EnumMaterial, name: string): nil -end - -declare class MaterialVariant extends Instance - BaseMaterial: EnumMaterial - ColorMap: Content - CustomPhysicalProperties: PhysicalProperties - MaterialPattern: EnumMaterialPattern - MetalnessMap: Content - NormalMap: Content - RoughnessMap: Content - StudsPerTile: number -end - declare class MemStorageConnection extends Instance function Disconnect(self): nil end @@ -7381,12 +7160,6 @@ declare class NetworkSettings extends Instance MtuOverride: number end -declare class NoCollisionConstraint extends Instance - Enabled: boolean - Part0: BasePart - Part1: BasePart -end - declare class NotificationService extends Instance IsConnected: boolean IsLuaChatEnabled: boolean @@ -7483,7 +7256,6 @@ declare class BasePart extends PVInstance function GetMass(self): number function GetNetworkOwner(self): Player? function GetNetworkOwnershipAuto(self): boolean - function GetNoCollisionConstraints(self): { Instance } function GetRootPart(self): BasePart function GetTouchingParts(self): { BasePart } function GetVelocityAtPosition(self, position: Vector3): Vector3 @@ -7578,17 +7350,6 @@ declare class TriangleMeshPart extends BasePart MeshSize: Vector3 end -declare class MeshPart extends TriangleMeshPart - DoubleSided: boolean - HasJointOffset: boolean - HasSkinnedMesh: boolean - JointOffset: Vector3 - MeshId: Content - RenderFidelity: EnumRenderFidelity - TextureID: Content - function ApplyMesh(self, meshPart: MeshPart): nil -end - declare class PartOperation extends TriangleMeshPart RenderFidelity: EnumRenderFidelity SmoothingAngle: number @@ -8275,78 +8036,9 @@ declare class Pose extends PoseBase function RemoveSubPose(self, pose: Pose): nil end -declare class PostEffect extends Instance - Enabled: boolean -end - -declare class BloomEffect extends PostEffect - Intensity: number - Size: number - Threshold: number -end - -declare class BlurEffect extends PostEffect - Size: number -end - -declare class ColorCorrectionEffect extends PostEffect - Brightness: number - Contrast: number - Saturation: number - TintColor: Color3 -end - -declare class DepthOfFieldEffect extends PostEffect - FarIntensity: number - FocusDistance: number - InFocusRadius: number - NearIntensity: number -end - -declare class SunRaysEffect extends PostEffect - Intensity: number - Spread: number -end - declare class ProcessInstancePhysicsService extends Instance end -declare class ProximityPrompt extends Instance - ActionText: string - AutoLocalize: boolean - ClickablePrompt: boolean - Enabled: boolean - Exclusivity: EnumProximityPromptExclusivity - GamepadKeyCode: EnumKeyCode - HoldDuration: number - KeyboardKeyCode: EnumKeyCode - MaxActivationDistance: number - ObjectText: string - PromptButtonHoldBegan: RBXScriptSignal - PromptButtonHoldEnded: RBXScriptSignal - PromptHidden: RBXScriptSignal<> - PromptShown: RBXScriptSignal - RequiresLineOfSight: boolean - RootLocalizationTable: LocalizationTable - Style: EnumProximityPromptStyle - TriggerEnded: RBXScriptSignal - Triggered: RBXScriptSignal - UIOffset: Vector2 - function InputHoldBegin(self): nil - function InputHoldEnd(self): nil -end - -declare class ProximityPromptService extends Instance - Enabled: boolean - MaxPromptsVisible: number - PromptButtonHoldBegan: RBXScriptSignal - PromptButtonHoldEnded: RBXScriptSignal - PromptHidden: RBXScriptSignal - PromptShown: RBXScriptSignal - PromptTriggerEnded: RBXScriptSignal - PromptTriggered: RBXScriptSignal -end - declare class PublishService extends Instance function CreateAssetAndWaitForAssetId(self, instances: { Instance }, operationId: string, creatorId: number, assetType: string, name: string, description: string): number function PublishCageMeshAsync(self, wrap: Instance, cageType: EnumCageType): Content @@ -8493,16 +8185,6 @@ declare class RenderingTest extends Instance function RenderdocTriggerCapture(self): nil end -declare class ReplicatedFirst extends Instance - DefaultLoadingGuiRemoved: RBXScriptSignal<> - FinishedReplicating: RBXScriptSignal<> - RemoveDefaultLoadingGuiSignal: RBXScriptSignal<> - function IsDefaultLoadingGuiRemoved(self): boolean - function IsFinishedReplicating(self): boolean - function RemoveDefaultLoadingScreen(self): nil - function SetDefaultLoadingGuiRemoved(self): nil -end - declare class ReplicatedStorage extends Instance end @@ -8748,7 +8430,6 @@ declare class ServiceProvider extends Instance ServiceAdded: RBXScriptSignal ServiceRemoving: RBXScriptSignal - AdService: AdService AnimationClipProvider: AnimationClipProvider AnimationFromVideoCreatorService: AnimationFromVideoCreatorService AnimationFromVideoCreatorStudioService: AnimationFromVideoCreatorStudioService @@ -8773,7 +8454,6 @@ declare class ServiceProvider extends Instance Chat: Chat ChatbotUIService: ChatbotUIService ClusterPacketCache: ClusterPacketCache - CollaboratorsService: CollaboratorsService CollectionService: CollectionService CommandService: CommandService ConfigureServerService: ConfigureServerService @@ -8814,19 +8494,15 @@ declare class ServiceProvider extends Instance HeightmapImporterService: HeightmapImporterService HttpRbxApiService: HttpRbxApiService HttpService: HttpService - ILegacyStudioBridge: ILegacyStudioBridge IXPService: IXPService IncrementalPatchBuilder: IncrementalPatchBuilder InsertService: InsertService KeyboardService: KeyboardService KeyframeSequenceProvider: KeyframeSequenceProvider - LSPFileSyncService: LSPFileSyncService LanguageService: LanguageService - LegacyStudioBridge: LegacyStudioBridge Lighting: Lighting LiveScriptingService: LiveScriptingService LocalStorageService: LocalStorageService - LocalizationService: LocalizationService LodDataService: LodDataService LogService: LogService LoginService: LoginService @@ -8834,7 +8510,6 @@ declare class ServiceProvider extends Instance LuauScriptAnalyzerService: LuauScriptAnalyzerService MarketplaceService: MarketplaceService MaterialGenerationService: MaterialGenerationService - MaterialService: MaterialService MemStorageService: MemStorageService MemoryStoreService: MemoryStoreService MeshContentProvider: MeshContentProvider @@ -8866,13 +8541,11 @@ declare class ServiceProvider extends Instance PluginPolicyService: PluginPolicyService PolicyService: PolicyService ProcessInstancePhysicsService: ProcessInstancePhysicsService - ProximityPromptService: ProximityPromptService PublishService: PublishService RbxAnalyticsService: RbxAnalyticsService RemoteCursorService: RemoteCursorService RemoteDebuggerServer: RemoteDebuggerServer RenderSettings: RenderSettings - ReplicatedFirst: ReplicatedFirst ReplicatedStorage: ReplicatedStorage RobloxPluginGuiService: RobloxPluginGuiService RobloxReplicatedStorage: RobloxReplicatedStorage @@ -8934,8 +8607,6 @@ declare class ServiceProvider extends Instance TimerService: TimerService ToastNotificationService: ToastNotificationService TouchInputService: TouchInputService - TutorialService: TutorialService - TweenService: TweenService UGCAvatarService: UGCAvatarService UGCValidationService: UGCValidationService UnvalidatedAssetService: UnvalidatedAssetService @@ -8959,8 +8630,6 @@ declare class ServiceProvider extends Instance JointsService: JointsService function FindService(self, className: string): Instance - function GetService(self, service: "AdService"): AdService - function GetService(self, service: "AnalyticsService"): AnalyticsService function GetService(self, service: "AnimationClipProvider"): AnimationClipProvider function GetService(self, service: "AnimationFromVideoCreatorService"): AnimationFromVideoCreatorService function GetService(self, service: "AnimationFromVideoCreatorStudioService"): AnimationFromVideoCreatorStudioService @@ -8985,7 +8654,6 @@ declare class ServiceProvider extends Instance function GetService(self, service: "Chat"): Chat function GetService(self, service: "ChatbotUIService"): ChatbotUIService function GetService(self, service: "ClusterPacketCache"): ClusterPacketCache - function GetService(self, service: "CollaboratorsService"): CollaboratorsService function GetService(self, service: "CollectionService"): CollectionService function GetService(self, service: "CommandService"): CommandService function GetService(self, service: "ConfigureServerService"): ConfigureServerService @@ -9027,20 +8695,16 @@ declare class ServiceProvider extends Instance function GetService(self, service: "Hopper"): Hopper function GetService(self, service: "HttpRbxApiService"): HttpRbxApiService function GetService(self, service: "HttpService"): HttpService - function GetService(self, service: "ILegacyStudioBridge"): ILegacyStudioBridge function GetService(self, service: "IXPService"): IXPService function GetService(self, service: "IncrementalPatchBuilder"): IncrementalPatchBuilder function GetService(self, service: "InsertService"): InsertService function GetService(self, service: "JointsService"): JointsService function GetService(self, service: "KeyboardService"): KeyboardService function GetService(self, service: "KeyframeSequenceProvider"): KeyframeSequenceProvider - function GetService(self, service: "LSPFileSyncService"): LSPFileSyncService function GetService(self, service: "LanguageService"): LanguageService - function GetService(self, service: "LegacyStudioBridge"): LegacyStudioBridge function GetService(self, service: "Lighting"): Lighting function GetService(self, service: "LiveScriptingService"): LiveScriptingService function GetService(self, service: "LocalStorageService"): LocalStorageService - function GetService(self, service: "LocalizationService"): LocalizationService function GetService(self, service: "LodDataService"): LodDataService function GetService(self, service: "LogService"): LogService function GetService(self, service: "LoginService"): LoginService @@ -9048,7 +8712,6 @@ declare class ServiceProvider extends Instance function GetService(self, service: "LuauScriptAnalyzerService"): LuauScriptAnalyzerService function GetService(self, service: "MarketplaceService"): MarketplaceService function GetService(self, service: "MaterialGenerationService"): MaterialGenerationService - function GetService(self, service: "MaterialService"): MaterialService function GetService(self, service: "MemStorageService"): MemStorageService function GetService(self, service: "MemoryStoreService"): MemoryStoreService function GetService(self, service: "MeshContentProvider"): MeshContentProvider @@ -9081,13 +8744,11 @@ declare class ServiceProvider extends Instance function GetService(self, service: "PointsService"): PointsService function GetService(self, service: "PolicyService"): PolicyService function GetService(self, service: "ProcessInstancePhysicsService"): ProcessInstancePhysicsService - function GetService(self, service: "ProximityPromptService"): ProximityPromptService function GetService(self, service: "PublishService"): PublishService function GetService(self, service: "RbxAnalyticsService"): RbxAnalyticsService function GetService(self, service: "RemoteCursorService"): RemoteCursorService function GetService(self, service: "RemoteDebuggerServer"): RemoteDebuggerServer function GetService(self, service: "RenderSettings"): RenderSettings - function GetService(self, service: "ReplicatedFirst"): ReplicatedFirst function GetService(self, service: "ReplicatedStorage"): ReplicatedStorage function GetService(self, service: "RobloxPluginGuiService"): RobloxPluginGuiService function GetService(self, service: "RobloxReplicatedStorage"): RobloxReplicatedStorage @@ -9149,8 +8810,7 @@ declare class ServiceProvider extends Instance function GetService(self, service: "TimerService"): TimerService function GetService(self, service: "ToastNotificationService"): ToastNotificationService function GetService(self, service: "TouchInputService"): TouchInputService - function GetService(self, service: "TutorialService"): TutorialService - function GetService(self, service: "TweenService"): TweenService + function GetService(self, service: "TweenService"): nil function GetService(self, service: "UGCAvatarService"): UGCAvatarService function GetService(self, service: "UGCValidationService"): UGCValidationService function GetService(self, service: "UnvalidatedAssetService"): UnvalidatedAssetService @@ -9364,7 +9024,6 @@ declare class Sound extends Instance RollOffMaxDistance: number RollOffMinDistance: number RollOffMode: EnumRollOffMode - SoundGroup: SoundGroup SoundId: Content Stopped: RBXScriptSignal TimeLength: number @@ -9382,76 +9041,6 @@ declare class SoundEffect extends Instance Priority: number end -declare class ChorusSoundEffect extends SoundEffect - Depth: number - Mix: number - Rate: number -end - -declare class CompressorSoundEffect extends SoundEffect - Attack: number - GainMakeup: number - Ratio: number - Release: number - SideChain: Instance - Threshold: number -end - -declare class CustomSoundEffect extends SoundEffect -end - -declare class AssetSoundEffect extends CustomSoundEffect -end - -declare class ChannelSelectorSoundEffect extends CustomSoundEffect - Channel: number -end - -declare class DistortionSoundEffect extends SoundEffect - Level: number -end - -declare class EchoSoundEffect extends SoundEffect - Delay: number - DryLevel: number - Feedback: number - WetLevel: number -end - -declare class EqualizerSoundEffect extends SoundEffect - HighGain: number - LowGain: number - MidGain: number -end - -declare class FlangeSoundEffect extends SoundEffect - Depth: number - Mix: number - Rate: number -end - -declare class PitchShiftSoundEffect extends SoundEffect - Octave: number -end - -declare class ReverbSoundEffect extends SoundEffect - DecayTime: number - Density: number - Diffusion: number - DryLevel: number - WetLevel: number -end - -declare class TremoloSoundEffect extends SoundEffect - Depth: number - Duty: number - Frequency: number -end - -declare class SoundGroup extends Instance - Volume: number -end - declare class SoundService extends Instance AmbientReverb: EnumReverbType DeviceListChanged: RBXScriptSignal @@ -9926,7 +9515,6 @@ end declare class TextChannel extends Instance MessageReceived: RBXScriptSignal OnIncomingMessage: (message: TextChatMessage) -> any - ShouldDeliverCallback: (message: TextChatMessage, textSource: TextSource) -> any function AddUserAsync(self, userId: number): any function DisplaySystemMessage(self, systemMessage: string, metadata: string?): TextChatMessage function SendAsync(self, message: string, metadata: string?): TextChatMessage @@ -9936,7 +9524,6 @@ declare class TextChatCommand extends Instance Enabled: boolean PrimaryAlias: string SecondaryAlias: string - Triggered: RBXScriptSignal end declare class TextChatConfigurations extends Instance @@ -10010,7 +9597,6 @@ declare class TextChatMessage extends Instance Status: EnumTextChatMessageStatus Text: string TextChannel: TextChannel - TextSource: TextSource Timestamp: DateTime end @@ -10056,11 +9642,6 @@ declare class TextService extends Instance function SetResolutionScale(self, scale: number): nil end -declare class TextSource extends Instance - CanSend: boolean - UserId: number -end - declare class ThirdPartyUserService extends Instance ActiveUserSignedOut: RBXScriptSignal function GetUserPlatformId(self): string @@ -10116,33 +9697,6 @@ declare class Translator extends Instance function Translate(self, context: Instance, text: string): string end -declare class TutorialService extends Instance - function GetMainViewSessionId(self): string - function GetStudioWidgetFromLabel(self, label: string): StudioWidget - function HasUserCompletedTutorial(self): boolean - function PromptClosePlace(self): nil - function SetTutorialCompletionStatus(self, completed: boolean): nil - function ShouldLaunchTutorial(self): boolean -end - -declare class TweenBase extends Instance - Completed: RBXScriptSignal - PlaybackState: EnumPlaybackState - function Cancel(self): nil - function Pause(self): nil - function Play(self): nil -end - -declare class Tween extends TweenBase - Instance: Instance - TweenInfo: TweenInfo -end - -declare class TweenService extends Instance - function Create(self, instance: Instance, tweenInfo: TweenInfo, propertyTable: { [any]: any }): Tween - function GetValue(self, alpha: number, easingStyle: EnumEasingStyle, easingDirection: EnumEasingDirection): number -end - declare class UGCAvatarService extends Instance end @@ -10510,7 +10064,7 @@ declare class Wire extends Instance end declare Instance: { - new: ((className: "Accoutrement", parent: Instance?) -> Accoutrement) & ((className: "Accessory", parent: Instance?) -> Accessory) & ((className: "Hat", parent: Instance?) -> Hat) & ((className: "AdvancedDragger", parent: Instance?) -> AdvancedDragger) & ((className: "AnalyticsService", parent: Instance?) -> AnalyticsService) & ((className: "Animation", parent: Instance?) -> Animation) & ((className: "CurveAnimation", parent: Instance?) -> CurveAnimation) & ((className: "KeyframeSequence", parent: Instance?) -> KeyframeSequence) & ((className: "AnimationController", parent: Instance?) -> AnimationController) & ((className: "AnimationRigData", parent: Instance?) -> AnimationRigData) & ((className: "Animator", parent: Instance?) -> Animator) & ((className: "AudioDeviceInput", parent: Instance?) -> AudioDeviceInput) & ((className: "AudioDeviceOutput", parent: Instance?) -> AudioDeviceOutput) & ((className: "AudioDistortion", parent: Instance?) -> AudioDistortion) & ((className: "AudioEcho", parent: Instance?) -> AudioEcho) & ((className: "AudioEmitter", parent: Instance?) -> AudioEmitter) & ((className: "AudioEqualizer", parent: Instance?) -> AudioEqualizer) & ((className: "AudioFader", parent: Instance?) -> AudioFader) & ((className: "AudioFlanger", parent: Instance?) -> AudioFlanger) & ((className: "AudioListener", parent: Instance?) -> AudioListener) & ((className: "AudioPitchShifter", parent: Instance?) -> AudioPitchShifter) & ((className: "AudioPlayer", parent: Instance?) -> AudioPlayer) & ((className: "AudioReverb", parent: Instance?) -> AudioReverb) & ((className: "AudioSearchParams", parent: Instance?) -> AudioSearchParams) & ((className: "Backpack", parent: Instance?) -> Backpack) & ((className: "WrapLayer", parent: Instance?) -> WrapLayer) & ((className: "WrapTarget", parent: Instance?) -> WrapTarget) & ((className: "BindableEvent", parent: Instance?) -> BindableEvent) & ((className: "BindableFunction", parent: Instance?) -> BindableFunction) & ((className: "BodyAngularVelocity", parent: Instance?) -> BodyAngularVelocity) & ((className: "BodyForce", parent: Instance?) -> BodyForce) & ((className: "BodyGyro", parent: Instance?) -> BodyGyro) & ((className: "BodyPosition", parent: Instance?) -> BodyPosition) & ((className: "BodyThrust", parent: Instance?) -> BodyThrust) & ((className: "BodyVelocity", parent: Instance?) -> BodyVelocity) & ((className: "RocketPropulsion", parent: Instance?) -> RocketPropulsion) & ((className: "Breakpoint", parent: Instance?) -> Breakpoint) & ((className: "BubbleChatMessageProperties", parent: Instance?) -> BubbleChatMessageProperties) & ((className: "Camera", parent: Instance?) -> Camera) & ((className: "BodyColors", parent: Instance?) -> BodyColors) & ((className: "CharacterMesh", parent: Instance?) -> CharacterMesh) & ((className: "Pants", parent: Instance?) -> Pants) & ((className: "Shirt", parent: Instance?) -> Shirt) & ((className: "ShirtGraphic", parent: Instance?) -> ShirtGraphic) & ((className: "Skin", parent: Instance?) -> Skin) & ((className: "ClickDetector", parent: Instance?) -> ClickDetector) & ((className: "DragDetector", parent: Instance?) -> DragDetector) & ((className: "Configuration", parent: Instance?) -> Configuration) & ((className: "AlignOrientation", parent: Instance?) -> AlignOrientation) & ((className: "AlignPosition", parent: Instance?) -> AlignPosition) & ((className: "AngularVelocity", parent: Instance?) -> AngularVelocity) & ((className: "AnimationConstraint", parent: Instance?) -> AnimationConstraint) & ((className: "BallSocketConstraint", parent: Instance?) -> BallSocketConstraint) & ((className: "HingeConstraint", parent: Instance?) -> HingeConstraint) & ((className: "LineForce", parent: Instance?) -> LineForce) & ((className: "LinearVelocity", parent: Instance?) -> LinearVelocity) & ((className: "PlaneConstraint", parent: Instance?) -> PlaneConstraint) & ((className: "Plane", parent: Instance?) -> Plane) & ((className: "RigidConstraint", parent: Instance?) -> RigidConstraint) & ((className: "RodConstraint", parent: Instance?) -> RodConstraint) & ((className: "RopeConstraint", parent: Instance?) -> RopeConstraint) & ((className: "CylindricalConstraint", parent: Instance?) -> CylindricalConstraint) & ((className: "PrismaticConstraint", parent: Instance?) -> PrismaticConstraint) & ((className: "SpringConstraint", parent: Instance?) -> SpringConstraint) & ((className: "Torque", parent: Instance?) -> Torque) & ((className: "TorsionSpringConstraint", parent: Instance?) -> TorsionSpringConstraint) & ((className: "UniversalConstraint", parent: Instance?) -> UniversalConstraint) & ((className: "VectorForce", parent: Instance?) -> VectorForce) & ((className: "HumanoidController", parent: Instance?) -> HumanoidController) & ((className: "SkateboardController", parent: Instance?) -> SkateboardController) & ((className: "VehicleController", parent: Instance?) -> VehicleController) & ((className: "AirController", parent: Instance?) -> AirController) & ((className: "ClimbController", parent: Instance?) -> ClimbController) & ((className: "GroundController", parent: Instance?) -> GroundController) & ((className: "SwimController", parent: Instance?) -> SwimController) & ((className: "ControllerManager", parent: Instance?) -> ControllerManager) & ((className: "CustomEvent", parent: Instance?) -> CustomEvent) & ((className: "CustomEventReceiver", parent: Instance?) -> CustomEventReceiver) & ((className: "CylinderMesh", parent: Instance?) -> CylinderMesh) & ((className: "DynamicMesh", parent: Instance?) -> DynamicMesh) & ((className: "FileMesh", parent: Instance?) -> FileMesh) & ((className: "SpecialMesh", parent: Instance?) -> SpecialMesh) & ((className: "DataStoreIncrementOptions", parent: Instance?) -> DataStoreIncrementOptions) & ((className: "DataStoreOptions", parent: Instance?) -> DataStoreOptions) & ((className: "DataStoreSetOptions", parent: Instance?) -> DataStoreSetOptions) & ((className: "DebuggerWatch", parent: Instance?) -> DebuggerWatch) & ((className: "Dialog", parent: Instance?) -> Dialog) & ((className: "DialogChoice", parent: Instance?) -> DialogChoice) & ((className: "Dragger", parent: Instance?) -> Dragger) & ((className: "EulerRotationCurve", parent: Instance?) -> EulerRotationCurve) & ((className: "ExperienceInviteOptions", parent: Instance?) -> ExperienceInviteOptions) & ((className: "Explosion", parent: Instance?) -> Explosion) & ((className: "Decal", parent: Instance?) -> Decal) & ((className: "Texture", parent: Instance?) -> Texture) & ((className: "Hole", parent: Instance?) -> Hole) & ((className: "MotorFeature", parent: Instance?) -> MotorFeature) & ((className: "Fire", parent: Instance?) -> Fire) & ((className: "FloatCurve", parent: Instance?) -> FloatCurve) & ((className: "CSGDictionaryService", parent: Instance?) -> CSGDictionaryService) & ((className: "NonReplicatedCSGDictionaryService", parent: Instance?) -> NonReplicatedCSGDictionaryService) & ((className: "ForceField", parent: Instance?) -> ForceField) & ((className: "FunctionalTest", parent: Instance?) -> FunctionalTest) & ((className: "GetTextBoundsParams", parent: Instance?) -> GetTextBoundsParams) & ((className: "Frame", parent: Instance?) -> Frame) & ((className: "ImageButton", parent: Instance?) -> ImageButton) & ((className: "TextButton", parent: Instance?) -> TextButton) & ((className: "ImageLabel", parent: Instance?) -> ImageLabel) & ((className: "TextLabel", parent: Instance?) -> TextLabel) & ((className: "ScrollingFrame", parent: Instance?) -> ScrollingFrame) & ((className: "TextBox", parent: Instance?) -> TextBox) & ((className: "VideoFrame", parent: Instance?) -> VideoFrame) & ((className: "ViewportFrame", parent: Instance?) -> ViewportFrame) & ((className: "BillboardGui", parent: Instance?) -> BillboardGui) & ((className: "ScreenGui", parent: Instance?) -> ScreenGui) & ((className: "GuiMain", parent: Instance?) -> GuiMain) & ((className: "AdGui", parent: Instance?) -> AdGui) & ((className: "SurfaceGui", parent: Instance?) -> SurfaceGui) & ((className: "FloorWire", parent: Instance?) -> FloorWire) & ((className: "SelectionBox", parent: Instance?) -> SelectionBox) & ((className: "BoxHandleAdornment", parent: Instance?) -> BoxHandleAdornment) & ((className: "ConeHandleAdornment", parent: Instance?) -> ConeHandleAdornment) & ((className: "CylinderHandleAdornment", parent: Instance?) -> CylinderHandleAdornment) & ((className: "ImageHandleAdornment", parent: Instance?) -> ImageHandleAdornment) & ((className: "LineHandleAdornment", parent: Instance?) -> LineHandleAdornment) & ((className: "SphereHandleAdornment", parent: Instance?) -> SphereHandleAdornment) & ((className: "WireframeHandleAdornment", parent: Instance?) -> WireframeHandleAdornment) & ((className: "ParabolaAdornment", parent: Instance?) -> ParabolaAdornment) & ((className: "SelectionSphere", parent: Instance?) -> SelectionSphere) & ((className: "ArcHandles", parent: Instance?) -> ArcHandles) & ((className: "Handles", parent: Instance?) -> Handles) & ((className: "SurfaceSelection", parent: Instance?) -> SurfaceSelection) & ((className: "SelectionPartLasso", parent: Instance?) -> SelectionPartLasso) & ((className: "SelectionPointLasso", parent: Instance?) -> SelectionPointLasso) & ((className: "HeightmapImporterService", parent: Instance?) -> HeightmapImporterService) & ((className: "HiddenSurfaceRemovalAsset", parent: Instance?) -> HiddenSurfaceRemovalAsset) & ((className: "Highlight", parent: Instance?) -> Highlight) & ((className: "Humanoid", parent: Instance?) -> Humanoid) & ((className: "HumanoidDescription", parent: Instance?) -> HumanoidDescription) & ((className: "IKControl", parent: Instance?) -> IKControl) & ((className: "RotateP", parent: Instance?) -> RotateP) & ((className: "RotateV", parent: Instance?) -> RotateV) & ((className: "Glue", parent: Instance?) -> Glue) & ((className: "ManualGlue", parent: Instance?) -> ManualGlue) & ((className: "ManualWeld", parent: Instance?) -> ManualWeld) & ((className: "Motor", parent: Instance?) -> Motor) & ((className: "Motor6D", parent: Instance?) -> Motor6D) & ((className: "Rotate", parent: Instance?) -> Rotate) & ((className: "Snap", parent: Instance?) -> Snap) & ((className: "VelocityMotor", parent: Instance?) -> VelocityMotor) & ((className: "Weld", parent: Instance?) -> Weld) & ((className: "Keyframe", parent: Instance?) -> Keyframe) & ((className: "KeyframeMarker", parent: Instance?) -> KeyframeMarker) & ((className: "PointLight", parent: Instance?) -> PointLight) & ((className: "SpotLight", parent: Instance?) -> SpotLight) & ((className: "SurfaceLight", parent: Instance?) -> SurfaceLight) & ((className: "LocalizationTable", parent: Instance?) -> LocalizationTable) & ((className: "Script", parent: Instance?) -> Script) & ((className: "LocalScript", parent: Instance?) -> LocalScript) & ((className: "ModuleScript", parent: Instance?) -> ModuleScript) & ((className: "MarkerCurve", parent: Instance?) -> MarkerCurve) & ((className: "MaterialVariant", parent: Instance?) -> MaterialVariant) & ((className: "MemoryStoreService", parent: Instance?) -> MemoryStoreService) & ((className: "Message", parent: Instance?) -> Message) & ((className: "Hint", parent: Instance?) -> Hint) & ((className: "NoCollisionConstraint", parent: Instance?) -> NoCollisionConstraint) & ((className: "CornerWedgePart", parent: Instance?) -> CornerWedgePart) & ((className: "Part", parent: Instance?) -> Part) & ((className: "FlagStand", parent: Instance?) -> FlagStand) & ((className: "Seat", parent: Instance?) -> Seat) & ((className: "SkateboardPlatform", parent: Instance?) -> SkateboardPlatform) & ((className: "SpawnLocation", parent: Instance?) -> SpawnLocation) & ((className: "WedgePart", parent: Instance?) -> WedgePart) & ((className: "MeshPart", parent: Instance?) -> MeshPart) & ((className: "PartOperation", parent: Instance?) -> PartOperation) & ((className: "IntersectOperation", parent: Instance?) -> IntersectOperation) & ((className: "NegateOperation", parent: Instance?) -> NegateOperation) & ((className: "UnionOperation", parent: Instance?) -> UnionOperation) & ((className: "TrussPart", parent: Instance?) -> TrussPart) & ((className: "VehicleSeat", parent: Instance?) -> VehicleSeat) & ((className: "Model", parent: Instance?) -> Model) & ((className: "Actor", parent: Instance?) -> Actor) & ((className: "HopperBin", parent: Instance?) -> HopperBin) & ((className: "Tool", parent: Instance?) -> Tool) & ((className: "Flag", parent: Instance?) -> Flag) & ((className: "WorldModel", parent: Instance?) -> WorldModel) & ((className: "PartOperationAsset", parent: Instance?) -> PartOperationAsset) & ((className: "ParticleEmitter", parent: Instance?) -> ParticleEmitter) & ((className: "PathfindingLink", parent: Instance?) -> PathfindingLink) & ((className: "PathfindingModifier", parent: Instance?) -> PathfindingModifier) & ((className: "Player", parent: Instance?) -> Player) & ((className: "PluginAction", parent: Instance?) -> PluginAction) & ((className: "PluginCapabilities", parent: Instance?) -> PluginCapabilities) & ((className: "NumberPose", parent: Instance?) -> NumberPose) & ((className: "Pose", parent: Instance?) -> Pose) & ((className: "BloomEffect", parent: Instance?) -> BloomEffect) & ((className: "BlurEffect", parent: Instance?) -> BlurEffect) & ((className: "ColorCorrectionEffect", parent: Instance?) -> ColorCorrectionEffect) & ((className: "DepthOfFieldEffect", parent: Instance?) -> DepthOfFieldEffect) & ((className: "SunRaysEffect", parent: Instance?) -> SunRaysEffect) & ((className: "ProximityPrompt", parent: Instance?) -> ProximityPrompt) & ((className: "ProximityPromptService", parent: Instance?) -> ProximityPromptService) & ((className: "ReflectionMetadata", parent: Instance?) -> ReflectionMetadata) & ((className: "ReflectionMetadataCallbacks", parent: Instance?) -> ReflectionMetadataCallbacks) & ((className: "ReflectionMetadataClasses", parent: Instance?) -> ReflectionMetadataClasses) & ((className: "ReflectionMetadataEnums", parent: Instance?) -> ReflectionMetadataEnums) & ((className: "ReflectionMetadataEvents", parent: Instance?) -> ReflectionMetadataEvents) & ((className: "ReflectionMetadataFunctions", parent: Instance?) -> ReflectionMetadataFunctions) & ((className: "ReflectionMetadataClass", parent: Instance?) -> ReflectionMetadataClass) & ((className: "ReflectionMetadataEnum", parent: Instance?) -> ReflectionMetadataEnum) & ((className: "ReflectionMetadataEnumItem", parent: Instance?) -> ReflectionMetadataEnumItem) & ((className: "ReflectionMetadataMember", parent: Instance?) -> ReflectionMetadataMember) & ((className: "ReflectionMetadataProperties", parent: Instance?) -> ReflectionMetadataProperties) & ((className: "ReflectionMetadataYieldFunctions", parent: Instance?) -> ReflectionMetadataYieldFunctions) & ((className: "RemoteEvent", parent: Instance?) -> RemoteEvent) & ((className: "RemoteFunction", parent: Instance?) -> RemoteFunction) & ((className: "RenderingTest", parent: Instance?) -> RenderingTest) & ((className: "RotationCurve", parent: Instance?) -> RotationCurve) & ((className: "BuoyancySensor", parent: Instance?) -> BuoyancySensor) & ((className: "ControllerPartSensor", parent: Instance?) -> ControllerPartSensor) & ((className: "Sky", parent: Instance?) -> Sky) & ((className: "Smoke", parent: Instance?) -> Smoke) & ((className: "Sound", parent: Instance?) -> Sound) & ((className: "ChorusSoundEffect", parent: Instance?) -> ChorusSoundEffect) & ((className: "CompressorSoundEffect", parent: Instance?) -> CompressorSoundEffect) & ((className: "DistortionSoundEffect", parent: Instance?) -> DistortionSoundEffect) & ((className: "EchoSoundEffect", parent: Instance?) -> EchoSoundEffect) & ((className: "EqualizerSoundEffect", parent: Instance?) -> EqualizerSoundEffect) & ((className: "FlangeSoundEffect", parent: Instance?) -> FlangeSoundEffect) & ((className: "PitchShiftSoundEffect", parent: Instance?) -> PitchShiftSoundEffect) & ((className: "ReverbSoundEffect", parent: Instance?) -> ReverbSoundEffect) & ((className: "TremoloSoundEffect", parent: Instance?) -> TremoloSoundEffect) & ((className: "SoundGroup", parent: Instance?) -> SoundGroup) & ((className: "Sparkles", parent: Instance?) -> Sparkles) & ((className: "StandalonePluginScripts", parent: Instance?) -> StandalonePluginScripts) & ((className: "StarterGear", parent: Instance?) -> StarterGear) & ((className: "StudioCallout", parent: Instance?) -> StudioCallout) & ((className: "StudioObjectBase", parent: Instance?) -> StudioObjectBase) & ((className: "StudioWidget", parent: Instance?) -> StudioWidget) & ((className: "StyleRule", parent: Instance?) -> StyleRule) & ((className: "StyleSheet", parent: Instance?) -> StyleSheet) & ((className: "StyleDerive", parent: Instance?) -> StyleDerive) & ((className: "StyleLink", parent: Instance?) -> StyleLink) & ((className: "SurfaceAppearance", parent: Instance?) -> SurfaceAppearance) & ((className: "Team", parent: Instance?) -> Team) & ((className: "TeleportOptions", parent: Instance?) -> TeleportOptions) & ((className: "TerrainDetail", parent: Instance?) -> TerrainDetail) & ((className: "TerrainRegion", parent: Instance?) -> TerrainRegion) & ((className: "TestService", parent: Instance?) -> TestService) & ((className: "TextChannel", parent: Instance?) -> TextChannel) & ((className: "TextChatCommand", parent: Instance?) -> TextChatCommand) & ((className: "TextChatMessageProperties", parent: Instance?) -> TextChatMessageProperties) & ((className: "TrackerStreamAnimation", parent: Instance?) -> TrackerStreamAnimation) & ((className: "Tween", parent: Instance?) -> Tween) & ((className: "BinaryStringValue", parent: Instance?) -> BinaryStringValue) & ((className: "BoolValue", parent: Instance?) -> BoolValue) & ((className: "BrickColorValue", parent: Instance?) -> BrickColorValue) & ((className: "CFrameValue", parent: Instance?) -> CFrameValue) & ((className: "Color3Value", parent: Instance?) -> Color3Value) & ((className: "DoubleConstrainedValue", parent: Instance?) -> DoubleConstrainedValue) & ((className: "IntConstrainedValue", parent: Instance?) -> IntConstrainedValue) & ((className: "IntValue", parent: Instance?) -> IntValue) & ((className: "NumberValue", parent: Instance?) -> NumberValue) & ((className: "ObjectValue", parent: Instance?) -> ObjectValue) & ((className: "RayValue", parent: Instance?) -> RayValue) & ((className: "StringValue", parent: Instance?) -> StringValue) & ((className: "Vector3Value", parent: Instance?) -> Vector3Value) & ((className: "Vector3Curve", parent: Instance?) -> Vector3Curve) & ((className: "VirtualInputManager", parent: Instance?) -> VirtualInputManager) & ((className: "WeldConstraint", parent: Instance?) -> WeldConstraint) & ((className: "Wire", parent: Instance?) -> Wire) & ((className: string, parent: Instance?) -> Instance), + new: ((className: "Accoutrement", parent: Instance?) -> Accoutrement) & ((className: "Accessory", parent: Instance?) -> Accessory) & ((className: "Hat", parent: Instance?) -> Hat) & ((className: "AdvancedDragger", parent: Instance?) -> AdvancedDragger) & ((className: "Animation", parent: Instance?) -> Animation) & ((className: "CurveAnimation", parent: Instance?) -> CurveAnimation) & ((className: "KeyframeSequence", parent: Instance?) -> KeyframeSequence) & ((className: "AnimationController", parent: Instance?) -> AnimationController) & ((className: "AnimationRigData", parent: Instance?) -> AnimationRigData) & ((className: "Animator", parent: Instance?) -> Animator) & ((className: "AudioDeviceInput", parent: Instance?) -> AudioDeviceInput) & ((className: "AudioDeviceOutput", parent: Instance?) -> AudioDeviceOutput) & ((className: "AudioDistortion", parent: Instance?) -> AudioDistortion) & ((className: "AudioEcho", parent: Instance?) -> AudioEcho) & ((className: "AudioEmitter", parent: Instance?) -> AudioEmitter) & ((className: "AudioEqualizer", parent: Instance?) -> AudioEqualizer) & ((className: "AudioFader", parent: Instance?) -> AudioFader) & ((className: "AudioFlanger", parent: Instance?) -> AudioFlanger) & ((className: "AudioListener", parent: Instance?) -> AudioListener) & ((className: "AudioPitchShifter", parent: Instance?) -> AudioPitchShifter) & ((className: "AudioPlayer", parent: Instance?) -> AudioPlayer) & ((className: "AudioReverb", parent: Instance?) -> AudioReverb) & ((className: "AudioSearchParams", parent: Instance?) -> AudioSearchParams) & ((className: "Backpack", parent: Instance?) -> Backpack) & ((className: "WrapLayer", parent: Instance?) -> WrapLayer) & ((className: "WrapTarget", parent: Instance?) -> WrapTarget) & ((className: "BindableEvent", parent: Instance?) -> BindableEvent) & ((className: "BindableFunction", parent: Instance?) -> BindableFunction) & ((className: "BodyAngularVelocity", parent: Instance?) -> BodyAngularVelocity) & ((className: "BodyForce", parent: Instance?) -> BodyForce) & ((className: "BodyGyro", parent: Instance?) -> BodyGyro) & ((className: "BodyPosition", parent: Instance?) -> BodyPosition) & ((className: "BodyThrust", parent: Instance?) -> BodyThrust) & ((className: "BodyVelocity", parent: Instance?) -> BodyVelocity) & ((className: "RocketPropulsion", parent: Instance?) -> RocketPropulsion) & ((className: "BubbleChatMessageProperties", parent: Instance?) -> BubbleChatMessageProperties) & ((className: "Camera", parent: Instance?) -> Camera) & ((className: "BodyColors", parent: Instance?) -> BodyColors) & ((className: "CharacterMesh", parent: Instance?) -> CharacterMesh) & ((className: "Pants", parent: Instance?) -> Pants) & ((className: "Shirt", parent: Instance?) -> Shirt) & ((className: "ShirtGraphic", parent: Instance?) -> ShirtGraphic) & ((className: "Skin", parent: Instance?) -> Skin) & ((className: "ClickDetector", parent: Instance?) -> ClickDetector) & ((className: "DragDetector", parent: Instance?) -> DragDetector) & ((className: "Configuration", parent: Instance?) -> Configuration) & ((className: "AlignOrientation", parent: Instance?) -> AlignOrientation) & ((className: "AlignPosition", parent: Instance?) -> AlignPosition) & ((className: "AngularVelocity", parent: Instance?) -> AngularVelocity) & ((className: "AnimationConstraint", parent: Instance?) -> AnimationConstraint) & ((className: "BallSocketConstraint", parent: Instance?) -> BallSocketConstraint) & ((className: "HingeConstraint", parent: Instance?) -> HingeConstraint) & ((className: "LineForce", parent: Instance?) -> LineForce) & ((className: "LinearVelocity", parent: Instance?) -> LinearVelocity) & ((className: "PlaneConstraint", parent: Instance?) -> PlaneConstraint) & ((className: "Plane", parent: Instance?) -> Plane) & ((className: "RigidConstraint", parent: Instance?) -> RigidConstraint) & ((className: "RodConstraint", parent: Instance?) -> RodConstraint) & ((className: "RopeConstraint", parent: Instance?) -> RopeConstraint) & ((className: "CylindricalConstraint", parent: Instance?) -> CylindricalConstraint) & ((className: "PrismaticConstraint", parent: Instance?) -> PrismaticConstraint) & ((className: "SpringConstraint", parent: Instance?) -> SpringConstraint) & ((className: "Torque", parent: Instance?) -> Torque) & ((className: "TorsionSpringConstraint", parent: Instance?) -> TorsionSpringConstraint) & ((className: "UniversalConstraint", parent: Instance?) -> UniversalConstraint) & ((className: "HumanoidController", parent: Instance?) -> HumanoidController) & ((className: "SkateboardController", parent: Instance?) -> SkateboardController) & ((className: "VehicleController", parent: Instance?) -> VehicleController) & ((className: "AirController", parent: Instance?) -> AirController) & ((className: "ClimbController", parent: Instance?) -> ClimbController) & ((className: "GroundController", parent: Instance?) -> GroundController) & ((className: "SwimController", parent: Instance?) -> SwimController) & ((className: "ControllerManager", parent: Instance?) -> ControllerManager) & ((className: "CustomEvent", parent: Instance?) -> CustomEvent) & ((className: "CustomEventReceiver", parent: Instance?) -> CustomEventReceiver) & ((className: "CylinderMesh", parent: Instance?) -> CylinderMesh) & ((className: "DynamicMesh", parent: Instance?) -> DynamicMesh) & ((className: "FileMesh", parent: Instance?) -> FileMesh) & ((className: "SpecialMesh", parent: Instance?) -> SpecialMesh) & ((className: "DataStoreIncrementOptions", parent: Instance?) -> DataStoreIncrementOptions) & ((className: "DataStoreOptions", parent: Instance?) -> DataStoreOptions) & ((className: "DataStoreSetOptions", parent: Instance?) -> DataStoreSetOptions) & ((className: "DebuggerWatch", parent: Instance?) -> DebuggerWatch) & ((className: "Dialog", parent: Instance?) -> Dialog) & ((className: "DialogChoice", parent: Instance?) -> DialogChoice) & ((className: "Dragger", parent: Instance?) -> Dragger) & ((className: "EulerRotationCurve", parent: Instance?) -> EulerRotationCurve) & ((className: "ExperienceInviteOptions", parent: Instance?) -> ExperienceInviteOptions) & ((className: "Explosion", parent: Instance?) -> Explosion) & ((className: "Decal", parent: Instance?) -> Decal) & ((className: "Texture", parent: Instance?) -> Texture) & ((className: "Hole", parent: Instance?) -> Hole) & ((className: "MotorFeature", parent: Instance?) -> MotorFeature) & ((className: "Fire", parent: Instance?) -> Fire) & ((className: "FloatCurve", parent: Instance?) -> FloatCurve) & ((className: "CSGDictionaryService", parent: Instance?) -> CSGDictionaryService) & ((className: "NonReplicatedCSGDictionaryService", parent: Instance?) -> NonReplicatedCSGDictionaryService) & ((className: "ForceField", parent: Instance?) -> ForceField) & ((className: "FunctionalTest", parent: Instance?) -> FunctionalTest) & ((className: "GetTextBoundsParams", parent: Instance?) -> GetTextBoundsParams) & ((className: "Frame", parent: Instance?) -> Frame) & ((className: "ImageButton", parent: Instance?) -> ImageButton) & ((className: "TextButton", parent: Instance?) -> TextButton) & ((className: "ImageLabel", parent: Instance?) -> ImageLabel) & ((className: "TextLabel", parent: Instance?) -> TextLabel) & ((className: "TextBox", parent: Instance?) -> TextBox) & ((className: "VideoFrame", parent: Instance?) -> VideoFrame) & ((className: "ViewportFrame", parent: Instance?) -> ViewportFrame) & ((className: "BillboardGui", parent: Instance?) -> BillboardGui) & ((className: "ScreenGui", parent: Instance?) -> ScreenGui) & ((className: "GuiMain", parent: Instance?) -> GuiMain) & ((className: "AdGui", parent: Instance?) -> AdGui) & ((className: "SurfaceGui", parent: Instance?) -> SurfaceGui) & ((className: "FloorWire", parent: Instance?) -> FloorWire) & ((className: "SelectionBox", parent: Instance?) -> SelectionBox) & ((className: "BoxHandleAdornment", parent: Instance?) -> BoxHandleAdornment) & ((className: "ConeHandleAdornment", parent: Instance?) -> ConeHandleAdornment) & ((className: "CylinderHandleAdornment", parent: Instance?) -> CylinderHandleAdornment) & ((className: "ImageHandleAdornment", parent: Instance?) -> ImageHandleAdornment) & ((className: "LineHandleAdornment", parent: Instance?) -> LineHandleAdornment) & ((className: "SphereHandleAdornment", parent: Instance?) -> SphereHandleAdornment) & ((className: "WireframeHandleAdornment", parent: Instance?) -> WireframeHandleAdornment) & ((className: "ParabolaAdornment", parent: Instance?) -> ParabolaAdornment) & ((className: "SelectionSphere", parent: Instance?) -> SelectionSphere) & ((className: "ArcHandles", parent: Instance?) -> ArcHandles) & ((className: "Handles", parent: Instance?) -> Handles) & ((className: "SurfaceSelection", parent: Instance?) -> SurfaceSelection) & ((className: "SelectionPartLasso", parent: Instance?) -> SelectionPartLasso) & ((className: "SelectionPointLasso", parent: Instance?) -> SelectionPointLasso) & ((className: "HeightmapImporterService", parent: Instance?) -> HeightmapImporterService) & ((className: "HiddenSurfaceRemovalAsset", parent: Instance?) -> HiddenSurfaceRemovalAsset) & ((className: "Humanoid", parent: Instance?) -> Humanoid) & ((className: "HumanoidDescription", parent: Instance?) -> HumanoidDescription) & ((className: "IKControl", parent: Instance?) -> IKControl) & ((className: "RotateP", parent: Instance?) -> RotateP) & ((className: "RotateV", parent: Instance?) -> RotateV) & ((className: "Glue", parent: Instance?) -> Glue) & ((className: "ManualGlue", parent: Instance?) -> ManualGlue) & ((className: "ManualWeld", parent: Instance?) -> ManualWeld) & ((className: "Motor", parent: Instance?) -> Motor) & ((className: "Motor6D", parent: Instance?) -> Motor6D) & ((className: "Rotate", parent: Instance?) -> Rotate) & ((className: "Snap", parent: Instance?) -> Snap) & ((className: "VelocityMotor", parent: Instance?) -> VelocityMotor) & ((className: "Weld", parent: Instance?) -> Weld) & ((className: "Keyframe", parent: Instance?) -> Keyframe) & ((className: "KeyframeMarker", parent: Instance?) -> KeyframeMarker) & ((className: "PointLight", parent: Instance?) -> PointLight) & ((className: "SpotLight", parent: Instance?) -> SpotLight) & ((className: "SurfaceLight", parent: Instance?) -> SurfaceLight) & ((className: "Script", parent: Instance?) -> Script) & ((className: "LocalScript", parent: Instance?) -> LocalScript) & ((className: "ModuleScript", parent: Instance?) -> ModuleScript) & ((className: "MarkerCurve", parent: Instance?) -> MarkerCurve) & ((className: "MemoryStoreService", parent: Instance?) -> MemoryStoreService) & ((className: "Message", parent: Instance?) -> Message) & ((className: "Hint", parent: Instance?) -> Hint) & ((className: "CornerWedgePart", parent: Instance?) -> CornerWedgePart) & ((className: "Part", parent: Instance?) -> Part) & ((className: "FlagStand", parent: Instance?) -> FlagStand) & ((className: "Seat", parent: Instance?) -> Seat) & ((className: "SkateboardPlatform", parent: Instance?) -> SkateboardPlatform) & ((className: "SpawnLocation", parent: Instance?) -> SpawnLocation) & ((className: "WedgePart", parent: Instance?) -> WedgePart) & ((className: "PartOperation", parent: Instance?) -> PartOperation) & ((className: "IntersectOperation", parent: Instance?) -> IntersectOperation) & ((className: "NegateOperation", parent: Instance?) -> NegateOperation) & ((className: "UnionOperation", parent: Instance?) -> UnionOperation) & ((className: "TrussPart", parent: Instance?) -> TrussPart) & ((className: "VehicleSeat", parent: Instance?) -> VehicleSeat) & ((className: "Model", parent: Instance?) -> Model) & ((className: "Actor", parent: Instance?) -> Actor) & ((className: "HopperBin", parent: Instance?) -> HopperBin) & ((className: "Tool", parent: Instance?) -> Tool) & ((className: "Flag", parent: Instance?) -> Flag) & ((className: "WorldModel", parent: Instance?) -> WorldModel) & ((className: "PartOperationAsset", parent: Instance?) -> PartOperationAsset) & ((className: "ParticleEmitter", parent: Instance?) -> ParticleEmitter) & ((className: "PathfindingLink", parent: Instance?) -> PathfindingLink) & ((className: "PathfindingModifier", parent: Instance?) -> PathfindingModifier) & ((className: "Player", parent: Instance?) -> Player) & ((className: "PluginAction", parent: Instance?) -> PluginAction) & ((className: "PluginCapabilities", parent: Instance?) -> PluginCapabilities) & ((className: "NumberPose", parent: Instance?) -> NumberPose) & ((className: "Pose", parent: Instance?) -> Pose) & ((className: "ReflectionMetadata", parent: Instance?) -> ReflectionMetadata) & ((className: "ReflectionMetadataCallbacks", parent: Instance?) -> ReflectionMetadataCallbacks) & ((className: "ReflectionMetadataClasses", parent: Instance?) -> ReflectionMetadataClasses) & ((className: "ReflectionMetadataEnums", parent: Instance?) -> ReflectionMetadataEnums) & ((className: "ReflectionMetadataEvents", parent: Instance?) -> ReflectionMetadataEvents) & ((className: "ReflectionMetadataFunctions", parent: Instance?) -> ReflectionMetadataFunctions) & ((className: "ReflectionMetadataClass", parent: Instance?) -> ReflectionMetadataClass) & ((className: "ReflectionMetadataEnum", parent: Instance?) -> ReflectionMetadataEnum) & ((className: "ReflectionMetadataEnumItem", parent: Instance?) -> ReflectionMetadataEnumItem) & ((className: "ReflectionMetadataMember", parent: Instance?) -> ReflectionMetadataMember) & ((className: "ReflectionMetadataProperties", parent: Instance?) -> ReflectionMetadataProperties) & ((className: "ReflectionMetadataYieldFunctions", parent: Instance?) -> ReflectionMetadataYieldFunctions) & ((className: "RemoteEvent", parent: Instance?) -> RemoteEvent) & ((className: "RemoteFunction", parent: Instance?) -> RemoteFunction) & ((className: "RenderingTest", parent: Instance?) -> RenderingTest) & ((className: "RotationCurve", parent: Instance?) -> RotationCurve) & ((className: "BuoyancySensor", parent: Instance?) -> BuoyancySensor) & ((className: "ControllerPartSensor", parent: Instance?) -> ControllerPartSensor) & ((className: "Sky", parent: Instance?) -> Sky) & ((className: "Smoke", parent: Instance?) -> Smoke) & ((className: "Sound", parent: Instance?) -> Sound) & ((className: "Sparkles", parent: Instance?) -> Sparkles) & ((className: "StandalonePluginScripts", parent: Instance?) -> StandalonePluginScripts) & ((className: "StarterGear", parent: Instance?) -> StarterGear) & ((className: "StudioCallout", parent: Instance?) -> StudioCallout) & ((className: "StudioObjectBase", parent: Instance?) -> StudioObjectBase) & ((className: "StudioWidget", parent: Instance?) -> StudioWidget) & ((className: "StyleRule", parent: Instance?) -> StyleRule) & ((className: "StyleSheet", parent: Instance?) -> StyleSheet) & ((className: "StyleDerive", parent: Instance?) -> StyleDerive) & ((className: "StyleLink", parent: Instance?) -> StyleLink) & ((className: "SurfaceAppearance", parent: Instance?) -> SurfaceAppearance) & ((className: "Team", parent: Instance?) -> Team) & ((className: "TeleportOptions", parent: Instance?) -> TeleportOptions) & ((className: "TerrainDetail", parent: Instance?) -> TerrainDetail) & ((className: "TerrainRegion", parent: Instance?) -> TerrainRegion) & ((className: "TestService", parent: Instance?) -> TestService) & ((className: "TextChannel", parent: Instance?) -> TextChannel) & ((className: "TextChatCommand", parent: Instance?) -> TextChatCommand) & ((className: "TextChatMessageProperties", parent: Instance?) -> TextChatMessageProperties) & ((className: "TrackerStreamAnimation", parent: Instance?) -> TrackerStreamAnimation) & ((className: "BinaryStringValue", parent: Instance?) -> BinaryStringValue) & ((className: "BoolValue", parent: Instance?) -> BoolValue) & ((className: "BrickColorValue", parent: Instance?) -> BrickColorValue) & ((className: "CFrameValue", parent: Instance?) -> CFrameValue) & ((className: "Color3Value", parent: Instance?) -> Color3Value) & ((className: "DoubleConstrainedValue", parent: Instance?) -> DoubleConstrainedValue) & ((className: "IntConstrainedValue", parent: Instance?) -> IntConstrainedValue) & ((className: "IntValue", parent: Instance?) -> IntValue) & ((className: "NumberValue", parent: Instance?) -> NumberValue) & ((className: "ObjectValue", parent: Instance?) -> ObjectValue) & ((className: "RayValue", parent: Instance?) -> RayValue) & ((className: "StringValue", parent: Instance?) -> StringValue) & ((className: "Vector3Value", parent: Instance?) -> Vector3Value) & ((className: "Vector3Curve", parent: Instance?) -> Vector3Curve) & ((className: "VirtualInputManager", parent: Instance?) -> VirtualInputManager) & ((className: "WeldConstraint", parent: Instance?) -> WeldConstraint) & ((className: "Wire", parent: Instance?) -> Wire) & ((className: string, parent: Instance?) -> Instance), Lock: (instance: Instance, player: Player) -> nil, Unlock: (instance: Instance) -> nil, @@ -10629,10 +10183,6 @@ declare Random: { new: ((seed: number?) -> Random), } -declare TweenInfo: { - new: ((time: number?, easingStyle: EnumEasingStyle?, easingDirection: EnumEasingDirection?, repeatCount: number?, reverses: boolean?, delayTime: number?) -> TweenInfo), -} - declare DateTime: { now: (() -> DateTime), fromUnixTimestamp: ((unixTimestamp: number) -> DateTime), diff --git a/luau/10000001.luau b/luau/10000001.luau new file mode 100644 index 0000000..f47c89e --- /dev/null +++ b/luau/10000001.luau @@ -0,0 +1,3316 @@ +local __DARKLUA_BUNDLE_MODULES = {} + +do + __DARKLUA_BUNDLE_MODULES.c = { + cannotAssignProperty = "The class type '%s' has no assignable property '%s'.", + cannotConnectChange = "The %s class doesn't have a property called '%s'.", + cannotConnectEvent = "The %s class doesn't have an event called '%s'.", + cannotCreateClass = "Can't create a new instance of class '%s'.", + computedCallbackError = "Computed callback error: ERROR_MESSAGE", + destructorNeededValue = [[To save instances into Values, provide a destructor function. This will be an error soon - see discussion #183 on GitHub.]], + destructorNeededComputed = [[To return instances from Computeds, provide a destructor function. This will be an error soon - see discussion #183 on GitHub.]], + multiReturnComputed = [[Returning multiple values from Computeds is discouraged, as behaviour will change soon - see discussion #189 on GitHub.]], + destructorNeededForKeys = [[To return instances from ForKeys, provide a destructor function. This will be an error soon - see discussion #183 on GitHub.]], + destructorNeededForValues = [[To return instances from ForValues, provide a destructor function. This will be an error soon - see discussion #183 on GitHub.]], + destructorNeededForPairs = [[To return instances from ForPairs, provide a destructor function. This will be an error soon - see discussion #183 on GitHub.]], + forKeysProcessorError = "ForKeys callback error: ERROR_MESSAGE", + forKeysKeyCollision = [[ForKeys should only write to output key '%s' once when processing key changes, but it wrote to it twice. Previously input key: '%s'; New input key: '%s']], + forKeysDestructorError = "ForKeys destructor error: ERROR_MESSAGE", + forPairsDestructorError = "ForPairs destructor error: ERROR_MESSAGE", + forPairsKeyCollision = [[ForPairs should only write to output key '%s' once when processing key changes, but it wrote to it twice. Previous input pair: '[%s] = %s'; New input pair: '[%s] = %s']], + forPairsProcessorError = "ForPairs callback error: ERROR_MESSAGE", + forValuesProcessorError = "ForValues callback error: ERROR_MESSAGE", + forValuesDestructorError = "ForValues destructor error: ERROR_MESSAGE", + invalidChangeHandler = [[The change handler for the '%s' property must be a function.]], + invalidEventHandler = "The handler for the '%s' event must be a function.", + invalidPropertyType = "'%s.%s' expected a '%s' type, but got a '%s' type.", + invalidRefType = "Instance refs must be Value objects.", + invalidOutType = "[Out] properties must be given Value objects.", + invalidOutProperty = "The %s class doesn't have a property called '%s'.", + invalidSpringDamping = [[The damping ratio for a spring must be >= 0. (damping was %.2f)]], + invalidSpringSpeed = "The speed of a spring must be >= 0. (speed was %.2f)", + mistypedSpringDamping = "The damping ratio for a spring must be a number. (got a %s)", + mistypedSpringSpeed = "The speed of a spring must be a number. (got a %s)", + mistypedTweenInfo = "The tween info of a tween must be a TweenInfo. (got a %s)", + springTypeMismatch = "The type '%s' doesn't match the spring's type '%s'.", + stateGetWasRemoved = [[`StateObject:get()` has been replaced by `use()` and `peek()` - see discussion #217 on GitHub.]], + strictReadError = "'%s' is not a valid member of '%s'.", + unknownMessage = "Unknown error: ERROR_MESSAGE", + unrecognisedChildType = "'%s' type children aren't accepted by `[Children]`.", + unrecognisedPropertyKey = "'%s' keys aren't accepted in property tables.", + unrecognisedPropertyStage = [['%s' isn't a valid stage for a special key to be applied at.]], + invalidEasingStyle = [[The easing style must be a valid Enum.EasingStyle or a string of 'Linear', 'Quad', 'Cubic', 'Quart', 'Quint', 'Sine', 'Exponential', 'Circular', 'Elastic', 'Back', 'Bounce'. (got %s)]], + invalidEasingDirection = [[The easing direction must be a valid Enum.EasingDirection or a string of 'In', 'Out', 'InOut', 'OutIn'. (got %s)]], + } +end +do + local messages = __DARKLUA_BUNDLE_MODULES.c + + local function logError(messageID, errObj, ...) + local formatString + + if messages[messageID] ~= nil then + formatString = messages[messageID] + else + messageID = "unknownMessage" + formatString = messages[messageID] + end + + local errorString + + if errObj == nil then + errorString = string.format( + "[Fusion] " .. formatString .. "\n(ID: " .. messageID .. ")", + ... + ) + else + formatString = + formatString:gsub("ERROR_MESSAGE", tostring(errObj.message)) + errorString = string.format( + "[Fusion] " + .. formatString + .. "\n(ID: " + .. messageID + .. ")\n---- Stack trace ----\n" + .. tostring(errObj.trace), + ... + ) + end + + error(errorString:gsub("\n", "\n "), 0) + end + + __DARKLUA_BUNDLE_MODULES.d = logError +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + + local function restrictRead(tableName, strictTable) + local metatable = getmetatable(strictTable) + + if metatable == nil then + metatable = {} + + setmetatable(strictTable, metatable) + end + + function metatable:__index(memberName) + logError("strictReadError", nil, tostring(memberName), tableName) + end + + return strictTable + end + + __DARKLUA_BUNDLE_MODULES.e = restrictRead +end +do + local Oklab = {} + + function Oklab.to(rgb) + local l = rgb.r * 0.4122214708 + + rgb.g * 0.5363325363 + + rgb.b * 0.0514459929 + local m = rgb.r * 0.2119034982 + + rgb.g * 0.6806995451 + + rgb.b * 0.1073969566 + local s = rgb.r * 0.0883024619 + + rgb.g * 0.2817188376 + + rgb.b * 0.6299787005 + local lRoot = l ^ 0.3333333333333333 + local mRoot = m ^ 0.3333333333333333 + local sRoot = s ^ 0.3333333333333333 + + return Vector3.new( + lRoot * 0.2104542553 + mRoot * 0.793617785 - sRoot * 0.0040720468, + lRoot * 1.9779984951 - mRoot * 2.428592205 + sRoot * 0.4505937099, + lRoot * 0.0259040371 + mRoot * 0.7827717662 - sRoot * 0.808675766 + ) + end + function Oklab.from(lab, unclamped) + local lRoot = lab.X + lab.Y * 0.3963377774 + lab.Z * 0.2158037573 + local mRoot = lab.X - lab.Y * 0.1055613458 - lab.Z * 0.0638541728 + local sRoot = lab.X - lab.Y * 0.0894841775 - lab.Z * 1.291485548 + local l = lRoot ^ 3 + local m = mRoot ^ 3 + local s = sRoot ^ 3 + local red = l * 4.0767416621 - m * 3.3077115913 + s * 0.2309699292 + local green = l * -1.2684380046 + m * 2.6097574011 - s * 0.3413193965 + local blue = l * -4.196086299999999E-3 + - m * 0.7034186147 + + s * 1.707614701 + + if not unclamped then + red = math.max(0, math.min(red, 1)) + green = math.max(0, math.min(green, 1)) + blue = math.max(0, math.min(blue, 1)) + end + + return Color3.new(red, green, blue) + end + + __DARKLUA_BUNDLE_MODULES.f = Oklab +end +do + __DARKLUA_BUNDLE_MODULES.g = function(value) + local basicType = type(value) + + if + basicType == "nil" + or basicType == "boolean" + or basicType == "number" + or basicType == "string" + or basicType == "function" + or basicType == "thread" + or basicType == "table" + then + return basicType + end + + local tests = { + { + "Instance", + { + "ClassName", + }, + }, + { + "EnumItem", + { + "EnumType", + "Name", + "Value", + }, + }, + { + "Enum", + { + "GetEnumItems", + }, + }, + { + "Enums", + { + "MembershipType", + }, + }, + { + "RBXScriptSignal", + { + "connect", + "wait", + }, + }, + { + "RBXScriptConnection", + { + "connected", + "disconnect", + }, + }, + { + "TweenInfo", + { + "EasingDirection", + "RepeatCount", + "EasingStyle", + }, + }, + { + "CFrame", + { + "p", + "x", + "y", + "z", + "lookVector", + }, + }, + { + "Vector3", + { + "Lerp", + "unit", + "magnitude", + "x", + "y", + "z", + }, + }, + { + "Vector3int16", + { + "z", + "x", + "y", + }, + }, + { + "Vector2", + { + "unit", + "magnitude", + "x", + "y", + }, + }, + { + "Vector2int16", + { + "x", + "y", + }, + }, + { + "Region3", + { + "CFrame", + "Size", + }, + }, + { + "Region3int16", + { + "Min", + "Max", + }, + }, + { + "Ray", + { + "Origin", + "Direction", + "Unit", + "ClosestPoint", + "Distance", + }, + }, + { + "UDim", + { + "Scale", + "Offset", + }, + }, + { + "Axes", + { + "Z", + "X", + "Y", + }, + }, + { + "UDim2", + { + "X", + "Y", + }, + }, + { + "BrickColor", + { + "Number", + "Name", + "Color", + "r", + "g", + "b", + }, + }, + { + "Color3", + { + "r", + "g", + "b", + }, + }, + { + "Faces", + { + "Right", + "Top", + "Back", + }, + }, + } + + for _, v in ipairs(tests) do + local t, test = v[1], v[2] + local ok, result = pcall(function() + for _, prop in ipairs(test) do + if value[prop] == nil then + return false + end + end + + return true + end) + + if ok and result then + return t + end + end + end +end +do + local Oklab = __DARKLUA_BUNDLE_MODULES.f + local typeof = __DARKLUA_BUNDLE_MODULES.g + + local function lerpType(from, to, ratio) + local typeString = typeof(from) + + if typeof(to) == typeString then + if typeString == "number" then + return (to - from) * ratio + from + elseif typeString == "CFrame" then + return from:Lerp(to, ratio) + elseif typeString == "Color3" then + local fromLab = Oklab.to(from) + local toLab = Oklab.to(to) + + return Oklab.from(fromLab:Lerp(toLab, ratio), false) + elseif typeString == "Ray" then + return Ray.new( + from.Origin:Lerp(to.Origin, ratio), + from.Direction:Lerp(to.Direction, ratio) + ) + elseif typeString == "Region3" then + local position = + from.CFrame.Position:Lerp(to.CFrame.Position, ratio) + local halfSize = from.Size:Lerp(to.Size, ratio) / 2 + + return Region3.new(position - halfSize, position + halfSize) + elseif typeString == "Region3int16" then + return Region3int16.new( + Vector3int16.new( + (to.Min.X - from.Min.X) * ratio + from.Min.X, + (to.Min.Y - from.Min.Y) * ratio + from.Min.Y, + (to.Min.Z - from.Min.Z) * ratio + from.Min.Z + ), + Vector3int16.new( + (to.Max.X - from.Max.X) * ratio + from.Max.X, + (to.Max.Y - from.Max.Y) * ratio + from.Max.Y, + (to.Max.Z - from.Max.Z) * ratio + from.Max.Z + ) + ) + elseif typeString == "UDim" then + return UDim.new( + (to.Scale - from.Scale) * ratio + from.Scale, + (to.Offset - from.Offset) * ratio + from.Offset + ) + elseif typeString == "UDim2" then + return UDim2.new( + (to.X.Scale - from.X.Scale) * ratio + from.X.Scale, + (to.X.Offset - from.X.Offset) * ratio + from.X.Offset, + (to.Y.Scale - from.Y.Scale) * ratio + from.Y.Scale, + (to.Y.Offset - from.Y.Offset) * ratio + from.Y.Offset + ) + elseif typeString == "Vector2" or typeString == "Vector3" then + return from:Lerp(to, ratio) + elseif typeString == "Vector2int16" then + return Vector2int16.new( + (to.X - from.X) * ratio + from.X, + (to.Y - from.Y) * ratio + from.Y + ) + elseif typeString == "Vector3int16" then + return Vector3int16.new( + (to.X - from.X) * ratio + from.X, + (to.Y - from.Y) * ratio + from.Y, + (to.Z - from.Z) * ratio + from.Z + ) + end + end + if ratio < 0.5 then + return from + end + + return to + end + + __DARKLUA_BUNDLE_MODULES.h = lerpType +end +do + local pow = math.pow + local sin = math.sin + local cos = math.cos + local pi = math.pi + local sqrt = math.sqrt + local abs = math.abs + local asin = math.asin + local easing = { + Linear = {}, + Quad = {}, + Cubic = {}, + Quart = {}, + Quint = {}, + Sine = {}, + Exponential = {}, + Circular = {}, + Elastic = {}, + Back = {}, + Bounce = {}, + } + local linear = function(t, b, c) + return c * t + b + end + + easing.Linear.In = linear + easing.Linear.Out = linear + easing.Linear.InOut = linear + easing.Linear.OutIn = linear + easing.Quad.In = function(t, b, c) + return c * pow(t, 2) + b + end + easing.Quad.Out = function(t, b, c) + return -c * t * (t - 2) + b + end + easing.Quad.InOut = function(t, b, c) + t = t * 2 + + if t < 1 then + return c / 2 * pow(t, 2) + b + end + + return -c / 2 * ((t - 1) * (t - 3) - 1) + b + end + easing.Quad.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Quad.Out(t * 2, b, c / 2) + end + + return easing.Quad.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Cubic.In = function(t, b, c) + return c * pow(t, 3) + b + end + easing.Cubic.Out = function(t, b, c) + t = t - 1 + + return c * (pow(t, 3) + 1) + b + end + easing.Cubic.InOut = function(t, b, c) + t = t * 2 + + if t < 1 then + return c / 2 * t * t * t + b + end + + t = t - 2 + + return c / 2 * (t * t * t + 2) + b + end + easing.Cubic.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Cubic.Out(t * 2, b, c / 2) + end + + return easing.Cubic.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Quart.In = function(t, b, c) + return c * pow(t, 4) + b + end + easing.Quart.Out = function(t, b, c) + t = t - 1 + + return -c * (pow(t, 4) - 1) + b + end + easing.Quart.InOut = function(t, b, c) + t = t * 2 + + if t < 1 then + return c / 2 * pow(t, 4) + b + end + + t = t - 2 + + return -c / 2 * (pow(t, 4) - 2) + b + end + easing.Quart.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Quart.Out(t * 2, b, c / 2) + end + + return easing.Quart.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Quint.In = function(t, b, c) + return c * pow(t, 5) + b + end + easing.Quint.Out = function(t, b, c) + t = t - 1 + + return c * (pow(t, 5) + 1) + b + end + easing.Quint.InOut = function(t, b, c) + t = t * 2 + + if t < 1 then + return c / 2 * pow(t, 5) + b + end + + t = t - 2 + + return c / 2 * (pow(t, 5) + 2) + b + end + easing.Quint.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Quint.Out(t * 2, b, c / 2) + end + + return easing.Quint.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Sine.In = function(t, b, c) + return -c * cos(t * (pi / 2)) + c + b + end + easing.Sine.Out = function(t, b, c) + return c * sin(t * (pi / 2)) + b + end + easing.Sine.InOut = function(t, b, c) + return -c / 2 * (cos(pi * t) - 1) + b + end + easing.Sine.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Sine.Out(t * 2, b, c / 2) + end + + return easing.Sine.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Exponential.In = function(t, b, c) + if t == 0 then + return b + end + + return c * pow(2, 10 * (t - 1)) + b - c * 0.001 + end + easing.Exponential.Out = function(t, b, c) + if t == 1 then + return b + c + end + + return c * 1.001 * (-pow(2, -10 * t) + 1) + b + end + easing.Exponential.InOut = function(t, b, c) + if t == 0 then + return b + elseif t == 1 then + return b + c + end + + t = t * 2 + + if t < 1 then + return c / 2 * pow(2, 10 * (t - 1)) + b - c * 0.0005 + end + + t = t - 1 + + return c / 2 * 1.0005 * (-pow(2, -10 * t) + 2) + b + end + easing.Exponential.OutIn = function(t, b, c) + if t < 0.5 then + return t.Exponential.Out(t * 2, b, c / 2) + end + + return t.Exponential.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Circular.In = function(t, b, c) + return (-c * (sqrt(1 - pow(t, 2)) - 1) + b) + end + easing.Circular.Out = function(t, b, c) + t = t - 1 + + return (c * sqrt(1 - pow(t, 2)) + b) + end + easing.Circular.InOut = function(t, b, c) + t = t * 2 + + if t < 1 then + return -c / 2 * (sqrt(1 - t * t) - 1) + b + end + + t = t - 2 + + return c / 2 * (sqrt(1 - t * t) + 1) + b + end + easing.Circular.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Circular.Out(t * 2, b, c / 2) + end + + return easing.Circular.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Elastic.In = function(t, b, c) + if t == 0 then + return b + elseif t == 1 then + return b + c + end + + local p = 0.3 + local s + + s = p / 4 + t = t - 1 + + return -(c * pow(2, 10 * t) * sin((t * 1 - s) * (2 * pi) / p)) + b + end + easing.Elastic.Out = function(t, b, c) + if t == 0 then + return b + elseif t == 1 then + return b + c + end + + local p = 0.3 + local s + + s = p / 4 + + return c * pow(2, -10 * t) * sin((t - s) * (2 * pi) / p) + c + b + end + easing.Elastic.InOut = function(t, b, c) + if t == 0 then + return b + end + + t = t * 2 + + if t == 2 then + return b + c + end + + local p = 0.45 + local a = 0 + local s + + if not a or a < abs(c) then + a = c + s = p / 4 + else + s = p / (2 * pi) * asin(c / a) + end + + t = t - 1 + + if t < 1 then + return -0.5 * (a * pow(2, 10 * t) * sin((t - s) * (2 * pi) / p)) + b + end + + return a * pow(2, -10 * t) * sin((t - s) * (2 * pi) / p) * 0.5 + c + b + end + easing.Elastic.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Elastic.Out(t * 2, b, c / 2) + end + + return easing.Elastic.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Back.In = function(t, b, c) + local s = 1.70158 + + return c * t * t * ((s + 1) * t - s) + b + end + easing.Back.Out = function(t, b, c) + local s = 1.70158 + + t = t - 1 + + return c * (t * t * ((s + 1) * t + s) + 1) + b + end + easing.Back.InOut = function(t, b, c) + local s = 2.5949095 + + t = t * 2 + + if t < 1 then + return c / 2 * (t * t * ((s + 1) * t - s)) + b + end + + t = t - 2 + + return c / 2 * (t * t * ((s + 1) * t + s) + 2) + b + end + easing.Back.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Back.Out(t * 2, b, c / 2) + end + + return easing.Back.In((t * 2) - 1, b + c / 2, c / 2) + end + easing.Bounce.Out = function(t, b, c) + if t < 0.36363636363636365 then + return c * (7.5625 * t * t) + b + elseif t < 0.7272727272727273 then + t = t - 0.5454545454545454 + + return c * (7.5625 * t * t + 0.75) + b + elseif t < 0.9090909090909091 then + t = t - 0.8181818181818182 + + return c * (7.5625 * t * t + 0.9375) + b + end + + t = t - 0.9545454545454546 + + return c * (7.5625 * t * t + 0.984375) + b + end + easing.Bounce.In = function(t, b, c) + return c - easing.Bounce.Out(1 - t, 0, c) + b + end + easing.Bounce.InOut = function(t, b, c) + if t < 0.5 then + return easing.Bounce.In(t * 2, 0, c) * 0.5 + b + end + + return easing.Bounce.Out(t * 2 - 1, 0, c) * 0.5 + c * 0.5 + b + end + easing.Bounce.OutIn = function(t, b, c) + if t < 0.5 then + return easing.Bounce.Out(t * 2, b, c / 2) + end + + return easing.Bounce.In((t * 2) - 1, b + c / 2, c / 2) + end + __DARKLUA_BUNDLE_MODULES.i = easing +end +do + local easing = __DARKLUA_BUNDLE_MODULES.i + + local function getTweenRatio(tweenInfo, currentTime) + local delay = tweenInfo.DelayTime + local duration = tweenInfo.Time + local reverses = tweenInfo.Reverses + local numCycles = 1 + tweenInfo.RepeatCount + local easeStyle = tweenInfo.EasingStyle + local easeDirection = tweenInfo.EasingDirection + local cycleDuration = delay + duration + + if reverses then + cycleDuration = cycleDuration + duration + end + if + currentTime >= cycleDuration * numCycles + and tweenInfo.RepeatCount > -1 + then + return 1 + end + + local cycleTime = currentTime % cycleDuration + + if cycleTime <= delay then + return 0 + end + + local tweenProgress = (cycleTime - delay) / duration + + if tweenProgress > 1 then + tweenProgress = 2 - tweenProgress + end + + return easing[easeStyle][easeDirection](tweenProgress, 0, 1) + end + + __DARKLUA_BUNDLE_MODULES.j = getTweenRatio +end +do + local function updateAll(root) + local counters = {} + local flags = {} + local queue = {} + local queueSize = 0 + local queuePos = 1 + + for object in pairs(root.dependentSet) do + queueSize = queueSize + 1 + queue[queueSize] = object + flags[object] = true + end + + while queuePos <= queueSize do + local next = queue[queuePos] + local counter = counters[next] + + counters[next] = (function() + if counter == nil then + return 1 + else + return counter + 1 + end + end)() + + if next.dependentSet ~= nil then + for object in pairs(next.dependentSet) do + queueSize = queueSize + 1 + queue[queueSize] = object + end + end + + queuePos = queuePos + 1 + end + + queuePos = 1 + + while queuePos <= queueSize do + local next = queue[queuePos] + local counter = counters[next] - 1 + + counters[next] = counter + + if + counter == 0 + and flags[next] + and next:update() + and next.dependentSet ~= nil + then + for object in pairs(next.dependentSet) do + flags[object] = true + end + end + + queuePos = queuePos + 1 + end + end + + __DARKLUA_BUNDLE_MODULES.k = updateAll +end +do + local lerpType = __DARKLUA_BUNDLE_MODULES.h + local getTweenRatio = __DARKLUA_BUNDLE_MODULES.j + local updateAll = __DARKLUA_BUNDLE_MODULES.k + local TweenScheduler = {} + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + local allTweens = {} + + setmetatable(allTweens, WEAK_KEYS_METATABLE) + + function TweenScheduler.add(tween) + allTweens[tween] = true + end + function TweenScheduler.remove(tween) + allTweens[tween] = nil + end + function TweenScheduler.updateAllTweens() + local now = time() + + for tween in pairs(allTweens) do + local currentTime = now - tween._currentTweenStartTime + + if + currentTime > tween._currentTweenDuration + and tween._currentTweenInfo.RepeatCount > -1 + then + if tween._currentTweenInfo.Reverses then + tween._currentValue = tween._prevValue + else + tween._currentValue = tween._nextValue + end + + tween._currentlyAnimating = false + + updateAll(tween) + TweenScheduler.remove(tween) + else + local ratio = + getTweenRatio(tween._currentTweenInfo, currentTime) + local currentValue = + lerpType(tween._prevValue, tween._nextValue, ratio) + + tween._currentValue = currentValue + tween._currentlyAnimating = true + + updateAll(tween) + end + end + end + + __DARKLUA_BUNDLE_MODULES.l = TweenScheduler +end +do + local Oklab = __DARKLUA_BUNDLE_MODULES.f + + local function packType(numbers, typeString) + if typeString == "number" then + return numbers[1] + elseif typeString == "CFrame" then + return CFrame.new(numbers[1], numbers[2], numbers[3]) + * CFrame.fromAxisAngle( + Vector3.new(numbers[4], numbers[5], numbers[6]).Unit, + numbers[7] + ) + elseif typeString == "Color3" then + return Oklab.from( + Vector3.new(numbers[1], numbers[2], numbers[3]), + false + ) + elseif typeString == "ColorSequenceKeypoint" then + return ColorSequenceKeypoint.new( + numbers[4], + Oklab.from( + Vector3.new(numbers[1], numbers[2], numbers[3]), + false + ) + ) + elseif typeString == "DateTime" then + return DateTime.fromUnixTimestampMillis(numbers[1]) + elseif typeString == "NumberRange" then + return NumberRange.new(numbers[1], numbers[2]) + elseif typeString == "NumberSequenceKeypoint" then + return NumberSequenceKeypoint.new( + numbers[2], + numbers[1], + numbers[3] + ) + elseif typeString == "PhysicalProperties" then + return PhysicalProperties.new( + numbers[1], + numbers[2], + numbers[3], + numbers[4], + numbers[5] + ) + elseif typeString == "Ray" then + return Ray.new( + Vector3.new(numbers[1], numbers[2], numbers[3]), + Vector3.new(numbers[4], numbers[5], numbers[6]) + ) + elseif typeString == "Rect" then + return Rect.new(numbers[1], numbers[2], numbers[3], numbers[4]) + elseif typeString == "Region3" then + local position = Vector3.new(numbers[1], numbers[2], numbers[3]) + local halfSize = + Vector3.new(numbers[4] / 2, numbers[5] / 2, numbers[6] / 2) + + return Region3.new(position - halfSize, position + halfSize) + elseif typeString == "Region3int16" then + return Region3int16.new( + Vector3int16.new(numbers[1], numbers[2], numbers[3]), + Vector3int16.new(numbers[4], numbers[5], numbers[6]) + ) + elseif typeString == "UDim" then + return UDim.new(numbers[1], numbers[2]) + elseif typeString == "UDim2" then + return UDim2.new(numbers[1], numbers[2], numbers[3], numbers[4]) + elseif typeString == "Vector2" then + return Vector2.new(numbers[1], numbers[2]) + elseif typeString == "Vector2int16" then + return Vector2int16.new(numbers[1], numbers[2]) + elseif typeString == "Vector3" then + return Vector3.new(numbers[1], numbers[2], numbers[3]) + elseif typeString == "Vector3int16" then + return Vector3int16.new(numbers[1], numbers[2], numbers[3]) + else + return nil + end + end + + __DARKLUA_BUNDLE_MODULES.m = packType +end +do + local function springCoefficients(time, damping, speed) + if time == 0 or speed == 0 then + return 1, 0, 0, 1 + end + + local posPos, posVel, velPos, velVel + + if damping > 1 then + local scaledTime = time * speed + local alpha = math.sqrt(damping ^ 2 - 1) + local scaledInvAlpha = -0.5 / alpha + local z1 = -alpha - damping + local z2 = 1 / z1 + local expZ1 = math.exp(scaledTime * z1) + local expZ2 = math.exp(scaledTime * z2) + + posPos = (expZ2 * z1 - expZ1 * z2) * scaledInvAlpha + posVel = (expZ1 - expZ2) * scaledInvAlpha / speed + velPos = (expZ2 - expZ1) * scaledInvAlpha * speed + velVel = (expZ1 * z1 - expZ2 * z2) * scaledInvAlpha + elseif damping == 1 then + local scaledTime = time * speed + local expTerm = math.exp(-scaledTime) + + posPos = expTerm * (1 + scaledTime) + posVel = expTerm * time + velPos = expTerm * (-scaledTime * speed) + velVel = expTerm * (1 - scaledTime) + else + local scaledTime = time * speed + local alpha = math.sqrt(1 - damping ^ 2) + local invAlpha = 1 / alpha + local alphaTime = alpha * scaledTime + local expTerm = math.exp(-scaledTime * damping) + local sinTerm = expTerm * math.sin(alphaTime) + local cosTerm = expTerm * math.cos(alphaTime) + local sinInvAlpha = sinTerm * invAlpha + local sinInvAlphaDamp = sinInvAlpha * damping + + posPos = sinInvAlphaDamp + cosTerm + posVel = sinInvAlpha + velPos = -(sinInvAlphaDamp * damping + sinTerm * alpha) + velVel = cosTerm - sinInvAlphaDamp + end + + return posPos, posVel, velPos, velVel + end + + __DARKLUA_BUNDLE_MODULES.n = springCoefficients +end +do + local packType = __DARKLUA_BUNDLE_MODULES.m + local springCoefficients = __DARKLUA_BUNDLE_MODULES.n + local updateAll = __DARKLUA_BUNDLE_MODULES.k + local SpringScheduler = {} + local EPSILON = 0.0001 + local activeSprings = {} + local lastUpdateTime = time() + + function SpringScheduler.add(spring) + spring._lastSchedule = lastUpdateTime + spring._startDisplacements = {} + spring._startVelocities = {} + + for index, goal in ipairs(spring._springGoals) do + spring._startDisplacements[index] = spring._springPositions[index] + - goal + spring._startVelocities[index] = spring._springVelocities[index] + end + + activeSprings[spring] = true + end + function SpringScheduler.remove(spring) + activeSprings[spring] = nil + end + function SpringScheduler.updateAllSprings() + local springsToSleep = {} + + lastUpdateTime = time() + + for spring in pairs(activeSprings) do + local posPos, posVel, velPos, velVel = springCoefficients( + lastUpdateTime - spring._lastSchedule, + spring._currentDamping, + spring._currentSpeed + ) + local positions = spring._springPositions + local velocities = spring._springVelocities + local startDisplacements = spring._startDisplacements + local startVelocities = spring._startVelocities + local isMoving = false + + for index, goal in ipairs(spring._springGoals) do + local oldDisplacement = startDisplacements[index] + local oldVelocity = startVelocities[index] + local newDisplacement = oldDisplacement * posPos + + oldVelocity * posVel + local newVelocity = oldDisplacement * velPos + + oldVelocity * velVel + + if + math.abs(newDisplacement) > EPSILON + or math.abs(newVelocity) > EPSILON + then + isMoving = true + end + + positions[index] = newDisplacement + goal + velocities[index] = newVelocity + end + + if not isMoving then + springsToSleep[spring] = true + end + end + for spring in pairs(activeSprings) do + spring._currentValue = + packType(spring._springPositions, spring._currentType) + + updateAll(spring) + end + for spring in pairs(springsToSleep) do + activeSprings[spring] = nil + spring._currentValue = + packType(spring._springGoals, spring._currentType) + end + end + + __DARKLUA_BUNDLE_MODULES.o = SpringScheduler +end +do + local RunService = game:GetService "RunService" + local TweenScheduler = __DARKLUA_BUNDLE_MODULES.l + local SpringScheduler = __DARKLUA_BUNDLE_MODULES.o + + local function bindScheduler() + RunService.RenderStepped:connect(TweenScheduler.updateAllTweens) + RunService.RenderStepped:connect(SpringScheduler.updateAllSprings) + end + + __DARKLUA_BUNDLE_MODULES.p = bindScheduler +end +do + __DARKLUA_BUNDLE_MODULES.q = { + BillboardGui = { Active = true }, + Frame = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + }, + TextLabel = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + Font = Enum.Font.SourceSans, + Text = "", + TextColor3 = Color3.new(0, 0, 0), + FontSize = Enum.FontSize.Size14, + }, + TextButton = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + AutoButtonColor = false, + Font = Enum.Font.SourceSans, + Text = "", + TextColor3 = Color3.new(0, 0, 0), + FontSize = Enum.FontSize.Size14, + }, + TextBox = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + ClearTextOnFocus = false, + Font = Enum.Font.SourceSans, + Text = "", + TextColor3 = Color3.new(0, 0, 0), + FontSize = Enum.FontSize.Size14, + }, + ImageLabel = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + }, + ImageButton = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + AutoButtonColor = false, + }, + SpawnLocation = { Duration = 0 }, + Part = { + Anchored = true, + Size = Vector3.new(1, 1, 1), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + TrussPart = { + Anchored = true, + Size = Vector3.new(2, 2, 2), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + CornerWedgePart = { + Anchored = true, + Size = Vector3.new(1, 1, 1), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + VehicleSeat = { + Anchored = true, + Size = Vector3.new(1, 1, 1), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + } +end +do + local typeof = __DARKLUA_BUNDLE_MODULES.g + + local function cleanupOne(task) + local taskType = typeof(task) + + if taskType == "Instance" then + task:Destroy() + elseif taskType == "RBXScriptConnection" then + task:disconnect() + elseif taskType == "function" then + task() + elseif taskType == "table" then + if type(task.destroy) == "function" then + task:destroy() + elseif type(task.Destroy) == "function" then + task:Destroy() + elseif task[1] ~= nil then + for _, subtask in ipairs(task) do + cleanupOne(subtask) + end + end + end + end + local function cleanup(...) + for index = 1, select("#", ...) do + cleanupOne(select(index, ...)) + end + end + + __DARKLUA_BUNDLE_MODULES.r = cleanup +end +do + local typeof = __DARKLUA_BUNDLE_MODULES.g + + local function xtypeof(x) + local typeString = typeof(x) + + if typeString == "table" and type(x.type) == "string" then + return x.type + else + return typeString + end + end + + __DARKLUA_BUNDLE_MODULES.s = xtypeof +end +do + local class = {} + local CLASS_METATABLE = { __index = class } + local strongRefs = {} + + function class:update() + for _, callback in pairs(self._changeListeners) do + Spawn(callback) + end + + return false + end + function class:onChange(callback) + local uniqueIdentifier = {} + + self._numChangeListeners = self._numChangeListeners + 1 + self._changeListeners[uniqueIdentifier] = callback + strongRefs[self] = true + + local disconnected = false + + return function() + if disconnected then + return + end + + disconnected = true + self._changeListeners[uniqueIdentifier] = nil + self._numChangeListeners = self._numChangeListeners - 1 + + if self._numChangeListeners == 0 then + strongRefs[self] = nil + end + end + end + function class:onBind(callback) + Spawn(callback) + + return self:onChange(callback) + end + + local function Observer(watchedState) + local self = setmetatable({ + type = "State", + kind = "Observer", + dependencySet = { [watchedState] = true }, + dependentSet = {}, + _changeListeners = {}, + _numChangeListeners = 0, + }, CLASS_METATABLE) + + watchedState.dependentSet[self] = true + + return self + end + + __DARKLUA_BUNDLE_MODULES.t = Observer +end +do + local function isState(target) + return type(target) == "table" and type(target._peek) == "function" + end + + __DARKLUA_BUNDLE_MODULES.u = isState +end +do + local isState = __DARKLUA_BUNDLE_MODULES.u + + local function peek(target) + if isState(target) then + return (target):_peek() + end + + return target + end + + __DARKLUA_BUNDLE_MODULES.v = peek +end +do + local cleanup = __DARKLUA_BUNDLE_MODULES.r + local xtypeof = __DARKLUA_BUNDLE_MODULES.s + local logError = __DARKLUA_BUNDLE_MODULES.d + local Observer = __DARKLUA_BUNDLE_MODULES.t + local peek = __DARKLUA_BUNDLE_MODULES.v + local typeof = __DARKLUA_BUNDLE_MODULES.g + + local function setProperty_unsafe(instance, property, value) + (instance)[property] = value + end + local function testPropertyAssignable(instance, property) + (instance)[property] = (instance)[property] + end + local function setProperty(instance, property, value) + if not pcall(setProperty_unsafe, instance, property, value) then + if not pcall(testPropertyAssignable, instance, property) then + if instance == nil then + logError( + "setPropertyNilRef", + nil, + property, + tostring(value) + ) + else + logError( + "cannotAssignProperty", + nil, + instance.ClassName, + property + ) + end + else + local givenType = typeof(value) + local expectedType = typeof((instance)[property]) + + logError( + "invalidPropertyType", + nil, + instance.ClassName, + property, + expectedType, + givenType + ) + end + end + end + local function bindProperty(instance, property, value, cleanupTasks) + if xtypeof(value) == "State" then + local willUpdate = false + + local function updateLater() + if not willUpdate then + willUpdate = true + + coroutine.resume(coroutine.create(function() + willUpdate = false + + setProperty(instance, property, peek(value)) + end)) + end + end + + setProperty(instance, property, peek(value)) + table.insert(cleanupTasks, Observer(value):onChange(updateLater)) + else + setProperty(instance, property, value) + end + end + local function applyInstanceProps(props, applyTo) + local specialKeys = { + self = {}, + descendants = {}, + ancestor = {}, + observer = {}, + } + local cleanupTasks = {} + + for key, value in pairs(props) do + local keyType = xtypeof(key) + + if keyType == "string" then + if key ~= "Parent" then + bindProperty(applyTo, key, value, cleanupTasks) + end + elseif keyType == "SpecialKey" then + local stage = (key).stage + local keys = specialKeys[stage] + + if keys == nil then + logError("unrecognisedPropertyStage", nil, stage) + else + keys[key] = value + end + else + logError("unrecognisedPropertyKey", nil, xtypeof(key)) + end + end + for key, value in pairs(specialKeys.self) do + key:apply(value, applyTo, cleanupTasks) + end + for key, value in pairs(specialKeys.descendants) do + key:apply(value, applyTo, cleanupTasks) + end + + if props.Parent ~= nil then + bindProperty(applyTo, "Parent", props.Parent, cleanupTasks) + end + + for key, value in pairs(specialKeys.ancestor) do + key:apply(value, applyTo, cleanupTasks) + end + for key, value in pairs(specialKeys.observer) do + key:apply(value, applyTo, cleanupTasks) + end + + if applyTo.Parent then + game.DescendantRemoving:connect(function(descendant) + if descendant == applyTo then + cleanup(cleanupTasks) + end + end) + end + end + + __DARKLUA_BUNDLE_MODULES.w = applyInstanceProps +end +do + local defaultProps = __DARKLUA_BUNDLE_MODULES.q + local applyInstanceProps = __DARKLUA_BUNDLE_MODULES.w + local logError = __DARKLUA_BUNDLE_MODULES.d + + local function New(className) + return function(props) + local ok, instance = pcall(Instance.new, className) + + if not ok then + logError("cannotCreateClass", nil, className) + end + + local classDefaults = defaultProps[className] + + if classDefaults ~= nil then + for defaultProp, defaultValue in pairs(classDefaults) do + instance[defaultProp] = defaultValue + end + end + + applyInstanceProps(props, instance) + + return instance + end + end + + __DARKLUA_BUNDLE_MODULES.x = New +end +do + local applyInstanceProps = __DARKLUA_BUNDLE_MODULES.w + + local function Hydrate(target) + return function(props) + applyInstanceProps(props, target) + + return target + end + end + + __DARKLUA_BUNDLE_MODULES.y = Hydrate +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local xtypeof = __DARKLUA_BUNDLE_MODULES.s + local Ref = {} + + Ref.type = "SpecialKey" + Ref.kind = "Ref" + Ref.stage = "observer" + + function Ref:apply(refState, applyTo, cleanupTasks) + if xtypeof(refState) ~= "State" or refState.kind ~= "Value" then + logError "invalidRefType" + else + refState:set(applyTo) + table.insert(cleanupTasks, function() + refState:set(nil) + end) + end + end + + __DARKLUA_BUNDLE_MODULES.z = Ref +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local xtypeof = __DARKLUA_BUNDLE_MODULES.s + + local function Out(propertyName) + local outKey = {} + + outKey.type = "SpecialKey" + outKey.kind = "Out" + outKey.stage = "observer" + + function outKey:apply(outState, applyTo, cleanupTasks) + local ok, event = pcall(function() + return applyTo.Changed + end) + + if not ok then + logError( + "invalidOutProperty", + nil, + applyTo.ClassName, + propertyName + ) + elseif xtypeof(outState) ~= "State" or outState.kind ~= "Value" then + logError "invalidOutType" + else + outState:set((applyTo)[propertyName]) + table.insert( + cleanupTasks, + event:connect(function(prop) + if prop == propertyName then + outState:set((applyTo)[propertyName]) + end + end) + ) + table.insert(cleanupTasks, function() + outState:set(nil) + end) + end + end + + return outKey + end + + __DARKLUA_BUNDLE_MODULES.A = Out +end +do + local Cleanup = {} + + Cleanup.type = "SpecialKey" + Cleanup.kind = "Cleanup" + Cleanup.stage = "observer" + + function Cleanup:apply(userTask, applyTo, cleanupTasks) + table.insert(cleanupTasks, userTask) + end + + __DARKLUA_BUNDLE_MODULES.B = Cleanup +end +do + local messages = __DARKLUA_BUNDLE_MODULES.c + + local function logWarn(messageID, ...) + local formatString + + if messages[messageID] ~= nil then + formatString = messages[messageID] + else + messageID = "unknownMessage" + formatString = messages[messageID] + end + + warn( + string.format( + "[Fusion] " .. formatString .. "\n(ID: " .. messageID .. ")", + ... + ) + ) + end + + __DARKLUA_BUNDLE_MODULES.C = logWarn +end +do + local logWarn = __DARKLUA_BUNDLE_MODULES.C + local Observer = __DARKLUA_BUNDLE_MODULES.t + local peek = __DARKLUA_BUNDLE_MODULES.v + local isState = __DARKLUA_BUNDLE_MODULES.u + local typeof = __DARKLUA_BUNDLE_MODULES.g + local EXPERIMENTAL_AUTO_NAMING = false + local Children = {} + + Children.type = "SpecialKey" + Children.kind = "Children" + Children.stage = "descendants" + + function Children:apply(propValue, applyTo, cleanupTasks) + local newParented = {} + local oldParented = {} + local newDisconnects = {} + local oldDisconnects = {} + local updateQueued = false + local queueUpdate + + local function updateChildren() + if not updateQueued then + return + end + + updateQueued = false + oldParented, newParented = newParented, oldParented + oldDisconnects, newDisconnects = newDisconnects, oldDisconnects + + for i, _ in pairs(newParented) do + newParented[i] = nil + end + for i, _ in pairs(newDisconnects) do + newDisconnects[i] = nil + end + + local function processChild(child, autoName) + local childType = typeof(child) + + if childType == "Instance" then + newParented[child] = true + + if oldParented[child] == nil then + child.Parent = applyTo + else + oldParented[child] = nil + end + if EXPERIMENTAL_AUTO_NAMING and autoName ~= nil then + child.Name = autoName + end + elseif isState(child) then + local value = peek(child) + + if value ~= nil then + processChild(value, autoName) + end + + local disconnect = oldDisconnects[child] + + if disconnect == nil then + disconnect = Observer(child):onChange(queueUpdate) + else + oldDisconnects[child] = nil + end + + newDisconnects[child] = disconnect + elseif childType == "table" then + for key, subChild in pairs(child) do + local keyType = typeof(key) + local subAutoName = nil + + if keyType == "string" then + subAutoName = key + elseif keyType == "number" and autoName ~= nil then + subAutoName = autoName .. "_" .. key + end + + processChild(subChild, subAutoName) + end + else + logWarn("unrecognisedChildType", childType) + end + end + + if propValue ~= nil then + processChild(propValue) + end + + for oldInstance in pairs(oldParented) do + oldInstance.Parent = nil + end + for oldState, disconnect in pairs(oldDisconnects) do + disconnect() + end + end + + queueUpdate = function() + if not updateQueued then + updateQueued = true + + coroutine.resume(coroutine.create(updateChildren)) + end + end + + table.insert(cleanupTasks, function() + propValue = nil + updateQueued = true + + updateChildren() + end) + + updateQueued = true + + updateChildren() + end + + __DARKLUA_BUNDLE_MODULES.D = Children +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local typeof = __DARKLUA_BUNDLE_MODULES.g + + local function getProperty_unsafe(instance, property) + return (instance)[property] + end + local function OnEvent(eventName) + local eventKey = {} + + eventKey.type = "SpecialKey" + eventKey.kind = "OnEvent" + eventKey.stage = "observer" + + function eventKey:apply(callback, applyTo, cleanupTasks) + local ok, event = pcall(getProperty_unsafe, applyTo, eventName) + + if not ok or typeof(event) ~= "RBXScriptSignal" then + logError( + "cannotConnectEvent", + nil, + applyTo.ClassName, + eventName + ) + elseif typeof(callback) ~= "function" then + logError("invalidEventHandler", nil, eventName) + else + table.insert(cleanupTasks, event:connect(callback)) + end + end + + return eventKey + end + + __DARKLUA_BUNDLE_MODULES.E = OnEvent +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local typeof = __DARKLUA_BUNDLE_MODULES.g + + local function OnChange(propertyName) + local changeKey = {} + + changeKey.type = "SpecialKey" + changeKey.kind = "OnChange" + changeKey.stage = "observer" + + function changeKey:apply(callback, applyTo, cleanupTasks) + local ok, event = pcall(function() + return applyTo.Changed + end) + + if not ok then + logError( + "cannotConnectChange", + nil, + applyTo.ClassName, + propertyName + ) + elseif typeof(callback) ~= "function" then + logError("invalidChangeHandler", nil, propertyName) + else + table.insert( + cleanupTasks, + event:connect(function(prop) + if prop == propertyName then + callback((applyTo)[propertyName]) + end + end) + ) + end + end + + return changeKey + end + + __DARKLUA_BUNDLE_MODULES.F = OnChange +end +do + local function isSimilar(a, b) + if type(a) == "table" then + return false + end + + return a == b + end + + __DARKLUA_BUNDLE_MODULES.G = isSimilar +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local updateAll = __DARKLUA_BUNDLE_MODULES.k + local isSimilar = __DARKLUA_BUNDLE_MODULES.G + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:set(newValue, force) + local oldValue = self._value + + if force or not isSimilar(oldValue, newValue) then + self._value = newValue + + updateAll(self) + end + end + function class:_peek() + return self._value + end + function class:get() + logError "stateGetWasRemoved" + end + + local function Value(initialValue) + local self = setmetatable({ + type = "State", + kind = "Value", + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _value = initialValue, + }, CLASS_METATABLE) + + return self + end + + __DARKLUA_BUNDLE_MODULES.H = Value +end +do + local messages = __DARKLUA_BUNDLE_MODULES.c + + local function logErrorNonFatal(messageID, errObj, ...) + local formatString + + if messages[messageID] ~= nil then + formatString = messages[messageID] + else + messageID = "unknownMessage" + formatString = messages[messageID] + end + + local errorString + + if errObj == nil then + errorString = string.format( + "[Fusion] " .. formatString .. "\n(ID: " .. messageID .. ")", + ... + ) + else + formatString = + formatString:gsub("ERROR_MESSAGE", tostring(errObj.message)) + errorString = string.format( + "[Fusion] " + .. formatString + .. "\n(ID: " + .. messageID + .. ")\n---- Stack trace ----\n" + .. tostring(errObj.trace), + ... + ) + end + + Spawn(function(...) + error(errorString:gsub("\n", "\n "), 0) + end, ...) + end + + __DARKLUA_BUNDLE_MODULES.I = logErrorNonFatal +end +do + local function parseError(err) + local trace = "Traceback not available" + + if debug and debug.traceback then + trace = debug.traceback(nil, 2) + end + + return { + type = "Error", + raw = err, + message = err:gsub("^.+:%d+:%s*", ""), + trace = trace, + } + end + + __DARKLUA_BUNDLE_MODULES.J = parseError +end +do + local typeof = __DARKLUA_BUNDLE_MODULES.g + + local function needsDestruction(x) + return typeof(x) == "Instance" + end + + __DARKLUA_BUNDLE_MODULES.K = needsDestruction +end +do + local isState = __DARKLUA_BUNDLE_MODULES.u + + local function makeUseCallback(dependencySet) + local function use(target) + if isState(target) then + dependencySet[target] = true + + return (target):_peek() + end + + return target + end + + return use + end + + __DARKLUA_BUNDLE_MODULES.L = makeUseCallback +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I + local logWarn = __DARKLUA_BUNDLE_MODULES.C + local parseError = __DARKLUA_BUNDLE_MODULES.J + local isSimilar = __DARKLUA_BUNDLE_MODULES.G + local needsDestruction = __DARKLUA_BUNDLE_MODULES.K + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + local use = makeUseCallback(self.dependencySet) + local ok, newValue, newMetaValue = pcall(self._processor, use) + + if ok then + if self._destructor == nil and needsDestruction(newValue) then + logWarn "destructorNeededComputed" + end + if newMetaValue ~= nil then + logWarn "multiReturnComputed" + end + + local oldValue = self._value + local similar = isSimilar(oldValue, newValue) + + if self._destructor ~= nil then + self._destructor(oldValue) + end + + self._value = newValue + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = true + end + + return not similar + else + logErrorNonFatal("computedCallbackError", parseError(newValue)) + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = true + end + + return false + end + end + function class:_peek() + return self._value + end + function class:get() + logError "stateGetWasRemoved" + end + + local function Computed(processor, destructor) + local dependencySet = {} + local self = setmetatable({ + type = "State", + kind = "Computed", + dependencySet = dependencySet, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _value = nil, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.M = Computed +end +do + local parseError = __DARKLUA_BUNDLE_MODULES.J + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I + local logError = __DARKLUA_BUNDLE_MODULES.d + local logWarn = __DARKLUA_BUNDLE_MODULES.C + local cleanup = __DARKLUA_BUNDLE_MODULES.r + local needsDestruction = __DARKLUA_BUNDLE_MODULES.K + local peek = __DARKLUA_BUNDLE_MODULES.v + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L + local isState = __DARKLUA_BUNDLE_MODULES.u + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + local inputIsState = self._inputIsState + local newInputTable = peek(self._inputTable) + local oldInputTable = self._oldInputTable + local keyIOMap = self._keyIOMap + local meta = self._meta + local didChange = false + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + if inputIsState then + self._inputTable.dependentSet[self] = true + self.dependencySet[self._inputTable] = true + end + + self._oldOutputTable, self._outputTable = + self._outputTable, self._oldOutputTable + + local oldOutputTable = self._oldOutputTable + local newOutputTable = self._outputTable + + for i, _ in pairs(newOutputTable) do + newOutputTable[i] = nil + end + for newInKey, newInValue in pairs(newInputTable) do + local keyData = self._keyData[newInKey] + + if keyData == nil then + keyData = { + dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), + } + self._keyData[newInKey] = keyData + end + + local shouldRecalculate = oldInputTable[newInKey] ~= newInValue + + if shouldRecalculate == false then + for dependency, oldValue in pairs(keyData.dependencyValues) do + if oldValue ~= peek(dependency) then + shouldRecalculate = true + + break + end + end + end + if shouldRecalculate then + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + for i, _ in pairs(keyData.dependencySet) do + keyData.dependencySet[i] = nil + end + + local use = makeUseCallback(keyData.dependencySet) + local processOK, newOutKey, newOutValue, newMetaValue = + pcall(self._processor, use, newInKey, newInValue) + + if processOK then + if + self._destructor == nil + and ( + needsDestruction(newOutKey) + or needsDestruction(newOutValue) + or needsDestruction(newMetaValue) + ) + then + logWarn "destructorNeededForPairs" + end + if newOutputTable[newOutKey] ~= nil then + local previousNewKey, previousNewValue + + for inKey, outKey in pairs(keyIOMap) do + if outKey == newOutKey then + previousNewValue = newInputTable[inKey] + + if previousNewValue ~= nil then + previousNewKey = inKey + + break + end + end + end + + if previousNewKey ~= nil then + logError( + "forPairsKeyCollision", + nil, + tostring(newOutKey), + tostring(previousNewKey), + tostring(previousNewValue), + tostring(newInKey), + tostring(newInValue) + ) + end + end + + local oldOutValue = oldOutputTable[newOutKey] + + if oldOutValue ~= newOutValue then + local oldMetaValue = meta[newOutKey] + + if oldOutValue ~= nil then + local destructOK, err = pcall( + self._destructor or cleanup, + newOutKey, + oldOutValue, + oldMetaValue + ) + + if not destructOK then + logErrorNonFatal( + "forPairsDestructorError", + parseError(err) + ) + end + end + + oldOutputTable[newOutKey] = nil + end + + oldInputTable[newInKey] = newInValue + keyIOMap[newInKey] = newOutKey + meta[newOutKey] = newMetaValue + newOutputTable[newOutKey] = newOutValue + didChange = true + else + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + logErrorNonFatal( + "forPairsProcessorError", + parseError(newOutKey) + ) + end + else + local storedOutKey = keyIOMap[newInKey] + + if newOutputTable[storedOutKey] ~= nil then + local previousNewKey, previousNewValue + + for inKey, outKey in pairs(keyIOMap) do + if storedOutKey == outKey then + previousNewValue = newInputTable[inKey] + + if previousNewValue ~= nil then + previousNewKey = inKey + + break + end + end + end + + if previousNewKey ~= nil then + logError( + "forPairsKeyCollision", + nil, + tostring(storedOutKey), + tostring(previousNewKey), + tostring(previousNewValue), + tostring(newInKey), + tostring(newInValue) + ) + end + end + + newOutputTable[storedOutKey] = oldOutputTable[storedOutKey] + end + + for dependency in pairs(keyData.dependencySet) do + keyData.dependencyValues[dependency] = peek(dependency) + self.dependencySet[dependency] = true + dependency.dependentSet[self] = true + end + end + for oldOutKey, oldOutValue in pairs(oldOutputTable) do + if newOutputTable[oldOutKey] ~= oldOutValue then + local oldMetaValue = meta[oldOutKey] + + if oldOutValue ~= nil then + local destructOK, err = pcall( + self._destructor or cleanup, + oldOutKey, + oldOutValue, + oldMetaValue + ) + + if not destructOK then + logErrorNonFatal( + "forPairsDestructorError", + parseError(err) + ) + end + end + if newOutputTable[oldOutKey] == nil then + meta[oldOutKey] = nil + self._keyData[oldOutKey] = nil + end + + didChange = true + end + end + for key in pairs(oldInputTable) do + if newInputTable[key] == nil then + oldInputTable[key] = nil + keyIOMap[key] = nil + end + end + + return didChange + end + function class:_peek() + return self._outputTable + end + function class:get() + logError "stateGetWasRemoved" + end + + local function ForPairs(inputTable, processor, destructor) + local inputIsState = isState(inputTable) + local self = setmetatable({ + type = "State", + kind = "ForPairs", + dependencySet = {}, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _inputIsState = inputIsState, + _inputTable = inputTable, + _oldInputTable = {}, + _outputTable = {}, + _oldOutputTable = {}, + _keyIOMap = {}, + _keyData = {}, + _meta = {}, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.N = ForPairs +end +do + local parseError = __DARKLUA_BUNDLE_MODULES.J + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I + local logError = __DARKLUA_BUNDLE_MODULES.d + local logWarn = __DARKLUA_BUNDLE_MODULES.C + local cleanup = __DARKLUA_BUNDLE_MODULES.r + local needsDestruction = __DARKLUA_BUNDLE_MODULES.K + local peek = __DARKLUA_BUNDLE_MODULES.v + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L + local isState = __DARKLUA_BUNDLE_MODULES.u + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + local inputIsState = self._inputIsState + local newInputTable = peek(self._inputTable) + local oldInputTable = self._oldInputTable + local outputTable = self._outputTable + local keyOIMap = self._keyOIMap + local keyIOMap = self._keyIOMap + local meta = self._meta + local didChange = false + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + if inputIsState then + self._inputTable.dependentSet[self] = true + self.dependencySet[self._inputTable] = true + end + + for newInKey, value in pairs(newInputTable) do + local keyData = self._keyData[newInKey] + + if keyData == nil then + keyData = { + dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), + } + self._keyData[newInKey] = keyData + end + + local shouldRecalculate = oldInputTable[newInKey] == nil + + if shouldRecalculate == false then + for dependency, oldValue in pairs(keyData.dependencyValues) do + if oldValue ~= peek(dependency) then + shouldRecalculate = true + + break + end + end + end + if shouldRecalculate then + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + for i, _ in pairs(keyData.dependencySet) do + keyData.dependencySet[i] = nil + end + + local use = makeUseCallback(keyData.dependencySet) + local processOK, newOutKey, newMetaValue = + pcall(self._processor, use, newInKey) + + if processOK then + if + self._destructor == nil + and ( + needsDestruction(newOutKey) + or needsDestruction(newMetaValue) + ) + then + logWarn "destructorNeededForKeys" + end + + local oldInKey = keyOIMap[newOutKey] + local oldOutKey = keyIOMap[newInKey] + + if + oldInKey ~= newInKey + and newInputTable[oldInKey] ~= nil + then + logError( + "forKeysKeyCollision", + nil, + tostring(newOutKey), + tostring(oldInKey), + tostring(newOutKey) + ) + end + if + oldOutKey ~= newOutKey + and keyOIMap[oldOutKey] == newInKey + then + local oldMetaValue = meta[oldOutKey] + local destructOK, err = pcall( + self._destructor or cleanup, + oldOutKey, + oldMetaValue + ) + + if not destructOK then + logErrorNonFatal( + "forKeysDestructorError", + parseError(err) + ) + end + + keyOIMap[oldOutKey] = nil + outputTable[oldOutKey] = nil + meta[oldOutKey] = nil + end + + oldInputTable[newInKey] = value + meta[newOutKey] = newMetaValue + keyOIMap[newOutKey] = newInKey + keyIOMap[newInKey] = newOutKey + outputTable[newOutKey] = value + didChange = true + else + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + logErrorNonFatal( + "forKeysProcessorError", + parseError(newOutKey) + ) + end + end + + for dependency in pairs(keyData.dependencySet) do + keyData.dependencyValues[dependency] = peek(dependency) + self.dependencySet[dependency] = true + dependency.dependentSet[self] = true + end + end + for outputKey, inputKey in pairs(keyOIMap) do + if newInputTable[inputKey] == nil then + local oldMetaValue = meta[outputKey] + local destructOK, err = + pcall(self._destructor or cleanup, outputKey, oldMetaValue) + + if not destructOK then + logErrorNonFatal("forKeysDestructorError", parseError(err)) + end + + oldInputTable[inputKey] = nil + meta[outputKey] = nil + keyOIMap[outputKey] = nil + keyIOMap[inputKey] = nil + outputTable[outputKey] = nil + self._keyData[inputKey] = nil + didChange = true + end + end + + return didChange + end + function class:_peek() + return self._outputTable + end + function class:get() + logError "stateGetWasRemoved" + end + + local function ForKeys(inputTable, processor, destructor) + local inputIsState = isState(inputTable) + local self = setmetatable({ + type = "State", + kind = "ForKeys", + dependencySet = {}, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _inputIsState = inputIsState, + _inputTable = inputTable, + _oldInputTable = {}, + _outputTable = {}, + _keyOIMap = {}, + _keyIOMap = {}, + _keyData = {}, + _meta = {}, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.O = ForKeys +end +do + local parseError = __DARKLUA_BUNDLE_MODULES.J + local logError = __DARKLUA_BUNDLE_MODULES.d + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I + local logWarn = __DARKLUA_BUNDLE_MODULES.C + local cleanup = __DARKLUA_BUNDLE_MODULES.r + local needsDestruction = __DARKLUA_BUNDLE_MODULES.K + local peek = __DARKLUA_BUNDLE_MODULES.v + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L + local isState = __DARKLUA_BUNDLE_MODULES.u + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + local inputIsState = self._inputIsState + local inputTable = peek(self._inputTable) + local outputValues = {} + local didChange = false + + self._oldValueCache, self._valueCache = + self._valueCache, self._oldValueCache + + local newValueCache = self._valueCache + local oldValueCache = self._oldValueCache + + for i, _ in pairs(newValueCache) do + newValueCache[i] = nil + end + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + if inputIsState then + self._inputTable.dependentSet[self] = true + self.dependencySet[self._inputTable] = true + end + + for inKey, inValue in pairs(inputTable) do + local oldCachedValues = oldValueCache[inValue] + local shouldRecalculate = oldCachedValues == nil + local value, valueData, meta + + if type(oldCachedValues) == "table" and #oldCachedValues > 0 then + local valueInfo = + table.remove(oldCachedValues, #oldCachedValues) + + value = valueInfo.value + valueData = valueInfo.valueData + meta = valueInfo.meta + + if #oldCachedValues <= 0 then + oldValueCache[inValue] = nil + end + elseif oldCachedValues ~= nil then + oldValueCache[inValue] = nil + shouldRecalculate = true + end + if valueData == nil then + valueData = { + dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), + } + end + if shouldRecalculate == false then + for dependency, oldValue in pairs(valueData.dependencyValues) do + if oldValue ~= peek(dependency) then + shouldRecalculate = true + + break + end + end + end + if shouldRecalculate then + valueData.oldDependencySet, valueData.dependencySet = + valueData.dependencySet, valueData.oldDependencySet + + for i, _ in pairs(valueData.dependencySet) do + valueData.dependencySet[i] = nil + end + + local use = makeUseCallback(valueData.dependencySet) + local processOK, newOutValue, newMetaValue = + pcall(self._processor, use, inValue) + + if processOK then + if + self._destructor == nil + and ( + needsDestruction(newOutValue) + or needsDestruction(newMetaValue) + ) + then + logWarn "destructorNeededForValues" + end + if value ~= nil then + local destructOK, err = + pcall(self._destructor or cleanup, value, meta) + + if not destructOK then + logErrorNonFatal( + "forValuesDestructorError", + parseError(err) + ) + end + end + + value = newOutValue + meta = newMetaValue + didChange = true + else + valueData.oldDependencySet, valueData.dependencySet = + valueData.dependencySet, valueData.oldDependencySet + + logErrorNonFatal( + "forValuesProcessorError", + parseError(newOutValue) + ) + end + end + + local newCachedValues = newValueCache[inValue] + + if newCachedValues == nil then + newCachedValues = {} + newValueCache[inValue] = newCachedValues + end + + table.insert(newCachedValues, { + value = value, + valueData = valueData, + meta = meta, + }) + + outputValues[inKey] = value + + for dependency in pairs(valueData.dependencySet) do + valueData.dependencyValues[dependency] = peek(dependency) + self.dependencySet[dependency] = true + dependency.dependentSet[self] = true + end + end + for _oldInValue, oldCachedValueInfo in pairs(oldValueCache) do + for _, valueInfo in ipairs(oldCachedValueInfo) do + local oldValue = valueInfo.value + local oldMetaValue = valueInfo.meta + local destructOK, err = + pcall(self._destructor or cleanup, oldValue, oldMetaValue) + + if not destructOK then + logErrorNonFatal( + "forValuesDestructorError", + parseError(err) + ) + end + + didChange = true + end + for i, _ in pairs(oldCachedValueInfo) do + oldCachedValueInfo[i] = nil + end + end + + self._outputTable = outputValues + + return didChange + end + function class:_peek() + return self._outputTable + end + function class:get() + logError "stateGetWasRemoved" + end + + local function ForValues(inputTable, processor, destructor) + local inputIsState = isState(inputTable) + local self = setmetatable({ + type = "State", + kind = "ForValues", + dependencySet = {}, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _inputIsState = inputIsState, + _inputTable = inputTable, + _outputTable = {}, + _valueCache = {}, + _oldValueCache = {}, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.P = ForValues +end +do + local TweenScheduler = __DARKLUA_BUNDLE_MODULES.l + local logError = __DARKLUA_BUNDLE_MODULES.d + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I + local xtypeof = __DARKLUA_BUNDLE_MODULES.s + local peek = __DARKLUA_BUNDLE_MODULES.v + local typeof = __DARKLUA_BUNDLE_MODULES.g + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + local goalValue = peek(self._goalState) + + if goalValue == self._nextValue and not self._currentlyAnimating then + return false + end + + local tweenInfo = peek(self._tweenInfo) + + if typeof(tweenInfo) ~= "TweenInfo" then + logErrorNonFatal("mistypedTweenInfo", nil, typeof(tweenInfo)) + + return false + end + + self._prevValue = self._currentValue + self._nextValue = goalValue + self._currentTweenStartTime = time() + self._currentTweenInfo = tweenInfo + + local tweenDuration = tweenInfo.DelayTime + tweenInfo.Time + + if tweenInfo.Reverses then + tweenDuration = tweenDuration + tweenInfo.Time + end + + tweenDuration = tweenDuration * (tweenInfo.RepeatCount + 1) + self._currentTweenDuration = tweenDuration + + TweenScheduler.add(self) + + return false + end + function class:_peek() + return self._currentValue + end + function class:get() + logError "stateGetWasRemoved" + end + + local function Tween(goalState, tweenInfo) + local currentValue = peek(goalState) + + if tweenInfo == nil then + tweenInfo = TweenInfo.new() + end + + local dependencySet = { [goalState] = true } + local tweenInfoIsState = xtypeof(tweenInfo) == "State" + + if tweenInfoIsState then + dependencySet[tweenInfo] = true + end + + local startingTweenInfo = peek(tweenInfo) + + if typeof(startingTweenInfo) ~= "TweenInfo" then + logError("mistypedTweenInfo", nil, typeof(startingTweenInfo)) + end + + local self = setmetatable({ + type = "State", + kind = "Tween", + dependencySet = dependencySet, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _goalState = goalState, + _tweenInfo = tweenInfo, + _tweenInfoIsState = tweenInfoIsState, + _prevValue = currentValue, + _nextValue = currentValue, + _currentValue = currentValue, + _currentTweenInfo = tweenInfo, + _currentTweenDuration = 0, + _currentTweenStartTime = 0, + _currentlyAnimating = false, + }, CLASS_METATABLE) + + goalState.dependentSet[self] = true + + return self + end + + __DARKLUA_BUNDLE_MODULES.Q = Tween +end +do + local Oklab = __DARKLUA_BUNDLE_MODULES.f + + local function unpackType(value, typeString) + if typeString == "number" then + return { value } + elseif typeString == "CFrame" then + local axis, angle = value:ToAxisAngle() + + return { + value.X, + value.Y, + value.Z, + axis.X, + axis.Y, + axis.Z, + angle, + } + elseif typeString == "Color3" then + local lab = Oklab.to(value) + + return { + lab.X, + lab.Y, + lab.Z, + } + elseif typeString == "ColorSequenceKeypoint" then + local lab = Oklab.to(value.Value) + + return { + lab.X, + lab.Y, + lab.Z, + value.Time, + } + elseif typeString == "DateTime" then + return { + value.UnixTimestampMillis, + } + elseif typeString == "NumberRange" then + return { + value.Min, + value.Max, + } + elseif typeString == "NumberSequenceKeypoint" then + return { + value.Value, + value.Time, + value.Envelope, + } + elseif typeString == "PhysicalProperties" then + return { + value.Density, + value.Friction, + value.Elasticity, + value.FrictionWeight, + value.ElasticityWeight, + } + elseif typeString == "Ray" then + return { + value.Origin.X, + value.Origin.Y, + value.Origin.Z, + value.Direction.X, + value.Direction.Y, + value.Direction.Z, + } + elseif typeString == "Rect" then + return { + value.Min.X, + value.Min.Y, + value.Max.X, + value.Max.Y, + } + elseif typeString == "Region3" then + return { + value.CFrame.X, + value.CFrame.Y, + value.CFrame.Z, + value.Size.X, + value.Size.Y, + value.Size.Z, + } + elseif typeString == "Region3int16" then + return { + value.Min.X, + value.Min.Y, + value.Min.Z, + value.Max.X, + value.Max.Y, + value.Max.Z, + } + elseif typeString == "UDim" then + return { + value.Scale, + value.Offset, + } + elseif typeString == "UDim2" then + return { + value.X.Scale, + value.X.Offset, + value.Y.Scale, + value.Y.Offset, + } + elseif typeString == "Vector2" then + return { + value.X, + value.Y, + } + elseif typeString == "Vector2int16" then + return { + value.X, + value.Y, + } + elseif typeString == "Vector3" then + return { + value.X, + value.Y, + value.Z, + } + elseif typeString == "Vector3int16" then + return { + value.X, + value.Y, + value.Z, + } + else + return {} + end + end + + __DARKLUA_BUNDLE_MODULES.R = unpackType +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I + local unpackType = __DARKLUA_BUNDLE_MODULES.R + local SpringScheduler = __DARKLUA_BUNDLE_MODULES.o + local updateAll = __DARKLUA_BUNDLE_MODULES.k + local xtypeof = __DARKLUA_BUNDLE_MODULES.s + local peek = __DARKLUA_BUNDLE_MODULES.v + local typeof = __DARKLUA_BUNDLE_MODULES.g + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:setPosition(newValue) + local newType = typeof(newValue) + + if newType ~= self._currentType then + logError("springTypeMismatch", nil, newType, self._currentType) + end + + self._springPositions = unpackType(newValue, newType) + self._currentValue = newValue + + SpringScheduler.add(self) + updateAll(self) + end + function class:setVelocity(newValue) + local newType = typeof(newValue) + + if newType ~= self._currentType then + logError("springTypeMismatch", nil, newType, self._currentType) + end + + self._springVelocities = unpackType(newValue, newType) + + SpringScheduler.add(self) + end + function class:addVelocity(deltaValue) + local deltaType = typeof(deltaValue) + + if deltaType ~= self._currentType then + logError("springTypeMismatch", nil, deltaType, self._currentType) + end + + local springDeltas = unpackType(deltaValue, deltaType) + + for index, delta in ipairs(springDeltas) do + do + local __DARKLUA_VAR = self._springVelocities + + __DARKLUA_VAR[index] = __DARKLUA_VAR[index] + delta + end + end + + SpringScheduler.add(self) + end + function class:update() + local goalValue = peek(self._goalState) + + if goalValue == self._goalValue then + local damping = peek(self._damping) + + if typeof(damping) ~= "number" then + logErrorNonFatal("mistypedSpringDamping", nil, typeof(damping)) + elseif damping < 0 then + logErrorNonFatal("invalidSpringDamping", nil, damping) + else + self._currentDamping = damping + end + + local speed = peek(self._speed) + + if typeof(speed) ~= "number" then + logErrorNonFatal("mistypedSpringSpeed", nil, typeof(speed)) + elseif speed < 0 then + logErrorNonFatal("invalidSpringSpeed", nil, speed) + else + self._currentSpeed = speed + end + + return false + else + self._goalValue = goalValue + + local oldType = self._currentType + local newType = typeof(goalValue) + + self._currentType = newType + + local springGoals = unpackType(goalValue, newType) + local numSprings = #springGoals + + self._springGoals = springGoals + + if newType ~= oldType then + self._currentValue = self._goalValue + + local springPositions = {} + + for i = 1, numSprings do + springPositions[i] = 0 + end + + local springVelocities = {} + + for i = 1, numSprings do + springVelocities[i] = 0 + end + + for index, springGoal in ipairs(springGoals) do + springPositions[index] = springGoal + end + + self._springPositions = springPositions + self._springVelocities = springVelocities + + SpringScheduler.remove(self) + + return true + elseif numSprings == 0 then + self._currentValue = self._goalValue + + return true + else + SpringScheduler.add(self) + + return false + end + end + end + function class:_peek() + return self._currentValue + end + function class:get() + logError "stateGetWasRemoved" + end + + local function Spring(goalState, speed, damping) + if speed == nil then + speed = 10 + end + if damping == nil then + damping = 1 + end + + local dependencySet = { [goalState] = true } + + if xtypeof(speed) == "State" then + dependencySet[speed] = true + end + if xtypeof(damping) == "State" then + dependencySet[damping] = true + end + + local self = setmetatable({ + type = "State", + kind = "Spring", + dependencySet = dependencySet, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _speed = speed, + _damping = damping, + _goalState = goalState, + _goalValue = nil, + _currentType = nil, + _currentValue = nil, + _currentSpeed = peek(speed), + _currentDamping = peek(damping), + _springPositions = nil, + _springGoals = nil, + _springVelocities = nil, + }, CLASS_METATABLE) + + goalState.dependentSet[self] = true + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.S = Spring +end +do + local function doNothing(...) end + + __DARKLUA_BUNDLE_MODULES.T = doNothing +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local TweenInfo = {} + + function TweenInfo.new( + time, + easingStyle, + easingDirection, + repeatCount, + reverses, + delayTime + ) + local proxy = newproxy(true) + local mt = getmetatable(proxy) + + if type(easingStyle) ~= "string" then + if easingStyle then + easingStyle = tostring(easingStyle):gsub("Enum.%w+.", "") + end + else + local ok + + for _, s in ipairs { + "Linear", + "Quad", + "Cubic", + "Quart", + "Quint", + "Sine", + "Exponential", + "Circular", + "Elastic", + "Back", + "Bounce", + } do + if easingStyle == s then + ok = true + + break + end + end + + if not ok then + logError("invalidEasingStyle", nil, easingStyle) + end + end + if type(easingDirection) ~= "string" then + if easingDirection then + easingDirection = + tostring(easingDirection):gsub("Enum.%w+.", "") + end + else + local ok + + for _, d in ipairs { + "In", + "Out", + "InOut", + "OutIn", + } do + if easingDirection == d then + ok = true + + break + end + end + + if not ok then + logError("invalidEasingDirection", nil, easingDirection) + end + end + + time = time or 1 + easingStyle = easingStyle or "Quad" + easingDirection = easingDirection or "Out" + repeatCount = repeatCount or 0 + reverses = reverses or false + delayTime = delayTime or 0 + mt.__index = { + Time = time, + EasingStyle = easingStyle, + EasingDirection = easingDirection, + RepeatCount = repeatCount, + Reverses = reverses, + DelayTime = delayTime, + } + mt.__newindex = function(_, prop) + error(prop .. " cannot be assigned to", math.huge) + end + mt.__tostring = function() + return "Time:" + .. tostring(time) + .. " DelayTime:" + .. tostring(delayTime) + .. " RepeatCount:" + .. tostring(repeatCount) + .. " Reverses:" + .. (reverses and "True" or "False") + .. " EasingDirection:" + .. easingDirection + .. " EasingStyle:" + .. easingStyle + end + mt.__metatable = "The metatable is locked" + + return proxy + end + + __DARKLUA_BUNDLE_MODULES.U = TweenInfo +end + +local restrictRead = __DARKLUA_BUNDLE_MODULES.e +local bindScheduler = __DARKLUA_BUNDLE_MODULES.p +local Fusion = restrictRead("Fusion", { + version = { + major = 0, + minor = 3, + isRelease = false, + }, + New = __DARKLUA_BUNDLE_MODULES.x, + Hydrate = __DARKLUA_BUNDLE_MODULES.y, + Ref = __DARKLUA_BUNDLE_MODULES.z, + Out = __DARKLUA_BUNDLE_MODULES.A, + Cleanup = __DARKLUA_BUNDLE_MODULES.B, + Children = __DARKLUA_BUNDLE_MODULES.D, + OnEvent = __DARKLUA_BUNDLE_MODULES.E, + OnChange = __DARKLUA_BUNDLE_MODULES.F, + Value = __DARKLUA_BUNDLE_MODULES.H, + Computed = __DARKLUA_BUNDLE_MODULES.M, + ForPairs = __DARKLUA_BUNDLE_MODULES.N, + ForKeys = __DARKLUA_BUNDLE_MODULES.O, + ForValues = __DARKLUA_BUNDLE_MODULES.P, + Observer = __DARKLUA_BUNDLE_MODULES.t, + Tween = __DARKLUA_BUNDLE_MODULES.Q, + Spring = __DARKLUA_BUNDLE_MODULES.S, + cleanup = __DARKLUA_BUNDLE_MODULES.r, + doNothing = __DARKLUA_BUNDLE_MODULES.T, + peek = __DARKLUA_BUNDLE_MODULES.v, + typeof = __DARKLUA_BUNDLE_MODULES.g, + TweenInfo = __DARKLUA_BUNDLE_MODULES.U, + Help = function() + return "See https://elttob.uk/Fusion/0.3/ for more information." + end, +}) + +bindScheduler() + +return Fusion diff --git a/luau/60595695.luau b/luau/60595695.luau index f2a057a..f9fbe08 100644 --- a/luau/60595695.luau +++ b/luau/60595695.luau @@ -16,6 +16,7 @@ while not sc and tries < 3 do end if sc then + sc:RegisterLibrary("Libraries/RbxFusion", "10000001") sc:RegisterLibrary("Libraries/RbxGui", "45284430") sc:RegisterLibrary("Libraries/RbxGear", "45374389") -- if game.PlaceId == deepakTestingPlace then From 411fa9aa7496b5dc86220d05d3ec93c9b8a82c00 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Wed, 6 Sep 2023 06:32:00 +0100 Subject: [PATCH 12/14] Some formatting changes to config files and corescripts --- defs.d.lua | 20 +++----------------- luau/10000001.luau | 8 ++++---- luau/152908679.luau | 4 +++- luau/153556783.luau | 4 +++- luau/157877000.luau | 4 +++- luau/38037565.luau | 4 +++- mercury.yml | 32 +++++++------------------------- 7 files changed, 26 insertions(+), 50 deletions(-) diff --git a/defs.d.lua b/defs.d.lua index 85274dc..46f489e 100644 --- a/defs.d.lua +++ b/defs.d.lua @@ -6832,21 +6832,6 @@ end declare class LodDataService extends Instance end -declare class LogService extends Instance - HttpResultOut: RBXScriptSignal<{ [any]: any }> - MessageOut: RBXScriptSignal - OnHttpResultApproved: RBXScriptSignal - ServerHttpResultOut: RBXScriptSignal<{ [any]: any }> - ServerMessageOut: RBXScriptSignal - function ClearOutput(self): nil - function ExecuteScript(self, source: string): nil - function GetHttpResultHistory(self): { any } - function GetLogHistory(self): { any } - function RequestHttpResultApproved(self): nil - function RequestServerHttpResult(self): nil - function RequestServerOutput(self): nil -end - declare class LoginService extends Instance LoginFailed: RBXScriptSignal LoginSucceeded: RBXScriptSignal @@ -8504,7 +8489,6 @@ declare class ServiceProvider extends Instance LiveScriptingService: LiveScriptingService LocalStorageService: LocalStorageService LodDataService: LodDataService - LogService: LogService LoginService: LoginService LuaWebService: LuaWebService LuauScriptAnalyzerService: LuauScriptAnalyzerService @@ -8706,7 +8690,6 @@ declare class ServiceProvider extends Instance function GetService(self, service: "LiveScriptingService"): LiveScriptingService function GetService(self, service: "LocalStorageService"): LocalStorageService function GetService(self, service: "LodDataService"): LodDataService - function GetService(self, service: "LogService"): LogService function GetService(self, service: "LoginService"): LoginService function GetService(self, service: "LuaWebService"): LuaWebService function GetService(self, service: "LuauScriptAnalyzerService"): LuauScriptAnalyzerService @@ -10285,6 +10268,9 @@ declare _SERVER_PRESENCE_URL: string declare _GUEST_NUMBER: number +declare _SERVER: boolean +declare _CLIENT: boolean + declare game: DataModel declare Game: DataModel declare workspace: Workspace diff --git a/luau/10000001.luau b/luau/10000001.luau index f47c89e..64f6566 100644 --- a/luau/10000001.luau +++ b/luau/10000001.luau @@ -1610,7 +1610,7 @@ do Cleanup.kind = "Cleanup" Cleanup.stage = "observer" - function Cleanup:apply(userTask, applyTo, cleanupTasks) + function Cleanup:apply(userTask, _, cleanupTasks) table.insert(cleanupTasks, userTask) end @@ -1731,7 +1731,7 @@ do for oldInstance in pairs(oldParented) do oldInstance.Parent = nil end - for oldState, disconnect in pairs(oldDisconnects) do + for _, disconnect in pairs(oldDisconnects) do disconnect() end end @@ -1920,7 +1920,7 @@ do ) end - Spawn(function(...) + Spawn(function() error(errorString:gsub("\n", "\n "), 0) end, ...) end @@ -3162,7 +3162,7 @@ do __DARKLUA_BUNDLE_MODULES.S = Spring end do - local function doNothing(...) end + local function doNothing() end __DARKLUA_BUNDLE_MODULES.T = doNothing end diff --git a/luau/152908679.luau b/luau/152908679.luau index 775483e..fd46075 100644 --- a/luau/152908679.luau +++ b/luau/152908679.luau @@ -2,7 +2,9 @@ -- Unused by Mercury print "[Mercury]: Loaded corescript 152908679" for _ = 1, 4 do - warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + pcall(function() + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + end) print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" end diff --git a/luau/153556783.luau b/luau/153556783.luau index 3729a60..0bbff0a 100644 --- a/luau/153556783.luau +++ b/luau/153556783.luau @@ -2,7 +2,9 @@ -- Unused by Mercury print "[Mercury]: Loaded corescript 153556783" for _ = 1, 4 do - warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + pcall(function() + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + end) print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" end diff --git a/luau/157877000.luau b/luau/157877000.luau index 17740ea..c75c4eb 100644 --- a/luau/157877000.luau +++ b/luau/157877000.luau @@ -1,7 +1,9 @@ -- Unused by Mercury print "[Mercury]: Loaded corescript 157877000" for _ = 1, 4 do - warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + pcall(function() + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + end) print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" end diff --git a/luau/38037565.luau b/luau/38037565.luau index bd94bb0..f2097ab 100644 --- a/luau/38037565.luau +++ b/luau/38037565.luau @@ -1,7 +1,9 @@ -- Unused by Mercury print "[Mercury]: Loaded corescript 38037565" for _ = 1, 4 do - warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + pcall(function() + warn "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" + end) print "IF YOU SEE THIS MESSAGE, PLEASE REPORT IT TO THE MERCURY DEVELOPERS" end diff --git a/mercury.yml b/mercury.yml index 633d454..30cb674 100644 --- a/mercury.yml +++ b/mercury.yml @@ -24,6 +24,10 @@ globals: args: [] _CHAR_APPEARANCE: args: [] + _SERVER: + args: [] + _CLIENT: + args: [] assert: args: @@ -5022,7 +5026,6 @@ globals: - AnimationController - AnimationRigData - Animator - - Atmosphere - Attachment - Bone - Backpack @@ -5099,7 +5102,6 @@ globals: - FlyweightService - CSGDictionaryService - NonReplicatedCSGDictionaryService - - Folder - ForceField - FunctionalTest - GetTextBoundsParams @@ -5192,8 +5194,6 @@ globals: - ColorCorrectionEffect - DepthOfFieldEffect - SunRaysEffect - - ProximityPrompt - - ProximityPromptService - ReflectionMetadata - ReflectionMetadataCallbacks - ReflectionMetadataClasses @@ -5240,18 +5240,6 @@ globals: - TrackerStreamAnimation - Trail - Tween - - UIAspectRatioConstraint - - UISizeConstraint - - UITextSizeConstraint - - UICorner - - UIGradient - - UIGridLayout - - UIListLayout - - UIPageLayout - - UITableLayout - - UIPadding - - UIScale - - UIStroke - BinaryStringValue - BoolValue - BrickColorValue @@ -5623,7 +5611,7 @@ globals: struct: Plugin require: args: - - type: number + - type: any script: struct: Script settings: @@ -5636,6 +5624,8 @@ globals: Spawn: args: - type: function + - required: false + type: "..." LoadLibrary: args: - type: string @@ -7043,7 +7033,6 @@ structs: - UserStorageService - LocalizationService - LodDataService - - LogService - LoginService - LuaWebService - LuauScriptAnalyzerService @@ -7472,13 +7461,6 @@ structs: Value: property: read-only Event: - Connect: - args: - - type: function - method: true - Wait: - args: [] - method: true connect: args: - type: function From 4a816a114fa8a2149a598a5ba7eeaff58e057597 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Fri, 8 Sep 2023 20:25:41 +0100 Subject: [PATCH 13/14] Add Red as a corescript library and update Fusion, further improve defs file --- defs.d.lua | 13 +- luau/10000001.luau | 4057 +++++++++++++++++++++++--------------------- luau/10000002.luau | 1334 +++++++++++++++ luau/60595695.luau | 1 + 4 files changed, 3417 insertions(+), 1988 deletions(-) create mode 100644 luau/10000002.luau diff --git a/defs.d.lua b/defs.d.lua index 46f489e..6b07a1d 100644 --- a/defs.d.lua +++ b/defs.d.lua @@ -3841,8 +3841,8 @@ declare class PhysicalProperties end declare class RBXScriptConnection - Connected: boolean - function Disconnect(self): nil + connected: boolean + function disconnect(self): nil end @@ -4122,7 +4122,6 @@ declare class Instance function FindFirstChildOfClass(self, className: string): Instance? function FindFirstChildWhichIsA(self, className: string, recursive: boolean?): Instance? function FindFirstDescendant(self, name: string): Instance? - function GetActor(self): Actor? function GetAttribute(self, attribute: string): any function GetAttributeChangedSignal(self, attribute: string): RBXScriptSignal<> function GetAttributes(self): { [string]: any } @@ -7388,12 +7387,6 @@ declare class Model extends PVInstance function TranslateBy(self, delta: Vector3): nil end -declare class Actor extends Model - function BindToMessage(self, topic: string, func: ((...any) -> ...any)): RBXScriptConnection - function BindToMessageParallel(self, topic: string, func: ((...any) -> ...any)): RBXScriptConnection - function SendMessage(self, topic: string, ...: any): () -end - declare class BackpackItem extends Model TextureId: Content end @@ -10047,7 +10040,7 @@ declare class Wire extends Instance end declare Instance: { - new: ((className: "Accoutrement", parent: Instance?) -> Accoutrement) & ((className: "Accessory", parent: Instance?) -> Accessory) & ((className: "Hat", parent: Instance?) -> Hat) & ((className: "AdvancedDragger", parent: Instance?) -> AdvancedDragger) & ((className: "Animation", parent: Instance?) -> Animation) & ((className: "CurveAnimation", parent: Instance?) -> CurveAnimation) & ((className: "KeyframeSequence", parent: Instance?) -> KeyframeSequence) & ((className: "AnimationController", parent: Instance?) -> AnimationController) & ((className: "AnimationRigData", parent: Instance?) -> AnimationRigData) & ((className: "Animator", parent: Instance?) -> Animator) & ((className: "AudioDeviceInput", parent: Instance?) -> AudioDeviceInput) & ((className: "AudioDeviceOutput", parent: Instance?) -> AudioDeviceOutput) & ((className: "AudioDistortion", parent: Instance?) -> AudioDistortion) & ((className: "AudioEcho", parent: Instance?) -> AudioEcho) & ((className: "AudioEmitter", parent: Instance?) -> AudioEmitter) & ((className: "AudioEqualizer", parent: Instance?) -> AudioEqualizer) & ((className: "AudioFader", parent: Instance?) -> AudioFader) & ((className: "AudioFlanger", parent: Instance?) -> AudioFlanger) & ((className: "AudioListener", parent: Instance?) -> AudioListener) & ((className: "AudioPitchShifter", parent: Instance?) -> AudioPitchShifter) & ((className: "AudioPlayer", parent: Instance?) -> AudioPlayer) & ((className: "AudioReverb", parent: Instance?) -> AudioReverb) & ((className: "AudioSearchParams", parent: Instance?) -> AudioSearchParams) & ((className: "Backpack", parent: Instance?) -> Backpack) & ((className: "WrapLayer", parent: Instance?) -> WrapLayer) & ((className: "WrapTarget", parent: Instance?) -> WrapTarget) & ((className: "BindableEvent", parent: Instance?) -> BindableEvent) & ((className: "BindableFunction", parent: Instance?) -> BindableFunction) & ((className: "BodyAngularVelocity", parent: Instance?) -> BodyAngularVelocity) & ((className: "BodyForce", parent: Instance?) -> BodyForce) & ((className: "BodyGyro", parent: Instance?) -> BodyGyro) & ((className: "BodyPosition", parent: Instance?) -> BodyPosition) & ((className: "BodyThrust", parent: Instance?) -> BodyThrust) & ((className: "BodyVelocity", parent: Instance?) -> BodyVelocity) & ((className: "RocketPropulsion", parent: Instance?) -> RocketPropulsion) & ((className: "BubbleChatMessageProperties", parent: Instance?) -> BubbleChatMessageProperties) & ((className: "Camera", parent: Instance?) -> Camera) & ((className: "BodyColors", parent: Instance?) -> BodyColors) & ((className: "CharacterMesh", parent: Instance?) -> CharacterMesh) & ((className: "Pants", parent: Instance?) -> Pants) & ((className: "Shirt", parent: Instance?) -> Shirt) & ((className: "ShirtGraphic", parent: Instance?) -> ShirtGraphic) & ((className: "Skin", parent: Instance?) -> Skin) & ((className: "ClickDetector", parent: Instance?) -> ClickDetector) & ((className: "DragDetector", parent: Instance?) -> DragDetector) & ((className: "Configuration", parent: Instance?) -> Configuration) & ((className: "AlignOrientation", parent: Instance?) -> AlignOrientation) & ((className: "AlignPosition", parent: Instance?) -> AlignPosition) & ((className: "AngularVelocity", parent: Instance?) -> AngularVelocity) & ((className: "AnimationConstraint", parent: Instance?) -> AnimationConstraint) & ((className: "BallSocketConstraint", parent: Instance?) -> BallSocketConstraint) & ((className: "HingeConstraint", parent: Instance?) -> HingeConstraint) & ((className: "LineForce", parent: Instance?) -> LineForce) & ((className: "LinearVelocity", parent: Instance?) -> LinearVelocity) & ((className: "PlaneConstraint", parent: Instance?) -> PlaneConstraint) & ((className: "Plane", parent: Instance?) -> Plane) & ((className: "RigidConstraint", parent: Instance?) -> RigidConstraint) & ((className: "RodConstraint", parent: Instance?) -> RodConstraint) & ((className: "RopeConstraint", parent: Instance?) -> RopeConstraint) & ((className: "CylindricalConstraint", parent: Instance?) -> CylindricalConstraint) & ((className: "PrismaticConstraint", parent: Instance?) -> PrismaticConstraint) & ((className: "SpringConstraint", parent: Instance?) -> SpringConstraint) & ((className: "Torque", parent: Instance?) -> Torque) & ((className: "TorsionSpringConstraint", parent: Instance?) -> TorsionSpringConstraint) & ((className: "UniversalConstraint", parent: Instance?) -> UniversalConstraint) & ((className: "HumanoidController", parent: Instance?) -> HumanoidController) & ((className: "SkateboardController", parent: Instance?) -> SkateboardController) & ((className: "VehicleController", parent: Instance?) -> VehicleController) & ((className: "AirController", parent: Instance?) -> AirController) & ((className: "ClimbController", parent: Instance?) -> ClimbController) & ((className: "GroundController", parent: Instance?) -> GroundController) & ((className: "SwimController", parent: Instance?) -> SwimController) & ((className: "ControllerManager", parent: Instance?) -> ControllerManager) & ((className: "CustomEvent", parent: Instance?) -> CustomEvent) & ((className: "CustomEventReceiver", parent: Instance?) -> CustomEventReceiver) & ((className: "CylinderMesh", parent: Instance?) -> CylinderMesh) & ((className: "DynamicMesh", parent: Instance?) -> DynamicMesh) & ((className: "FileMesh", parent: Instance?) -> FileMesh) & ((className: "SpecialMesh", parent: Instance?) -> SpecialMesh) & ((className: "DataStoreIncrementOptions", parent: Instance?) -> DataStoreIncrementOptions) & ((className: "DataStoreOptions", parent: Instance?) -> DataStoreOptions) & ((className: "DataStoreSetOptions", parent: Instance?) -> DataStoreSetOptions) & ((className: "DebuggerWatch", parent: Instance?) -> DebuggerWatch) & ((className: "Dialog", parent: Instance?) -> Dialog) & ((className: "DialogChoice", parent: Instance?) -> DialogChoice) & ((className: "Dragger", parent: Instance?) -> Dragger) & ((className: "EulerRotationCurve", parent: Instance?) -> EulerRotationCurve) & ((className: "ExperienceInviteOptions", parent: Instance?) -> ExperienceInviteOptions) & ((className: "Explosion", parent: Instance?) -> Explosion) & ((className: "Decal", parent: Instance?) -> Decal) & ((className: "Texture", parent: Instance?) -> Texture) & ((className: "Hole", parent: Instance?) -> Hole) & ((className: "MotorFeature", parent: Instance?) -> MotorFeature) & ((className: "Fire", parent: Instance?) -> Fire) & ((className: "FloatCurve", parent: Instance?) -> FloatCurve) & ((className: "CSGDictionaryService", parent: Instance?) -> CSGDictionaryService) & ((className: "NonReplicatedCSGDictionaryService", parent: Instance?) -> NonReplicatedCSGDictionaryService) & ((className: "ForceField", parent: Instance?) -> ForceField) & ((className: "FunctionalTest", parent: Instance?) -> FunctionalTest) & ((className: "GetTextBoundsParams", parent: Instance?) -> GetTextBoundsParams) & ((className: "Frame", parent: Instance?) -> Frame) & ((className: "ImageButton", parent: Instance?) -> ImageButton) & ((className: "TextButton", parent: Instance?) -> TextButton) & ((className: "ImageLabel", parent: Instance?) -> ImageLabel) & ((className: "TextLabel", parent: Instance?) -> TextLabel) & ((className: "TextBox", parent: Instance?) -> TextBox) & ((className: "VideoFrame", parent: Instance?) -> VideoFrame) & ((className: "ViewportFrame", parent: Instance?) -> ViewportFrame) & ((className: "BillboardGui", parent: Instance?) -> BillboardGui) & ((className: "ScreenGui", parent: Instance?) -> ScreenGui) & ((className: "GuiMain", parent: Instance?) -> GuiMain) & ((className: "AdGui", parent: Instance?) -> AdGui) & ((className: "SurfaceGui", parent: Instance?) -> SurfaceGui) & ((className: "FloorWire", parent: Instance?) -> FloorWire) & ((className: "SelectionBox", parent: Instance?) -> SelectionBox) & ((className: "BoxHandleAdornment", parent: Instance?) -> BoxHandleAdornment) & ((className: "ConeHandleAdornment", parent: Instance?) -> ConeHandleAdornment) & ((className: "CylinderHandleAdornment", parent: Instance?) -> CylinderHandleAdornment) & ((className: "ImageHandleAdornment", parent: Instance?) -> ImageHandleAdornment) & ((className: "LineHandleAdornment", parent: Instance?) -> LineHandleAdornment) & ((className: "SphereHandleAdornment", parent: Instance?) -> SphereHandleAdornment) & ((className: "WireframeHandleAdornment", parent: Instance?) -> WireframeHandleAdornment) & ((className: "ParabolaAdornment", parent: Instance?) -> ParabolaAdornment) & ((className: "SelectionSphere", parent: Instance?) -> SelectionSphere) & ((className: "ArcHandles", parent: Instance?) -> ArcHandles) & ((className: "Handles", parent: Instance?) -> Handles) & ((className: "SurfaceSelection", parent: Instance?) -> SurfaceSelection) & ((className: "SelectionPartLasso", parent: Instance?) -> SelectionPartLasso) & ((className: "SelectionPointLasso", parent: Instance?) -> SelectionPointLasso) & ((className: "HeightmapImporterService", parent: Instance?) -> HeightmapImporterService) & ((className: "HiddenSurfaceRemovalAsset", parent: Instance?) -> HiddenSurfaceRemovalAsset) & ((className: "Humanoid", parent: Instance?) -> Humanoid) & ((className: "HumanoidDescription", parent: Instance?) -> HumanoidDescription) & ((className: "IKControl", parent: Instance?) -> IKControl) & ((className: "RotateP", parent: Instance?) -> RotateP) & ((className: "RotateV", parent: Instance?) -> RotateV) & ((className: "Glue", parent: Instance?) -> Glue) & ((className: "ManualGlue", parent: Instance?) -> ManualGlue) & ((className: "ManualWeld", parent: Instance?) -> ManualWeld) & ((className: "Motor", parent: Instance?) -> Motor) & ((className: "Motor6D", parent: Instance?) -> Motor6D) & ((className: "Rotate", parent: Instance?) -> Rotate) & ((className: "Snap", parent: Instance?) -> Snap) & ((className: "VelocityMotor", parent: Instance?) -> VelocityMotor) & ((className: "Weld", parent: Instance?) -> Weld) & ((className: "Keyframe", parent: Instance?) -> Keyframe) & ((className: "KeyframeMarker", parent: Instance?) -> KeyframeMarker) & ((className: "PointLight", parent: Instance?) -> PointLight) & ((className: "SpotLight", parent: Instance?) -> SpotLight) & ((className: "SurfaceLight", parent: Instance?) -> SurfaceLight) & ((className: "Script", parent: Instance?) -> Script) & ((className: "LocalScript", parent: Instance?) -> LocalScript) & ((className: "ModuleScript", parent: Instance?) -> ModuleScript) & ((className: "MarkerCurve", parent: Instance?) -> MarkerCurve) & ((className: "MemoryStoreService", parent: Instance?) -> MemoryStoreService) & ((className: "Message", parent: Instance?) -> Message) & ((className: "Hint", parent: Instance?) -> Hint) & ((className: "CornerWedgePart", parent: Instance?) -> CornerWedgePart) & ((className: "Part", parent: Instance?) -> Part) & ((className: "FlagStand", parent: Instance?) -> FlagStand) & ((className: "Seat", parent: Instance?) -> Seat) & ((className: "SkateboardPlatform", parent: Instance?) -> SkateboardPlatform) & ((className: "SpawnLocation", parent: Instance?) -> SpawnLocation) & ((className: "WedgePart", parent: Instance?) -> WedgePart) & ((className: "PartOperation", parent: Instance?) -> PartOperation) & ((className: "IntersectOperation", parent: Instance?) -> IntersectOperation) & ((className: "NegateOperation", parent: Instance?) -> NegateOperation) & ((className: "UnionOperation", parent: Instance?) -> UnionOperation) & ((className: "TrussPart", parent: Instance?) -> TrussPart) & ((className: "VehicleSeat", parent: Instance?) -> VehicleSeat) & ((className: "Model", parent: Instance?) -> Model) & ((className: "Actor", parent: Instance?) -> Actor) & ((className: "HopperBin", parent: Instance?) -> HopperBin) & ((className: "Tool", parent: Instance?) -> Tool) & ((className: "Flag", parent: Instance?) -> Flag) & ((className: "WorldModel", parent: Instance?) -> WorldModel) & ((className: "PartOperationAsset", parent: Instance?) -> PartOperationAsset) & ((className: "ParticleEmitter", parent: Instance?) -> ParticleEmitter) & ((className: "PathfindingLink", parent: Instance?) -> PathfindingLink) & ((className: "PathfindingModifier", parent: Instance?) -> PathfindingModifier) & ((className: "Player", parent: Instance?) -> Player) & ((className: "PluginAction", parent: Instance?) -> PluginAction) & ((className: "PluginCapabilities", parent: Instance?) -> PluginCapabilities) & ((className: "NumberPose", parent: Instance?) -> NumberPose) & ((className: "Pose", parent: Instance?) -> Pose) & ((className: "ReflectionMetadata", parent: Instance?) -> ReflectionMetadata) & ((className: "ReflectionMetadataCallbacks", parent: Instance?) -> ReflectionMetadataCallbacks) & ((className: "ReflectionMetadataClasses", parent: Instance?) -> ReflectionMetadataClasses) & ((className: "ReflectionMetadataEnums", parent: Instance?) -> ReflectionMetadataEnums) & ((className: "ReflectionMetadataEvents", parent: Instance?) -> ReflectionMetadataEvents) & ((className: "ReflectionMetadataFunctions", parent: Instance?) -> ReflectionMetadataFunctions) & ((className: "ReflectionMetadataClass", parent: Instance?) -> ReflectionMetadataClass) & ((className: "ReflectionMetadataEnum", parent: Instance?) -> ReflectionMetadataEnum) & ((className: "ReflectionMetadataEnumItem", parent: Instance?) -> ReflectionMetadataEnumItem) & ((className: "ReflectionMetadataMember", parent: Instance?) -> ReflectionMetadataMember) & ((className: "ReflectionMetadataProperties", parent: Instance?) -> ReflectionMetadataProperties) & ((className: "ReflectionMetadataYieldFunctions", parent: Instance?) -> ReflectionMetadataYieldFunctions) & ((className: "RemoteEvent", parent: Instance?) -> RemoteEvent) & ((className: "RemoteFunction", parent: Instance?) -> RemoteFunction) & ((className: "RenderingTest", parent: Instance?) -> RenderingTest) & ((className: "RotationCurve", parent: Instance?) -> RotationCurve) & ((className: "BuoyancySensor", parent: Instance?) -> BuoyancySensor) & ((className: "ControllerPartSensor", parent: Instance?) -> ControllerPartSensor) & ((className: "Sky", parent: Instance?) -> Sky) & ((className: "Smoke", parent: Instance?) -> Smoke) & ((className: "Sound", parent: Instance?) -> Sound) & ((className: "Sparkles", parent: Instance?) -> Sparkles) & ((className: "StandalonePluginScripts", parent: Instance?) -> StandalonePluginScripts) & ((className: "StarterGear", parent: Instance?) -> StarterGear) & ((className: "StudioCallout", parent: Instance?) -> StudioCallout) & ((className: "StudioObjectBase", parent: Instance?) -> StudioObjectBase) & ((className: "StudioWidget", parent: Instance?) -> StudioWidget) & ((className: "StyleRule", parent: Instance?) -> StyleRule) & ((className: "StyleSheet", parent: Instance?) -> StyleSheet) & ((className: "StyleDerive", parent: Instance?) -> StyleDerive) & ((className: "StyleLink", parent: Instance?) -> StyleLink) & ((className: "SurfaceAppearance", parent: Instance?) -> SurfaceAppearance) & ((className: "Team", parent: Instance?) -> Team) & ((className: "TeleportOptions", parent: Instance?) -> TeleportOptions) & ((className: "TerrainDetail", parent: Instance?) -> TerrainDetail) & ((className: "TerrainRegion", parent: Instance?) -> TerrainRegion) & ((className: "TestService", parent: Instance?) -> TestService) & ((className: "TextChannel", parent: Instance?) -> TextChannel) & ((className: "TextChatCommand", parent: Instance?) -> TextChatCommand) & ((className: "TextChatMessageProperties", parent: Instance?) -> TextChatMessageProperties) & ((className: "TrackerStreamAnimation", parent: Instance?) -> TrackerStreamAnimation) & ((className: "BinaryStringValue", parent: Instance?) -> BinaryStringValue) & ((className: "BoolValue", parent: Instance?) -> BoolValue) & ((className: "BrickColorValue", parent: Instance?) -> BrickColorValue) & ((className: "CFrameValue", parent: Instance?) -> CFrameValue) & ((className: "Color3Value", parent: Instance?) -> Color3Value) & ((className: "DoubleConstrainedValue", parent: Instance?) -> DoubleConstrainedValue) & ((className: "IntConstrainedValue", parent: Instance?) -> IntConstrainedValue) & ((className: "IntValue", parent: Instance?) -> IntValue) & ((className: "NumberValue", parent: Instance?) -> NumberValue) & ((className: "ObjectValue", parent: Instance?) -> ObjectValue) & ((className: "RayValue", parent: Instance?) -> RayValue) & ((className: "StringValue", parent: Instance?) -> StringValue) & ((className: "Vector3Value", parent: Instance?) -> Vector3Value) & ((className: "Vector3Curve", parent: Instance?) -> Vector3Curve) & ((className: "VirtualInputManager", parent: Instance?) -> VirtualInputManager) & ((className: "WeldConstraint", parent: Instance?) -> WeldConstraint) & ((className: "Wire", parent: Instance?) -> Wire) & ((className: string, parent: Instance?) -> Instance), + new: ((className: "Accoutrement", parent: Instance?) -> Accoutrement) & ((className: "Accessory", parent: Instance?) -> Accessory) & ((className: "Hat", parent: Instance?) -> Hat) & ((className: "AdvancedDragger", parent: Instance?) -> AdvancedDragger) & ((className: "Animation", parent: Instance?) -> Animation) & ((className: "CurveAnimation", parent: Instance?) -> CurveAnimation) & ((className: "KeyframeSequence", parent: Instance?) -> KeyframeSequence) & ((className: "AnimationController", parent: Instance?) -> AnimationController) & ((className: "AnimationRigData", parent: Instance?) -> AnimationRigData) & ((className: "Animator", parent: Instance?) -> Animator) & ((className: "AudioDeviceInput", parent: Instance?) -> AudioDeviceInput) & ((className: "AudioDeviceOutput", parent: Instance?) -> AudioDeviceOutput) & ((className: "AudioDistortion", parent: Instance?) -> AudioDistortion) & ((className: "AudioEcho", parent: Instance?) -> AudioEcho) & ((className: "AudioEmitter", parent: Instance?) -> AudioEmitter) & ((className: "AudioEqualizer", parent: Instance?) -> AudioEqualizer) & ((className: "AudioFader", parent: Instance?) -> AudioFader) & ((className: "AudioFlanger", parent: Instance?) -> AudioFlanger) & ((className: "AudioListener", parent: Instance?) -> AudioListener) & ((className: "AudioPitchShifter", parent: Instance?) -> AudioPitchShifter) & ((className: "AudioPlayer", parent: Instance?) -> AudioPlayer) & ((className: "AudioReverb", parent: Instance?) -> AudioReverb) & ((className: "AudioSearchParams", parent: Instance?) -> AudioSearchParams) & ((className: "Backpack", parent: Instance?) -> Backpack) & ((className: "WrapLayer", parent: Instance?) -> WrapLayer) & ((className: "WrapTarget", parent: Instance?) -> WrapTarget) & ((className: "BindableEvent", parent: Instance?) -> BindableEvent) & ((className: "BindableFunction", parent: Instance?) -> BindableFunction) & ((className: "BodyAngularVelocity", parent: Instance?) -> BodyAngularVelocity) & ((className: "BodyForce", parent: Instance?) -> BodyForce) & ((className: "BodyGyro", parent: Instance?) -> BodyGyro) & ((className: "BodyPosition", parent: Instance?) -> BodyPosition) & ((className: "BodyThrust", parent: Instance?) -> BodyThrust) & ((className: "BodyVelocity", parent: Instance?) -> BodyVelocity) & ((className: "RocketPropulsion", parent: Instance?) -> RocketPropulsion) & ((className: "BubbleChatMessageProperties", parent: Instance?) -> BubbleChatMessageProperties) & ((className: "Camera", parent: Instance?) -> Camera) & ((className: "BodyColors", parent: Instance?) -> BodyColors) & ((className: "CharacterMesh", parent: Instance?) -> CharacterMesh) & ((className: "Pants", parent: Instance?) -> Pants) & ((className: "Shirt", parent: Instance?) -> Shirt) & ((className: "ShirtGraphic", parent: Instance?) -> ShirtGraphic) & ((className: "Skin", parent: Instance?) -> Skin) & ((className: "ClickDetector", parent: Instance?) -> ClickDetector) & ((className: "DragDetector", parent: Instance?) -> DragDetector) & ((className: "Configuration", parent: Instance?) -> Configuration) & ((className: "AlignOrientation", parent: Instance?) -> AlignOrientation) & ((className: "AlignPosition", parent: Instance?) -> AlignPosition) & ((className: "AngularVelocity", parent: Instance?) -> AngularVelocity) & ((className: "AnimationConstraint", parent: Instance?) -> AnimationConstraint) & ((className: "BallSocketConstraint", parent: Instance?) -> BallSocketConstraint) & ((className: "HingeConstraint", parent: Instance?) -> HingeConstraint) & ((className: "LineForce", parent: Instance?) -> LineForce) & ((className: "LinearVelocity", parent: Instance?) -> LinearVelocity) & ((className: "PlaneConstraint", parent: Instance?) -> PlaneConstraint) & ((className: "Plane", parent: Instance?) -> Plane) & ((className: "RigidConstraint", parent: Instance?) -> RigidConstraint) & ((className: "RodConstraint", parent: Instance?) -> RodConstraint) & ((className: "RopeConstraint", parent: Instance?) -> RopeConstraint) & ((className: "CylindricalConstraint", parent: Instance?) -> CylindricalConstraint) & ((className: "PrismaticConstraint", parent: Instance?) -> PrismaticConstraint) & ((className: "SpringConstraint", parent: Instance?) -> SpringConstraint) & ((className: "Torque", parent: Instance?) -> Torque) & ((className: "TorsionSpringConstraint", parent: Instance?) -> TorsionSpringConstraint) & ((className: "UniversalConstraint", parent: Instance?) -> UniversalConstraint) & ((className: "HumanoidController", parent: Instance?) -> HumanoidController) & ((className: "SkateboardController", parent: Instance?) -> SkateboardController) & ((className: "VehicleController", parent: Instance?) -> VehicleController) & ((className: "AirController", parent: Instance?) -> AirController) & ((className: "ClimbController", parent: Instance?) -> ClimbController) & ((className: "GroundController", parent: Instance?) -> GroundController) & ((className: "SwimController", parent: Instance?) -> SwimController) & ((className: "ControllerManager", parent: Instance?) -> ControllerManager) & ((className: "CustomEvent", parent: Instance?) -> CustomEvent) & ((className: "CustomEventReceiver", parent: Instance?) -> CustomEventReceiver) & ((className: "CylinderMesh", parent: Instance?) -> CylinderMesh) & ((className: "DynamicMesh", parent: Instance?) -> DynamicMesh) & ((className: "FileMesh", parent: Instance?) -> FileMesh) & ((className: "SpecialMesh", parent: Instance?) -> SpecialMesh) & ((className: "DataStoreIncrementOptions", parent: Instance?) -> DataStoreIncrementOptions) & ((className: "DataStoreOptions", parent: Instance?) -> DataStoreOptions) & ((className: "DataStoreSetOptions", parent: Instance?) -> DataStoreSetOptions) & ((className: "DebuggerWatch", parent: Instance?) -> DebuggerWatch) & ((className: "Dialog", parent: Instance?) -> Dialog) & ((className: "DialogChoice", parent: Instance?) -> DialogChoice) & ((className: "Dragger", parent: Instance?) -> Dragger) & ((className: "EulerRotationCurve", parent: Instance?) -> EulerRotationCurve) & ((className: "ExperienceInviteOptions", parent: Instance?) -> ExperienceInviteOptions) & ((className: "Explosion", parent: Instance?) -> Explosion) & ((className: "Decal", parent: Instance?) -> Decal) & ((className: "Texture", parent: Instance?) -> Texture) & ((className: "Hole", parent: Instance?) -> Hole) & ((className: "MotorFeature", parent: Instance?) -> MotorFeature) & ((className: "Fire", parent: Instance?) -> Fire) & ((className: "FloatCurve", parent: Instance?) -> FloatCurve) & ((className: "CSGDictionaryService", parent: Instance?) -> CSGDictionaryService) & ((className: "NonReplicatedCSGDictionaryService", parent: Instance?) -> NonReplicatedCSGDictionaryService) & ((className: "ForceField", parent: Instance?) -> ForceField) & ((className: "FunctionalTest", parent: Instance?) -> FunctionalTest) & ((className: "GetTextBoundsParams", parent: Instance?) -> GetTextBoundsParams) & ((className: "Frame", parent: Instance?) -> Frame) & ((className: "ImageButton", parent: Instance?) -> ImageButton) & ((className: "TextButton", parent: Instance?) -> TextButton) & ((className: "ImageLabel", parent: Instance?) -> ImageLabel) & ((className: "TextLabel", parent: Instance?) -> TextLabel) & ((className: "TextBox", parent: Instance?) -> TextBox) & ((className: "VideoFrame", parent: Instance?) -> VideoFrame) & ((className: "ViewportFrame", parent: Instance?) -> ViewportFrame) & ((className: "BillboardGui", parent: Instance?) -> BillboardGui) & ((className: "ScreenGui", parent: Instance?) -> ScreenGui) & ((className: "GuiMain", parent: Instance?) -> GuiMain) & ((className: "AdGui", parent: Instance?) -> AdGui) & ((className: "SurfaceGui", parent: Instance?) -> SurfaceGui) & ((className: "FloorWire", parent: Instance?) -> FloorWire) & ((className: "SelectionBox", parent: Instance?) -> SelectionBox) & ((className: "BoxHandleAdornment", parent: Instance?) -> BoxHandleAdornment) & ((className: "ConeHandleAdornment", parent: Instance?) -> ConeHandleAdornment) & ((className: "CylinderHandleAdornment", parent: Instance?) -> CylinderHandleAdornment) & ((className: "ImageHandleAdornment", parent: Instance?) -> ImageHandleAdornment) & ((className: "LineHandleAdornment", parent: Instance?) -> LineHandleAdornment) & ((className: "SphereHandleAdornment", parent: Instance?) -> SphereHandleAdornment) & ((className: "WireframeHandleAdornment", parent: Instance?) -> WireframeHandleAdornment) & ((className: "ParabolaAdornment", parent: Instance?) -> ParabolaAdornment) & ((className: "SelectionSphere", parent: Instance?) -> SelectionSphere) & ((className: "ArcHandles", parent: Instance?) -> ArcHandles) & ((className: "Handles", parent: Instance?) -> Handles) & ((className: "SurfaceSelection", parent: Instance?) -> SurfaceSelection) & ((className: "SelectionPartLasso", parent: Instance?) -> SelectionPartLasso) & ((className: "SelectionPointLasso", parent: Instance?) -> SelectionPointLasso) & ((className: "HeightmapImporterService", parent: Instance?) -> HeightmapImporterService) & ((className: "HiddenSurfaceRemovalAsset", parent: Instance?) -> HiddenSurfaceRemovalAsset) & ((className: "Humanoid", parent: Instance?) -> Humanoid) & ((className: "HumanoidDescription", parent: Instance?) -> HumanoidDescription) & ((className: "IKControl", parent: Instance?) -> IKControl) & ((className: "RotateP", parent: Instance?) -> RotateP) & ((className: "RotateV", parent: Instance?) -> RotateV) & ((className: "Glue", parent: Instance?) -> Glue) & ((className: "ManualGlue", parent: Instance?) -> ManualGlue) & ((className: "ManualWeld", parent: Instance?) -> ManualWeld) & ((className: "Motor", parent: Instance?) -> Motor) & ((className: "Motor6D", parent: Instance?) -> Motor6D) & ((className: "Rotate", parent: Instance?) -> Rotate) & ((className: "Snap", parent: Instance?) -> Snap) & ((className: "VelocityMotor", parent: Instance?) -> VelocityMotor) & ((className: "Weld", parent: Instance?) -> Weld) & ((className: "Keyframe", parent: Instance?) -> Keyframe) & ((className: "KeyframeMarker", parent: Instance?) -> KeyframeMarker) & ((className: "PointLight", parent: Instance?) -> PointLight) & ((className: "SpotLight", parent: Instance?) -> SpotLight) & ((className: "SurfaceLight", parent: Instance?) -> SurfaceLight) & ((className: "Script", parent: Instance?) -> Script) & ((className: "LocalScript", parent: Instance?) -> LocalScript) & ((className: "ModuleScript", parent: Instance?) -> ModuleScript) & ((className: "MarkerCurve", parent: Instance?) -> MarkerCurve) & ((className: "MemoryStoreService", parent: Instance?) -> MemoryStoreService) & ((className: "Message", parent: Instance?) -> Message) & ((className: "Hint", parent: Instance?) -> Hint) & ((className: "CornerWedgePart", parent: Instance?) -> CornerWedgePart) & ((className: "Part", parent: Instance?) -> Part) & ((className: "FlagStand", parent: Instance?) -> FlagStand) & ((className: "Seat", parent: Instance?) -> Seat) & ((className: "SkateboardPlatform", parent: Instance?) -> SkateboardPlatform) & ((className: "SpawnLocation", parent: Instance?) -> SpawnLocation) & ((className: "WedgePart", parent: Instance?) -> WedgePart) & ((className: "PartOperation", parent: Instance?) -> PartOperation) & ((className: "IntersectOperation", parent: Instance?) -> IntersectOperation) & ((className: "NegateOperation", parent: Instance?) -> NegateOperation) & ((className: "UnionOperation", parent: Instance?) -> UnionOperation) & ((className: "TrussPart", parent: Instance?) -> TrussPart) & ((className: "VehicleSeat", parent: Instance?) -> VehicleSeat) & ((className: "Model", parent: Instance?) -> Model) & ((className: "HopperBin", parent: Instance?) -> HopperBin) & ((className: "Tool", parent: Instance?) -> Tool) & ((className: "Flag", parent: Instance?) -> Flag) & ((className: "WorldModel", parent: Instance?) -> WorldModel) & ((className: "PartOperationAsset", parent: Instance?) -> PartOperationAsset) & ((className: "ParticleEmitter", parent: Instance?) -> ParticleEmitter) & ((className: "PathfindingLink", parent: Instance?) -> PathfindingLink) & ((className: "PathfindingModifier", parent: Instance?) -> PathfindingModifier) & ((className: "Player", parent: Instance?) -> Player) & ((className: "PluginAction", parent: Instance?) -> PluginAction) & ((className: "PluginCapabilities", parent: Instance?) -> PluginCapabilities) & ((className: "NumberPose", parent: Instance?) -> NumberPose) & ((className: "Pose", parent: Instance?) -> Pose) & ((className: "ReflectionMetadata", parent: Instance?) -> ReflectionMetadata) & ((className: "ReflectionMetadataCallbacks", parent: Instance?) -> ReflectionMetadataCallbacks) & ((className: "ReflectionMetadataClasses", parent: Instance?) -> ReflectionMetadataClasses) & ((className: "ReflectionMetadataEnums", parent: Instance?) -> ReflectionMetadataEnums) & ((className: "ReflectionMetadataEvents", parent: Instance?) -> ReflectionMetadataEvents) & ((className: "ReflectionMetadataFunctions", parent: Instance?) -> ReflectionMetadataFunctions) & ((className: "ReflectionMetadataClass", parent: Instance?) -> ReflectionMetadataClass) & ((className: "ReflectionMetadataEnum", parent: Instance?) -> ReflectionMetadataEnum) & ((className: "ReflectionMetadataEnumItem", parent: Instance?) -> ReflectionMetadataEnumItem) & ((className: "ReflectionMetadataMember", parent: Instance?) -> ReflectionMetadataMember) & ((className: "ReflectionMetadataProperties", parent: Instance?) -> ReflectionMetadataProperties) & ((className: "ReflectionMetadataYieldFunctions", parent: Instance?) -> ReflectionMetadataYieldFunctions) & ((className: "RemoteEvent", parent: Instance?) -> RemoteEvent) & ((className: "RemoteFunction", parent: Instance?) -> RemoteFunction) & ((className: "RenderingTest", parent: Instance?) -> RenderingTest) & ((className: "RotationCurve", parent: Instance?) -> RotationCurve) & ((className: "BuoyancySensor", parent: Instance?) -> BuoyancySensor) & ((className: "ControllerPartSensor", parent: Instance?) -> ControllerPartSensor) & ((className: "Sky", parent: Instance?) -> Sky) & ((className: "Smoke", parent: Instance?) -> Smoke) & ((className: "Sound", parent: Instance?) -> Sound) & ((className: "Sparkles", parent: Instance?) -> Sparkles) & ((className: "StandalonePluginScripts", parent: Instance?) -> StandalonePluginScripts) & ((className: "StarterGear", parent: Instance?) -> StarterGear) & ((className: "StudioCallout", parent: Instance?) -> StudioCallout) & ((className: "StudioObjectBase", parent: Instance?) -> StudioObjectBase) & ((className: "StudioWidget", parent: Instance?) -> StudioWidget) & ((className: "StyleRule", parent: Instance?) -> StyleRule) & ((className: "StyleSheet", parent: Instance?) -> StyleSheet) & ((className: "StyleDerive", parent: Instance?) -> StyleDerive) & ((className: "StyleLink", parent: Instance?) -> StyleLink) & ((className: "SurfaceAppearance", parent: Instance?) -> SurfaceAppearance) & ((className: "Team", parent: Instance?) -> Team) & ((className: "TeleportOptions", parent: Instance?) -> TeleportOptions) & ((className: "TerrainDetail", parent: Instance?) -> TerrainDetail) & ((className: "TerrainRegion", parent: Instance?) -> TerrainRegion) & ((className: "TestService", parent: Instance?) -> TestService) & ((className: "TextChannel", parent: Instance?) -> TextChannel) & ((className: "TextChatCommand", parent: Instance?) -> TextChatCommand) & ((className: "TextChatMessageProperties", parent: Instance?) -> TextChatMessageProperties) & ((className: "TrackerStreamAnimation", parent: Instance?) -> TrackerStreamAnimation) & ((className: "BinaryStringValue", parent: Instance?) -> BinaryStringValue) & ((className: "BoolValue", parent: Instance?) -> BoolValue) & ((className: "BrickColorValue", parent: Instance?) -> BrickColorValue) & ((className: "CFrameValue", parent: Instance?) -> CFrameValue) & ((className: "Color3Value", parent: Instance?) -> Color3Value) & ((className: "DoubleConstrainedValue", parent: Instance?) -> DoubleConstrainedValue) & ((className: "IntConstrainedValue", parent: Instance?) -> IntConstrainedValue) & ((className: "IntValue", parent: Instance?) -> IntValue) & ((className: "NumberValue", parent: Instance?) -> NumberValue) & ((className: "ObjectValue", parent: Instance?) -> ObjectValue) & ((className: "RayValue", parent: Instance?) -> RayValue) & ((className: "StringValue", parent: Instance?) -> StringValue) & ((className: "Vector3Value", parent: Instance?) -> Vector3Value) & ((className: "Vector3Curve", parent: Instance?) -> Vector3Curve) & ((className: "VirtualInputManager", parent: Instance?) -> VirtualInputManager) & ((className: "WeldConstraint", parent: Instance?) -> WeldConstraint) & ((className: "Wire", parent: Instance?) -> Wire) & ((className: string, parent: Instance?) -> Instance), Lock: (instance: Instance, player: Player) -> nil, Unlock: (instance: Instance) -> nil, diff --git a/luau/10000001.luau b/luau/10000001.luau index 64f6566..63a0cd8 100644 --- a/luau/10000001.luau +++ b/luau/10000001.luau @@ -32,6 +32,7 @@ do mistypedSpringDamping = "The damping ratio for a spring must be a number. (got a %s)", mistypedSpringSpeed = "The speed of a spring must be a number. (got a %s)", mistypedTweenInfo = "The tween info of a tween must be a TweenInfo. (got a %s)", + noTaskScheduler = "Fusion is not connected to an external task scheduler.", springTypeMismatch = "The type '%s' doesn't match the spring's type '%s'.", stateGetWasRemoved = [[`StateObject:get()` has been replaced by `use()` and `peek()` - see discussion #217 on GitHub.]], strictReadError = "'%s' is not a valid member of '%s'.", @@ -82,6 +83,64 @@ do __DARKLUA_BUNDLE_MODULES.d = logError end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local External = {} + local updateStepCallbacks = {} + local currentScheduler = nil + local lastUpdateStep = 0 + + function External.setExternalScheduler(newScheduler) + local oldScheduler = currentScheduler + + if oldScheduler ~= nil then + oldScheduler.stopScheduler() + end + + currentScheduler = newScheduler + + if newScheduler ~= nil then + newScheduler.startScheduler() + end + + return oldScheduler + end + function External.doTaskImmediate(resume) + if currentScheduler == nil then + logError "noTaskScheduler" + else + currentScheduler.doTaskImmediate(resume) + end + end + function External.doTaskDeferred(resume) + if currentScheduler == nil then + logError "noTaskScheduler" + else + currentScheduler.doTaskDeferred(resume) + end + end + function External.bindToUpdateStep(callback) + local uniqueIdentifier = {} + + updateStepCallbacks[uniqueIdentifier] = callback + + return function() + updateStepCallbacks[uniqueIdentifier] = nil + end + end + function External.performUpdateStep(now) + lastUpdateStep = now + + for _, callback in pairs(updateStepCallbacks) do + callback(now) + end + end + function External.lastUpdateStep() + return lastUpdateStep + end + + __DARKLUA_BUNDLE_MODULES.e = External +end do local logError = __DARKLUA_BUNDLE_MODULES.d @@ -101,57 +160,140 @@ do return strictTable end - __DARKLUA_BUNDLE_MODULES.e = restrictRead + __DARKLUA_BUNDLE_MODULES.f = restrictRead end do - local Oklab = {} + local RunService = game:GetService "RunService" + local External = __DARKLUA_BUNDLE_MODULES.e + local MercuryExternal = {} - function Oklab.to(rgb) - local l = rgb.r * 0.4122214708 - + rgb.g * 0.5363325363 - + rgb.b * 0.0514459929 - local m = rgb.r * 0.2119034982 - + rgb.g * 0.6806995451 - + rgb.b * 0.1073969566 - local s = rgb.r * 0.0883024619 - + rgb.g * 0.2817188376 - + rgb.b * 0.6299787005 - local lRoot = l ^ 0.3333333333333333 - local mRoot = m ^ 0.3333333333333333 - local sRoot = s ^ 0.3333333333333333 - - return Vector3.new( - lRoot * 0.2104542553 + mRoot * 0.793617785 - sRoot * 0.0040720468, - lRoot * 1.9779984951 - mRoot * 2.428592205 + sRoot * 0.4505937099, - lRoot * 0.0259040371 + mRoot * 0.7827717662 - sRoot * 0.808675766 - ) + function MercuryExternal.doTaskImmediate(resume) + Spawn(resume) + end + function MercuryExternal.doTaskDeferred(resume) + coroutine.resume(coroutine.create(resume)) end - function Oklab.from(lab, unclamped) - local lRoot = lab.X + lab.Y * 0.3963377774 + lab.Z * 0.2158037573 - local mRoot = lab.X - lab.Y * 0.1055613458 - lab.Z * 0.0638541728 - local sRoot = lab.X - lab.Y * 0.0894841775 - lab.Z * 1.291485548 - local l = lRoot ^ 3 - local m = mRoot ^ 3 - local s = sRoot ^ 3 - local red = l * 4.0767416621 - m * 3.3077115913 + s * 0.2309699292 - local green = l * -1.2684380046 + m * 2.6097574011 - s * 0.3413193965 - local blue = l * -4.196086299999999E-3 - - m * 0.7034186147 - + s * 1.707614701 - if not unclamped then - red = math.max(0, math.min(red, 1)) - green = math.max(0, math.min(green, 1)) - blue = math.max(0, math.min(blue, 1)) + local function performUpdateStep() + External.performUpdateStep(time()) + end + + local stopSchedulerFunc = nil + + function MercuryExternal.startScheduler() + if stopSchedulerFunc ~= nil then + return end - return Color3.new(red, green, blue) + local conn = RunService.RenderStepped:connect(performUpdateStep) + + stopSchedulerFunc = function() + conn:disconnect() + end + end + function MercuryExternal.stopScheduler() + if stopSchedulerFunc ~= nil then + stopSchedulerFunc() + + stopSchedulerFunc = nil + end end - __DARKLUA_BUNDLE_MODULES.f = Oklab + __DARKLUA_BUNDLE_MODULES.g = MercuryExternal end do - __DARKLUA_BUNDLE_MODULES.g = function(value) + __DARKLUA_BUNDLE_MODULES.h = { + BillboardGui = { Active = true }, + Frame = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + }, + TextLabel = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + Font = Enum.Font.SourceSans, + Text = "", + TextColor3 = Color3.new(0, 0, 0), + FontSize = Enum.FontSize.Size14, + }, + TextButton = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + AutoButtonColor = false, + Font = Enum.Font.SourceSans, + Text = "", + TextColor3 = Color3.new(0, 0, 0), + FontSize = Enum.FontSize.Size14, + }, + TextBox = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + ClearTextOnFocus = false, + Font = Enum.Font.SourceSans, + Text = "", + TextColor3 = Color3.new(0, 0, 0), + FontSize = Enum.FontSize.Size14, + }, + ImageLabel = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + }, + ImageButton = { + BackgroundColor3 = Color3.new(1, 1, 1), + BorderColor3 = Color3.new(0, 0, 0), + BorderSizePixel = 0, + AutoButtonColor = false, + }, + SpawnLocation = { Duration = 0 }, + Part = { + Anchored = true, + Size = Vector3.new(1, 1, 1), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + TrussPart = { + Anchored = true, + Size = Vector3.new(2, 2, 2), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + CornerWedgePart = { + Anchored = true, + Size = Vector3.new(1, 1, 1), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + VehicleSeat = { + Anchored = true, + Size = Vector3.new(1, 1, 1), + FrontSurface = Enum.SurfaceType.Smooth, + BackSurface = Enum.SurfaceType.Smooth, + LeftSurface = Enum.SurfaceType.Smooth, + RightSurface = Enum.SurfaceType.Smooth, + TopSurface = Enum.SurfaceType.Smooth, + BottomSurface = Enum.SurfaceType.Smooth, + }, + } +end +do + __DARKLUA_BUNDLE_MODULES.i = function(value) local basicType = type(value) if @@ -354,8 +496,1626 @@ do end end do - local Oklab = __DARKLUA_BUNDLE_MODULES.f - local typeof = __DARKLUA_BUNDLE_MODULES.g + local typeof = __DARKLUA_BUNDLE_MODULES.i + + local function cleanupOne(task) + local taskType = typeof(task) + + if taskType == "Instance" then + task:Destroy() + elseif taskType == "RBXScriptConnection" then + task:disconnect() + elseif taskType == "function" then + task() + elseif taskType == "table" then + if type(task.destroy) == "function" then + task:destroy() + elseif type(task.Destroy) == "function" then + task:Destroy() + elseif task[1] ~= nil then + for _, subtask in ipairs(task) do + cleanupOne(subtask) + end + end + end + end + local function cleanup(...) + for index = 1, select("#", ...) do + cleanupOne(select(index, ...)) + end + end + + __DARKLUA_BUNDLE_MODULES.j = cleanup +end +do + local typeof = __DARKLUA_BUNDLE_MODULES.i + + local function xtypeof(x) + local typeString = typeof(x) + + if typeString == "table" and type(x.type) == "string" then + return x.type + else + return typeString + end + end + + __DARKLUA_BUNDLE_MODULES.k = xtypeof +end +do + local External = __DARKLUA_BUNDLE_MODULES.e + local class = {} + local CLASS_METATABLE = { __index = class } + local strongRefs = {} + + function class:update() + for _, callback in pairs(self._changeListeners) do + External.doTaskImmediate(callback) + end + + return false + end + function class:onChange(callback) + local uniqueIdentifier = {} + + self._numChangeListeners = self._numChangeListeners + 1 + self._changeListeners[uniqueIdentifier] = callback + strongRefs[self] = true + + local disconnected = false + + return function() + if disconnected then + return + end + + disconnected = true + self._changeListeners[uniqueIdentifier] = nil + self._numChangeListeners = self._numChangeListeners - 1 + + if self._numChangeListeners == 0 then + strongRefs[self] = nil + end + end + end + function class:onBind(callback) + External.doTaskImmediate(callback) + + return self:onChange(callback) + end + + local function Observer(watchedState) + local self = setmetatable({ + type = "State", + kind = "Observer", + dependencySet = { [watchedState] = true }, + dependentSet = {}, + _changeListeners = {}, + _numChangeListeners = 0, + }, CLASS_METATABLE) + + watchedState.dependentSet[self] = true + + return self + end + + __DARKLUA_BUNDLE_MODULES.l = Observer +end +do + local function isState(target) + return type(target) == "table" and type(target._peek) == "function" + end + + __DARKLUA_BUNDLE_MODULES.m = isState +end +do + local isState = __DARKLUA_BUNDLE_MODULES.m + + local function peek(target) + if isState(target) then + return (target):_peek() + end + + return target + end + + __DARKLUA_BUNDLE_MODULES.n = peek +end +do + local External = __DARKLUA_BUNDLE_MODULES.e + local cleanup = __DARKLUA_BUNDLE_MODULES.j + local xtypeof = __DARKLUA_BUNDLE_MODULES.k + local logError = __DARKLUA_BUNDLE_MODULES.d + local Observer = __DARKLUA_BUNDLE_MODULES.l + local peek = __DARKLUA_BUNDLE_MODULES.n + local typeof = __DARKLUA_BUNDLE_MODULES.i + + local function setProperty_unsafe(instance, property, value) + (instance)[property] = value + end + local function testPropertyAssignable(instance, property) + (instance)[property] = (instance)[property] + end + local function setProperty(instance, property, value) + if not pcall(setProperty_unsafe, instance, property, value) then + if not pcall(testPropertyAssignable, instance, property) then + if instance == nil then + logError( + "setPropertyNilRef", + nil, + property, + tostring(value) + ) + else + logError( + "cannotAssignProperty", + nil, + instance.ClassName, + property + ) + end + else + local givenType = typeof(value) + local expectedType = typeof((instance)[property]) + + logError( + "invalidPropertyType", + nil, + instance.ClassName, + property, + expectedType, + givenType + ) + end + end + end + local function bindProperty(instance, property, value, cleanupTasks) + if xtypeof(value) == "State" then + local willUpdate = false + + local function updateLater() + if not willUpdate then + willUpdate = true + + External.doTaskDeferred(function() + willUpdate = false + + setProperty(instance, property, peek(value)) + end) + end + end + + setProperty(instance, property, peek(value)) + table.insert(cleanupTasks, Observer(value):onChange(updateLater)) + else + setProperty(instance, property, value) + end + end + local function applyInstanceProps(props, applyTo) + local specialKeys = { + self = {}, + descendants = {}, + ancestor = {}, + observer = {}, + } + local cleanupTasks = {} + + for key, value in pairs(props) do + local keyType = xtypeof(key) + + if keyType == "string" then + if key ~= "Parent" then + bindProperty(applyTo, key, value, cleanupTasks) + end + elseif keyType == "SpecialKey" then + local stage = (key).stage + local keys = specialKeys[stage] + + if keys == nil then + logError("unrecognisedPropertyStage", nil, stage) + else + keys[key] = value + end + else + logError("unrecognisedPropertyKey", nil, xtypeof(key)) + end + end + for key, value in pairs(specialKeys.self) do + key:apply(value, applyTo, cleanupTasks) + end + for key, value in pairs(specialKeys.descendants) do + key:apply(value, applyTo, cleanupTasks) + end + + if props.Parent ~= nil then + bindProperty(applyTo, "Parent", props.Parent, cleanupTasks) + end + + for key, value in pairs(specialKeys.ancestor) do + key:apply(value, applyTo, cleanupTasks) + end + for key, value in pairs(specialKeys.observer) do + key:apply(value, applyTo, cleanupTasks) + end + + if applyTo.Parent then + game.DescendantRemoving:connect(function(descendant) + if descendant == applyTo then + cleanup(cleanupTasks) + end + end) + end + end + + __DARKLUA_BUNDLE_MODULES.o = applyInstanceProps +end +do + local defaultProps = __DARKLUA_BUNDLE_MODULES.h + local applyInstanceProps = __DARKLUA_BUNDLE_MODULES.o + local logError = __DARKLUA_BUNDLE_MODULES.d + + local function New(className) + return function(props) + local ok, instance = pcall(Instance.new, className) + + if not ok then + logError("cannotCreateClass", nil, className) + end + + local classDefaults = defaultProps[className] + + if classDefaults ~= nil then + for defaultProp, defaultValue in pairs(classDefaults) do + instance[defaultProp] = defaultValue + end + end + + applyInstanceProps(props, instance) + + return instance + end + end + + __DARKLUA_BUNDLE_MODULES.p = New +end +do + local applyInstanceProps = __DARKLUA_BUNDLE_MODULES.o + + local function Hydrate(target) + return function(props) + applyInstanceProps(props, target) + + return target + end + end + + __DARKLUA_BUNDLE_MODULES.q = Hydrate +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local xtypeof = __DARKLUA_BUNDLE_MODULES.k + local Ref = {} + + Ref.type = "SpecialKey" + Ref.kind = "Ref" + Ref.stage = "observer" + + function Ref:apply(refState, applyTo, cleanupTasks) + if xtypeof(refState) ~= "State" or refState.kind ~= "Value" then + logError "invalidRefType" + else + refState:set(applyTo) + table.insert(cleanupTasks, function() + refState:set(nil) + end) + end + end + + __DARKLUA_BUNDLE_MODULES.r = Ref +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local xtypeof = __DARKLUA_BUNDLE_MODULES.k + + local function Out(propertyName) + local outKey = {} + + outKey.type = "SpecialKey" + outKey.kind = "Out" + outKey.stage = "observer" + + function outKey:apply(outState, applyTo, cleanupTasks) + local ok, event = pcall(function() + return applyTo.Changed + end) + + if not ok then + logError( + "invalidOutProperty", + nil, + applyTo.ClassName, + propertyName + ) + elseif xtypeof(outState) ~= "State" or outState.kind ~= "Value" then + logError "invalidOutType" + else + outState:set((applyTo)[propertyName]) + table.insert( + cleanupTasks, + event:connect(function(prop) + if prop == propertyName then + outState:set((applyTo)[propertyName]) + end + end) + ) + table.insert(cleanupTasks, function() + outState:set(nil) + end) + end + end + + return outKey + end + + __DARKLUA_BUNDLE_MODULES.s = Out +end +do + local Cleanup = {} + + Cleanup.type = "SpecialKey" + Cleanup.kind = "Cleanup" + Cleanup.stage = "observer" + + function Cleanup:apply(userTask, _, cleanupTasks) + table.insert(cleanupTasks, userTask) + end + + __DARKLUA_BUNDLE_MODULES.t = Cleanup +end +do + local messages = __DARKLUA_BUNDLE_MODULES.c + + local function logWarn(messageID, ...) + local formatString + + if messages[messageID] ~= nil then + formatString = messages[messageID] + else + messageID = "unknownMessage" + formatString = messages[messageID] + end + + warn( + string.format( + "[Fusion] " .. formatString .. "\n(ID: " .. messageID .. ")", + ... + ) + ) + end + + __DARKLUA_BUNDLE_MODULES.u = logWarn +end +do + local External = __DARKLUA_BUNDLE_MODULES.e + local logWarn = __DARKLUA_BUNDLE_MODULES.u + local Observer = __DARKLUA_BUNDLE_MODULES.l + local peek = __DARKLUA_BUNDLE_MODULES.n + local isState = __DARKLUA_BUNDLE_MODULES.m + local typeof = __DARKLUA_BUNDLE_MODULES.i + local EXPERIMENTAL_AUTO_NAMING = false + local Children = {} + + Children.type = "SpecialKey" + Children.kind = "Children" + Children.stage = "descendants" + + function Children:apply(propValue, applyTo, cleanupTasks) + local newParented = {} + local oldParented = {} + local newDisconnects = {} + local oldDisconnects = {} + local updateQueued = false + local queueUpdate + + local function updateChildren() + if not updateQueued then + return + end + + updateQueued = false + oldParented, newParented = newParented, oldParented + oldDisconnects, newDisconnects = newDisconnects, oldDisconnects + + for i, _ in pairs(newParented) do + newParented[i] = nil + end + for i, _ in pairs(newDisconnects) do + newDisconnects[i] = nil + end + + local function processChild(child, autoName) + local childType = typeof(child) + + if childType == "Instance" then + newParented[child] = true + + if oldParented[child] == nil then + child.Parent = applyTo + else + oldParented[child] = nil + end + if EXPERIMENTAL_AUTO_NAMING and autoName ~= nil then + child.Name = autoName + end + elseif isState(child) then + local value = peek(child) + + if value ~= nil then + processChild(value, autoName) + end + + local disconnect = oldDisconnects[child] + + if disconnect == nil then + disconnect = Observer(child):onChange(queueUpdate) + else + oldDisconnects[child] = nil + end + + newDisconnects[child] = disconnect + elseif childType == "table" then + for key, subChild in pairs(child) do + local keyType = typeof(key) + local subAutoName = nil + + if keyType == "string" then + subAutoName = key + elseif keyType == "number" and autoName ~= nil then + subAutoName = autoName .. "_" .. key + end + + processChild(subChild, subAutoName) + end + else + logWarn("unrecognisedChildType", childType) + end + end + + if propValue ~= nil then + processChild(propValue) + end + + for oldInstance in pairs(oldParented) do + oldInstance.Parent = nil + end + for _, disconnect in pairs(oldDisconnects) do + disconnect() + end + end + + queueUpdate = function() + if not updateQueued then + updateQueued = true + + External.doTaskDeferred(updateChildren) + end + end + + table.insert(cleanupTasks, function() + propValue = nil + updateQueued = true + + updateChildren() + end) + + updateQueued = true + + updateChildren() + end + + __DARKLUA_BUNDLE_MODULES.v = Children +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local typeof = __DARKLUA_BUNDLE_MODULES.i + + local function getProperty_unsafe(instance, property) + return (instance)[property] + end + local function OnEvent(eventName) + local eventKey = {} + + eventKey.type = "SpecialKey" + eventKey.kind = "OnEvent" + eventKey.stage = "observer" + + function eventKey:apply(callback, applyTo, cleanupTasks) + local ok, event = pcall(getProperty_unsafe, applyTo, eventName) + + if not ok or typeof(event) ~= "RBXScriptSignal" then + logError( + "cannotConnectEvent", + nil, + applyTo.ClassName, + eventName + ) + elseif typeof(callback) ~= "function" then + logError("invalidEventHandler", nil, eventName) + else + table.insert(cleanupTasks, event:connect(callback)) + end + end + + return eventKey + end + + __DARKLUA_BUNDLE_MODULES.w = OnEvent +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local typeof = __DARKLUA_BUNDLE_MODULES.i + + local function OnChange(propertyName) + local changeKey = {} + + changeKey.type = "SpecialKey" + changeKey.kind = "OnChange" + changeKey.stage = "observer" + + function changeKey:apply(callback, applyTo, cleanupTasks) + local ok, event = pcall(function() + return applyTo.Changed + end) + + if not ok then + logError( + "cannotConnectChange", + nil, + applyTo.ClassName, + propertyName + ) + elseif typeof(callback) ~= "function" then + logError("invalidChangeHandler", nil, propertyName) + else + table.insert( + cleanupTasks, + event:connect(function(prop) + if prop == propertyName then + callback((applyTo)[propertyName]) + end + end) + ) + end + end + + return changeKey + end + + __DARKLUA_BUNDLE_MODULES.x = OnChange +end +do + local function updateAll(root) + local counters = {} + local flags = {} + local queue = {} + local queueSize = 0 + local queuePos = 1 + + for object in pairs(root.dependentSet) do + queueSize = queueSize + 1 + queue[queueSize] = object + flags[object] = true + end + + while queuePos <= queueSize do + local next = queue[queuePos] + local counter = counters[next] + + counters[next] = (function() + if counter == nil then + return 1 + else + return counter + 1 + end + end)() + + if next.dependentSet ~= nil then + for object in pairs(next.dependentSet) do + queueSize = queueSize + 1 + queue[queueSize] = object + end + end + + queuePos = queuePos + 1 + end + + queuePos = 1 + + while queuePos <= queueSize do + local next = queue[queuePos] + local counter = counters[next] - 1 + + counters[next] = counter + + if + counter == 0 + and flags[next] + and next:update() + and next.dependentSet ~= nil + then + for object in pairs(next.dependentSet) do + flags[object] = true + end + end + + queuePos = queuePos + 1 + end + end + + __DARKLUA_BUNDLE_MODULES.y = updateAll +end +do + local function isSimilar(a, b) + if type(a) == "table" then + return false + end + + return a == b + end + + __DARKLUA_BUNDLE_MODULES.z = isSimilar +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local updateAll = __DARKLUA_BUNDLE_MODULES.y + local isSimilar = __DARKLUA_BUNDLE_MODULES.z + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:set(newValue, force) + local oldValue = self._value + + if force or not isSimilar(oldValue, newValue) then + self._value = newValue + + updateAll(self) + end + end + function class:_peek() + return self._value + end + function class:get() + logError "stateGetWasRemoved" + end + + local function Value(initialValue) + local self = setmetatable({ + type = "State", + kind = "Value", + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _value = initialValue, + }, CLASS_METATABLE) + + return self + end + + __DARKLUA_BUNDLE_MODULES.A = Value +end +do + local messages = __DARKLUA_BUNDLE_MODULES.c + + local function logErrorNonFatal(messageID, errObj, ...) + local formatString + + if messages[messageID] ~= nil then + formatString = messages[messageID] + else + messageID = "unknownMessage" + formatString = messages[messageID] + end + + local errorString + + if errObj == nil then + errorString = string.format( + "[Fusion] " .. formatString .. "\n(ID: " .. messageID .. ")", + ... + ) + else + formatString = + formatString:gsub("ERROR_MESSAGE", tostring(errObj.message)) + errorString = string.format( + "[Fusion] " + .. formatString + .. "\n(ID: " + .. messageID + .. ")\n---- Stack trace ----\n" + .. tostring(errObj.trace), + ... + ) + end + + coroutine.wrap(function() + error(errorString:gsub("\n", "\n "), 0) + end)() + end + + __DARKLUA_BUNDLE_MODULES.B = logErrorNonFatal +end +do + local function parseError(err) + local trace = "Traceback not available" + + if debug and debug.traceback then + trace = debug.traceback(nil, 2) + end + + return { + type = "Error", + raw = err, + message = err:gsub("^.+:%d+:%s*", ""), + trace = trace, + } + end + + __DARKLUA_BUNDLE_MODULES.C = parseError +end +do + local typeof = __DARKLUA_BUNDLE_MODULES.i + + local function needsDestruction(x) + return typeof(x) == "Instance" + end + + __DARKLUA_BUNDLE_MODULES.D = needsDestruction +end +do + local isState = __DARKLUA_BUNDLE_MODULES.m + + local function makeUseCallback(dependencySet) + local function use(target) + if isState(target) then + dependencySet[target] = true + + return (target):_peek() + end + + return target + end + + return use + end + + __DARKLUA_BUNDLE_MODULES.E = makeUseCallback +end +do + local logError = __DARKLUA_BUNDLE_MODULES.d + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.B + local logWarn = __DARKLUA_BUNDLE_MODULES.u + local parseError = __DARKLUA_BUNDLE_MODULES.C + local isSimilar = __DARKLUA_BUNDLE_MODULES.z + local needsDestruction = __DARKLUA_BUNDLE_MODULES.D + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.E + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + local use = makeUseCallback(self.dependencySet) + local ok, newValue, newMetaValue = pcall(self._processor, use) + + if ok then + if self._destructor == nil and needsDestruction(newValue) then + logWarn "destructorNeededComputed" + end + if newMetaValue ~= nil then + logWarn "multiReturnComputed" + end + + local oldValue = self._value + local similar = isSimilar(oldValue, newValue) + + if self._destructor ~= nil then + self._destructor(oldValue) + end + + self._value = newValue + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = true + end + + return not similar + else + logErrorNonFatal("computedCallbackError", parseError(newValue)) + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = true + end + + return false + end + end + function class:_peek() + return self._value + end + function class:get() + logError "stateGetWasRemoved" + end + + local function Computed(processor, destructor) + local dependencySet = {} + local self = setmetatable({ + type = "State", + kind = "Computed", + dependencySet = dependencySet, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _value = nil, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.F = Computed +end +do + local parseError = __DARKLUA_BUNDLE_MODULES.C + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.B + local logError = __DARKLUA_BUNDLE_MODULES.d + local logWarn = __DARKLUA_BUNDLE_MODULES.u + local cleanup = __DARKLUA_BUNDLE_MODULES.j + local needsDestruction = __DARKLUA_BUNDLE_MODULES.D + local peek = __DARKLUA_BUNDLE_MODULES.n + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.E + local isState = __DARKLUA_BUNDLE_MODULES.m + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + local inputIsState = self._inputIsState + local newInputTable = peek(self._inputTable) + local oldInputTable = self._oldInputTable + local keyIOMap = self._keyIOMap + local meta = self._meta + local didChange = false + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + if inputIsState then + self._inputTable.dependentSet[self] = true + self.dependencySet[self._inputTable] = true + end + + self._oldOutputTable, self._outputTable = + self._outputTable, self._oldOutputTable + + local oldOutputTable = self._oldOutputTable + local newOutputTable = self._outputTable + + for i, _ in pairs(newOutputTable) do + newOutputTable[i] = nil + end + for newInKey, newInValue in pairs(newInputTable) do + local keyData = self._keyData[newInKey] + + if keyData == nil then + keyData = { + dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), + } + self._keyData[newInKey] = keyData + end + + local shouldRecalculate = oldInputTable[newInKey] ~= newInValue + + if shouldRecalculate == false then + for dependency, oldValue in pairs(keyData.dependencyValues) do + if oldValue ~= peek(dependency) then + shouldRecalculate = true + + break + end + end + end + if shouldRecalculate then + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + for i, _ in pairs(keyData.dependencySet) do + keyData.dependencySet[i] = nil + end + + local use = makeUseCallback(keyData.dependencySet) + local processOK, newOutKey, newOutValue, newMetaValue = + pcall(self._processor, use, newInKey, newInValue) + + if processOK then + if + self._destructor == nil + and ( + needsDestruction(newOutKey) + or needsDestruction(newOutValue) + or needsDestruction(newMetaValue) + ) + then + logWarn "destructorNeededForPairs" + end + if newOutputTable[newOutKey] ~= nil then + local previousNewKey, previousNewValue + + for inKey, outKey in pairs(keyIOMap) do + if outKey == newOutKey then + previousNewValue = newInputTable[inKey] + + if previousNewValue ~= nil then + previousNewKey = inKey + + break + end + end + end + + if previousNewKey ~= nil then + logError( + "forPairsKeyCollision", + nil, + tostring(newOutKey), + tostring(previousNewKey), + tostring(previousNewValue), + tostring(newInKey), + tostring(newInValue) + ) + end + end + + local oldOutValue = oldOutputTable[newOutKey] + + if oldOutValue ~= newOutValue then + local oldMetaValue = meta[newOutKey] + + if oldOutValue ~= nil then + local destructOK, err = pcall( + self._destructor or cleanup, + newOutKey, + oldOutValue, + oldMetaValue + ) + + if not destructOK then + logErrorNonFatal( + "forPairsDestructorError", + parseError(err) + ) + end + end + + oldOutputTable[newOutKey] = nil + end + + oldInputTable[newInKey] = newInValue + keyIOMap[newInKey] = newOutKey + meta[newOutKey] = newMetaValue + newOutputTable[newOutKey] = newOutValue + didChange = true + else + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + logErrorNonFatal( + "forPairsProcessorError", + parseError(newOutKey) + ) + end + else + local storedOutKey = keyIOMap[newInKey] + + if newOutputTable[storedOutKey] ~= nil then + local previousNewKey, previousNewValue + + for inKey, outKey in pairs(keyIOMap) do + if storedOutKey == outKey then + previousNewValue = newInputTable[inKey] + + if previousNewValue ~= nil then + previousNewKey = inKey + + break + end + end + end + + if previousNewKey ~= nil then + logError( + "forPairsKeyCollision", + nil, + tostring(storedOutKey), + tostring(previousNewKey), + tostring(previousNewValue), + tostring(newInKey), + tostring(newInValue) + ) + end + end + + newOutputTable[storedOutKey] = oldOutputTable[storedOutKey] + end + + for dependency in pairs(keyData.dependencySet) do + keyData.dependencyValues[dependency] = peek(dependency) + self.dependencySet[dependency] = true + dependency.dependentSet[self] = true + end + end + for oldOutKey, oldOutValue in pairs(oldOutputTable) do + if newOutputTable[oldOutKey] ~= oldOutValue then + local oldMetaValue = meta[oldOutKey] + + if oldOutValue ~= nil then + local destructOK, err = pcall( + self._destructor or cleanup, + oldOutKey, + oldOutValue, + oldMetaValue + ) + + if not destructOK then + logErrorNonFatal( + "forPairsDestructorError", + parseError(err) + ) + end + end + if newOutputTable[oldOutKey] == nil then + meta[oldOutKey] = nil + self._keyData[oldOutKey] = nil + end + + didChange = true + end + end + for key in pairs(oldInputTable) do + if newInputTable[key] == nil then + oldInputTable[key] = nil + keyIOMap[key] = nil + end + end + + return didChange + end + function class:_peek() + return self._outputTable + end + function class:get() + logError "stateGetWasRemoved" + end + + local function ForPairs(inputTable, processor, destructor) + local inputIsState = isState(inputTable) + local self = setmetatable({ + type = "State", + kind = "ForPairs", + dependencySet = {}, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _inputIsState = inputIsState, + _inputTable = inputTable, + _oldInputTable = {}, + _outputTable = {}, + _oldOutputTable = {}, + _keyIOMap = {}, + _keyData = {}, + _meta = {}, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.G = ForPairs +end +do + local parseError = __DARKLUA_BUNDLE_MODULES.C + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.B + local logError = __DARKLUA_BUNDLE_MODULES.d + local logWarn = __DARKLUA_BUNDLE_MODULES.u + local cleanup = __DARKLUA_BUNDLE_MODULES.j + local needsDestruction = __DARKLUA_BUNDLE_MODULES.D + local peek = __DARKLUA_BUNDLE_MODULES.n + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.E + local isState = __DARKLUA_BUNDLE_MODULES.m + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + local inputIsState = self._inputIsState + local newInputTable = peek(self._inputTable) + local oldInputTable = self._oldInputTable + local outputTable = self._outputTable + local keyOIMap = self._keyOIMap + local keyIOMap = self._keyIOMap + local meta = self._meta + local didChange = false + + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + if inputIsState then + self._inputTable.dependentSet[self] = true + self.dependencySet[self._inputTable] = true + end + + for newInKey, value in pairs(newInputTable) do + local keyData = self._keyData[newInKey] + + if keyData == nil then + keyData = { + dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), + } + self._keyData[newInKey] = keyData + end + + local shouldRecalculate = oldInputTable[newInKey] == nil + + if shouldRecalculate == false then + for dependency, oldValue in pairs(keyData.dependencyValues) do + if oldValue ~= peek(dependency) then + shouldRecalculate = true + + break + end + end + end + if shouldRecalculate then + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + for i, _ in pairs(keyData.dependencySet) do + keyData.dependencySet[i] = nil + end + + local use = makeUseCallback(keyData.dependencySet) + local processOK, newOutKey, newMetaValue = + pcall(self._processor, use, newInKey) + + if processOK then + if + self._destructor == nil + and ( + needsDestruction(newOutKey) + or needsDestruction(newMetaValue) + ) + then + logWarn "destructorNeededForKeys" + end + + local oldInKey = keyOIMap[newOutKey] + local oldOutKey = keyIOMap[newInKey] + + if + oldInKey ~= newInKey + and newInputTable[oldInKey] ~= nil + then + logError( + "forKeysKeyCollision", + nil, + tostring(newOutKey), + tostring(oldInKey), + tostring(newOutKey) + ) + end + if + oldOutKey ~= newOutKey + and keyOIMap[oldOutKey] == newInKey + then + local oldMetaValue = meta[oldOutKey] + local destructOK, err = pcall( + self._destructor or cleanup, + oldOutKey, + oldMetaValue + ) + + if not destructOK then + logErrorNonFatal( + "forKeysDestructorError", + parseError(err) + ) + end + + keyOIMap[oldOutKey] = nil + outputTable[oldOutKey] = nil + meta[oldOutKey] = nil + end + + oldInputTable[newInKey] = value + meta[newOutKey] = newMetaValue + keyOIMap[newOutKey] = newInKey + keyIOMap[newInKey] = newOutKey + outputTable[newOutKey] = value + didChange = true + else + keyData.oldDependencySet, keyData.dependencySet = + keyData.dependencySet, keyData.oldDependencySet + + logErrorNonFatal( + "forKeysProcessorError", + parseError(newOutKey) + ) + end + end + + for dependency in pairs(keyData.dependencySet) do + keyData.dependencyValues[dependency] = peek(dependency) + self.dependencySet[dependency] = true + dependency.dependentSet[self] = true + end + end + for outputKey, inputKey in pairs(keyOIMap) do + if newInputTable[inputKey] == nil then + local oldMetaValue = meta[outputKey] + local destructOK, err = + pcall(self._destructor or cleanup, outputKey, oldMetaValue) + + if not destructOK then + logErrorNonFatal("forKeysDestructorError", parseError(err)) + end + + oldInputTable[inputKey] = nil + meta[outputKey] = nil + keyOIMap[outputKey] = nil + keyIOMap[inputKey] = nil + outputTable[outputKey] = nil + self._keyData[inputKey] = nil + didChange = true + end + end + + return didChange + end + function class:_peek() + return self._outputTable + end + function class:get() + logError "stateGetWasRemoved" + end + + local function ForKeys(inputTable, processor, destructor) + local inputIsState = isState(inputTable) + local self = setmetatable({ + type = "State", + kind = "ForKeys", + dependencySet = {}, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _inputIsState = inputIsState, + _inputTable = inputTable, + _oldInputTable = {}, + _outputTable = {}, + _keyOIMap = {}, + _keyIOMap = {}, + _keyData = {}, + _meta = {}, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.H = ForKeys +end +do + local parseError = __DARKLUA_BUNDLE_MODULES.C + local logError = __DARKLUA_BUNDLE_MODULES.d + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.B + local logWarn = __DARKLUA_BUNDLE_MODULES.u + local cleanup = __DARKLUA_BUNDLE_MODULES.j + local needsDestruction = __DARKLUA_BUNDLE_MODULES.D + local peek = __DARKLUA_BUNDLE_MODULES.n + local makeUseCallback = __DARKLUA_BUNDLE_MODULES.E + local isState = __DARKLUA_BUNDLE_MODULES.m + local class = {} + local CLASS_METATABLE = { __index = class } + local WEAK_KEYS_METATABLE = { + __mode = "k", + } + + function class:update() + local inputIsState = self._inputIsState + local inputTable = peek(self._inputTable) + local outputValues = {} + local didChange = false + + self._oldValueCache, self._valueCache = + self._valueCache, self._oldValueCache + + local newValueCache = self._valueCache + local oldValueCache = self._oldValueCache + + for i, _ in pairs(newValueCache) do + newValueCache[i] = nil + end + for dependency in pairs(self.dependencySet) do + dependency.dependentSet[self] = nil + end + + self._oldDependencySet, self.dependencySet = + self.dependencySet, self._oldDependencySet + + for i, _ in pairs(self.dependencySet) do + self.dependencySet[i] = nil + end + + if inputIsState then + self._inputTable.dependentSet[self] = true + self.dependencySet[self._inputTable] = true + end + + for inKey, inValue in pairs(inputTable) do + local oldCachedValues = oldValueCache[inValue] + local shouldRecalculate = oldCachedValues == nil + local value, valueData, meta + + if type(oldCachedValues) == "table" and #oldCachedValues > 0 then + local valueInfo = + table.remove(oldCachedValues, #oldCachedValues) + + value = valueInfo.value + valueData = valueInfo.valueData + meta = valueInfo.meta + + if #oldCachedValues <= 0 then + oldValueCache[inValue] = nil + end + elseif oldCachedValues ~= nil then + oldValueCache[inValue] = nil + shouldRecalculate = true + end + if valueData == nil then + valueData = { + dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), + dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), + } + end + if shouldRecalculate == false then + for dependency, oldValue in pairs(valueData.dependencyValues) do + if oldValue ~= peek(dependency) then + shouldRecalculate = true + + break + end + end + end + if shouldRecalculate then + valueData.oldDependencySet, valueData.dependencySet = + valueData.dependencySet, valueData.oldDependencySet + + for i, _ in pairs(valueData.dependencySet) do + valueData.dependencySet[i] = nil + end + + local use = makeUseCallback(valueData.dependencySet) + local processOK, newOutValue, newMetaValue = + pcall(self._processor, use, inValue) + + if processOK then + if + self._destructor == nil + and ( + needsDestruction(newOutValue) + or needsDestruction(newMetaValue) + ) + then + logWarn "destructorNeededForValues" + end + if value ~= nil then + local destructOK, err = + pcall(self._destructor or cleanup, value, meta) + + if not destructOK then + logErrorNonFatal( + "forValuesDestructorError", + parseError(err) + ) + end + end + + value = newOutValue + meta = newMetaValue + didChange = true + else + valueData.oldDependencySet, valueData.dependencySet = + valueData.dependencySet, valueData.oldDependencySet + + logErrorNonFatal( + "forValuesProcessorError", + parseError(newOutValue) + ) + end + end + + local newCachedValues = newValueCache[inValue] + + if newCachedValues == nil then + newCachedValues = {} + newValueCache[inValue] = newCachedValues + end + + table.insert(newCachedValues, { + value = value, + valueData = valueData, + meta = meta, + }) + + outputValues[inKey] = value + + for dependency in pairs(valueData.dependencySet) do + valueData.dependencyValues[dependency] = peek(dependency) + self.dependencySet[dependency] = true + dependency.dependentSet[self] = true + end + end + for _oldInValue, oldCachedValueInfo in pairs(oldValueCache) do + for _, valueInfo in ipairs(oldCachedValueInfo) do + local oldValue = valueInfo.value + local oldMetaValue = valueInfo.meta + local destructOK, err = + pcall(self._destructor or cleanup, oldValue, oldMetaValue) + + if not destructOK then + logErrorNonFatal( + "forValuesDestructorError", + parseError(err) + ) + end + + didChange = true + end + for i, _ in pairs(oldCachedValueInfo) do + oldCachedValueInfo[i] = nil + end + end + + self._outputTable = outputValues + + return didChange + end + function class:_peek() + return self._outputTable + end + function class:get() + logError "stateGetWasRemoved" + end + + local function ForValues(inputTable, processor, destructor) + local inputIsState = isState(inputTable) + local self = setmetatable({ + type = "State", + kind = "ForValues", + dependencySet = {}, + dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), + _oldDependencySet = {}, + _processor = processor, + _destructor = destructor, + _inputIsState = inputIsState, + _inputTable = inputTable, + _outputTable = {}, + _valueCache = {}, + _oldValueCache = {}, + }, CLASS_METATABLE) + + self:update() + + return self + end + + __DARKLUA_BUNDLE_MODULES.I = ForValues +end +do + local Oklab = {} + + function Oklab.to(rgb) + local l = rgb.r * 0.4122214708 + + rgb.g * 0.5363325363 + + rgb.b * 0.0514459929 + local m = rgb.r * 0.2119034982 + + rgb.g * 0.6806995451 + + rgb.b * 0.1073969566 + local s = rgb.r * 0.0883024619 + + rgb.g * 0.2817188376 + + rgb.b * 0.6299787005 + local lRoot = l ^ 0.3333333333333333 + local mRoot = m ^ 0.3333333333333333 + local sRoot = s ^ 0.3333333333333333 + + return Vector3.new( + lRoot * 0.2104542553 + mRoot * 0.793617785 - sRoot * 0.0040720468, + lRoot * 1.9779984951 - mRoot * 2.428592205 + sRoot * 0.4505937099, + lRoot * 0.0259040371 + mRoot * 0.7827717662 - sRoot * 0.808675766 + ) + end + function Oklab.from(lab, unclamped) + local lRoot = lab.X + lab.Y * 0.3963377774 + lab.Z * 0.2158037573 + local mRoot = lab.X - lab.Y * 0.1055613458 - lab.Z * 0.0638541728 + local sRoot = lab.X - lab.Y * 0.0894841775 - lab.Z * 1.291485548 + local l = lRoot ^ 3 + local m = mRoot ^ 3 + local s = sRoot ^ 3 + local red = l * 4.0767416621 - m * 3.3077115913 + s * 0.2309699292 + local green = l * -1.2684380046 + m * 2.6097574011 - s * 0.3413193965 + local blue = l * -4.196086299999999E-3 + - m * 0.7034186147 + + s * 1.707614701 + + if not unclamped then + red = math.max(0, math.min(red, 1)) + green = math.max(0, math.min(green, 1)) + blue = math.max(0, math.min(blue, 1)) + end + + return Color3.new(red, green, blue) + end + + __DARKLUA_BUNDLE_MODULES.J = Oklab +end +do + local Oklab = __DARKLUA_BUNDLE_MODULES.J + local typeof = __DARKLUA_BUNDLE_MODULES.i local function lerpType(from, to, ratio) local typeString = typeof(from) @@ -428,7 +2188,7 @@ do return to end - __DARKLUA_BUNDLE_MODULES.h = lerpType + __DARKLUA_BUNDLE_MODULES.K = lerpType end do local pow = math.pow @@ -771,10 +2531,10 @@ do return easing.Bounce.In((t * 2) - 1, b + c / 2, c / 2) end - __DARKLUA_BUNDLE_MODULES.i = easing + __DARKLUA_BUNDLE_MODULES.L = easing end do - local easing = __DARKLUA_BUNDLE_MODULES.i + local easing = __DARKLUA_BUNDLE_MODULES.L local function getTweenRatio(tweenInfo, currentTime) local delay = tweenInfo.DelayTime @@ -810,73 +2570,13 @@ do return easing[easeStyle][easeDirection](tweenProgress, 0, 1) end - __DARKLUA_BUNDLE_MODULES.j = getTweenRatio + __DARKLUA_BUNDLE_MODULES.M = getTweenRatio end do - local function updateAll(root) - local counters = {} - local flags = {} - local queue = {} - local queueSize = 0 - local queuePos = 1 - - for object in pairs(root.dependentSet) do - queueSize = queueSize + 1 - queue[queueSize] = object - flags[object] = true - end - - while queuePos <= queueSize do - local next = queue[queuePos] - local counter = counters[next] - - counters[next] = (function() - if counter == nil then - return 1 - else - return counter + 1 - end - end)() - - if next.dependentSet ~= nil then - for object in pairs(next.dependentSet) do - queueSize = queueSize + 1 - queue[queueSize] = object - end - end - - queuePos = queuePos + 1 - end - - queuePos = 1 - - while queuePos <= queueSize do - local next = queue[queuePos] - local counter = counters[next] - 1 - - counters[next] = counter - - if - counter == 0 - and flags[next] - and next:update() - and next.dependentSet ~= nil - then - for object in pairs(next.dependentSet) do - flags[object] = true - end - end - - queuePos = queuePos + 1 - end - end - - __DARKLUA_BUNDLE_MODULES.k = updateAll -end -do - local lerpType = __DARKLUA_BUNDLE_MODULES.h - local getTweenRatio = __DARKLUA_BUNDLE_MODULES.j - local updateAll = __DARKLUA_BUNDLE_MODULES.k + local External = __DARKLUA_BUNDLE_MODULES.e + local lerpType = __DARKLUA_BUNDLE_MODULES.K + local getTweenRatio = __DARKLUA_BUNDLE_MODULES.M + local updateAll = __DARKLUA_BUNDLE_MODULES.y local TweenScheduler = {} local WEAK_KEYS_METATABLE = { __mode = "k", @@ -891,9 +2591,8 @@ do function TweenScheduler.remove(tween) allTweens[tween] = nil end - function TweenScheduler.updateAllTweens() - local now = time() + local function updateAllTweens(now) for tween in pairs(allTweens) do local currentTime = now - tween._currentTweenStartTime @@ -925,1836 +2624,18 @@ do end end - __DARKLUA_BUNDLE_MODULES.l = TweenScheduler + External.bindToUpdateStep(updateAllTweens) + + __DARKLUA_BUNDLE_MODULES.N = TweenScheduler end do - local Oklab = __DARKLUA_BUNDLE_MODULES.f - - local function packType(numbers, typeString) - if typeString == "number" then - return numbers[1] - elseif typeString == "CFrame" then - return CFrame.new(numbers[1], numbers[2], numbers[3]) - * CFrame.fromAxisAngle( - Vector3.new(numbers[4], numbers[5], numbers[6]).Unit, - numbers[7] - ) - elseif typeString == "Color3" then - return Oklab.from( - Vector3.new(numbers[1], numbers[2], numbers[3]), - false - ) - elseif typeString == "ColorSequenceKeypoint" then - return ColorSequenceKeypoint.new( - numbers[4], - Oklab.from( - Vector3.new(numbers[1], numbers[2], numbers[3]), - false - ) - ) - elseif typeString == "DateTime" then - return DateTime.fromUnixTimestampMillis(numbers[1]) - elseif typeString == "NumberRange" then - return NumberRange.new(numbers[1], numbers[2]) - elseif typeString == "NumberSequenceKeypoint" then - return NumberSequenceKeypoint.new( - numbers[2], - numbers[1], - numbers[3] - ) - elseif typeString == "PhysicalProperties" then - return PhysicalProperties.new( - numbers[1], - numbers[2], - numbers[3], - numbers[4], - numbers[5] - ) - elseif typeString == "Ray" then - return Ray.new( - Vector3.new(numbers[1], numbers[2], numbers[3]), - Vector3.new(numbers[4], numbers[5], numbers[6]) - ) - elseif typeString == "Rect" then - return Rect.new(numbers[1], numbers[2], numbers[3], numbers[4]) - elseif typeString == "Region3" then - local position = Vector3.new(numbers[1], numbers[2], numbers[3]) - local halfSize = - Vector3.new(numbers[4] / 2, numbers[5] / 2, numbers[6] / 2) - - return Region3.new(position - halfSize, position + halfSize) - elseif typeString == "Region3int16" then - return Region3int16.new( - Vector3int16.new(numbers[1], numbers[2], numbers[3]), - Vector3int16.new(numbers[4], numbers[5], numbers[6]) - ) - elseif typeString == "UDim" then - return UDim.new(numbers[1], numbers[2]) - elseif typeString == "UDim2" then - return UDim2.new(numbers[1], numbers[2], numbers[3], numbers[4]) - elseif typeString == "Vector2" then - return Vector2.new(numbers[1], numbers[2]) - elseif typeString == "Vector2int16" then - return Vector2int16.new(numbers[1], numbers[2]) - elseif typeString == "Vector3" then - return Vector3.new(numbers[1], numbers[2], numbers[3]) - elseif typeString == "Vector3int16" then - return Vector3int16.new(numbers[1], numbers[2], numbers[3]) - else - return nil - end - end - - __DARKLUA_BUNDLE_MODULES.m = packType -end -do - local function springCoefficients(time, damping, speed) - if time == 0 or speed == 0 then - return 1, 0, 0, 1 - end - - local posPos, posVel, velPos, velVel - - if damping > 1 then - local scaledTime = time * speed - local alpha = math.sqrt(damping ^ 2 - 1) - local scaledInvAlpha = -0.5 / alpha - local z1 = -alpha - damping - local z2 = 1 / z1 - local expZ1 = math.exp(scaledTime * z1) - local expZ2 = math.exp(scaledTime * z2) - - posPos = (expZ2 * z1 - expZ1 * z2) * scaledInvAlpha - posVel = (expZ1 - expZ2) * scaledInvAlpha / speed - velPos = (expZ2 - expZ1) * scaledInvAlpha * speed - velVel = (expZ1 * z1 - expZ2 * z2) * scaledInvAlpha - elseif damping == 1 then - local scaledTime = time * speed - local expTerm = math.exp(-scaledTime) - - posPos = expTerm * (1 + scaledTime) - posVel = expTerm * time - velPos = expTerm * (-scaledTime * speed) - velVel = expTerm * (1 - scaledTime) - else - local scaledTime = time * speed - local alpha = math.sqrt(1 - damping ^ 2) - local invAlpha = 1 / alpha - local alphaTime = alpha * scaledTime - local expTerm = math.exp(-scaledTime * damping) - local sinTerm = expTerm * math.sin(alphaTime) - local cosTerm = expTerm * math.cos(alphaTime) - local sinInvAlpha = sinTerm * invAlpha - local sinInvAlphaDamp = sinInvAlpha * damping - - posPos = sinInvAlphaDamp + cosTerm - posVel = sinInvAlpha - velPos = -(sinInvAlphaDamp * damping + sinTerm * alpha) - velVel = cosTerm - sinInvAlphaDamp - end - - return posPos, posVel, velPos, velVel - end - - __DARKLUA_BUNDLE_MODULES.n = springCoefficients -end -do - local packType = __DARKLUA_BUNDLE_MODULES.m - local springCoefficients = __DARKLUA_BUNDLE_MODULES.n - local updateAll = __DARKLUA_BUNDLE_MODULES.k - local SpringScheduler = {} - local EPSILON = 0.0001 - local activeSprings = {} - local lastUpdateTime = time() - - function SpringScheduler.add(spring) - spring._lastSchedule = lastUpdateTime - spring._startDisplacements = {} - spring._startVelocities = {} - - for index, goal in ipairs(spring._springGoals) do - spring._startDisplacements[index] = spring._springPositions[index] - - goal - spring._startVelocities[index] = spring._springVelocities[index] - end - - activeSprings[spring] = true - end - function SpringScheduler.remove(spring) - activeSprings[spring] = nil - end - function SpringScheduler.updateAllSprings() - local springsToSleep = {} - - lastUpdateTime = time() - - for spring in pairs(activeSprings) do - local posPos, posVel, velPos, velVel = springCoefficients( - lastUpdateTime - spring._lastSchedule, - spring._currentDamping, - spring._currentSpeed - ) - local positions = spring._springPositions - local velocities = spring._springVelocities - local startDisplacements = spring._startDisplacements - local startVelocities = spring._startVelocities - local isMoving = false - - for index, goal in ipairs(spring._springGoals) do - local oldDisplacement = startDisplacements[index] - local oldVelocity = startVelocities[index] - local newDisplacement = oldDisplacement * posPos - + oldVelocity * posVel - local newVelocity = oldDisplacement * velPos - + oldVelocity * velVel - - if - math.abs(newDisplacement) > EPSILON - or math.abs(newVelocity) > EPSILON - then - isMoving = true - end - - positions[index] = newDisplacement + goal - velocities[index] = newVelocity - end - - if not isMoving then - springsToSleep[spring] = true - end - end - for spring in pairs(activeSprings) do - spring._currentValue = - packType(spring._springPositions, spring._currentType) - - updateAll(spring) - end - for spring in pairs(springsToSleep) do - activeSprings[spring] = nil - spring._currentValue = - packType(spring._springGoals, spring._currentType) - end - end - - __DARKLUA_BUNDLE_MODULES.o = SpringScheduler -end -do - local RunService = game:GetService "RunService" - local TweenScheduler = __DARKLUA_BUNDLE_MODULES.l - local SpringScheduler = __DARKLUA_BUNDLE_MODULES.o - - local function bindScheduler() - RunService.RenderStepped:connect(TweenScheduler.updateAllTweens) - RunService.RenderStepped:connect(SpringScheduler.updateAllSprings) - end - - __DARKLUA_BUNDLE_MODULES.p = bindScheduler -end -do - __DARKLUA_BUNDLE_MODULES.q = { - BillboardGui = { Active = true }, - Frame = { - BackgroundColor3 = Color3.new(1, 1, 1), - BorderColor3 = Color3.new(0, 0, 0), - BorderSizePixel = 0, - }, - TextLabel = { - BackgroundColor3 = Color3.new(1, 1, 1), - BorderColor3 = Color3.new(0, 0, 0), - BorderSizePixel = 0, - Font = Enum.Font.SourceSans, - Text = "", - TextColor3 = Color3.new(0, 0, 0), - FontSize = Enum.FontSize.Size14, - }, - TextButton = { - BackgroundColor3 = Color3.new(1, 1, 1), - BorderColor3 = Color3.new(0, 0, 0), - BorderSizePixel = 0, - AutoButtonColor = false, - Font = Enum.Font.SourceSans, - Text = "", - TextColor3 = Color3.new(0, 0, 0), - FontSize = Enum.FontSize.Size14, - }, - TextBox = { - BackgroundColor3 = Color3.new(1, 1, 1), - BorderColor3 = Color3.new(0, 0, 0), - BorderSizePixel = 0, - ClearTextOnFocus = false, - Font = Enum.Font.SourceSans, - Text = "", - TextColor3 = Color3.new(0, 0, 0), - FontSize = Enum.FontSize.Size14, - }, - ImageLabel = { - BackgroundColor3 = Color3.new(1, 1, 1), - BorderColor3 = Color3.new(0, 0, 0), - BorderSizePixel = 0, - }, - ImageButton = { - BackgroundColor3 = Color3.new(1, 1, 1), - BorderColor3 = Color3.new(0, 0, 0), - BorderSizePixel = 0, - AutoButtonColor = false, - }, - SpawnLocation = { Duration = 0 }, - Part = { - Anchored = true, - Size = Vector3.new(1, 1, 1), - FrontSurface = Enum.SurfaceType.Smooth, - BackSurface = Enum.SurfaceType.Smooth, - LeftSurface = Enum.SurfaceType.Smooth, - RightSurface = Enum.SurfaceType.Smooth, - TopSurface = Enum.SurfaceType.Smooth, - BottomSurface = Enum.SurfaceType.Smooth, - }, - TrussPart = { - Anchored = true, - Size = Vector3.new(2, 2, 2), - FrontSurface = Enum.SurfaceType.Smooth, - BackSurface = Enum.SurfaceType.Smooth, - LeftSurface = Enum.SurfaceType.Smooth, - RightSurface = Enum.SurfaceType.Smooth, - TopSurface = Enum.SurfaceType.Smooth, - BottomSurface = Enum.SurfaceType.Smooth, - }, - CornerWedgePart = { - Anchored = true, - Size = Vector3.new(1, 1, 1), - FrontSurface = Enum.SurfaceType.Smooth, - BackSurface = Enum.SurfaceType.Smooth, - LeftSurface = Enum.SurfaceType.Smooth, - RightSurface = Enum.SurfaceType.Smooth, - TopSurface = Enum.SurfaceType.Smooth, - BottomSurface = Enum.SurfaceType.Smooth, - }, - VehicleSeat = { - Anchored = true, - Size = Vector3.new(1, 1, 1), - FrontSurface = Enum.SurfaceType.Smooth, - BackSurface = Enum.SurfaceType.Smooth, - LeftSurface = Enum.SurfaceType.Smooth, - RightSurface = Enum.SurfaceType.Smooth, - TopSurface = Enum.SurfaceType.Smooth, - BottomSurface = Enum.SurfaceType.Smooth, - }, - } -end -do - local typeof = __DARKLUA_BUNDLE_MODULES.g - - local function cleanupOne(task) - local taskType = typeof(task) - - if taskType == "Instance" then - task:Destroy() - elseif taskType == "RBXScriptConnection" then - task:disconnect() - elseif taskType == "function" then - task() - elseif taskType == "table" then - if type(task.destroy) == "function" then - task:destroy() - elseif type(task.Destroy) == "function" then - task:Destroy() - elseif task[1] ~= nil then - for _, subtask in ipairs(task) do - cleanupOne(subtask) - end - end - end - end - local function cleanup(...) - for index = 1, select("#", ...) do - cleanupOne(select(index, ...)) - end - end - - __DARKLUA_BUNDLE_MODULES.r = cleanup -end -do - local typeof = __DARKLUA_BUNDLE_MODULES.g - - local function xtypeof(x) - local typeString = typeof(x) - - if typeString == "table" and type(x.type) == "string" then - return x.type - else - return typeString - end - end - - __DARKLUA_BUNDLE_MODULES.s = xtypeof -end -do - local class = {} - local CLASS_METATABLE = { __index = class } - local strongRefs = {} - - function class:update() - for _, callback in pairs(self._changeListeners) do - Spawn(callback) - end - - return false - end - function class:onChange(callback) - local uniqueIdentifier = {} - - self._numChangeListeners = self._numChangeListeners + 1 - self._changeListeners[uniqueIdentifier] = callback - strongRefs[self] = true - - local disconnected = false - - return function() - if disconnected then - return - end - - disconnected = true - self._changeListeners[uniqueIdentifier] = nil - self._numChangeListeners = self._numChangeListeners - 1 - - if self._numChangeListeners == 0 then - strongRefs[self] = nil - end - end - end - function class:onBind(callback) - Spawn(callback) - - return self:onChange(callback) - end - - local function Observer(watchedState) - local self = setmetatable({ - type = "State", - kind = "Observer", - dependencySet = { [watchedState] = true }, - dependentSet = {}, - _changeListeners = {}, - _numChangeListeners = 0, - }, CLASS_METATABLE) - - watchedState.dependentSet[self] = true - - return self - end - - __DARKLUA_BUNDLE_MODULES.t = Observer -end -do - local function isState(target) - return type(target) == "table" and type(target._peek) == "function" - end - - __DARKLUA_BUNDLE_MODULES.u = isState -end -do - local isState = __DARKLUA_BUNDLE_MODULES.u - - local function peek(target) - if isState(target) then - return (target):_peek() - end - - return target - end - - __DARKLUA_BUNDLE_MODULES.v = peek -end -do - local cleanup = __DARKLUA_BUNDLE_MODULES.r - local xtypeof = __DARKLUA_BUNDLE_MODULES.s + local External = __DARKLUA_BUNDLE_MODULES.e + local TweenScheduler = __DARKLUA_BUNDLE_MODULES.N local logError = __DARKLUA_BUNDLE_MODULES.d - local Observer = __DARKLUA_BUNDLE_MODULES.t - local peek = __DARKLUA_BUNDLE_MODULES.v - local typeof = __DARKLUA_BUNDLE_MODULES.g - - local function setProperty_unsafe(instance, property, value) - (instance)[property] = value - end - local function testPropertyAssignable(instance, property) - (instance)[property] = (instance)[property] - end - local function setProperty(instance, property, value) - if not pcall(setProperty_unsafe, instance, property, value) then - if not pcall(testPropertyAssignable, instance, property) then - if instance == nil then - logError( - "setPropertyNilRef", - nil, - property, - tostring(value) - ) - else - logError( - "cannotAssignProperty", - nil, - instance.ClassName, - property - ) - end - else - local givenType = typeof(value) - local expectedType = typeof((instance)[property]) - - logError( - "invalidPropertyType", - nil, - instance.ClassName, - property, - expectedType, - givenType - ) - end - end - end - local function bindProperty(instance, property, value, cleanupTasks) - if xtypeof(value) == "State" then - local willUpdate = false - - local function updateLater() - if not willUpdate then - willUpdate = true - - coroutine.resume(coroutine.create(function() - willUpdate = false - - setProperty(instance, property, peek(value)) - end)) - end - end - - setProperty(instance, property, peek(value)) - table.insert(cleanupTasks, Observer(value):onChange(updateLater)) - else - setProperty(instance, property, value) - end - end - local function applyInstanceProps(props, applyTo) - local specialKeys = { - self = {}, - descendants = {}, - ancestor = {}, - observer = {}, - } - local cleanupTasks = {} - - for key, value in pairs(props) do - local keyType = xtypeof(key) - - if keyType == "string" then - if key ~= "Parent" then - bindProperty(applyTo, key, value, cleanupTasks) - end - elseif keyType == "SpecialKey" then - local stage = (key).stage - local keys = specialKeys[stage] - - if keys == nil then - logError("unrecognisedPropertyStage", nil, stage) - else - keys[key] = value - end - else - logError("unrecognisedPropertyKey", nil, xtypeof(key)) - end - end - for key, value in pairs(specialKeys.self) do - key:apply(value, applyTo, cleanupTasks) - end - for key, value in pairs(specialKeys.descendants) do - key:apply(value, applyTo, cleanupTasks) - end - - if props.Parent ~= nil then - bindProperty(applyTo, "Parent", props.Parent, cleanupTasks) - end - - for key, value in pairs(specialKeys.ancestor) do - key:apply(value, applyTo, cleanupTasks) - end - for key, value in pairs(specialKeys.observer) do - key:apply(value, applyTo, cleanupTasks) - end - - if applyTo.Parent then - game.DescendantRemoving:connect(function(descendant) - if descendant == applyTo then - cleanup(cleanupTasks) - end - end) - end - end - - __DARKLUA_BUNDLE_MODULES.w = applyInstanceProps -end -do - local defaultProps = __DARKLUA_BUNDLE_MODULES.q - local applyInstanceProps = __DARKLUA_BUNDLE_MODULES.w - local logError = __DARKLUA_BUNDLE_MODULES.d - - local function New(className) - return function(props) - local ok, instance = pcall(Instance.new, className) - - if not ok then - logError("cannotCreateClass", nil, className) - end - - local classDefaults = defaultProps[className] - - if classDefaults ~= nil then - for defaultProp, defaultValue in pairs(classDefaults) do - instance[defaultProp] = defaultValue - end - end - - applyInstanceProps(props, instance) - - return instance - end - end - - __DARKLUA_BUNDLE_MODULES.x = New -end -do - local applyInstanceProps = __DARKLUA_BUNDLE_MODULES.w - - local function Hydrate(target) - return function(props) - applyInstanceProps(props, target) - - return target - end - end - - __DARKLUA_BUNDLE_MODULES.y = Hydrate -end -do - local logError = __DARKLUA_BUNDLE_MODULES.d - local xtypeof = __DARKLUA_BUNDLE_MODULES.s - local Ref = {} - - Ref.type = "SpecialKey" - Ref.kind = "Ref" - Ref.stage = "observer" - - function Ref:apply(refState, applyTo, cleanupTasks) - if xtypeof(refState) ~= "State" or refState.kind ~= "Value" then - logError "invalidRefType" - else - refState:set(applyTo) - table.insert(cleanupTasks, function() - refState:set(nil) - end) - end - end - - __DARKLUA_BUNDLE_MODULES.z = Ref -end -do - local logError = __DARKLUA_BUNDLE_MODULES.d - local xtypeof = __DARKLUA_BUNDLE_MODULES.s - - local function Out(propertyName) - local outKey = {} - - outKey.type = "SpecialKey" - outKey.kind = "Out" - outKey.stage = "observer" - - function outKey:apply(outState, applyTo, cleanupTasks) - local ok, event = pcall(function() - return applyTo.Changed - end) - - if not ok then - logError( - "invalidOutProperty", - nil, - applyTo.ClassName, - propertyName - ) - elseif xtypeof(outState) ~= "State" or outState.kind ~= "Value" then - logError "invalidOutType" - else - outState:set((applyTo)[propertyName]) - table.insert( - cleanupTasks, - event:connect(function(prop) - if prop == propertyName then - outState:set((applyTo)[propertyName]) - end - end) - ) - table.insert(cleanupTasks, function() - outState:set(nil) - end) - end - end - - return outKey - end - - __DARKLUA_BUNDLE_MODULES.A = Out -end -do - local Cleanup = {} - - Cleanup.type = "SpecialKey" - Cleanup.kind = "Cleanup" - Cleanup.stage = "observer" - - function Cleanup:apply(userTask, _, cleanupTasks) - table.insert(cleanupTasks, userTask) - end - - __DARKLUA_BUNDLE_MODULES.B = Cleanup -end -do - local messages = __DARKLUA_BUNDLE_MODULES.c - - local function logWarn(messageID, ...) - local formatString - - if messages[messageID] ~= nil then - formatString = messages[messageID] - else - messageID = "unknownMessage" - formatString = messages[messageID] - end - - warn( - string.format( - "[Fusion] " .. formatString .. "\n(ID: " .. messageID .. ")", - ... - ) - ) - end - - __DARKLUA_BUNDLE_MODULES.C = logWarn -end -do - local logWarn = __DARKLUA_BUNDLE_MODULES.C - local Observer = __DARKLUA_BUNDLE_MODULES.t - local peek = __DARKLUA_BUNDLE_MODULES.v - local isState = __DARKLUA_BUNDLE_MODULES.u - local typeof = __DARKLUA_BUNDLE_MODULES.g - local EXPERIMENTAL_AUTO_NAMING = false - local Children = {} - - Children.type = "SpecialKey" - Children.kind = "Children" - Children.stage = "descendants" - - function Children:apply(propValue, applyTo, cleanupTasks) - local newParented = {} - local oldParented = {} - local newDisconnects = {} - local oldDisconnects = {} - local updateQueued = false - local queueUpdate - - local function updateChildren() - if not updateQueued then - return - end - - updateQueued = false - oldParented, newParented = newParented, oldParented - oldDisconnects, newDisconnects = newDisconnects, oldDisconnects - - for i, _ in pairs(newParented) do - newParented[i] = nil - end - for i, _ in pairs(newDisconnects) do - newDisconnects[i] = nil - end - - local function processChild(child, autoName) - local childType = typeof(child) - - if childType == "Instance" then - newParented[child] = true - - if oldParented[child] == nil then - child.Parent = applyTo - else - oldParented[child] = nil - end - if EXPERIMENTAL_AUTO_NAMING and autoName ~= nil then - child.Name = autoName - end - elseif isState(child) then - local value = peek(child) - - if value ~= nil then - processChild(value, autoName) - end - - local disconnect = oldDisconnects[child] - - if disconnect == nil then - disconnect = Observer(child):onChange(queueUpdate) - else - oldDisconnects[child] = nil - end - - newDisconnects[child] = disconnect - elseif childType == "table" then - for key, subChild in pairs(child) do - local keyType = typeof(key) - local subAutoName = nil - - if keyType == "string" then - subAutoName = key - elseif keyType == "number" and autoName ~= nil then - subAutoName = autoName .. "_" .. key - end - - processChild(subChild, subAutoName) - end - else - logWarn("unrecognisedChildType", childType) - end - end - - if propValue ~= nil then - processChild(propValue) - end - - for oldInstance in pairs(oldParented) do - oldInstance.Parent = nil - end - for _, disconnect in pairs(oldDisconnects) do - disconnect() - end - end - - queueUpdate = function() - if not updateQueued then - updateQueued = true - - coroutine.resume(coroutine.create(updateChildren)) - end - end - - table.insert(cleanupTasks, function() - propValue = nil - updateQueued = true - - updateChildren() - end) - - updateQueued = true - - updateChildren() - end - - __DARKLUA_BUNDLE_MODULES.D = Children -end -do - local logError = __DARKLUA_BUNDLE_MODULES.d - local typeof = __DARKLUA_BUNDLE_MODULES.g - - local function getProperty_unsafe(instance, property) - return (instance)[property] - end - local function OnEvent(eventName) - local eventKey = {} - - eventKey.type = "SpecialKey" - eventKey.kind = "OnEvent" - eventKey.stage = "observer" - - function eventKey:apply(callback, applyTo, cleanupTasks) - local ok, event = pcall(getProperty_unsafe, applyTo, eventName) - - if not ok or typeof(event) ~= "RBXScriptSignal" then - logError( - "cannotConnectEvent", - nil, - applyTo.ClassName, - eventName - ) - elseif typeof(callback) ~= "function" then - logError("invalidEventHandler", nil, eventName) - else - table.insert(cleanupTasks, event:connect(callback)) - end - end - - return eventKey - end - - __DARKLUA_BUNDLE_MODULES.E = OnEvent -end -do - local logError = __DARKLUA_BUNDLE_MODULES.d - local typeof = __DARKLUA_BUNDLE_MODULES.g - - local function OnChange(propertyName) - local changeKey = {} - - changeKey.type = "SpecialKey" - changeKey.kind = "OnChange" - changeKey.stage = "observer" - - function changeKey:apply(callback, applyTo, cleanupTasks) - local ok, event = pcall(function() - return applyTo.Changed - end) - - if not ok then - logError( - "cannotConnectChange", - nil, - applyTo.ClassName, - propertyName - ) - elseif typeof(callback) ~= "function" then - logError("invalidChangeHandler", nil, propertyName) - else - table.insert( - cleanupTasks, - event:connect(function(prop) - if prop == propertyName then - callback((applyTo)[propertyName]) - end - end) - ) - end - end - - return changeKey - end - - __DARKLUA_BUNDLE_MODULES.F = OnChange -end -do - local function isSimilar(a, b) - if type(a) == "table" then - return false - end - - return a == b - end - - __DARKLUA_BUNDLE_MODULES.G = isSimilar -end -do - local logError = __DARKLUA_BUNDLE_MODULES.d - local updateAll = __DARKLUA_BUNDLE_MODULES.k - local isSimilar = __DARKLUA_BUNDLE_MODULES.G - local class = {} - local CLASS_METATABLE = { __index = class } - local WEAK_KEYS_METATABLE = { - __mode = "k", - } - - function class:set(newValue, force) - local oldValue = self._value - - if force or not isSimilar(oldValue, newValue) then - self._value = newValue - - updateAll(self) - end - end - function class:_peek() - return self._value - end - function class:get() - logError "stateGetWasRemoved" - end - - local function Value(initialValue) - local self = setmetatable({ - type = "State", - kind = "Value", - dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), - _value = initialValue, - }, CLASS_METATABLE) - - return self - end - - __DARKLUA_BUNDLE_MODULES.H = Value -end -do - local messages = __DARKLUA_BUNDLE_MODULES.c - - local function logErrorNonFatal(messageID, errObj, ...) - local formatString - - if messages[messageID] ~= nil then - formatString = messages[messageID] - else - messageID = "unknownMessage" - formatString = messages[messageID] - end - - local errorString - - if errObj == nil then - errorString = string.format( - "[Fusion] " .. formatString .. "\n(ID: " .. messageID .. ")", - ... - ) - else - formatString = - formatString:gsub("ERROR_MESSAGE", tostring(errObj.message)) - errorString = string.format( - "[Fusion] " - .. formatString - .. "\n(ID: " - .. messageID - .. ")\n---- Stack trace ----\n" - .. tostring(errObj.trace), - ... - ) - end - - Spawn(function() - error(errorString:gsub("\n", "\n "), 0) - end, ...) - end - - __DARKLUA_BUNDLE_MODULES.I = logErrorNonFatal -end -do - local function parseError(err) - local trace = "Traceback not available" - - if debug and debug.traceback then - trace = debug.traceback(nil, 2) - end - - return { - type = "Error", - raw = err, - message = err:gsub("^.+:%d+:%s*", ""), - trace = trace, - } - end - - __DARKLUA_BUNDLE_MODULES.J = parseError -end -do - local typeof = __DARKLUA_BUNDLE_MODULES.g - - local function needsDestruction(x) - return typeof(x) == "Instance" - end - - __DARKLUA_BUNDLE_MODULES.K = needsDestruction -end -do - local isState = __DARKLUA_BUNDLE_MODULES.u - - local function makeUseCallback(dependencySet) - local function use(target) - if isState(target) then - dependencySet[target] = true - - return (target):_peek() - end - - return target - end - - return use - end - - __DARKLUA_BUNDLE_MODULES.L = makeUseCallback -end -do - local logError = __DARKLUA_BUNDLE_MODULES.d - local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I - local logWarn = __DARKLUA_BUNDLE_MODULES.C - local parseError = __DARKLUA_BUNDLE_MODULES.J - local isSimilar = __DARKLUA_BUNDLE_MODULES.G - local needsDestruction = __DARKLUA_BUNDLE_MODULES.K - local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L - local class = {} - local CLASS_METATABLE = { __index = class } - local WEAK_KEYS_METATABLE = { - __mode = "k", - } - - function class:update() - for dependency in pairs(self.dependencySet) do - dependency.dependentSet[self] = nil - end - - self._oldDependencySet, self.dependencySet = - self.dependencySet, self._oldDependencySet - - for i, _ in pairs(self.dependencySet) do - self.dependencySet[i] = nil - end - - local use = makeUseCallback(self.dependencySet) - local ok, newValue, newMetaValue = pcall(self._processor, use) - - if ok then - if self._destructor == nil and needsDestruction(newValue) then - logWarn "destructorNeededComputed" - end - if newMetaValue ~= nil then - logWarn "multiReturnComputed" - end - - local oldValue = self._value - local similar = isSimilar(oldValue, newValue) - - if self._destructor ~= nil then - self._destructor(oldValue) - end - - self._value = newValue - - for dependency in pairs(self.dependencySet) do - dependency.dependentSet[self] = true - end - - return not similar - else - logErrorNonFatal("computedCallbackError", parseError(newValue)) - - self._oldDependencySet, self.dependencySet = - self.dependencySet, self._oldDependencySet - - for dependency in pairs(self.dependencySet) do - dependency.dependentSet[self] = true - end - - return false - end - end - function class:_peek() - return self._value - end - function class:get() - logError "stateGetWasRemoved" - end - - local function Computed(processor, destructor) - local dependencySet = {} - local self = setmetatable({ - type = "State", - kind = "Computed", - dependencySet = dependencySet, - dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), - _oldDependencySet = {}, - _processor = processor, - _destructor = destructor, - _value = nil, - }, CLASS_METATABLE) - - self:update() - - return self - end - - __DARKLUA_BUNDLE_MODULES.M = Computed -end -do - local parseError = __DARKLUA_BUNDLE_MODULES.J - local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I - local logError = __DARKLUA_BUNDLE_MODULES.d - local logWarn = __DARKLUA_BUNDLE_MODULES.C - local cleanup = __DARKLUA_BUNDLE_MODULES.r - local needsDestruction = __DARKLUA_BUNDLE_MODULES.K - local peek = __DARKLUA_BUNDLE_MODULES.v - local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L - local isState = __DARKLUA_BUNDLE_MODULES.u - local class = {} - local CLASS_METATABLE = { __index = class } - local WEAK_KEYS_METATABLE = { - __mode = "k", - } - - function class:update() - local inputIsState = self._inputIsState - local newInputTable = peek(self._inputTable) - local oldInputTable = self._oldInputTable - local keyIOMap = self._keyIOMap - local meta = self._meta - local didChange = false - - for dependency in pairs(self.dependencySet) do - dependency.dependentSet[self] = nil - end - - self._oldDependencySet, self.dependencySet = - self.dependencySet, self._oldDependencySet - - for i, _ in pairs(self.dependencySet) do - self.dependencySet[i] = nil - end - - if inputIsState then - self._inputTable.dependentSet[self] = true - self.dependencySet[self._inputTable] = true - end - - self._oldOutputTable, self._outputTable = - self._outputTable, self._oldOutputTable - - local oldOutputTable = self._oldOutputTable - local newOutputTable = self._outputTable - - for i, _ in pairs(newOutputTable) do - newOutputTable[i] = nil - end - for newInKey, newInValue in pairs(newInputTable) do - local keyData = self._keyData[newInKey] - - if keyData == nil then - keyData = { - dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), - oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), - dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), - } - self._keyData[newInKey] = keyData - end - - local shouldRecalculate = oldInputTable[newInKey] ~= newInValue - - if shouldRecalculate == false then - for dependency, oldValue in pairs(keyData.dependencyValues) do - if oldValue ~= peek(dependency) then - shouldRecalculate = true - - break - end - end - end - if shouldRecalculate then - keyData.oldDependencySet, keyData.dependencySet = - keyData.dependencySet, keyData.oldDependencySet - - for i, _ in pairs(keyData.dependencySet) do - keyData.dependencySet[i] = nil - end - - local use = makeUseCallback(keyData.dependencySet) - local processOK, newOutKey, newOutValue, newMetaValue = - pcall(self._processor, use, newInKey, newInValue) - - if processOK then - if - self._destructor == nil - and ( - needsDestruction(newOutKey) - or needsDestruction(newOutValue) - or needsDestruction(newMetaValue) - ) - then - logWarn "destructorNeededForPairs" - end - if newOutputTable[newOutKey] ~= nil then - local previousNewKey, previousNewValue - - for inKey, outKey in pairs(keyIOMap) do - if outKey == newOutKey then - previousNewValue = newInputTable[inKey] - - if previousNewValue ~= nil then - previousNewKey = inKey - - break - end - end - end - - if previousNewKey ~= nil then - logError( - "forPairsKeyCollision", - nil, - tostring(newOutKey), - tostring(previousNewKey), - tostring(previousNewValue), - tostring(newInKey), - tostring(newInValue) - ) - end - end - - local oldOutValue = oldOutputTable[newOutKey] - - if oldOutValue ~= newOutValue then - local oldMetaValue = meta[newOutKey] - - if oldOutValue ~= nil then - local destructOK, err = pcall( - self._destructor or cleanup, - newOutKey, - oldOutValue, - oldMetaValue - ) - - if not destructOK then - logErrorNonFatal( - "forPairsDestructorError", - parseError(err) - ) - end - end - - oldOutputTable[newOutKey] = nil - end - - oldInputTable[newInKey] = newInValue - keyIOMap[newInKey] = newOutKey - meta[newOutKey] = newMetaValue - newOutputTable[newOutKey] = newOutValue - didChange = true - else - keyData.oldDependencySet, keyData.dependencySet = - keyData.dependencySet, keyData.oldDependencySet - - logErrorNonFatal( - "forPairsProcessorError", - parseError(newOutKey) - ) - end - else - local storedOutKey = keyIOMap[newInKey] - - if newOutputTable[storedOutKey] ~= nil then - local previousNewKey, previousNewValue - - for inKey, outKey in pairs(keyIOMap) do - if storedOutKey == outKey then - previousNewValue = newInputTable[inKey] - - if previousNewValue ~= nil then - previousNewKey = inKey - - break - end - end - end - - if previousNewKey ~= nil then - logError( - "forPairsKeyCollision", - nil, - tostring(storedOutKey), - tostring(previousNewKey), - tostring(previousNewValue), - tostring(newInKey), - tostring(newInValue) - ) - end - end - - newOutputTable[storedOutKey] = oldOutputTable[storedOutKey] - end - - for dependency in pairs(keyData.dependencySet) do - keyData.dependencyValues[dependency] = peek(dependency) - self.dependencySet[dependency] = true - dependency.dependentSet[self] = true - end - end - for oldOutKey, oldOutValue in pairs(oldOutputTable) do - if newOutputTable[oldOutKey] ~= oldOutValue then - local oldMetaValue = meta[oldOutKey] - - if oldOutValue ~= nil then - local destructOK, err = pcall( - self._destructor or cleanup, - oldOutKey, - oldOutValue, - oldMetaValue - ) - - if not destructOK then - logErrorNonFatal( - "forPairsDestructorError", - parseError(err) - ) - end - end - if newOutputTable[oldOutKey] == nil then - meta[oldOutKey] = nil - self._keyData[oldOutKey] = nil - end - - didChange = true - end - end - for key in pairs(oldInputTable) do - if newInputTable[key] == nil then - oldInputTable[key] = nil - keyIOMap[key] = nil - end - end - - return didChange - end - function class:_peek() - return self._outputTable - end - function class:get() - logError "stateGetWasRemoved" - end - - local function ForPairs(inputTable, processor, destructor) - local inputIsState = isState(inputTable) - local self = setmetatable({ - type = "State", - kind = "ForPairs", - dependencySet = {}, - dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), - _oldDependencySet = {}, - _processor = processor, - _destructor = destructor, - _inputIsState = inputIsState, - _inputTable = inputTable, - _oldInputTable = {}, - _outputTable = {}, - _oldOutputTable = {}, - _keyIOMap = {}, - _keyData = {}, - _meta = {}, - }, CLASS_METATABLE) - - self:update() - - return self - end - - __DARKLUA_BUNDLE_MODULES.N = ForPairs -end -do - local parseError = __DARKLUA_BUNDLE_MODULES.J - local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I - local logError = __DARKLUA_BUNDLE_MODULES.d - local logWarn = __DARKLUA_BUNDLE_MODULES.C - local cleanup = __DARKLUA_BUNDLE_MODULES.r - local needsDestruction = __DARKLUA_BUNDLE_MODULES.K - local peek = __DARKLUA_BUNDLE_MODULES.v - local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L - local isState = __DARKLUA_BUNDLE_MODULES.u - local class = {} - local CLASS_METATABLE = { __index = class } - local WEAK_KEYS_METATABLE = { - __mode = "k", - } - - function class:update() - local inputIsState = self._inputIsState - local newInputTable = peek(self._inputTable) - local oldInputTable = self._oldInputTable - local outputTable = self._outputTable - local keyOIMap = self._keyOIMap - local keyIOMap = self._keyIOMap - local meta = self._meta - local didChange = false - - for dependency in pairs(self.dependencySet) do - dependency.dependentSet[self] = nil - end - - self._oldDependencySet, self.dependencySet = - self.dependencySet, self._oldDependencySet - - for i, _ in pairs(self.dependencySet) do - self.dependencySet[i] = nil - end - - if inputIsState then - self._inputTable.dependentSet[self] = true - self.dependencySet[self._inputTable] = true - end - - for newInKey, value in pairs(newInputTable) do - local keyData = self._keyData[newInKey] - - if keyData == nil then - keyData = { - dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), - oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), - dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), - } - self._keyData[newInKey] = keyData - end - - local shouldRecalculate = oldInputTable[newInKey] == nil - - if shouldRecalculate == false then - for dependency, oldValue in pairs(keyData.dependencyValues) do - if oldValue ~= peek(dependency) then - shouldRecalculate = true - - break - end - end - end - if shouldRecalculate then - keyData.oldDependencySet, keyData.dependencySet = - keyData.dependencySet, keyData.oldDependencySet - - for i, _ in pairs(keyData.dependencySet) do - keyData.dependencySet[i] = nil - end - - local use = makeUseCallback(keyData.dependencySet) - local processOK, newOutKey, newMetaValue = - pcall(self._processor, use, newInKey) - - if processOK then - if - self._destructor == nil - and ( - needsDestruction(newOutKey) - or needsDestruction(newMetaValue) - ) - then - logWarn "destructorNeededForKeys" - end - - local oldInKey = keyOIMap[newOutKey] - local oldOutKey = keyIOMap[newInKey] - - if - oldInKey ~= newInKey - and newInputTable[oldInKey] ~= nil - then - logError( - "forKeysKeyCollision", - nil, - tostring(newOutKey), - tostring(oldInKey), - tostring(newOutKey) - ) - end - if - oldOutKey ~= newOutKey - and keyOIMap[oldOutKey] == newInKey - then - local oldMetaValue = meta[oldOutKey] - local destructOK, err = pcall( - self._destructor or cleanup, - oldOutKey, - oldMetaValue - ) - - if not destructOK then - logErrorNonFatal( - "forKeysDestructorError", - parseError(err) - ) - end - - keyOIMap[oldOutKey] = nil - outputTable[oldOutKey] = nil - meta[oldOutKey] = nil - end - - oldInputTable[newInKey] = value - meta[newOutKey] = newMetaValue - keyOIMap[newOutKey] = newInKey - keyIOMap[newInKey] = newOutKey - outputTable[newOutKey] = value - didChange = true - else - keyData.oldDependencySet, keyData.dependencySet = - keyData.dependencySet, keyData.oldDependencySet - - logErrorNonFatal( - "forKeysProcessorError", - parseError(newOutKey) - ) - end - end - - for dependency in pairs(keyData.dependencySet) do - keyData.dependencyValues[dependency] = peek(dependency) - self.dependencySet[dependency] = true - dependency.dependentSet[self] = true - end - end - for outputKey, inputKey in pairs(keyOIMap) do - if newInputTable[inputKey] == nil then - local oldMetaValue = meta[outputKey] - local destructOK, err = - pcall(self._destructor or cleanup, outputKey, oldMetaValue) - - if not destructOK then - logErrorNonFatal("forKeysDestructorError", parseError(err)) - end - - oldInputTable[inputKey] = nil - meta[outputKey] = nil - keyOIMap[outputKey] = nil - keyIOMap[inputKey] = nil - outputTable[outputKey] = nil - self._keyData[inputKey] = nil - didChange = true - end - end - - return didChange - end - function class:_peek() - return self._outputTable - end - function class:get() - logError "stateGetWasRemoved" - end - - local function ForKeys(inputTable, processor, destructor) - local inputIsState = isState(inputTable) - local self = setmetatable({ - type = "State", - kind = "ForKeys", - dependencySet = {}, - dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), - _oldDependencySet = {}, - _processor = processor, - _destructor = destructor, - _inputIsState = inputIsState, - _inputTable = inputTable, - _oldInputTable = {}, - _outputTable = {}, - _keyOIMap = {}, - _keyIOMap = {}, - _keyData = {}, - _meta = {}, - }, CLASS_METATABLE) - - self:update() - - return self - end - - __DARKLUA_BUNDLE_MODULES.O = ForKeys -end -do - local parseError = __DARKLUA_BUNDLE_MODULES.J - local logError = __DARKLUA_BUNDLE_MODULES.d - local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I - local logWarn = __DARKLUA_BUNDLE_MODULES.C - local cleanup = __DARKLUA_BUNDLE_MODULES.r - local needsDestruction = __DARKLUA_BUNDLE_MODULES.K - local peek = __DARKLUA_BUNDLE_MODULES.v - local makeUseCallback = __DARKLUA_BUNDLE_MODULES.L - local isState = __DARKLUA_BUNDLE_MODULES.u - local class = {} - local CLASS_METATABLE = { __index = class } - local WEAK_KEYS_METATABLE = { - __mode = "k", - } - - function class:update() - local inputIsState = self._inputIsState - local inputTable = peek(self._inputTable) - local outputValues = {} - local didChange = false - - self._oldValueCache, self._valueCache = - self._valueCache, self._oldValueCache - - local newValueCache = self._valueCache - local oldValueCache = self._oldValueCache - - for i, _ in pairs(newValueCache) do - newValueCache[i] = nil - end - for dependency in pairs(self.dependencySet) do - dependency.dependentSet[self] = nil - end - - self._oldDependencySet, self.dependencySet = - self.dependencySet, self._oldDependencySet - - for i, _ in pairs(self.dependencySet) do - self.dependencySet[i] = nil - end - - if inputIsState then - self._inputTable.dependentSet[self] = true - self.dependencySet[self._inputTable] = true - end - - for inKey, inValue in pairs(inputTable) do - local oldCachedValues = oldValueCache[inValue] - local shouldRecalculate = oldCachedValues == nil - local value, valueData, meta - - if type(oldCachedValues) == "table" and #oldCachedValues > 0 then - local valueInfo = - table.remove(oldCachedValues, #oldCachedValues) - - value = valueInfo.value - valueData = valueInfo.valueData - meta = valueInfo.meta - - if #oldCachedValues <= 0 then - oldValueCache[inValue] = nil - end - elseif oldCachedValues ~= nil then - oldValueCache[inValue] = nil - shouldRecalculate = true - end - if valueData == nil then - valueData = { - dependencySet = setmetatable({}, WEAK_KEYS_METATABLE), - oldDependencySet = setmetatable({}, WEAK_KEYS_METATABLE), - dependencyValues = setmetatable({}, WEAK_KEYS_METATABLE), - } - end - if shouldRecalculate == false then - for dependency, oldValue in pairs(valueData.dependencyValues) do - if oldValue ~= peek(dependency) then - shouldRecalculate = true - - break - end - end - end - if shouldRecalculate then - valueData.oldDependencySet, valueData.dependencySet = - valueData.dependencySet, valueData.oldDependencySet - - for i, _ in pairs(valueData.dependencySet) do - valueData.dependencySet[i] = nil - end - - local use = makeUseCallback(valueData.dependencySet) - local processOK, newOutValue, newMetaValue = - pcall(self._processor, use, inValue) - - if processOK then - if - self._destructor == nil - and ( - needsDestruction(newOutValue) - or needsDestruction(newMetaValue) - ) - then - logWarn "destructorNeededForValues" - end - if value ~= nil then - local destructOK, err = - pcall(self._destructor or cleanup, value, meta) - - if not destructOK then - logErrorNonFatal( - "forValuesDestructorError", - parseError(err) - ) - end - end - - value = newOutValue - meta = newMetaValue - didChange = true - else - valueData.oldDependencySet, valueData.dependencySet = - valueData.dependencySet, valueData.oldDependencySet - - logErrorNonFatal( - "forValuesProcessorError", - parseError(newOutValue) - ) - end - end - - local newCachedValues = newValueCache[inValue] - - if newCachedValues == nil then - newCachedValues = {} - newValueCache[inValue] = newCachedValues - end - - table.insert(newCachedValues, { - value = value, - valueData = valueData, - meta = meta, - }) - - outputValues[inKey] = value - - for dependency in pairs(valueData.dependencySet) do - valueData.dependencyValues[dependency] = peek(dependency) - self.dependencySet[dependency] = true - dependency.dependentSet[self] = true - end - end - for _oldInValue, oldCachedValueInfo in pairs(oldValueCache) do - for _, valueInfo in ipairs(oldCachedValueInfo) do - local oldValue = valueInfo.value - local oldMetaValue = valueInfo.meta - local destructOK, err = - pcall(self._destructor or cleanup, oldValue, oldMetaValue) - - if not destructOK then - logErrorNonFatal( - "forValuesDestructorError", - parseError(err) - ) - end - - didChange = true - end - for i, _ in pairs(oldCachedValueInfo) do - oldCachedValueInfo[i] = nil - end - end - - self._outputTable = outputValues - - return didChange - end - function class:_peek() - return self._outputTable - end - function class:get() - logError "stateGetWasRemoved" - end - - local function ForValues(inputTable, processor, destructor) - local inputIsState = isState(inputTable) - local self = setmetatable({ - type = "State", - kind = "ForValues", - dependencySet = {}, - dependentSet = setmetatable({}, WEAK_KEYS_METATABLE), - _oldDependencySet = {}, - _processor = processor, - _destructor = destructor, - _inputIsState = inputIsState, - _inputTable = inputTable, - _outputTable = {}, - _valueCache = {}, - _oldValueCache = {}, - }, CLASS_METATABLE) - - self:update() - - return self - end - - __DARKLUA_BUNDLE_MODULES.P = ForValues -end -do - local TweenScheduler = __DARKLUA_BUNDLE_MODULES.l - local logError = __DARKLUA_BUNDLE_MODULES.d - local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I - local xtypeof = __DARKLUA_BUNDLE_MODULES.s - local peek = __DARKLUA_BUNDLE_MODULES.v - local typeof = __DARKLUA_BUNDLE_MODULES.g + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.B + local xtypeof = __DARKLUA_BUNDLE_MODULES.k + local peek = __DARKLUA_BUNDLE_MODULES.n + local typeof = __DARKLUA_BUNDLE_MODULES.i local class = {} local CLASS_METATABLE = { __index = class } local WEAK_KEYS_METATABLE = { @@ -2778,7 +2659,7 @@ do self._prevValue = self._currentValue self._nextValue = goalValue - self._currentTweenStartTime = time() + self._currentTweenStartTime = External.lastUpdateStep() self._currentTweenInfo = tweenInfo local tweenDuration = tweenInfo.DelayTime + tweenInfo.Time @@ -2843,10 +2724,10 @@ do return self end - __DARKLUA_BUNDLE_MODULES.Q = Tween + __DARKLUA_BUNDLE_MODULES.O = Tween end do - local Oklab = __DARKLUA_BUNDLE_MODULES.f + local Oklab = __DARKLUA_BUNDLE_MODULES.J local function unpackType(value, typeString) if typeString == "number" then @@ -2976,17 +2857,232 @@ do end end - __DARKLUA_BUNDLE_MODULES.R = unpackType + __DARKLUA_BUNDLE_MODULES.P = unpackType +end +do + local Oklab = __DARKLUA_BUNDLE_MODULES.J + + local function packType(numbers, typeString) + if typeString == "number" then + return numbers[1] + elseif typeString == "CFrame" then + return CFrame.new(numbers[1], numbers[2], numbers[3]) + * CFrame.fromAxisAngle( + Vector3.new(numbers[4], numbers[5], numbers[6]).Unit, + numbers[7] + ) + elseif typeString == "Color3" then + return Oklab.from( + Vector3.new(numbers[1], numbers[2], numbers[3]), + false + ) + elseif typeString == "ColorSequenceKeypoint" then + return ColorSequenceKeypoint.new( + numbers[4], + Oklab.from( + Vector3.new(numbers[1], numbers[2], numbers[3]), + false + ) + ) + elseif typeString == "DateTime" then + return DateTime.fromUnixTimestampMillis(numbers[1]) + elseif typeString == "NumberRange" then + return NumberRange.new(numbers[1], numbers[2]) + elseif typeString == "NumberSequenceKeypoint" then + return NumberSequenceKeypoint.new( + numbers[2], + numbers[1], + numbers[3] + ) + elseif typeString == "PhysicalProperties" then + return PhysicalProperties.new( + numbers[1], + numbers[2], + numbers[3], + numbers[4], + numbers[5] + ) + elseif typeString == "Ray" then + return Ray.new( + Vector3.new(numbers[1], numbers[2], numbers[3]), + Vector3.new(numbers[4], numbers[5], numbers[6]) + ) + elseif typeString == "Rect" then + return Rect.new(numbers[1], numbers[2], numbers[3], numbers[4]) + elseif typeString == "Region3" then + local position = Vector3.new(numbers[1], numbers[2], numbers[3]) + local halfSize = + Vector3.new(numbers[4] / 2, numbers[5] / 2, numbers[6] / 2) + + return Region3.new(position - halfSize, position + halfSize) + elseif typeString == "Region3int16" then + return Region3int16.new( + Vector3int16.new(numbers[1], numbers[2], numbers[3]), + Vector3int16.new(numbers[4], numbers[5], numbers[6]) + ) + elseif typeString == "UDim" then + return UDim.new(numbers[1], numbers[2]) + elseif typeString == "UDim2" then + return UDim2.new(numbers[1], numbers[2], numbers[3], numbers[4]) + elseif typeString == "Vector2" then + return Vector2.new(numbers[1], numbers[2]) + elseif typeString == "Vector2int16" then + return Vector2int16.new(numbers[1], numbers[2]) + elseif typeString == "Vector3" then + return Vector3.new(numbers[1], numbers[2], numbers[3]) + elseif typeString == "Vector3int16" then + return Vector3int16.new(numbers[1], numbers[2], numbers[3]) + else + return nil + end + end + + __DARKLUA_BUNDLE_MODULES.Q = packType +end +do + local function springCoefficients(time, damping, speed) + if time == 0 or speed == 0 then + return 1, 0, 0, 1 + end + + local posPos, posVel, velPos, velVel + + if damping > 1 then + local scaledTime = time * speed + local alpha = math.sqrt(damping ^ 2 - 1) + local scaledInvAlpha = -0.5 / alpha + local z1 = -alpha - damping + local z2 = 1 / z1 + local expZ1 = math.exp(scaledTime * z1) + local expZ2 = math.exp(scaledTime * z2) + + posPos = (expZ2 * z1 - expZ1 * z2) * scaledInvAlpha + posVel = (expZ1 - expZ2) * scaledInvAlpha / speed + velPos = (expZ2 - expZ1) * scaledInvAlpha * speed + velVel = (expZ1 * z1 - expZ2 * z2) * scaledInvAlpha + elseif damping == 1 then + local scaledTime = time * speed + local expTerm = math.exp(-scaledTime) + + posPos = expTerm * (1 + scaledTime) + posVel = expTerm * time + velPos = expTerm * (-scaledTime * speed) + velVel = expTerm * (1 - scaledTime) + else + local scaledTime = time * speed + local alpha = math.sqrt(1 - damping ^ 2) + local invAlpha = 1 / alpha + local alphaTime = alpha * scaledTime + local expTerm = math.exp(-scaledTime * damping) + local sinTerm = expTerm * math.sin(alphaTime) + local cosTerm = expTerm * math.cos(alphaTime) + local sinInvAlpha = sinTerm * invAlpha + local sinInvAlphaDamp = sinInvAlpha * damping + + posPos = sinInvAlphaDamp + cosTerm + posVel = sinInvAlpha + velPos = -(sinInvAlphaDamp * damping + sinTerm * alpha) + velVel = cosTerm - sinInvAlphaDamp + end + + return posPos, posVel, velPos, velVel + end + + __DARKLUA_BUNDLE_MODULES.R = springCoefficients +end +do + local External = __DARKLUA_BUNDLE_MODULES.e + local packType = __DARKLUA_BUNDLE_MODULES.Q + local springCoefficients = __DARKLUA_BUNDLE_MODULES.R + local updateAll = __DARKLUA_BUNDLE_MODULES.y + local SpringScheduler = {} + local EPSILON = 0.0001 + local activeSprings = {} + local lastUpdateTime = External.lastUpdateStep() + + function SpringScheduler.add(spring) + spring._lastSchedule = lastUpdateTime + spring._startDisplacements = {} + spring._startVelocities = {} + + for index, goal in ipairs(spring._springGoals) do + spring._startDisplacements[index] = spring._springPositions[index] + - goal + spring._startVelocities[index] = spring._springVelocities[index] + end + + activeSprings[spring] = true + end + function SpringScheduler.remove(spring) + activeSprings[spring] = nil + end + + local function updateAllSprings(now) + local springsToSleep = {} + + lastUpdateTime = now + + for spring in pairs(activeSprings) do + local posPos, posVel, velPos, velVel = springCoefficients( + lastUpdateTime - spring._lastSchedule, + spring._currentDamping, + spring._currentSpeed + ) + local positions = spring._springPositions + local velocities = spring._springVelocities + local startDisplacements = spring._startDisplacements + local startVelocities = spring._startVelocities + local isMoving = false + + for index, goal in ipairs(spring._springGoals) do + local oldDisplacement = startDisplacements[index] + local oldVelocity = startVelocities[index] + local newDisplacement = oldDisplacement * posPos + + oldVelocity * posVel + local newVelocity = oldDisplacement * velPos + + oldVelocity * velVel + + if + math.abs(newDisplacement) > EPSILON + or math.abs(newVelocity) > EPSILON + then + isMoving = true + end + + positions[index] = newDisplacement + goal + velocities[index] = newVelocity + end + + if not isMoving then + springsToSleep[spring] = true + end + end + for spring in pairs(activeSprings) do + spring._currentValue = + packType(spring._springPositions, spring._currentType) + + updateAll(spring) + end + for spring in pairs(springsToSleep) do + activeSprings[spring] = nil + spring._currentValue = + packType(spring._springGoals, spring._currentType) + end + end + + External.bindToUpdateStep(updateAllSprings) + + __DARKLUA_BUNDLE_MODULES.S = SpringScheduler end do local logError = __DARKLUA_BUNDLE_MODULES.d - local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.I - local unpackType = __DARKLUA_BUNDLE_MODULES.R - local SpringScheduler = __DARKLUA_BUNDLE_MODULES.o - local updateAll = __DARKLUA_BUNDLE_MODULES.k - local xtypeof = __DARKLUA_BUNDLE_MODULES.s - local peek = __DARKLUA_BUNDLE_MODULES.v - local typeof = __DARKLUA_BUNDLE_MODULES.g + local logErrorNonFatal = __DARKLUA_BUNDLE_MODULES.B + local unpackType = __DARKLUA_BUNDLE_MODULES.P + local SpringScheduler = __DARKLUA_BUNDLE_MODULES.S + local updateAll = __DARKLUA_BUNDLE_MODULES.y + local xtypeof = __DARKLUA_BUNDLE_MODULES.k + local peek = __DARKLUA_BUNDLE_MODULES.n + local typeof = __DARKLUA_BUNDLE_MODULES.i local class = {} local CLASS_METATABLE = { __index = class } local WEAK_KEYS_METATABLE = { @@ -3159,12 +3255,12 @@ do return self end - __DARKLUA_BUNDLE_MODULES.S = Spring + __DARKLUA_BUNDLE_MODULES.T = Spring end do local function doNothing() end - __DARKLUA_BUNDLE_MODULES.T = doNothing + __DARKLUA_BUNDLE_MODULES.U = doNothing end do local logError = __DARKLUA_BUNDLE_MODULES.d @@ -3274,43 +3370,48 @@ do return proxy end - __DARKLUA_BUNDLE_MODULES.U = TweenInfo + __DARKLUA_BUNDLE_MODULES.V = TweenInfo +end + +local External = __DARKLUA_BUNDLE_MODULES.e +local restrictRead = __DARKLUA_BUNDLE_MODULES.f + +do + local MercuryExternal = __DARKLUA_BUNDLE_MODULES.g + + External.setExternalScheduler(MercuryExternal) end -local restrictRead = __DARKLUA_BUNDLE_MODULES.e -local bindScheduler = __DARKLUA_BUNDLE_MODULES.p local Fusion = restrictRead("Fusion", { version = { major = 0, minor = 3, isRelease = false, }, - New = __DARKLUA_BUNDLE_MODULES.x, - Hydrate = __DARKLUA_BUNDLE_MODULES.y, - Ref = __DARKLUA_BUNDLE_MODULES.z, - Out = __DARKLUA_BUNDLE_MODULES.A, - Cleanup = __DARKLUA_BUNDLE_MODULES.B, - Children = __DARKLUA_BUNDLE_MODULES.D, - OnEvent = __DARKLUA_BUNDLE_MODULES.E, - OnChange = __DARKLUA_BUNDLE_MODULES.F, - Value = __DARKLUA_BUNDLE_MODULES.H, - Computed = __DARKLUA_BUNDLE_MODULES.M, - ForPairs = __DARKLUA_BUNDLE_MODULES.N, - ForKeys = __DARKLUA_BUNDLE_MODULES.O, - ForValues = __DARKLUA_BUNDLE_MODULES.P, - Observer = __DARKLUA_BUNDLE_MODULES.t, - Tween = __DARKLUA_BUNDLE_MODULES.Q, - Spring = __DARKLUA_BUNDLE_MODULES.S, - cleanup = __DARKLUA_BUNDLE_MODULES.r, - doNothing = __DARKLUA_BUNDLE_MODULES.T, - peek = __DARKLUA_BUNDLE_MODULES.v, - typeof = __DARKLUA_BUNDLE_MODULES.g, - TweenInfo = __DARKLUA_BUNDLE_MODULES.U, + New = __DARKLUA_BUNDLE_MODULES.p, + Hydrate = __DARKLUA_BUNDLE_MODULES.q, + Ref = __DARKLUA_BUNDLE_MODULES.r, + Out = __DARKLUA_BUNDLE_MODULES.s, + Cleanup = __DARKLUA_BUNDLE_MODULES.t, + Children = __DARKLUA_BUNDLE_MODULES.v, + OnEvent = __DARKLUA_BUNDLE_MODULES.w, + OnChange = __DARKLUA_BUNDLE_MODULES.x, + Value = __DARKLUA_BUNDLE_MODULES.A, + Computed = __DARKLUA_BUNDLE_MODULES.F, + ForPairs = __DARKLUA_BUNDLE_MODULES.G, + ForKeys = __DARKLUA_BUNDLE_MODULES.H, + ForValues = __DARKLUA_BUNDLE_MODULES.I, + Observer = __DARKLUA_BUNDLE_MODULES.l, + Tween = __DARKLUA_BUNDLE_MODULES.O, + Spring = __DARKLUA_BUNDLE_MODULES.T, + cleanup = __DARKLUA_BUNDLE_MODULES.j, + doNothing = __DARKLUA_BUNDLE_MODULES.U, + peek = __DARKLUA_BUNDLE_MODULES.n, + typeof = __DARKLUA_BUNDLE_MODULES.i, + TweenInfo = __DARKLUA_BUNDLE_MODULES.V, Help = function() return "See https://elttob.uk/Fusion/0.3/ for more information." end, }) -bindScheduler() - return Fusion diff --git a/luau/10000002.luau b/luau/10000002.luau new file mode 100644 index 0000000..1f6c3e0 --- /dev/null +++ b/luau/10000002.luau @@ -0,0 +1,1334 @@ +local function Red(Script) + local _SERVER, _CLIENT + + if Script:IsA "LocalScript" then + _CLIENT = true + elseif Script:IsA "Script" then + _SERVER = true + else + error("Argument must be the script itself", 2) + end + + local success, result = ypcall(function() + local __DARKLUA_BUNDLE_MODULES = {} + + do + local ReplicatedStorage = game:GetService "ReplicatedStorage" + local Players = game:GetService "Players" + local RedEvent = {} + local Remote, ClientFolder + + if _SERVER then + Remote = Instance.new "RemoteEvent" + Remote.Name = "RedEvent" + Remote.Parent = ReplicatedStorage + + local function PlayerAdded(Player) + ClientFolder = Instance.new "ScreenGui" + ClientFolder.Name = "Red" + ClientFolder.Parent = Player:FindFirstChild "PlayerGui" + end + + Players.PlayerAdded:connect(PlayerAdded) + + for _, Player in ipairs(Players:GetPlayers()) do + PlayerAdded(Player) + end + else + Remote = ReplicatedStorage:WaitForChild "RedEvent" + ClientFolder = (Players.LocalPlayer:FindFirstChild "PlayerGui"):WaitForChild "Red" + ClientFolder.Parent = nil + end + + RedEvent.Remote = Remote + RedEvent.ClientFolder = ClientFolder + __DARKLUA_BUNDLE_MODULES.a = RedEvent + end + do + local FreeThread = nil + + local function FunctionPasser(fn, ...) + local AquiredThread = FreeThread + + FreeThread = nil + + fn(...) + + FreeThread = AquiredThread + end + local function Yielder() + while true do + FunctionPasser(coroutine.yield()) + end + end + + __DARKLUA_BUNDLE_MODULES.b = function(fn, ...) + if not FreeThread then + FreeThread = coroutine.create(Yielder) + + coroutine.resume(FreeThread) + end + + coroutine.resume(FreeThread, fn, ...) + end + end + do + local RunService = game:GetService "RunService" + local Spawn = __DARKLUA_BUNDLE_MODULES.b + local Promise = {} + + Promise.__index = Promise + + function Promise.Promise(Callback) + local self = setmetatable({}, Promise) + + self.Status = "Pending" + self.OnResolve = {} + self.OnReject = {} + self.Value = {} + self.Thread = nil + self.Thread = coroutine.create(function() + local ok, err = ypcall(Callback, function(...) + self:_Resolve(...) + end, function(...) + self:_Reject(...) + end) + + if not ok then + self:_Reject(err) + end + end) + + coroutine.resume(self.Thread) + + return self + end + + Promise.new = Promise.Promise + + function Promise.Resolve(...) + local self = setmetatable({}, Promise) + + self.Status = "Resolved" + self.OnResolve = {} + self.OnReject = {} + self.Value = { ... } + self.Thread = nil + + return self + end + function Promise.Reject(...) + local self = setmetatable({}, Promise) + + self.Status = "Rejected" + self.OnResolve = {} + self.OnReject = {} + self.Value = { ... } + self.Thread = nil + + return self + end + function Promise._Resolve(self, ...) + assert( + self.Status == "Pending", + "Cannot resolve a promise that is not pending." + ) + + self.Status = "Resolved" + self.Value = { ... } + + for _, Callback in ipairs(self.OnResolve) do + Spawn(Callback, ...) + end + + coroutine.resume(coroutine.create(function() + coroutine.yield(self.Thread) + end)) + end + function Promise._Reject(self, ...) + assert( + self.Status == "Pending", + "Cannot reject a promise that is not pending." + ) + + self.Status = "Rejected" + self.Value = { ... } + + for _, Callback in ipairs(self.OnReject) do + Spawn(Callback, ...) + end + + coroutine.resume(coroutine.create(function() + coroutine.yield(self.Thread) + end)) + end + function Promise.Then(self, OnResolve, OnReject) + return Promise.Promise(function(Resolve, Reject) + local function PromiseResolutionProcedure(Value, ...) + if + type(Value) == "table" + and getmetatable(Value) == Promise + then + if Value.Status == "Pending" then + table.insert(Value.OnResolve, Resolve) + table.insert(Value.OnReject, Reject) + elseif Value.Status == "Resolved" then + Resolve(Value.Value) + elseif Value.Status == "Rejected" then + Reject(Value.Value) + end + else + Resolve(Value, ...) + end + end + + if self.Status == "Pending" then + if OnResolve then + table.insert(self.OnResolve, function(...) + PromiseResolutionProcedure(OnResolve(...)) + end) + else + table.insert( + self.OnResolve, + PromiseResolutionProcedure + ) + end + if OnReject then + table.insert(self.OnReject, function(...) + PromiseResolutionProcedure(OnReject(...)) + end) + else + table.insert(self.OnReject, Reject) + end + elseif self.Status == "Resolved" then + if OnResolve then + PromiseResolutionProcedure( + OnResolve(unpack(self.Value)) + ) + else + Resolve(unpack(self.Value)) + end + elseif self.Status == "Rejected" then + if OnReject then + PromiseResolutionProcedure( + OnReject(unpack(self.Value)) + ) + else + Reject(unpack(self.Value)) + end + end + end) + end + function Promise.Catch(self, OnReject) + return self:Then(nil, OnReject) + end + function Promise.Finally(self, Finally) + return self:Then(function(...) + Finally() + + return ... + end, function(Error) + Finally() + error(Error) + end) + end + function Promise.Await(self) + if self.Status == "Resolved" then + return unpack(self.Value) + elseif self.Status == "Rejected" then + return error(unpack(self.Value)) + end + + local c = 0 + + repeat + RunService.Stepped:wait() + + c = c + 1 + until self.Status ~= "Pending" or c > 500 + + local Current = coroutine.running() + + local function Resume() + coroutine.resume(Current) + end + + table.insert(self.OnResolve, Resume) + table.insert(self.OnReject, Resume) + coroutine.yield() + + if self.Status == "Resolved" then + return unpack(self.Value) + end + + return error(unpack(self.Value)) + end + + __DARKLUA_BUNDLE_MODULES.c = Promise + end + do + local RedEvent = __DARKLUA_BUNDLE_MODULES.a + local Event = RedEvent.Remote + local Promise = __DARKLUA_BUNDLE_MODULES.c + local Serdes = {} + + Serdes.NextId = 1 + Serdes.NextOT = 1 + + function Serdes.RegisterIdentifier(Name) + assert( + _SERVER, + "RegisterIdentifier can only be called on the server" + ) + + local Id = string.char(Serdes.NextId) + + Serdes.NextId = Serdes.NextId + 1 + + local e = Event:FindFirstChild(Name) + + if e then + e.Value = Id + else + e = Instance.new "StringValue" + e.Name = Name + e.Value = Id + e.Parent = Event + end + + return Id + end + function Serdes.Identifier(Name) + local e + + if _CLIENT then + return Promise.new(function(Resolve) + e = Event:WaitForChild(Name) + + if e.Value ~= nil then + Resolve(e.Value) + else + local Thread = Delay(5, function() + print( + [[[Red.Serdes]: Retrieving identifier exceeded 5 seconds. Make sure ']] + .. Name + .. "' is registered on the server." + ) + end) + + e.Changed:Once(function() + coroutine.yield(Thread) + Resolve(e.Value) + end) + end + end) + else + e = Event:FindFirstChild(Name) + + if e and e.Value then + return Promise.Resolve(e.Value) + end + + return Promise.Resolve(Serdes.RegisterIdentifier(Name)) + end + end + function Serdes.IdentifierAsync(Name) + return Serdes.Identifier(Name):Await() + end + function Serdes.OneTime() + Serdes.NextOT = Serdes.NextOT + 1 + + if Serdes.NextOT == 0xffff + 1 then + Serdes.NextOT = 0 + end + + return string.char(Serdes.NextOT) + end + + __DARKLUA_BUNDLE_MODULES.d = Serdes + end + do + local RunService = game:GetService "RunService" + + local function MakeHeartbeatFunction(Clock) + return function(Delta) + Clock:Advance(Delta) + end + end + + local Clock = {} + + Clock.__index = Clock + + function Clock.Clock(Interval, Callback) + local self = setmetatable({}, Clock) + + self.Interval = Interval + self.Callback = Callback + self.Delta = 0 + self.Connection = + RunService.Heartbeat:connect(MakeHeartbeatFunction(self)) + + return self + end + + Clock.new = Clock.Clock + + function Clock.Pause(self) + if self.Connection then + self.Connection:Disconnect() + end + end + function Clock.Resume(self) + if self.Connection.Connected then + return + end + + self.Connection = + RunService.Heartbeat:connect(MakeHeartbeatFunction(self)) + end + function Clock.Advance(self, Delta) + self.Delta = self.Delta + Delta + + if self.Delta >= self.Interval * 10 then + local Skipped = math.floor(self.Delta / self.Interval) + + self.Delta = self.Delta - Skipped * self.Interval + + return + end + if self.Delta >= self.Interval then + self.Delta = self.Delta - self.Interval + + self.Callback() + end + end + + __DARKLUA_BUNDLE_MODULES.e = Clock + end + do + __DARKLUA_BUNDLE_MODULES.f = __DARKLUA_BUNDLE_MODULES.e + end + do + local RunService = game:GetService "RunService" + local RedEvent = __DARKLUA_BUNDLE_MODULES.a + local Remote = RedEvent.Remote + local Serdes = __DARKLUA_BUNDLE_MODULES.d + local Spawn = __DARKLUA_BUNDLE_MODULES.b + local Promise = __DARKLUA_BUNDLE_MODULES.c + local Clock = __DARKLUA_BUNDLE_MODULES.f + local Event = {} + local nil_symbol = { __nil = true } + + Event.Callbacks = {} + Event.Outgoing = {} + + if _CLIENT then + Event.ActiveCalls = {} + end + + function Event.Listen() + if _CLIENT then + Remote.OnClientEvent:connect( + function(SingleFire, MultipleFire, IncomingCall) + if SingleFire.__nil then + SingleFire = nil + end + if MultipleFire.__nil then + MultipleFire = nil + end + if IncomingCall.__nil then + IncomingCall = nil + end + if SingleFire then + for EventId, Call in pairs(SingleFire) do + local Callback = Event.Callbacks[EventId] + local c = 0 + + repeat + RunService.Stepped:wait() + + Callback = Event.Callbacks[EventId] + c = c + 1 + until Callback or c > 500 + + if Callback then + if type(Call) == "table" then + Spawn(Callback, unpack(Call)) + else + Spawn(Callback, Call) + end + else + print "[Red]: Callback not found!" + end + end + end + if MultipleFire then + for EventId, Calls in pairs(MultipleFire) do + local Callback = Event.Callbacks[EventId] + + if Callback then + for _, Call in ipairs(Calls) do + if type(Call) == "table" then + Spawn(Callback, unpack(Call)) + else + Spawn(Callback, Call) + end + end + end + end + end + if IncomingCall then + for _, Call in pairs(IncomingCall) do + local CallId = table.remove(Call, 1) + local Success = table.remove(Call, 1) + + if Event.ActiveCalls[CallId] then + if Success then + Event.ActiveCalls[CallId].Resolve( + unpack(Call) + ) + else + Event.ActiveCalls[CallId].Reject( + unpack(Call) + ) + end + + Event.ActiveCalls[CallId] = nil + end + end + end + end + ) + Clock.new(1 / 60, function() + if not next(Event.Outgoing) then + return + end + + local SingleFire = {} + local SendSingleFire = false + + if Event.Outgoing[1] then + for EventId, Calls in pairs(Event.Outgoing[1]) do + if #Calls == 1 then + SingleFire[EventId] = Calls[1] + Event.Outgoing[1][EventId] = nil + SendSingleFire = true + end + end + end + + local sf = nil_symbol + + if SendSingleFire then + sf = SingleFire + end + + local eo1, eo2 = Event.Outgoing[1], Event.Outgoing[2] + + if eo1 == nil then + eo1 = nil_symbol + end + if eo2 == nil then + eo2 = nil_symbol + end + + Remote:FireServer(sf, eo1, eo2) + + for i, _ in pairs(Event.Outgoing) do + Event.Outgoing[i] = nil + end + end) + else + Remote.OnServerEvent:connect( + function(Player, SingleFire, MultipleFire, IncomingCall) + if SingleFire.__nil then + SingleFire = nil + end + if MultipleFire.__nil then + MultipleFire = nil + end + if IncomingCall.__nil then + IncomingCall = nil + end + if SingleFire then + for EventId, Call in pairs(SingleFire) do + local Callback = Event.Callbacks[EventId] + + if Callback then + if type(Call) == "table" then + Spawn( + Callback, + Player, + unpack(Call) + ) + else + Spawn(Callback, Player, Call) + end + end + end + end + if MultipleFire then + for EventId, Calls in pairs(MultipleFire) do + local Callback = Event.Callbacks[EventId] + + if Callback then + for _, Call in ipairs(Calls) do + if type(Call) == "table" then + Spawn( + Callback, + Player, + unpack(Call) + ) + else + Spawn(Callback, Player, Call) + end + end + end + end + end + if IncomingCall then + for EventId, Calls in pairs(IncomingCall) do + if Event.Callbacks[EventId] then + for _, Call in ipairs(Calls) do + Spawn(function() + local CallId = + table.remove(Call, 1) + local Result = { + CallId, + pcall( + Event.Callbacks[EventId], + Player, + unpack(Call) + ), + } + + if + Event.Outgoing[Player] + == nil + then + Event.Outgoing[Player] = {} + end + if + Event.Outgoing[Player][2] + == nil + then + Event.Outgoing[Player][2] = + {} + end + + table.insert( + Event.Outgoing[Player][2], + Result + ) + end) + end + else + if Event.Outgoing[Player] == nil then + Event.Outgoing[Player] = {} + end + if Event.Outgoing[Player][2] == nil then + Event.Outgoing[Player][2] = {} + end + + for _, Call in ipairs(Calls) do + table.insert( + Event.Outgoing[Player][2], + { + Call[1], + false, + "[Red]: Event not found", + } + ) + end + end + end + end + end + ) + RunService.Heartbeat:connect(function() + for Player, Packets in pairs(Event.Outgoing) do + local SingleCall = {} + local SendSingleCall = false + + if Packets[1] then + for EventId, Calls in pairs(Packets[1]) do + if #Calls == 1 then + SingleCall[EventId] = Calls[1] + Packets[1][EventId] = nil + SendSingleCall = true + end + end + end + + local sc = nil_symbol + + if SendSingleCall then + sc = SingleCall + end + + local p1, p2 = Packets[1], Packets[2] + + if p1 == nil then + p1 = nil_symbol + end + if p2 == nil then + p2 = nil_symbol + end + + Remote:FireClient(Player, sc, p1, p2) + end + for i, _ in pairs(Event.Outgoing) do + Event.Outgoing[i] = nil + end + end) + end + end + function Event.AddQueue(Queue, Call) + local Length = #Call + + if Length == 1 then + local Type = type(Call[1]) + + if Type ~= "table" then + table.insert(Queue, Call[1]) + else + table.insert(Queue, Call) + end + else + table.insert(Queue, Call) + end + end + function Event.FireClient(Player, EventName, ...) + assert( + not _CLIENT, + "Event.FireClient can only be called from the server" + ) + + local EventId = Serdes.IdentifierAsync(EventName) + + if Event.Outgoing[Player] == nil then + Event.Outgoing[Player] = {} + end + if Event.Outgoing[Player][1] == nil then + Event.Outgoing[Player][1] = {} + end + if Event.Outgoing[Player][1][EventId] == nil then + Event.Outgoing[Player][1][EventId] = {} + end + + Event.AddQueue(Event.Outgoing[Player][1][EventId], { ... }) + end + function Event.FireServer(EventName, ...) + assert( + _CLIENT, + "Event.FireServer can only be called on the client" + ) + + local Args = { ... } + + return Serdes.Identifier(EventName):Then(function(EventId) + if Event.Outgoing[1] == nil then + Event.Outgoing[1] = {} + end + if Event.Outgoing[1][EventId] == nil then + Event.Outgoing[1][EventId] = {} + end + + Event.AddQueue(Event.Outgoing[1][EventId], Args) + end) + end + function Event.Call(EventName, ...) + assert(_CLIENT, "Event.Call can only be called on the client") + + local Args = { ... } + + return Promise.new(function(Resolve, Reject) + local CallId = Serdes.OneTime() + local EventId = Serdes.IdentifierAsync(EventName) + + if Event.Outgoing[2] == nil then + Event.Outgoing[2] = {} + end + if Event.Outgoing[2][EventId] == nil then + Event.Outgoing[2][EventId] = {} + end + + table.insert(Args, 1, CallId) + table.insert(Event.Outgoing[2][EventId], Args) + + Event.ActiveCalls[CallId] = { + Resolve = Resolve, + Reject = Reject, + } + end) + end + function Event.SetCallback(EventName, Callback) + return Serdes.Identifier(EventName):Then(function(EventId) + Event.Callbacks[EventId] = Callback + end) + end + + __DARKLUA_BUNDLE_MODULES.g = Event + end + do + local Players = game:GetService "Players" + local RedEvent = __DARKLUA_BUNDLE_MODULES.a + local Remote = RedEvent.Remote + local ClientFolder = RedEvent.ClientFolder + local Serdes = __DARKLUA_BUNDLE_MODULES.d + local Event = __DARKLUA_BUNDLE_MODULES.g + local Server = {} + + Server.__index = Server + + function Server.Server(Name) + local self = setmetatable({}, Server) + + self.Name = Name + self.FolderInstance = nil + + return self + end + + Server.new = Server.Server + + function Server.Fire(self, Player, EventName, ...) + Event.FireClient(Player, self.Name .. "_" .. EventName, ...) + end + function Server.FireAll(self, EventName, ...) + for _, Player in ipairs(Players:GetPlayers()) do + self:Fire(Player, EventName, ...) + end + end + function Server.FireAllExcept(self, Player, EventName, ...) + for _, OtherPlayer in ipairs(Players:GetPlayers()) do + if OtherPlayer ~= Player then + self:Fire(OtherPlayer, EventName, ...) + end + end + end + function Server.FireList(self, PlayerList, EventName, ...) + for _, Player in ipairs(PlayerList) do + self:Fire(Player, EventName, ...) + end + end + function Server.FireWithFilter(self, Filter, EventName, ...) + for _, Player in ipairs(Players:GetPlayers()) do + if Filter(Player) then + self:Fire(Player, EventName, ...) + end + end + end + function Server.On(self, EventName, Callback) + Event.SetCallback(self.Name .. "_" .. EventName, Callback) + end + function Server.Folder(self, Player) + if Player then + ClientFolder = (Player:FindFirstChild "PlayerGui").Red + + if ClientFolder:FindFirstChild(self.Name) then + return ClientFolder:FindFirstChild(self.Name) + else + local Folder = Instance.new "Model" + + Folder.Name = self.Name + Folder.Parent = ClientFolder + + return Folder + end + else + if not self.FolderInstance then + local Folder = Instance.new "Model" + + Folder.Name = self.Name + Folder.Parent = Remote + self.FolderInstance = Folder + end + + return self.FolderInstance + end + end + + local Client = {} + + Client.__index = Client + + function Client.Client(Name) + local self = setmetatable({}, Client) + + self.Name = Name + self.FolderInstance = nil + self.LocalFolderInstance = nil + + return self + end + + Client.new = Client.Client + + function Client.Fire(self, EventName, ...) + return Event.FireServer(self.Name .. "_" .. EventName, ...) + end + function Client.Call(self, EventName, ...) + return Event.Call(self.Name .. "_" .. EventName, ...) + end + function Client.On(self, EventName, Callback) + return Event.SetCallback( + self.Name .. "_" .. EventName, + Callback + ) + end + function Client.Folder(self) + if not self.FolderInstance then + self.FolderInstance = Remote:WaitForChild(self.Name) + end + + return self.FolderInstance + end + function Client.LocalFolder(self) + if not self.LocalFolderInstance then + self.LocalFolderInstance = + ClientFolder:WaitForChild(self.Name) + end + + return self.LocalFolderInstance + end + + local Net = {} + + Net.ServerNamespaceList = {} + Net.ClientNamespaceList = {} + + function Net.Server(Name, Definitions) + assert(_SERVER, "Net.Server can only be used on the server") + + if not Net.ServerNamespaceList[Name] then + Net.ServerNamespaceList[Name] = Server.Server(Name) + end + if Definitions then + for _, Term in ipairs(Definitions) do + Serdes.Identifier(Name .. "_" .. Term) + end + end + + return Net.ServerNamespaceList[Name] + end + function Net.Client(Name) + assert(_CLIENT, "Net.Client can only be used on the client") + + if Net.ClientNamespaceList[Name] == nil then + Net.ClientNamespaceList[Name] = Client.Client(Name) + end + + return Net.ClientNamespaceList[Name] + end + function Net.Identifier(Name) + return Serdes.Identifier(Name) + end + + Event.Listen() + + __DARKLUA_BUNDLE_MODULES.h = Net + end + do + local CollectionService = game:GetService "CollectionService" + local Spawn = __DARKLUA_BUNDLE_MODULES.b + + __DARKLUA_BUNDLE_MODULES.i = function(Tag, Start, Stop) + local InstanceMap = {} + + for _, Instance in ipairs(CollectionService:GetTagged(Tag)) do + Spawn(function() + InstanceMap[Instance] = { + Start(Instance), + } + end) + end + + local AddConnection = CollectionService + :GetInstanceAddedSignal(Tag) + :connect(function(Instance) + InstanceMap[Instance] = { + Start(Instance), + } + end) + local RemoveConnection = CollectionService + :GetInstanceRemovedSignal(Tag) + :connect(function(Instance) + local Value = InstanceMap[Instance] + + if Value then + InstanceMap[Instance] = nil + + Stop(unpack(Value)) + end + end) + + return function() + AddConnection:Disconnect() + RemoveConnection:Disconnect() + + for Instance, Value in pairs(InstanceMap) do + Spawn(Stop, unpack(Value)) + end + end + end + end + do + __DARKLUA_BUNDLE_MODULES.j = function(Limit, Interval) + assert(Limit > 0, "Limit must be greater than 0") + + local CountMap = {} + local CountKeyless = 0 + + return function(Key) + if Key then + local Count = CountMap[Key] + + if Count == nil then + Count = 0 + + Delay(Interval, function() + CountMap[Key] = nil + end) + end + if Count >= Limit then + return false + end + + CountMap[Key] = Count + 1 + else + if CountKeyless == 0 then + Delay(Interval, function() + CountKeyless = 0 + end) + end + if CountKeyless >= Limit then + return false + end + + CountKeyless = CountKeyless + 1 + end + + return true + end + end + end + do + local Promise = __DARKLUA_BUNDLE_MODULES.c + local Spawn = __DARKLUA_BUNDLE_MODULES.b + local Signal = {} + + Signal.__index = Signal + + function Signal.new() + return setmetatable({ Root = nil }, Signal) + end + function Signal.Connect(self, Callback) + local Node = { + Next = self.Root, + Callback = Callback, + } + + self.Root = Node + + return function() + if self.Root == Node then + self.Root = Node.Next + else + local Current = self.Root + + while Current do + if Current.Next == Node then + Current.Next = Node.Next + + break + end + + Current = Current.Next + end + end + end + end + function Signal.Wait(self) + return Promise.new(function(Resolve) + local Disconnect + + Disconnect = self:Connect(function(...) + Disconnect() + Resolve(...) + end) + end) + end + function Signal.Fire(self, ...) + local Current = self.Root + + while Current do + Spawn(Current.Callback, ...) + + Current = Current.Next + end + end + function Signal.DisconnectAll(self) + self.Root = nil + end + + __DARKLUA_BUNDLE_MODULES.k = Signal + end + do + __DARKLUA_BUNDLE_MODULES.l = function(value) + local basicType = type(value) + + if + basicType == "nil" + or basicType == "boolean" + or basicType == "number" + or basicType == "string" + or basicType == "function" + or basicType == "thread" + or basicType == "table" + then + return basicType + end + + local tests = { + { + "Instance", + { + "ClassName", + }, + }, + { + "EnumItem", + { + "EnumType", + "Name", + "Value", + }, + }, + { + "Enum", + { + "GetEnumItems", + }, + }, + { + "Enums", + { + "MembershipType", + }, + }, + { + "RBXScriptSignal", + { + "connect", + "wait", + }, + }, + { + "RBXScriptConnection", + { + "connected", + "disconnect", + }, + }, + { + "TweenInfo", + { + "EasingDirection", + "RepeatCount", + "EasingStyle", + }, + }, + { + "CFrame", + { + "p", + "x", + "y", + "z", + "lookVector", + }, + }, + { + "Vector3", + { + "Lerp", + "unit", + "magnitude", + "x", + "y", + "z", + }, + }, + { + "Vector3int16", + { + "z", + "x", + "y", + }, + }, + { + "Vector2", + { + "unit", + "magnitude", + "x", + "y", + }, + }, + { + "Vector2int16", + { + "x", + "y", + }, + }, + { + "Region3", + { + "CFrame", + "Size", + }, + }, + { + "Region3int16", + { + "Min", + "Max", + }, + }, + { + "Ray", + { + "Origin", + "Direction", + "Unit", + "ClosestPoint", + "Distance", + }, + }, + { + "UDim", + { + "Scale", + "Offset", + }, + }, + { + "Axes", + { + "Z", + "X", + "Y", + }, + }, + { + "UDim2", + { + "X", + "Y", + }, + }, + { + "BrickColor", + { + "Number", + "Name", + "Color", + "r", + "g", + "b", + }, + }, + { + "Color3", + { + "r", + "g", + "b", + }, + }, + { + "Faces", + { + "Right", + "Top", + "Back", + }, + }, + } + + for _, v in ipairs(tests) do + local t, test = v[1], v[2] + local ok, result = pcall(function() + for _, prop in ipairs(test) do + if value[prop] == nil then + return false + end + end + + return true + end) + + if ok and result then + return t + end + end + end + end + do + local Spawn = __DARKLUA_BUNDLE_MODULES.b + local typeof = __DARKLUA_BUNDLE_MODULES.l + + __DARKLUA_BUNDLE_MODULES.m = function() + local Bin = {} + + return function(Item) + table.insert(Bin, Item) + end, function() + for _, Item in ipairs(Bin) do + if typeof(Item) == "Instance" then + Item:Destroy() + elseif typeof(Item) == "RBXScriptConnection" then + Item:disconnect() + elseif typeof(Item) == "function" then + Spawn(Item) + end + end + for i, _ in ipairs(Bin) do + Bin[i] = nil + end + end + end + end + + local Net = __DARKLUA_BUNDLE_MODULES.h + + return { + Server = Net.Server, + Client = Net.Client, + Collection = __DARKLUA_BUNDLE_MODULES.i, + Ratelimit = __DARKLUA_BUNDLE_MODULES.j, + Promise = __DARKLUA_BUNDLE_MODULES.c, + Signal = __DARKLUA_BUNDLE_MODULES.k, + Clock = __DARKLUA_BUNDLE_MODULES.e, + Spawn = __DARKLUA_BUNDLE_MODULES.b, + Bin = __DARKLUA_BUNDLE_MODULES.m, + } + end) + + if not success then + error(result) + end + + return result +end + +return { + Help = function() + return "See https://redblox.dev/ for more information." + end, + Load = Red, +} diff --git a/luau/60595695.luau b/luau/60595695.luau index f9fbe08..398d8ec 100644 --- a/luau/60595695.luau +++ b/luau/60595695.luau @@ -17,6 +17,7 @@ end if sc then sc:RegisterLibrary("Libraries/RbxFusion", "10000001") + sc:RegisterLibrary("Libraries/RbxRed", "10000002") sc:RegisterLibrary("Libraries/RbxGui", "45284430") sc:RegisterLibrary("Libraries/RbxGear", "45374389") -- if game.PlaceId == deepakTestingPlace then From 41ae09feb5662de6d58ac3ad52361afbaf5481b6 Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Sat, 9 Sep 2023 02:05:52 +0100 Subject: [PATCH 14/14] Move globally-used configurations into the root of the repository --- aftman.toml | 3 - dense.json5 | 20 - lines.json5 | 18 - mercury.yml | 9571 --------------------------------------------------- selene.toml | 4 - stylua.toml | 6 - 6 files changed, 9622 deletions(-) delete mode 100644 aftman.toml delete mode 100644 dense.json5 delete mode 100644 lines.json5 delete mode 100644 mercury.yml delete mode 100644 selene.toml delete mode 100644 stylua.toml diff --git a/aftman.toml b/aftman.toml deleted file mode 100644 index fb250cc..0000000 --- a/aftman.toml +++ /dev/null @@ -1,3 +0,0 @@ -[tools] -darklua = "seaofvoices/darklua@0.10.2" -stylua = "JohnnyMorganz/StyLua@0.18.1" diff --git a/dense.json5 b/dense.json5 deleted file mode 100644 index c02edcc..0000000 --- a/dense.json5 +++ /dev/null @@ -1,20 +0,0 @@ -{ - generator: "dense", - rules: [ - "remove_comments", - "remove_spaces", - "remove_compound_assignment", - "group_local_assignment", - // "compute_expression", - "remove_unused_if_branch", - "remove_unused_while", - "remove_empty_do", - // "remove_method_definition", - "remove_function_call_parens", - "filter_after_early_return", - { - rule: "rename_variables", - globals: ["$default", "$roblox"], - }, - ], -} diff --git a/lines.json5 b/lines.json5 deleted file mode 100644 index ce31eb2..0000000 --- a/lines.json5 +++ /dev/null @@ -1,18 +0,0 @@ -{ - rules: [ - "remove_spaces", - "remove_compound_assignment", - "group_local_assignment", - // "compute_expression", - "remove_unused_if_branch", - "remove_unused_while", - "remove_empty_do", - // "remove_method_definition", - "remove_function_call_parens", - "filter_after_early_return", - { - rule: "rename_variables", - globals: ["$default", "$roblox"], - }, - ], -} diff --git a/mercury.yml b/mercury.yml deleted file mode 100644 index 30cb674..0000000 --- a/mercury.yml +++ /dev/null @@ -1,9571 +0,0 @@ -# This file was @generated by generate-roblox-std at 2022-06-17 03:38:33.243546500 +01:00 ---- -base: lua51 -name: mercury -globals: - # Substitutions - _USER_ID: - args: [] - _CREATOR_ID: - args: [] - _SERVER_PORT: - args: [] - _SERVER_PRESENCE_URL: - args: [] - _SERVER_ADDRESS: - args: [] - _PLACE_ID: - args: [] - _IS_STUDIO_JOIN: - args: [] - _MAP_LOCATION: - args: [] - _MAP_LOCATION_EXISTS: - args: [] - _CHAR_APPEARANCE: - args: [] - _SERVER: - args: [] - _CLIENT: - args: [] - - assert: - args: - - type: any - - required: false - type: string - ypcall: - args: - - type: function - - required: false - type: "..." - Axes.new: - args: - - type: "..." - BrickColor.Black: - args: [] - BrickColor.Blue: - args: [] - BrickColor.DarkGray: - args: [] - BrickColor.Gray: - args: [] - BrickColor.Green: - args: [] - BrickColor.Red: - args: [] - BrickColor.White: - args: [] - BrickColor.Yellow: - args: [] - BrickColor.new: - args: - - type: any - - required: false - type: number - - required: false - type: number - BrickColor.palette: - args: - - type: number - BrickColor.random: - args: [] - CFrame.Angles: - args: - - required: false - type: number - - required: false - type: number - - required: false - type: number - CFrame.fromAxisAngle: - args: - - type: - display: Vector3 - - type: number - CFrame.fromEulerAnglesXYZ: - args: - - type: number - - type: number - - type: number - CFrame.fromEulerAnglesYXZ: - args: - - type: number - - type: number - - type: number - CFrame.fromMatrix: - args: - - type: - display: Vector3 - - type: - display: Vector3 - - type: - display: Vector3 - - required: false - type: - display: Vector3 - CFrame.fromOrientation: - args: - - type: number - - type: number - - type: number - CFrame.identity: - property: read-only - CFrame.lookAt: - args: - - type: - display: Vector3 - - type: - display: Vector3 - - required: false - type: - display: Vector3 - CFrame.new: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - Color3.fromHSV: - args: - - type: number - - type: number - - type: number - Color3.fromHex: - args: - - type: string - Color3.fromRGB: - args: - - type: number - - type: number - - type: number - Color3.new: - args: - - required: false - type: number - - required: false - type: number - - required: false - type: number - Color3.toHSV: - args: - - type: - display: Color3 - ColorSequence.new: - args: - - type: any - - required: false - type: - display: Color3 - ColorSequenceKeypoint.new: - args: - - type: number - - type: - display: Color3 - DateTime.fromIsoDate: - args: - - type: string - DateTime.fromLocalTime: - args: - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - DateTime.fromUniversalTime: - args: - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - DateTime.fromUnixTimestamp: - args: - - type: number - DateTime.fromUnixTimestampMillis: - args: - - type: number - DateTime.now: - args: [] - DebuggerManager: - args: [] - DockWidgetPluginGuiInfo.new: - args: - - required: false - type: - display: InitialDockState - - required: false - type: bool - - required: false - type: bool - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - - Enum.UploadSetting.Never: - struct: EnumItem - Enum.PriorityMethod.Ask me first: - struct: EnumItem - - Enum.PriorityMethod.AccumulatedError: - struct: EnumItem - Enum.PhysicsSendMethod.ErrorComputation2: - struct: EnumItem - - Enum.ABTestLoadingStatus.Error: - struct: EnumItem - Enum.ABTestLoadingStatus.GetEnumItems: - args: [] - method: true - Enum.ABTestLoadingStatus.Initialized: - struct: EnumItem - Enum.ABTestLoadingStatus.None: - struct: EnumItem - Enum.ABTestLoadingStatus.Pending: - struct: EnumItem - Enum.ABTestLoadingStatus.ShutOff: - struct: EnumItem - Enum.ABTestLoadingStatus.TimedOut: - struct: EnumItem - Enum.AccessoryType.Back: - struct: EnumItem - Enum.AccessoryType.DressSkirt: - struct: EnumItem - Enum.AccessoryType.Eyebrow: - struct: EnumItem - Enum.AccessoryType.Eyelash: - struct: EnumItem - Enum.AccessoryType.Face: - struct: EnumItem - Enum.AccessoryType.Front: - struct: EnumItem - Enum.AccessoryType.GetEnumItems: - args: [] - method: true - Enum.AccessoryType.Hair: - struct: EnumItem - Enum.AccessoryType.Hat: - struct: EnumItem - Enum.AccessoryType.Jacket: - struct: EnumItem - Enum.AccessoryType.LeftShoe: - struct: EnumItem - Enum.AccessoryType.Neck: - struct: EnumItem - Enum.AccessoryType.Pants: - struct: EnumItem - Enum.AccessoryType.RightShoe: - struct: EnumItem - Enum.AccessoryType.Shirt: - struct: EnumItem - Enum.AccessoryType.Shorts: - struct: EnumItem - Enum.AccessoryType.Shoulder: - struct: EnumItem - Enum.AccessoryType.Sweater: - struct: EnumItem - Enum.AccessoryType.TShirt: - struct: EnumItem - Enum.AccessoryType.Unknown: - struct: EnumItem - Enum.AccessoryType.Waist: - struct: EnumItem - Enum.ActionType.Draw: - struct: EnumItem - Enum.ActionType.GetEnumItems: - args: [] - method: true - Enum.ActionType.Lose: - struct: EnumItem - Enum.ActionType.Nothing: - struct: EnumItem - Enum.ActionType.Pause: - struct: EnumItem - Enum.ActionType.Win: - struct: EnumItem - Enum.ActuatorRelativeTo.Attachment0: - struct: EnumItem - Enum.ActuatorRelativeTo.Attachment1: - struct: EnumItem - Enum.ActuatorRelativeTo.GetEnumItems: - args: [] - method: true - Enum.ActuatorRelativeTo.World: - struct: EnumItem - Enum.ActuatorType.GetEnumItems: - args: [] - method: true - Enum.ActuatorType.Motor: - struct: EnumItem - Enum.ActuatorType.None: - struct: EnumItem - Enum.ActuatorType.Servo: - struct: EnumItem - Enum.AdornCullingMode.Automatic: - struct: EnumItem - Enum.AdornCullingMode.GetEnumItems: - args: [] - method: true - Enum.AdornCullingMode.Never: - struct: EnumItem - Enum.AlignType.GetEnumItems: - args: [] - method: true - Enum.AlignType.Parallel: - struct: EnumItem - Enum.AlignType.Perpendicular: - struct: EnumItem - Enum.AlphaMode.GetEnumItems: - args: [] - method: true - Enum.AlphaMode.Overlay: - struct: EnumItem - Enum.AlphaMode.Transparency: - struct: EnumItem - Enum.AnalyticsEconomyAction.Acquire: - struct: EnumItem - Enum.AnalyticsEconomyAction.Default: - struct: EnumItem - Enum.AnalyticsEconomyAction.GetEnumItems: - args: [] - method: true - Enum.AnalyticsEconomyAction.Spend: - struct: EnumItem - Enum.AnalyticsLogLevel.Debug: - struct: EnumItem - Enum.AnalyticsLogLevel.Error: - struct: EnumItem - Enum.AnalyticsLogLevel.Fatal: - struct: EnumItem - Enum.AnalyticsLogLevel.GetEnumItems: - args: [] - method: true - Enum.AnalyticsLogLevel.Information: - struct: EnumItem - Enum.AnalyticsLogLevel.Trace: - struct: EnumItem - Enum.AnalyticsLogLevel.Warning: - struct: EnumItem - Enum.AnalyticsProgressionStatus.Abandon: - struct: EnumItem - Enum.AnalyticsProgressionStatus.Begin: - struct: EnumItem - Enum.AnalyticsProgressionStatus.Complete: - struct: EnumItem - Enum.AnalyticsProgressionStatus.Default: - struct: EnumItem - Enum.AnalyticsProgressionStatus.Fail: - struct: EnumItem - Enum.AnalyticsProgressionStatus.GetEnumItems: - args: [] - method: true - Enum.AnimationPriority.Action: - struct: EnumItem - Enum.AnimationPriority.Action2: - struct: EnumItem - Enum.AnimationPriority.Action3: - struct: EnumItem - Enum.AnimationPriority.Action4: - struct: EnumItem - Enum.AnimationPriority.Core: - struct: EnumItem - Enum.AnimationPriority.GetEnumItems: - args: [] - method: true - Enum.AnimationPriority.Idle: - struct: EnumItem - Enum.AnimationPriority.Movement: - struct: EnumItem - Enum.AnimatorRetargetingMode.Default: - struct: EnumItem - Enum.AnimatorRetargetingMode.Disabled: - struct: EnumItem - Enum.AnimatorRetargetingMode.Enabled: - struct: EnumItem - Enum.AnimatorRetargetingMode.GetEnumItems: - args: [] - method: true - Enum.AppShellActionType.AvatarEditorPageLoaded: - struct: EnumItem - Enum.AppShellActionType.GamePageLoaded: - struct: EnumItem - Enum.AppShellActionType.GetEnumItems: - args: [] - method: true - Enum.AppShellActionType.HomePageLoaded: - struct: EnumItem - Enum.AppShellActionType.None: - struct: EnumItem - Enum.AppShellActionType.OpenApp: - struct: EnumItem - Enum.AppShellActionType.ReadConversation: - struct: EnumItem - Enum.AppShellActionType.TapAvatarTab: - struct: EnumItem - Enum.AppShellActionType.TapChatTab: - struct: EnumItem - Enum.AppShellActionType.TapConversationEntry: - struct: EnumItem - Enum.AppShellActionType.TapGamePageTab: - struct: EnumItem - Enum.AppShellActionType.TapHomePageTab: - struct: EnumItem - Enum.AppShellFeature.AvatarEditor: - struct: EnumItem - Enum.AppShellFeature.Chat: - struct: EnumItem - Enum.AppShellFeature.GamePage: - struct: EnumItem - Enum.AppShellFeature.GetEnumItems: - args: [] - method: true - Enum.AppShellFeature.HomePage: - struct: EnumItem - Enum.AppShellFeature.Landing: - struct: EnumItem - Enum.AppShellFeature.More: - struct: EnumItem - Enum.AppShellFeature.None: - struct: EnumItem - Enum.AppUpdateStatus.Available: - struct: EnumItem - Enum.AppUpdateStatus.Failed: - struct: EnumItem - Enum.AppUpdateStatus.GetEnumItems: - args: [] - method: true - Enum.AppUpdateStatus.NotAvailable: - struct: EnumItem - Enum.AppUpdateStatus.NotSupported: - struct: EnumItem - Enum.AppUpdateStatus.Unknown: - struct: EnumItem - Enum.ApplyStrokeMode.Border: - struct: EnumItem - Enum.ApplyStrokeMode.Contextual: - struct: EnumItem - Enum.ApplyStrokeMode.GetEnumItems: - args: [] - method: true - Enum.AspectType.FitWithinMaxSize: - struct: EnumItem - Enum.AspectType.GetEnumItems: - args: [] - method: true - Enum.AspectType.ScaleWithParentSize: - struct: EnumItem - Enum.AssetFetchStatus.Failure: - struct: EnumItem - Enum.AssetFetchStatus.GetEnumItems: - args: [] - method: true - Enum.AssetFetchStatus.Success: - struct: EnumItem - Enum.AssetType.Animation: - struct: EnumItem - Enum.AssetType.Audio: - struct: EnumItem - Enum.AssetType.BackAccessory: - struct: EnumItem - Enum.AssetType.Badge: - struct: EnumItem - Enum.AssetType.ClimbAnimation: - struct: EnumItem - Enum.AssetType.DeathAnimation: - struct: EnumItem - Enum.AssetType.Decal: - struct: EnumItem - Enum.AssetType.DressSkirtAccessory: - struct: EnumItem - Enum.AssetType.EarAccessory: - struct: EnumItem - Enum.AssetType.EmoteAnimation: - struct: EnumItem - Enum.AssetType.EyeAccessory: - struct: EnumItem - Enum.AssetType.EyebrowAccessory: - struct: EnumItem - Enum.AssetType.EyelashAccessory: - struct: EnumItem - Enum.AssetType.Face: - struct: EnumItem - Enum.AssetType.FaceAccessory: - struct: EnumItem - Enum.AssetType.FallAnimation: - struct: EnumItem - Enum.AssetType.FrontAccessory: - struct: EnumItem - Enum.AssetType.GamePass: - struct: EnumItem - Enum.AssetType.Gear: - struct: EnumItem - Enum.AssetType.GetEnumItems: - args: [] - method: true - Enum.AssetType.HairAccessory: - struct: EnumItem - Enum.AssetType.Hat: - struct: EnumItem - Enum.AssetType.Head: - struct: EnumItem - Enum.AssetType.IdleAnimation: - struct: EnumItem - Enum.AssetType.Image: - struct: EnumItem - Enum.AssetType.JacketAccessory: - struct: EnumItem - Enum.AssetType.JumpAnimation: - struct: EnumItem - Enum.AssetType.LeftArm: - struct: EnumItem - Enum.AssetType.LeftLeg: - struct: EnumItem - Enum.AssetType.LeftShoeAccessory: - struct: EnumItem - Enum.AssetType.Lua: - struct: EnumItem - Enum.AssetType.Mesh: - struct: EnumItem - Enum.AssetType.MeshPart: - struct: EnumItem - Enum.AssetType.Model: - struct: EnumItem - Enum.AssetType.NeckAccessory: - struct: EnumItem - Enum.AssetType.Package: - struct: EnumItem - Enum.AssetType.Pants: - struct: EnumItem - Enum.AssetType.PantsAccessory: - struct: EnumItem - Enum.AssetType.Place: - struct: EnumItem - Enum.AssetType.Plugin: - struct: EnumItem - Enum.AssetType.PoseAnimation: - struct: EnumItem - Enum.AssetType.RightArm: - struct: EnumItem - Enum.AssetType.RightLeg: - struct: EnumItem - Enum.AssetType.RightShoeAccessory: - struct: EnumItem - Enum.AssetType.RunAnimation: - struct: EnumItem - Enum.AssetType.Shirt: - struct: EnumItem - Enum.AssetType.ShirtAccessory: - struct: EnumItem - Enum.AssetType.ShortsAccessory: - struct: EnumItem - Enum.AssetType.ShoulderAccessory: - struct: EnumItem - Enum.AssetType.SweaterAccessory: - struct: EnumItem - Enum.AssetType.SwimAnimation: - struct: EnumItem - Enum.AssetType.TShirt: - struct: EnumItem - Enum.AssetType.TShirtAccessory: - struct: EnumItem - Enum.AssetType.Torso: - struct: EnumItem - Enum.AssetType.Video: - struct: EnumItem - Enum.AssetType.WaistAccessory: - struct: EnumItem - Enum.AssetType.WalkAnimation: - struct: EnumItem - Enum.AssetTypeVerification.Always: - struct: EnumItem - Enum.AssetTypeVerification.ClientOnly: - struct: EnumItem - Enum.AssetTypeVerification.Default: - struct: EnumItem - Enum.AssetTypeVerification.GetEnumItems: - args: [] - method: true - Enum.AutoIndentRule.Absolute: - struct: EnumItem - Enum.AutoIndentRule.GetEnumItems: - args: [] - method: true - Enum.AutoIndentRule.Off: - struct: EnumItem - Enum.AutoIndentRule.Relative: - struct: EnumItem - Enum.AutomaticSize.GetEnumItems: - args: [] - method: true - Enum.AutomaticSize.None: - struct: EnumItem - Enum.AutomaticSize.X: - struct: EnumItem - Enum.AutomaticSize.XY: - struct: EnumItem - Enum.AutomaticSize.Y: - struct: EnumItem - Enum.AvatarAssetType.BackAccessory: - struct: EnumItem - Enum.AvatarAssetType.ClimbAnimation: - struct: EnumItem - Enum.AvatarAssetType.DressSkirtAccessory: - struct: EnumItem - Enum.AvatarAssetType.EmoteAnimation: - struct: EnumItem - Enum.AvatarAssetType.EyebrowAccessory: - struct: EnumItem - Enum.AvatarAssetType.EyelashAccessory: - struct: EnumItem - Enum.AvatarAssetType.Face: - struct: EnumItem - Enum.AvatarAssetType.FaceAccessory: - struct: EnumItem - Enum.AvatarAssetType.FallAnimation: - struct: EnumItem - Enum.AvatarAssetType.FrontAccessory: - struct: EnumItem - Enum.AvatarAssetType.Gear: - struct: EnumItem - Enum.AvatarAssetType.GetEnumItems: - args: [] - method: true - Enum.AvatarAssetType.HairAccessory: - struct: EnumItem - Enum.AvatarAssetType.Hat: - struct: EnumItem - Enum.AvatarAssetType.Head: - struct: EnumItem - Enum.AvatarAssetType.IdleAnimation: - struct: EnumItem - Enum.AvatarAssetType.JacketAccessory: - struct: EnumItem - Enum.AvatarAssetType.JumpAnimation: - struct: EnumItem - Enum.AvatarAssetType.LeftArm: - struct: EnumItem - Enum.AvatarAssetType.LeftLeg: - struct: EnumItem - Enum.AvatarAssetType.LeftShoeAccessory: - struct: EnumItem - Enum.AvatarAssetType.NeckAccessory: - struct: EnumItem - Enum.AvatarAssetType.Pants: - struct: EnumItem - Enum.AvatarAssetType.PantsAccessory: - struct: EnumItem - Enum.AvatarAssetType.RightArm: - struct: EnumItem - Enum.AvatarAssetType.RightLeg: - struct: EnumItem - Enum.AvatarAssetType.RightShoeAccessory: - struct: EnumItem - Enum.AvatarAssetType.RunAnimation: - struct: EnumItem - Enum.AvatarAssetType.Shirt: - struct: EnumItem - Enum.AvatarAssetType.ShirtAccessory: - struct: EnumItem - Enum.AvatarAssetType.ShortsAccessory: - struct: EnumItem - Enum.AvatarAssetType.ShoulderAccessory: - struct: EnumItem - Enum.AvatarAssetType.SweaterAccessory: - struct: EnumItem - Enum.AvatarAssetType.SwimAnimation: - struct: EnumItem - Enum.AvatarAssetType.TShirt: - struct: EnumItem - Enum.AvatarAssetType.TShirtAccessory: - struct: EnumItem - Enum.AvatarAssetType.Torso: - struct: EnumItem - Enum.AvatarAssetType.WaistAccessory: - struct: EnumItem - Enum.AvatarAssetType.WalkAnimation: - struct: EnumItem - Enum.AvatarContextMenuOption.Chat: - struct: EnumItem - Enum.AvatarContextMenuOption.Emote: - struct: EnumItem - Enum.AvatarContextMenuOption.Friend: - struct: EnumItem - Enum.AvatarContextMenuOption.GetEnumItems: - args: [] - method: true - Enum.AvatarContextMenuOption.InspectMenu: - struct: EnumItem - Enum.AvatarItemType.Asset: - struct: EnumItem - Enum.AvatarItemType.Bundle: - struct: EnumItem - Enum.AvatarItemType.GetEnumItems: - args: [] - method: true - Enum.AvatarPromptResult.Failed: - struct: EnumItem - Enum.AvatarPromptResult.GetEnumItems: - args: [] - method: true - Enum.AvatarPromptResult.PermissionDenied: - struct: EnumItem - Enum.AvatarPromptResult.Success: - struct: EnumItem - Enum.Axis.GetEnumItems: - args: [] - method: true - Enum.Axis.X: - struct: EnumItem - Enum.Axis.Y: - struct: EnumItem - Enum.Axis.Z: - struct: EnumItem - Enum.BinType.Clone: - struct: EnumItem - Enum.BinType.GameTool: - struct: EnumItem - Enum.BinType.GetEnumItems: - args: [] - method: true - Enum.BinType.Grab: - struct: EnumItem - Enum.BinType.Hammer: - struct: EnumItem - Enum.BinType.Script: - struct: EnumItem - Enum.BodyPart.GetEnumItems: - args: [] - method: true - Enum.BodyPart.Head: - struct: EnumItem - Enum.BodyPart.LeftArm: - struct: EnumItem - Enum.BodyPart.LeftLeg: - struct: EnumItem - Enum.BodyPart.RightArm: - struct: EnumItem - Enum.BodyPart.RightLeg: - struct: EnumItem - Enum.BodyPart.Torso: - struct: EnumItem - Enum.BodyPartR15.GetEnumItems: - args: [] - method: true - Enum.BodyPartR15.Head: - struct: EnumItem - Enum.BodyPartR15.LeftFoot: - struct: EnumItem - Enum.BodyPartR15.LeftHand: - struct: EnumItem - Enum.BodyPartR15.LeftLowerArm: - struct: EnumItem - Enum.BodyPartR15.LeftLowerLeg: - struct: EnumItem - Enum.BodyPartR15.LeftUpperArm: - struct: EnumItem - Enum.BodyPartR15.LeftUpperLeg: - struct: EnumItem - Enum.BodyPartR15.LowerTorso: - struct: EnumItem - Enum.BodyPartR15.RightFoot: - struct: EnumItem - Enum.BodyPartR15.RightHand: - struct: EnumItem - Enum.BodyPartR15.RightLowerArm: - struct: EnumItem - Enum.BodyPartR15.RightLowerLeg: - struct: EnumItem - Enum.BodyPartR15.RightUpperArm: - struct: EnumItem - Enum.BodyPartR15.RightUpperLeg: - struct: EnumItem - Enum.BodyPartR15.RootPart: - struct: EnumItem - Enum.BodyPartR15.Unknown: - struct: EnumItem - Enum.BodyPartR15.UpperTorso: - struct: EnumItem - Enum.BorderMode.GetEnumItems: - args: [] - method: true - Enum.BorderMode.Inset: - struct: EnumItem - Enum.BorderMode.Middle: - struct: EnumItem - Enum.BorderMode.Outline: - struct: EnumItem - Enum.BreakReason.Error: - struct: EnumItem - Enum.BreakReason.GetEnumItems: - args: [] - method: true - Enum.BreakReason.Other: - struct: EnumItem - Enum.BreakReason.SpecialBreakpoint: - struct: EnumItem - Enum.BreakReason.UserBreakpoint: - struct: EnumItem - Enum.BreakpointRemoveReason.GetEnumItems: - args: [] - method: true - Enum.BreakpointRemoveReason.Requested: - struct: EnumItem - Enum.BreakpointRemoveReason.ScriptChanged: - struct: EnumItem - Enum.BreakpointRemoveReason.ScriptRemoved: - struct: EnumItem - Enum.BulkMoveMode.FireAllEvents: - struct: EnumItem - Enum.BulkMoveMode.FireCFrameChanged: - struct: EnumItem - Enum.BulkMoveMode.GetEnumItems: - args: [] - method: true - Enum.BundleType.Animations: - struct: EnumItem - Enum.BundleType.BodyParts: - struct: EnumItem - Enum.BundleType.GetEnumItems: - args: [] - method: true - Enum.BundleType.Shoes: - struct: EnumItem - Enum.Button.Dismount: - struct: EnumItem - Enum.Button.GetEnumItems: - args: [] - method: true - Enum.Button.Jump: - struct: EnumItem - Enum.ButtonStyle.Custom: - struct: EnumItem - Enum.ButtonStyle.GetEnumItems: - args: [] - method: true - Enum.ButtonStyle.RobloxButton: - struct: EnumItem - Enum.ButtonStyle.RobloxButtonDefault: - struct: EnumItem - Enum.ButtonStyle.RobloxRoundButton: - struct: EnumItem - Enum.ButtonStyle.RobloxRoundDefaultButton: - struct: EnumItem - Enum.ButtonStyle.RobloxRoundDropdownButton: - struct: EnumItem - Enum.CageType.GetEnumItems: - args: [] - method: true - Enum.CageType.Inner: - struct: EnumItem - Enum.CageType.Outer: - struct: EnumItem - Enum.CameraMode.Classic: - struct: EnumItem - Enum.CameraMode.GetEnumItems: - args: [] - method: true - Enum.CameraMode.LockFirstPerson: - struct: EnumItem - Enum.CameraPanMode.Classic: - struct: EnumItem - Enum.CameraPanMode.EdgeBump: - struct: EnumItem - Enum.CameraPanMode.GetEnumItems: - args: [] - method: true - Enum.CameraType.Attach: - struct: EnumItem - Enum.CameraType.Custom: - struct: EnumItem - Enum.CameraType.Fixed: - struct: EnumItem - Enum.CameraType.Follow: - struct: EnumItem - Enum.CameraType.GetEnumItems: - args: [] - method: true - Enum.CameraType.Orbital: - struct: EnumItem - Enum.CameraType.Scriptable: - struct: EnumItem - Enum.CameraType.Track: - struct: EnumItem - Enum.CameraType.Watch: - struct: EnumItem - Enum.CatalogCategoryFilter.Collectibles: - struct: EnumItem - Enum.CatalogCategoryFilter.CommunityCreations: - struct: EnumItem - Enum.CatalogCategoryFilter.Featured: - struct: EnumItem - Enum.CatalogCategoryFilter.GetEnumItems: - args: [] - method: true - Enum.CatalogCategoryFilter.None: - struct: EnumItem - Enum.CatalogCategoryFilter.Premium: - struct: EnumItem - Enum.CatalogCategoryFilter.Recommended: - struct: EnumItem - Enum.CatalogSortType.GetEnumItems: - args: [] - method: true - Enum.CatalogSortType.MostFavorited: - struct: EnumItem - Enum.CatalogSortType.PriceHighToLow: - struct: EnumItem - Enum.CatalogSortType.PriceLowToHigh: - struct: EnumItem - Enum.CatalogSortType.RecentlyUpdated: - struct: EnumItem - Enum.CatalogSortType.Relevance: - struct: EnumItem - Enum.CellBlock.CornerWedge: - struct: EnumItem - Enum.CellBlock.GetEnumItems: - args: [] - method: true - Enum.CellBlock.HorizontalWedge: - struct: EnumItem - Enum.CellBlock.InverseCornerWedge: - struct: EnumItem - Enum.CellBlock.Solid: - struct: EnumItem - Enum.CellBlock.VerticalWedge: - struct: EnumItem - Enum.CellMaterial.Aluminum: - struct: EnumItem - Enum.CellMaterial.Asphalt: - struct: EnumItem - Enum.CellMaterial.BluePlastic: - struct: EnumItem - Enum.CellMaterial.Brick: - struct: EnumItem - Enum.CellMaterial.Cement: - struct: EnumItem - Enum.CellMaterial.CinderBlock: - struct: EnumItem - Enum.CellMaterial.Empty: - struct: EnumItem - Enum.CellMaterial.GetEnumItems: - args: [] - method: true - Enum.CellMaterial.Gold: - struct: EnumItem - Enum.CellMaterial.Granite: - struct: EnumItem - Enum.CellMaterial.Grass: - struct: EnumItem - Enum.CellMaterial.Gravel: - struct: EnumItem - Enum.CellMaterial.Iron: - struct: EnumItem - Enum.CellMaterial.MossyStone: - struct: EnumItem - Enum.CellMaterial.RedPlastic: - struct: EnumItem - Enum.CellMaterial.Sand: - struct: EnumItem - Enum.CellMaterial.Water: - struct: EnumItem - Enum.CellMaterial.WoodLog: - struct: EnumItem - Enum.CellMaterial.WoodPlank: - struct: EnumItem - Enum.CellOrientation.GetEnumItems: - args: [] - method: true - Enum.CellOrientation.NegX: - struct: EnumItem - Enum.CellOrientation.NegZ: - struct: EnumItem - Enum.CellOrientation.X: - struct: EnumItem - Enum.CellOrientation.Z: - struct: EnumItem - Enum.CenterDialogType.GetEnumItems: - args: [] - method: true - Enum.CenterDialogType.ModalDialog: - struct: EnumItem - Enum.CenterDialogType.PlayerInitiatedDialog: - struct: EnumItem - Enum.CenterDialogType.QuitDialog: - struct: EnumItem - Enum.CenterDialogType.UnsolicitedDialog: - struct: EnumItem - Enum.ChatCallbackType.GetEnumItems: - args: [] - method: true - Enum.ChatCallbackType.OnClientFormattingMessage: - struct: EnumItem - Enum.ChatCallbackType.OnClientSendingMessage: - struct: EnumItem - Enum.ChatCallbackType.OnCreatingChatWindow: - struct: EnumItem - Enum.ChatCallbackType.OnServerReceivingMessage: - struct: EnumItem - Enum.ChatColor.Blue: - struct: EnumItem - Enum.ChatColor.GetEnumItems: - args: [] - method: true - Enum.ChatColor.Green: - struct: EnumItem - Enum.ChatColor.Red: - struct: EnumItem - Enum.ChatColor.White: - struct: EnumItem - Enum.ChatMode.GetEnumItems: - args: [] - method: true - Enum.ChatMode.Menu: - struct: EnumItem - Enum.ChatMode.TextAndMenu: - struct: EnumItem - Enum.ChatPrivacyMode.AllUsers: - struct: EnumItem - Enum.ChatPrivacyMode.Friends: - struct: EnumItem - Enum.ChatPrivacyMode.GetEnumItems: - args: [] - method: true - Enum.ChatPrivacyMode.NoOne: - struct: EnumItem - Enum.ChatStyle.Bubble: - struct: EnumItem - Enum.ChatStyle.Classic: - struct: EnumItem - Enum.ChatStyle.ClassicAndBubble: - struct: EnumItem - Enum.ChatStyle.GetEnumItems: - args: [] - method: true - Enum.ChatVersion.GetEnumItems: - args: [] - method: true - Enum.ChatVersion.LegacyChatService: - struct: EnumItem - Enum.ChatVersion.TextChatService: - struct: EnumItem - Enum.ClientAnimatorThrottlingMode.Default: - struct: EnumItem - Enum.ClientAnimatorThrottlingMode.Disabled: - struct: EnumItem - Enum.ClientAnimatorThrottlingMode.Enabled: - struct: EnumItem - Enum.ClientAnimatorThrottlingMode.GetEnumItems: - args: [] - method: true - Enum.CollisionFidelity.Box: - struct: EnumItem - Enum.CollisionFidelity.Default: - struct: EnumItem - Enum.CollisionFidelity.GetEnumItems: - args: [] - method: true - Enum.CollisionFidelity.Hull: - struct: EnumItem - Enum.CollisionFidelity.PreciseConvexDecomposition: - struct: EnumItem - Enum.CommandPermission.GetEnumItems: - args: [] - method: true - Enum.CommandPermission.LocalUser: - struct: EnumItem - Enum.CommandPermission.Plugin: - struct: EnumItem - Enum.ComputerCameraMovementMode.CameraToggle: - struct: EnumItem - Enum.ComputerCameraMovementMode.Classic: - struct: EnumItem - Enum.ComputerCameraMovementMode.Default: - struct: EnumItem - Enum.ComputerCameraMovementMode.Follow: - struct: EnumItem - Enum.ComputerCameraMovementMode.GetEnumItems: - args: [] - method: true - Enum.ComputerCameraMovementMode.Orbital: - struct: EnumItem - Enum.ComputerMovementMode.ClickToMove: - struct: EnumItem - Enum.ComputerMovementMode.Default: - struct: EnumItem - Enum.ComputerMovementMode.GetEnumItems: - args: [] - method: true - Enum.ComputerMovementMode.KeyboardMouse: - struct: EnumItem - Enum.ConnectionError.DisconnectBadhash: - struct: EnumItem - Enum.ConnectionError.DisconnectBlockedIP: - struct: EnumItem - Enum.ConnectionError.DisconnectBySecurityPolicy: - struct: EnumItem - Enum.ConnectionError.DisconnectClientFailure: - struct: EnumItem - Enum.ConnectionError.DisconnectClientRequest: - struct: EnumItem - Enum.ConnectionError.DisconnectCloudEditKick: - struct: EnumItem - Enum.ConnectionError.DisconnectConnectionLost: - struct: EnumItem - Enum.ConnectionError.DisconnectDevMaintenance: - struct: EnumItem - Enum.ConnectionError.DisconnectDuplicatePlayer: - struct: EnumItem - Enum.ConnectionError.DisconnectDuplicateTicket: - struct: EnumItem - Enum.ConnectionError.DisconnectErrors: - struct: EnumItem - Enum.ConnectionError.DisconnectEvicted: - struct: EnumItem - Enum.ConnectionError.DisconnectHashTimeout: - struct: EnumItem - Enum.ConnectionError.DisconnectIdle: - struct: EnumItem - Enum.ConnectionError.DisconnectIllegalTeleport: - struct: EnumItem - Enum.ConnectionError.DisconnectLuaKick: - struct: EnumItem - Enum.ConnectionError.DisconnectModeratedGame: - struct: EnumItem - Enum.ConnectionError.DisconnectNewSecurityKeyMismatch: - struct: EnumItem - Enum.ConnectionError.DisconnectOnRemoteSysStats: - struct: EnumItem - Enum.ConnectionError.DisconnectOutOfMemory: - struct: EnumItem - Enum.ConnectionError.DisconnectOutOfMemoryExitContinue: - struct: EnumItem - Enum.ConnectionError.DisconnectPlayerless: - struct: EnumItem - Enum.ConnectionError.DisconnectProtocolMismatch: - struct: EnumItem - Enum.ConnectionError.DisconnectRaknetErrors: - struct: EnumItem - Enum.ConnectionError.DisconnectReceivePacketError: - struct: EnumItem - Enum.ConnectionError.DisconnectReceivePacketStreamError: - struct: EnumItem - Enum.ConnectionError.DisconnectRejoin: - struct: EnumItem - Enum.ConnectionError.DisconnectRobloxMaintenance: - struct: EnumItem - Enum.ConnectionError.DisconnectSecurityKeyMismatch: - struct: EnumItem - Enum.ConnectionError.DisconnectSendPacketError: - struct: EnumItem - Enum.ConnectionError.DisconnectTimeout: - struct: EnumItem - Enum.ConnectionError.DisconnectWrongVersion: - struct: EnumItem - Enum.ConnectionError.GetEnumItems: - args: [] - method: true - Enum.ConnectionError.OK: - struct: EnumItem - Enum.ConnectionError.PlacelaunchCustomMessage: - struct: EnumItem - Enum.ConnectionError.PlacelaunchDisabled: - struct: EnumItem - Enum.ConnectionError.PlacelaunchError: - struct: EnumItem - Enum.ConnectionError.PlacelaunchErrors: - struct: EnumItem - Enum.ConnectionError.PlacelaunchFlooded: - struct: EnumItem - Enum.ConnectionError.PlacelaunchGameEnded: - struct: EnumItem - Enum.ConnectionError.PlacelaunchGameFull: - struct: EnumItem - Enum.ConnectionError.PlacelaunchHashException: - struct: EnumItem - Enum.ConnectionError.PlacelaunchHashExpired: - struct: EnumItem - Enum.ConnectionError.PlacelaunchHttpError: - struct: EnumItem - Enum.ConnectionError.PlacelaunchOtherError: - struct: EnumItem - Enum.ConnectionError.PlacelaunchPartyCannotFit: - struct: EnumItem - Enum.ConnectionError.PlacelaunchRestricted: - struct: EnumItem - Enum.ConnectionError.PlacelaunchUnauthorized: - struct: EnumItem - Enum.ConnectionError.PlacelaunchUserLeft: - struct: EnumItem - Enum.ConnectionError.TeleportErrors: - struct: EnumItem - Enum.ConnectionError.TeleportFailure: - struct: EnumItem - Enum.ConnectionError.TeleportFlooded: - struct: EnumItem - Enum.ConnectionError.TeleportGameEnded: - struct: EnumItem - Enum.ConnectionError.TeleportGameFull: - struct: EnumItem - Enum.ConnectionError.TeleportGameNotFound: - struct: EnumItem - Enum.ConnectionError.TeleportIsTeleporting: - struct: EnumItem - Enum.ConnectionError.TeleportUnauthorized: - struct: EnumItem - Enum.ConnectionError.Unknown: - struct: EnumItem - Enum.ConnectionState.Connected: - struct: EnumItem - Enum.ConnectionState.Disconnected: - struct: EnumItem - Enum.ConnectionState.GetEnumItems: - args: [] - method: true - Enum.ContextActionPriority.Default: - struct: EnumItem - Enum.ContextActionPriority.GetEnumItems: - args: [] - method: true - Enum.ContextActionPriority.High: - struct: EnumItem - Enum.ContextActionPriority.Low: - struct: EnumItem - Enum.ContextActionPriority.Medium: - struct: EnumItem - Enum.ContextActionResult.GetEnumItems: - args: [] - method: true - Enum.ContextActionResult.Pass: - struct: EnumItem - Enum.ContextActionResult.Sink: - struct: EnumItem - Enum.ControlMode.Classic: - struct: EnumItem - Enum.ControlMode.GetEnumItems: - args: [] - method: true - Enum.ControlMode.MouseLockSwitch: - struct: EnumItem - Enum.CoreGuiType.All: - struct: EnumItem - Enum.CoreGuiType.Backpack: - struct: EnumItem - Enum.CoreGuiType.Chat: - struct: EnumItem - Enum.CoreGuiType.EmotesMenu: - struct: EnumItem - Enum.CoreGuiType.GetEnumItems: - args: [] - method: true - Enum.CoreGuiType.Health: - struct: EnumItem - Enum.CoreGuiType.PlayerList: - struct: EnumItem - Enum.CreateOutfitFailure.GetEnumItems: - args: [] - method: true - Enum.CreateOutfitFailure.InvalidName: - struct: EnumItem - Enum.CreateOutfitFailure.Other: - struct: EnumItem - Enum.CreateOutfitFailure.OutfitLimitReached: - struct: EnumItem - Enum.CreatorType.GetEnumItems: - args: [] - method: true - Enum.CreatorType.Group: - struct: EnumItem - Enum.CreatorType.User: - struct: EnumItem - Enum.CurrencyType.Default: - struct: EnumItem - Enum.CurrencyType.GetEnumItems: - args: [] - method: true - Enum.CurrencyType.Robux: - struct: EnumItem - Enum.CurrencyType.Tix: - struct: EnumItem - Enum.CustomCameraMode.Classic: - struct: EnumItem - Enum.CustomCameraMode.Default: - struct: EnumItem - Enum.CustomCameraMode.Follow: - struct: EnumItem - Enum.CustomCameraMode.GetEnumItems: - args: [] - method: true - Enum.DataStoreRequestType.GetAsync: - struct: EnumItem - Enum.DataStoreRequestType.GetEnumItems: - args: [] - method: true - Enum.DataStoreRequestType.GetSortedAsync: - struct: EnumItem - Enum.DataStoreRequestType.OnUpdate: - struct: EnumItem - Enum.DataStoreRequestType.SetIncrementAsync: - struct: EnumItem - Enum.DataStoreRequestType.SetIncrementSortedAsync: - struct: EnumItem - Enum.DataStoreRequestType.UpdateAsync: - struct: EnumItem - Enum.DebuggerEndReason.ClientRequest: - struct: EnumItem - Enum.DebuggerEndReason.ConfigurationFailed: - struct: EnumItem - Enum.DebuggerEndReason.Disconnected: - struct: EnumItem - Enum.DebuggerEndReason.GetEnumItems: - args: [] - method: true - Enum.DebuggerEndReason.InvalidHost: - struct: EnumItem - Enum.DebuggerEndReason.RpcError: - struct: EnumItem - Enum.DebuggerEndReason.ServerProtocolMismatch: - struct: EnumItem - Enum.DebuggerEndReason.ServerShutdown: - struct: EnumItem - Enum.DebuggerEndReason.Timeout: - struct: EnumItem - Enum.DebuggerExceptionBreakMode.Always: - struct: EnumItem - Enum.DebuggerExceptionBreakMode.GetEnumItems: - args: [] - method: true - Enum.DebuggerExceptionBreakMode.Never: - struct: EnumItem - Enum.DebuggerExceptionBreakMode.Unhandled: - struct: EnumItem - Enum.DebuggerFrameType.C: - struct: EnumItem - Enum.DebuggerFrameType.GetEnumItems: - args: [] - method: true - Enum.DebuggerFrameType.Lua: - struct: EnumItem - Enum.DebuggerPauseReason.Breakpoint: - struct: EnumItem - Enum.DebuggerPauseReason.Entrypoint: - struct: EnumItem - Enum.DebuggerPauseReason.Exception: - struct: EnumItem - Enum.DebuggerPauseReason.GetEnumItems: - args: [] - method: true - Enum.DebuggerPauseReason.Requested: - struct: EnumItem - Enum.DebuggerPauseReason.SingleStep: - struct: EnumItem - Enum.DebuggerPauseReason.Unknown: - struct: EnumItem - Enum.DebuggerStatus.ConnectionClosed: - struct: EnumItem - Enum.DebuggerStatus.ConnectionLost: - struct: EnumItem - Enum.DebuggerStatus.GetEnumItems: - args: [] - method: true - Enum.DebuggerStatus.InternalError: - struct: EnumItem - Enum.DebuggerStatus.InvalidArgument: - struct: EnumItem - Enum.DebuggerStatus.InvalidResponse: - struct: EnumItem - Enum.DebuggerStatus.InvalidState: - struct: EnumItem - Enum.DebuggerStatus.RpcError: - struct: EnumItem - Enum.DebuggerStatus.Success: - struct: EnumItem - Enum.DebuggerStatus.Timeout: - struct: EnumItem - Enum.DevCameraOcclusionMode.GetEnumItems: - args: [] - method: true - Enum.DevCameraOcclusionMode.Invisicam: - struct: EnumItem - Enum.DevCameraOcclusionMode.Zoom: - struct: EnumItem - Enum.DevComputerCameraMovementMode.CameraToggle: - struct: EnumItem - Enum.DevComputerCameraMovementMode.Classic: - struct: EnumItem - Enum.DevComputerCameraMovementMode.Follow: - struct: EnumItem - Enum.DevComputerCameraMovementMode.GetEnumItems: - args: [] - method: true - Enum.DevComputerCameraMovementMode.Orbital: - struct: EnumItem - Enum.DevComputerCameraMovementMode.UserChoice: - struct: EnumItem - Enum.DevComputerMovementMode.ClickToMove: - struct: EnumItem - Enum.DevComputerMovementMode.GetEnumItems: - args: [] - method: true - Enum.DevComputerMovementMode.KeyboardMouse: - struct: EnumItem - Enum.DevComputerMovementMode.Scriptable: - struct: EnumItem - Enum.DevComputerMovementMode.UserChoice: - struct: EnumItem - Enum.DevTouchCameraMovementMode.Classic: - struct: EnumItem - Enum.DevTouchCameraMovementMode.Follow: - struct: EnumItem - Enum.DevTouchCameraMovementMode.GetEnumItems: - args: [] - method: true - Enum.DevTouchCameraMovementMode.Orbital: - struct: EnumItem - Enum.DevTouchCameraMovementMode.UserChoice: - struct: EnumItem - Enum.DevTouchMovementMode.ClickToMove: - struct: EnumItem - Enum.DevTouchMovementMode.DPad: - struct: EnumItem - Enum.DevTouchMovementMode.DynamicThumbstick: - struct: EnumItem - Enum.DevTouchMovementMode.GetEnumItems: - args: [] - method: true - Enum.DevTouchMovementMode.Scriptable: - struct: EnumItem - Enum.DevTouchMovementMode.Thumbpad: - struct: EnumItem - Enum.DevTouchMovementMode.Thumbstick: - struct: EnumItem - Enum.DevTouchMovementMode.UserChoice: - struct: EnumItem - Enum.DeveloperMemoryTag.Animation: - struct: EnumItem - Enum.DeveloperMemoryTag.GeometryCSG: - struct: EnumItem - Enum.DeveloperMemoryTag.GetEnumItems: - args: [] - method: true - Enum.DeveloperMemoryTag.GraphicsMeshParts: - struct: EnumItem - Enum.DeveloperMemoryTag.GraphicsParticles: - struct: EnumItem - Enum.DeveloperMemoryTag.GraphicsParts: - struct: EnumItem - Enum.DeveloperMemoryTag.GraphicsSolidModels: - struct: EnumItem - Enum.DeveloperMemoryTag.GraphicsSpatialHash: - struct: EnumItem - Enum.DeveloperMemoryTag.GraphicsTerrain: - struct: EnumItem - Enum.DeveloperMemoryTag.GraphicsTexture: - struct: EnumItem - Enum.DeveloperMemoryTag.GraphicsTextureCharacter: - struct: EnumItem - Enum.DeveloperMemoryTag.Gui: - struct: EnumItem - Enum.DeveloperMemoryTag.HttpCache: - struct: EnumItem - Enum.DeveloperMemoryTag.Instances: - struct: EnumItem - Enum.DeveloperMemoryTag.Internal: - struct: EnumItem - Enum.DeveloperMemoryTag.LuaHeap: - struct: EnumItem - Enum.DeveloperMemoryTag.Navigation: - struct: EnumItem - Enum.DeveloperMemoryTag.PhysicsCollision: - struct: EnumItem - Enum.DeveloperMemoryTag.PhysicsParts: - struct: EnumItem - Enum.DeveloperMemoryTag.Script: - struct: EnumItem - Enum.DeveloperMemoryTag.Signals: - struct: EnumItem - Enum.DeveloperMemoryTag.Sounds: - struct: EnumItem - Enum.DeveloperMemoryTag.StreamingSounds: - struct: EnumItem - Enum.DeveloperMemoryTag.TerrainVoxels: - struct: EnumItem - Enum.DeviceType.Desktop: - struct: EnumItem - Enum.DeviceType.GetEnumItems: - args: [] - method: true - Enum.DeviceType.Phone: - struct: EnumItem - Enum.DeviceType.Tablet: - struct: EnumItem - Enum.DeviceType.Unknown: - struct: EnumItem - Enum.DialogBehaviorType.GetEnumItems: - args: [] - method: true - Enum.DialogBehaviorType.MultiplePlayers: - struct: EnumItem - Enum.DialogBehaviorType.SinglePlayer: - struct: EnumItem - Enum.DialogPurpose.GetEnumItems: - args: [] - method: true - Enum.DialogPurpose.Help: - struct: EnumItem - Enum.DialogPurpose.Quest: - struct: EnumItem - Enum.DialogPurpose.Shop: - struct: EnumItem - Enum.DialogTone.Enemy: - struct: EnumItem - Enum.DialogTone.Friendly: - struct: EnumItem - Enum.DialogTone.GetEnumItems: - args: [] - method: true - Enum.DialogTone.Neutral: - struct: EnumItem - Enum.DominantAxis.GetEnumItems: - args: [] - method: true - Enum.DominantAxis.Height: - struct: EnumItem - Enum.DominantAxis.Width: - struct: EnumItem - Enum.DraftStatusCode.DraftCommitted: - struct: EnumItem - Enum.DraftStatusCode.DraftOutdated: - struct: EnumItem - Enum.DraftStatusCode.GetEnumItems: - args: [] - method: true - Enum.DraftStatusCode.OK: - struct: EnumItem - Enum.DraftStatusCode.ScriptRemoved: - struct: EnumItem - Enum.DraggerCoordinateSpace.GetEnumItems: - args: [] - method: true - Enum.DraggerCoordinateSpace.Object: - struct: EnumItem - Enum.DraggerCoordinateSpace.World: - struct: EnumItem - Enum.DraggerMovementMode.Geometric: - struct: EnumItem - Enum.DraggerMovementMode.GetEnumItems: - args: [] - method: true - Enum.DraggerMovementMode.Physical: - struct: EnumItem - Enum.EasingDirection.GetEnumItems: - args: [] - method: true - Enum.EasingDirection.In: - struct: EnumItem - Enum.EasingDirection.InOut: - struct: EnumItem - Enum.EasingDirection.Out: - struct: EnumItem - Enum.EasingStyle.Back: - struct: EnumItem - Enum.EasingStyle.Bounce: - struct: EnumItem - Enum.EasingStyle.Circular: - struct: EnumItem - Enum.EasingStyle.Cubic: - struct: EnumItem - Enum.EasingStyle.Elastic: - struct: EnumItem - Enum.EasingStyle.Exponential: - struct: EnumItem - Enum.EasingStyle.GetEnumItems: - args: [] - method: true - Enum.EasingStyle.Linear: - struct: EnumItem - Enum.EasingStyle.Quad: - struct: EnumItem - Enum.EasingStyle.Quart: - struct: EnumItem - Enum.EasingStyle.Quint: - struct: EnumItem - Enum.EasingStyle.Sine: - struct: EnumItem - Enum.ElasticBehavior.Always: - struct: EnumItem - Enum.ElasticBehavior.GetEnumItems: - args: [] - method: true - Enum.ElasticBehavior.Never: - struct: EnumItem - Enum.ElasticBehavior.WhenScrollable: - struct: EnumItem - Enum.EnviromentalPhysicsThrottle.Always: - struct: EnumItem - Enum.EnviromentalPhysicsThrottle.DefaultAuto: - struct: EnumItem - Enum.EnviromentalPhysicsThrottle.Disabled: - struct: EnumItem - Enum.EnviromentalPhysicsThrottle.GetEnumItems: - args: [] - method: true - Enum.EnviromentalPhysicsThrottle.Skip16: - struct: EnumItem - Enum.EnviromentalPhysicsThrottle.Skip2: - struct: EnumItem - Enum.EnviromentalPhysicsThrottle.Skip4: - struct: EnumItem - Enum.EnviromentalPhysicsThrottle.Skip8: - struct: EnumItem - Enum.ExplosionType.Craters: - struct: EnumItem - Enum.ExplosionType.GetEnumItems: - args: [] - method: true - Enum.ExplosionType.NoCraters: - struct: EnumItem - Enum.FieldOfViewMode.Diagonal: - struct: EnumItem - Enum.FieldOfViewMode.GetEnumItems: - args: [] - method: true - Enum.FieldOfViewMode.MaxAxis: - struct: EnumItem - Enum.FieldOfViewMode.Vertical: - struct: EnumItem - Enum.FillDirection.GetEnumItems: - args: [] - method: true - Enum.FillDirection.Horizontal: - struct: EnumItem - Enum.FillDirection.Vertical: - struct: EnumItem - Enum.FilterResult.Accepted: - struct: EnumItem - Enum.FilterResult.GetEnumItems: - args: [] - method: true - Enum.FilterResult.Rejected: - struct: EnumItem - Enum.Font.AmaticSC: - struct: EnumItem - Enum.Font.Antique: - struct: EnumItem - Enum.Font.Arcade: - struct: EnumItem - Enum.Font.Arial: - struct: EnumItem - Enum.Font.ArialBold: - struct: EnumItem - Enum.Font.Bangers: - struct: EnumItem - Enum.Font.Bodoni: - struct: EnumItem - Enum.Font.Cartoon: - struct: EnumItem - Enum.Font.Code: - struct: EnumItem - Enum.Font.Creepster: - struct: EnumItem - Enum.Font.DenkOne: - struct: EnumItem - Enum.Font.Fantasy: - struct: EnumItem - Enum.Font.Fondamento: - struct: EnumItem - Enum.Font.FredokaOne: - struct: EnumItem - Enum.Font.Garamond: - struct: EnumItem - Enum.Font.GetEnumItems: - args: [] - method: true - Enum.Font.Gotham: - struct: EnumItem - Enum.Font.GothamBlack: - struct: EnumItem - Enum.Font.GothamBold: - struct: EnumItem - Enum.Font.GothamMedium: - struct: EnumItem - Enum.Font.GrenzeGotisch: - struct: EnumItem - Enum.Font.Highway: - struct: EnumItem - Enum.Font.IndieFlower: - struct: EnumItem - Enum.Font.JosefinSans: - struct: EnumItem - Enum.Font.Jura: - struct: EnumItem - Enum.Font.Kalam: - struct: EnumItem - Enum.Font.Legacy: - struct: EnumItem - Enum.Font.LuckiestGuy: - struct: EnumItem - Enum.Font.Merriweather: - struct: EnumItem - Enum.Font.Michroma: - struct: EnumItem - Enum.Font.Nunito: - struct: EnumItem - Enum.Font.Oswald: - struct: EnumItem - Enum.Font.PatrickHand: - struct: EnumItem - Enum.Font.PermanentMarker: - struct: EnumItem - Enum.Font.Roboto: - struct: EnumItem - Enum.Font.RobotoCondensed: - struct: EnumItem - Enum.Font.RobotoMono: - struct: EnumItem - Enum.Font.Sarpanch: - struct: EnumItem - Enum.Font.SciFi: - struct: EnumItem - Enum.Font.SourceSans: - struct: EnumItem - Enum.Font.SourceSansBold: - struct: EnumItem - Enum.Font.SourceSansItalic: - struct: EnumItem - Enum.Font.SourceSansLight: - struct: EnumItem - Enum.Font.SourceSansSemibold: - struct: EnumItem - Enum.Font.SpecialElite: - struct: EnumItem - Enum.Font.TitilliumWeb: - struct: EnumItem - Enum.Font.Ubuntu: - struct: EnumItem - Enum.Font.Unknown: - struct: EnumItem - Enum.FontSize.GetEnumItems: - args: [] - method: true - Enum.FontSize.Size10: - struct: EnumItem - Enum.FontSize.Size11: - struct: EnumItem - Enum.FontSize.Size12: - struct: EnumItem - Enum.FontSize.Size14: - struct: EnumItem - Enum.FontSize.Size18: - struct: EnumItem - Enum.FontSize.Size24: - struct: EnumItem - Enum.FontSize.Size28: - struct: EnumItem - Enum.FontSize.Size32: - struct: EnumItem - Enum.FontSize.Size36: - struct: EnumItem - Enum.FontSize.Size42: - struct: EnumItem - Enum.FontSize.Size48: - struct: EnumItem - Enum.FontSize.Size60: - struct: EnumItem - Enum.FontSize.Size8: - struct: EnumItem - Enum.FontSize.Size9: - struct: EnumItem - Enum.FontSize.Size96: - struct: EnumItem - Enum.FontStyle.GetEnumItems: - args: [] - method: true - Enum.FontStyle.Italic: - struct: EnumItem - Enum.FontStyle.Normal: - struct: EnumItem - Enum.FontWeight.Bold: - struct: EnumItem - Enum.FontWeight.ExtraBold: - struct: EnumItem - Enum.FontWeight.ExtraLight: - struct: EnumItem - Enum.FontWeight.GetEnumItems: - args: [] - method: true - Enum.FontWeight.Heavy: - struct: EnumItem - Enum.FontWeight.Light: - struct: EnumItem - Enum.FontWeight.Medium: - struct: EnumItem - Enum.FontWeight.Regular: - struct: EnumItem - Enum.FontWeight.SemiBold: - struct: EnumItem - Enum.FontWeight.Thin: - struct: EnumItem - Enum.FormFactor.Brick: - struct: EnumItem - Enum.FormFactor.Custom: - struct: EnumItem - Enum.FormFactor.GetEnumItems: - args: [] - method: true - Enum.FormFactor.Plate: - struct: EnumItem - Enum.FormFactor.Symmetric: - struct: EnumItem - Enum.FrameStyle.ChatBlue: - struct: EnumItem - Enum.FrameStyle.ChatGreen: - struct: EnumItem - Enum.FrameStyle.ChatRed: - struct: EnumItem - Enum.FrameStyle.Custom: - struct: EnumItem - Enum.FrameStyle.DropShadow: - struct: EnumItem - Enum.FrameStyle.GetEnumItems: - args: [] - method: true - Enum.FrameStyle.RobloxRound: - struct: EnumItem - Enum.FrameStyle.RobloxSquare: - struct: EnumItem - Enum.FramerateManagerMode.Automatic: - struct: EnumItem - Enum.FramerateManagerMode.GetEnumItems: - args: [] - method: true - Enum.FramerateManagerMode.Off: - struct: EnumItem - Enum.FramerateManagerMode.On: - struct: EnumItem - Enum.FriendRequestEvent.Accept: - struct: EnumItem - Enum.FriendRequestEvent.Deny: - struct: EnumItem - Enum.FriendRequestEvent.GetEnumItems: - args: [] - method: true - Enum.FriendRequestEvent.Issue: - struct: EnumItem - Enum.FriendRequestEvent.Revoke: - struct: EnumItem - Enum.FriendStatus.Friend: - struct: EnumItem - Enum.FriendStatus.FriendRequestReceived: - struct: EnumItem - Enum.FriendStatus.FriendRequestSent: - struct: EnumItem - Enum.FriendStatus.GetEnumItems: - args: [] - method: true - Enum.FriendStatus.NotFriend: - struct: EnumItem - Enum.FriendStatus.Unknown: - struct: EnumItem - Enum.FunctionalTestResult.Error: - struct: EnumItem - Enum.FunctionalTestResult.GetEnumItems: - args: [] - method: true - Enum.FunctionalTestResult.Passed: - struct: EnumItem - Enum.FunctionalTestResult.Warning: - struct: EnumItem - Enum.GameAvatarType.GetEnumItems: - args: [] - method: true - Enum.GameAvatarType.PlayerChoice: - struct: EnumItem - Enum.GameAvatarType.R15: - struct: EnumItem - Enum.GameAvatarType.R6: - struct: EnumItem - Enum.GearGenreSetting.AllGenres: - struct: EnumItem - Enum.GearGenreSetting.GetEnumItems: - args: [] - method: true - Enum.GearGenreSetting.MatchingGenreOnly: - struct: EnumItem - Enum.GearType.BuildingTools: - struct: EnumItem - Enum.GearType.Explosives: - struct: EnumItem - Enum.GearType.GetEnumItems: - args: [] - method: true - Enum.GearType.MeleeWeapons: - struct: EnumItem - Enum.GearType.MusicalInstruments: - struct: EnumItem - Enum.GearType.NavigationEnhancers: - struct: EnumItem - Enum.GearType.PowerUps: - struct: EnumItem - Enum.GearType.RangedWeapons: - struct: EnumItem - Enum.GearType.SocialItems: - struct: EnumItem - Enum.GearType.Transport: - struct: EnumItem - Enum.Genre.Adventure: - struct: EnumItem - Enum.Genre.All: - struct: EnumItem - Enum.Genre.Fantasy: - struct: EnumItem - Enum.Genre.Funny: - struct: EnumItem - Enum.Genre.GetEnumItems: - args: [] - method: true - Enum.Genre.Ninja: - struct: EnumItem - Enum.Genre.Pirate: - struct: EnumItem - Enum.Genre.Scary: - struct: EnumItem - Enum.Genre.SciFi: - struct: EnumItem - Enum.Genre.SkatePark: - struct: EnumItem - Enum.Genre.Sports: - struct: EnumItem - Enum.Genre.TownAndCity: - struct: EnumItem - Enum.Genre.Tutorial: - struct: EnumItem - Enum.Genre.War: - struct: EnumItem - Enum.Genre.WildWest: - struct: EnumItem - Enum.GetEnums: - args: [] - method: true - Enum.GraphicsMode.Automatic: - struct: EnumItem - Enum.GraphicsMode.Direct3D11: - struct: EnumItem - Enum.GraphicsMode.GetEnumItems: - args: [] - method: true - Enum.GraphicsMode.Metal: - struct: EnumItem - Enum.GraphicsMode.NoGraphics: - struct: EnumItem - Enum.GraphicsMode.OpenGL: - struct: EnumItem - Enum.GraphicsMode.Vulkan: - struct: EnumItem - Enum.HandlesStyle.GetEnumItems: - args: [] - method: true - Enum.HandlesStyle.Movement: - struct: EnumItem - Enum.HandlesStyle.Resize: - struct: EnumItem - Enum.HighlightDepthMode.AlwaysOnTop: - struct: EnumItem - Enum.HighlightDepthMode.GetEnumItems: - args: [] - method: true - Enum.HighlightDepthMode.Occluded: - struct: EnumItem - Enum.HorizontalAlignment.Center: - struct: EnumItem - Enum.HorizontalAlignment.GetEnumItems: - args: [] - method: true - Enum.HorizontalAlignment.Left: - struct: EnumItem - Enum.HorizontalAlignment.Right: - struct: EnumItem - Enum.HoverAnimateSpeed.Fast: - struct: EnumItem - Enum.HoverAnimateSpeed.GetEnumItems: - args: [] - method: true - Enum.HoverAnimateSpeed.Medium: - struct: EnumItem - Enum.HoverAnimateSpeed.Slow: - struct: EnumItem - Enum.HoverAnimateSpeed.VeryFast: - struct: EnumItem - Enum.HoverAnimateSpeed.VerySlow: - struct: EnumItem - Enum.HttpCachePolicy.DataOnly: - struct: EnumItem - Enum.HttpCachePolicy.Default: - struct: EnumItem - Enum.HttpCachePolicy.Full: - struct: EnumItem - Enum.HttpCachePolicy.GetEnumItems: - args: [] - method: true - Enum.HttpCachePolicy.InternalRedirectRefresh: - struct: EnumItem - Enum.HttpCachePolicy.None: - struct: EnumItem - Enum.HttpContentType.ApplicationJson: - struct: EnumItem - Enum.HttpContentType.ApplicationUrlEncoded: - struct: EnumItem - Enum.HttpContentType.ApplicationXml: - struct: EnumItem - Enum.HttpContentType.GetEnumItems: - args: [] - method: true - Enum.HttpContentType.TextPlain: - struct: EnumItem - Enum.HttpContentType.TextXml: - struct: EnumItem - Enum.HttpError.Aborted: - struct: EnumItem - Enum.HttpError.ConnectFail: - struct: EnumItem - Enum.HttpError.DnsResolve: - struct: EnumItem - Enum.HttpError.GetEnumItems: - args: [] - method: true - Enum.HttpError.InvalidRedirect: - struct: EnumItem - Enum.HttpError.InvalidUrl: - struct: EnumItem - Enum.HttpError.NetFail: - struct: EnumItem - Enum.HttpError.OK: - struct: EnumItem - Enum.HttpError.OutOfMemory: - struct: EnumItem - Enum.HttpError.SslConnectFail: - struct: EnumItem - Enum.HttpError.SslVerificationFail: - struct: EnumItem - Enum.HttpError.TimedOut: - struct: EnumItem - Enum.HttpError.TooManyRedirects: - struct: EnumItem - Enum.HttpError.Unknown: - struct: EnumItem - Enum.HttpRequestType.Analytics: - struct: EnumItem - Enum.HttpRequestType.Avatar: - struct: EnumItem - Enum.HttpRequestType.Chat: - struct: EnumItem - Enum.HttpRequestType.Default: - struct: EnumItem - Enum.HttpRequestType.GetEnumItems: - args: [] - method: true - Enum.HttpRequestType.Localization: - struct: EnumItem - Enum.HttpRequestType.MarketplaceService: - struct: EnumItem - Enum.HttpRequestType.Players: - struct: EnumItem - Enum.HumanoidCollisionType.GetEnumItems: - args: [] - method: true - Enum.HumanoidCollisionType.InnerBox: - struct: EnumItem - Enum.HumanoidCollisionType.OuterBox: - struct: EnumItem - Enum.HumanoidDisplayDistanceType.GetEnumItems: - args: [] - method: true - Enum.HumanoidDisplayDistanceType.None: - struct: EnumItem - Enum.HumanoidDisplayDistanceType.Subject: - struct: EnumItem - Enum.HumanoidDisplayDistanceType.Viewer: - struct: EnumItem - Enum.HumanoidHealthDisplayType.AlwaysOff: - struct: EnumItem - Enum.HumanoidHealthDisplayType.AlwaysOn: - struct: EnumItem - Enum.HumanoidHealthDisplayType.DisplayWhenDamaged: - struct: EnumItem - Enum.HumanoidHealthDisplayType.GetEnumItems: - args: [] - method: true - Enum.HumanoidOnlySetCollisionsOnStateChange.Default: - struct: EnumItem - Enum.HumanoidOnlySetCollisionsOnStateChange.Disabled: - struct: EnumItem - Enum.HumanoidOnlySetCollisionsOnStateChange.Enabled: - struct: EnumItem - Enum.HumanoidOnlySetCollisionsOnStateChange.GetEnumItems: - args: [] - method: true - Enum.HumanoidRigType.GetEnumItems: - args: [] - method: true - Enum.HumanoidRigType.R15: - struct: EnumItem - Enum.HumanoidRigType.R6: - struct: EnumItem - Enum.HumanoidStateType.Climbing: - struct: EnumItem - Enum.HumanoidStateType.Dead: - struct: EnumItem - Enum.HumanoidStateType.FallingDown: - struct: EnumItem - Enum.HumanoidStateType.Flying: - struct: EnumItem - Enum.HumanoidStateType.Freefall: - struct: EnumItem - Enum.HumanoidStateType.GetEnumItems: - args: [] - method: true - Enum.HumanoidStateType.GettingUp: - struct: EnumItem - Enum.HumanoidStateType.Jumping: - struct: EnumItem - Enum.HumanoidStateType.Landed: - struct: EnumItem - Enum.HumanoidStateType.None: - struct: EnumItem - Enum.HumanoidStateType.Physics: - struct: EnumItem - Enum.HumanoidStateType.PlatformStanding: - struct: EnumItem - Enum.HumanoidStateType.Ragdoll: - struct: EnumItem - Enum.HumanoidStateType.Running: - struct: EnumItem - Enum.HumanoidStateType.RunningNoPhysics: - struct: EnumItem - Enum.HumanoidStateType.Seated: - struct: EnumItem - Enum.HumanoidStateType.StrafingNoPhysics: - struct: EnumItem - Enum.HumanoidStateType.Swimming: - struct: EnumItem - Enum.IKCollisionsMode.GetEnumItems: - args: [] - method: true - Enum.IKCollisionsMode.IncludeContactedMechanisms: - struct: EnumItem - Enum.IKCollisionsMode.NoCollisions: - struct: EnumItem - Enum.IKCollisionsMode.OtherMechanismsAnchored: - struct: EnumItem - Enum.IXPLoadingStatus.ErrorConnection: - struct: EnumItem - Enum.IXPLoadingStatus.ErrorInvalidUser: - struct: EnumItem - Enum.IXPLoadingStatus.ErrorJsonParse: - struct: EnumItem - Enum.IXPLoadingStatus.ErrorTimedOut: - struct: EnumItem - Enum.IXPLoadingStatus.GetEnumItems: - args: [] - method: true - Enum.IXPLoadingStatus.Initialized: - struct: EnumItem - Enum.IXPLoadingStatus.None: - struct: EnumItem - Enum.IXPLoadingStatus.Pending: - struct: EnumItem - Enum.IXPLoadingStatus.ShutOff: - struct: EnumItem - Enum.InOut.Center: - struct: EnumItem - Enum.InOut.Edge: - struct: EnumItem - Enum.InOut.GetEnumItems: - args: [] - method: true - Enum.InOut.Inset: - struct: EnumItem - Enum.InfoType.Asset: - struct: EnumItem - Enum.InfoType.Bundle: - struct: EnumItem - Enum.InfoType.GamePass: - struct: EnumItem - Enum.InfoType.GetEnumItems: - args: [] - method: true - Enum.InfoType.Product: - struct: EnumItem - Enum.InfoType.Subscription: - struct: EnumItem - Enum.InitialDockState.Bottom: - struct: EnumItem - Enum.InitialDockState.Float: - struct: EnumItem - Enum.InitialDockState.GetEnumItems: - args: [] - method: true - Enum.InitialDockState.Left: - struct: EnumItem - Enum.InitialDockState.Right: - struct: EnumItem - Enum.InitialDockState.Top: - struct: EnumItem - Enum.InputType.Constant: - struct: EnumItem - Enum.InputType.GetEnumItems: - args: [] - method: true - Enum.InputType.NoInput: - struct: EnumItem - Enum.InputType.Sin: - struct: EnumItem - Enum.InterpolationThrottlingMode.Default: - struct: EnumItem - Enum.InterpolationThrottlingMode.Disabled: - struct: EnumItem - Enum.InterpolationThrottlingMode.Enabled: - struct: EnumItem - Enum.InterpolationThrottlingMode.GetEnumItems: - args: [] - method: true - Enum.JointCreationMode.All: - struct: EnumItem - Enum.JointCreationMode.GetEnumItems: - args: [] - method: true - Enum.JointCreationMode.None: - struct: EnumItem - Enum.JointCreationMode.Surface: - struct: EnumItem - Enum.KeyCode.A: - struct: EnumItem - Enum.KeyCode.Ampersand: - struct: EnumItem - Enum.KeyCode.Asterisk: - struct: EnumItem - Enum.KeyCode.At: - struct: EnumItem - Enum.KeyCode.B: - struct: EnumItem - Enum.KeyCode.BackSlash: - struct: EnumItem - Enum.KeyCode.Backquote: - struct: EnumItem - Enum.KeyCode.Backspace: - struct: EnumItem - Enum.KeyCode.Break: - struct: EnumItem - Enum.KeyCode.ButtonA: - struct: EnumItem - Enum.KeyCode.ButtonB: - struct: EnumItem - Enum.KeyCode.ButtonL1: - struct: EnumItem - Enum.KeyCode.ButtonL2: - struct: EnumItem - Enum.KeyCode.ButtonL3: - struct: EnumItem - Enum.KeyCode.ButtonR1: - struct: EnumItem - Enum.KeyCode.ButtonR2: - struct: EnumItem - Enum.KeyCode.ButtonR3: - struct: EnumItem - Enum.KeyCode.ButtonSelect: - struct: EnumItem - Enum.KeyCode.ButtonStart: - struct: EnumItem - Enum.KeyCode.ButtonX: - struct: EnumItem - Enum.KeyCode.ButtonY: - struct: EnumItem - Enum.KeyCode.C: - struct: EnumItem - Enum.KeyCode.CapsLock: - struct: EnumItem - Enum.KeyCode.Caret: - struct: EnumItem - Enum.KeyCode.Clear: - struct: EnumItem - Enum.KeyCode.Colon: - struct: EnumItem - Enum.KeyCode.Comma: - struct: EnumItem - Enum.KeyCode.Compose: - struct: EnumItem - Enum.KeyCode.D: - struct: EnumItem - Enum.KeyCode.DPadDown: - struct: EnumItem - Enum.KeyCode.DPadLeft: - struct: EnumItem - Enum.KeyCode.DPadRight: - struct: EnumItem - Enum.KeyCode.DPadUp: - struct: EnumItem - Enum.KeyCode.Delete: - struct: EnumItem - Enum.KeyCode.Dollar: - struct: EnumItem - Enum.KeyCode.Down: - struct: EnumItem - Enum.KeyCode.E: - struct: EnumItem - Enum.KeyCode.Eight: - struct: EnumItem - Enum.KeyCode.End: - struct: EnumItem - Enum.KeyCode.Equals: - struct: EnumItem - Enum.KeyCode.Escape: - struct: EnumItem - Enum.KeyCode.Euro: - struct: EnumItem - Enum.KeyCode.F: - struct: EnumItem - Enum.KeyCode.F1: - struct: EnumItem - Enum.KeyCode.F10: - struct: EnumItem - Enum.KeyCode.F11: - struct: EnumItem - Enum.KeyCode.F12: - struct: EnumItem - Enum.KeyCode.F13: - struct: EnumItem - Enum.KeyCode.F14: - struct: EnumItem - Enum.KeyCode.F15: - struct: EnumItem - Enum.KeyCode.F2: - struct: EnumItem - Enum.KeyCode.F3: - struct: EnumItem - Enum.KeyCode.F4: - struct: EnumItem - Enum.KeyCode.F5: - struct: EnumItem - Enum.KeyCode.F6: - struct: EnumItem - Enum.KeyCode.F7: - struct: EnumItem - Enum.KeyCode.F8: - struct: EnumItem - Enum.KeyCode.F9: - struct: EnumItem - Enum.KeyCode.Five: - struct: EnumItem - Enum.KeyCode.Four: - struct: EnumItem - Enum.KeyCode.G: - struct: EnumItem - Enum.KeyCode.GetEnumItems: - args: [] - method: true - Enum.KeyCode.GreaterThan: - struct: EnumItem - Enum.KeyCode.H: - struct: EnumItem - Enum.KeyCode.Hash: - struct: EnumItem - Enum.KeyCode.Help: - struct: EnumItem - Enum.KeyCode.Home: - struct: EnumItem - Enum.KeyCode.I: - struct: EnumItem - Enum.KeyCode.Insert: - struct: EnumItem - Enum.KeyCode.J: - struct: EnumItem - Enum.KeyCode.K: - struct: EnumItem - Enum.KeyCode.KeypadDivide: - struct: EnumItem - Enum.KeyCode.KeypadEight: - struct: EnumItem - Enum.KeyCode.KeypadEnter: - struct: EnumItem - Enum.KeyCode.KeypadEquals: - struct: EnumItem - Enum.KeyCode.KeypadFive: - struct: EnumItem - Enum.KeyCode.KeypadFour: - struct: EnumItem - Enum.KeyCode.KeypadMinus: - struct: EnumItem - Enum.KeyCode.KeypadMultiply: - struct: EnumItem - Enum.KeyCode.KeypadNine: - struct: EnumItem - Enum.KeyCode.KeypadOne: - struct: EnumItem - Enum.KeyCode.KeypadPeriod: - struct: EnumItem - Enum.KeyCode.KeypadPlus: - struct: EnumItem - Enum.KeyCode.KeypadSeven: - struct: EnumItem - Enum.KeyCode.KeypadSix: - struct: EnumItem - Enum.KeyCode.KeypadThree: - struct: EnumItem - Enum.KeyCode.KeypadTwo: - struct: EnumItem - Enum.KeyCode.KeypadZero: - struct: EnumItem - Enum.KeyCode.L: - struct: EnumItem - Enum.KeyCode.Left: - struct: EnumItem - Enum.KeyCode.LeftAlt: - struct: EnumItem - Enum.KeyCode.LeftBracket: - struct: EnumItem - Enum.KeyCode.LeftControl: - struct: EnumItem - Enum.KeyCode.LeftCurly: - struct: EnumItem - Enum.KeyCode.LeftMeta: - struct: EnumItem - Enum.KeyCode.LeftParenthesis: - struct: EnumItem - Enum.KeyCode.LeftShift: - struct: EnumItem - Enum.KeyCode.LeftSuper: - struct: EnumItem - Enum.KeyCode.LessThan: - struct: EnumItem - Enum.KeyCode.M: - struct: EnumItem - Enum.KeyCode.Menu: - struct: EnumItem - Enum.KeyCode.Minus: - struct: EnumItem - Enum.KeyCode.Mode: - struct: EnumItem - Enum.KeyCode.N: - struct: EnumItem - Enum.KeyCode.Nine: - struct: EnumItem - Enum.KeyCode.NumLock: - struct: EnumItem - Enum.KeyCode.O: - struct: EnumItem - Enum.KeyCode.One: - struct: EnumItem - Enum.KeyCode.P: - struct: EnumItem - Enum.KeyCode.PageDown: - struct: EnumItem - Enum.KeyCode.PageUp: - struct: EnumItem - Enum.KeyCode.Pause: - struct: EnumItem - Enum.KeyCode.Percent: - struct: EnumItem - Enum.KeyCode.Period: - struct: EnumItem - Enum.KeyCode.Pipe: - struct: EnumItem - Enum.KeyCode.Plus: - struct: EnumItem - Enum.KeyCode.Power: - struct: EnumItem - Enum.KeyCode.Print: - struct: EnumItem - Enum.KeyCode.Q: - struct: EnumItem - Enum.KeyCode.Question: - struct: EnumItem - Enum.KeyCode.Quote: - struct: EnumItem - Enum.KeyCode.QuotedDouble: - struct: EnumItem - Enum.KeyCode.R: - struct: EnumItem - Enum.KeyCode.Return: - struct: EnumItem - Enum.KeyCode.Right: - struct: EnumItem - Enum.KeyCode.RightAlt: - struct: EnumItem - Enum.KeyCode.RightBracket: - struct: EnumItem - Enum.KeyCode.RightControl: - struct: EnumItem - Enum.KeyCode.RightCurly: - struct: EnumItem - Enum.KeyCode.RightMeta: - struct: EnumItem - Enum.KeyCode.RightParenthesis: - struct: EnumItem - Enum.KeyCode.RightShift: - struct: EnumItem - Enum.KeyCode.RightSuper: - struct: EnumItem - Enum.KeyCode.S: - struct: EnumItem - Enum.KeyCode.ScrollLock: - struct: EnumItem - Enum.KeyCode.Semicolon: - struct: EnumItem - Enum.KeyCode.Seven: - struct: EnumItem - Enum.KeyCode.Six: - struct: EnumItem - Enum.KeyCode.Slash: - struct: EnumItem - Enum.KeyCode.Space: - struct: EnumItem - Enum.KeyCode.SysReq: - struct: EnumItem - Enum.KeyCode.T: - struct: EnumItem - Enum.KeyCode.Tab: - struct: EnumItem - Enum.KeyCode.Three: - struct: EnumItem - Enum.KeyCode.Thumbstick1: - struct: EnumItem - Enum.KeyCode.Thumbstick2: - struct: EnumItem - Enum.KeyCode.Tilde: - struct: EnumItem - Enum.KeyCode.Two: - struct: EnumItem - Enum.KeyCode.U: - struct: EnumItem - Enum.KeyCode.Underscore: - struct: EnumItem - Enum.KeyCode.Undo: - struct: EnumItem - Enum.KeyCode.Unknown: - struct: EnumItem - Enum.KeyCode.Up: - struct: EnumItem - Enum.KeyCode.V: - struct: EnumItem - Enum.KeyCode.W: - struct: EnumItem - Enum.KeyCode.World0: - struct: EnumItem - Enum.KeyCode.World1: - struct: EnumItem - Enum.KeyCode.World10: - struct: EnumItem - Enum.KeyCode.World11: - struct: EnumItem - Enum.KeyCode.World12: - struct: EnumItem - Enum.KeyCode.World13: - struct: EnumItem - Enum.KeyCode.World14: - struct: EnumItem - Enum.KeyCode.World15: - struct: EnumItem - Enum.KeyCode.World16: - struct: EnumItem - Enum.KeyCode.World17: - struct: EnumItem - Enum.KeyCode.World18: - struct: EnumItem - Enum.KeyCode.World19: - struct: EnumItem - Enum.KeyCode.World2: - struct: EnumItem - Enum.KeyCode.World20: - struct: EnumItem - Enum.KeyCode.World21: - struct: EnumItem - Enum.KeyCode.World22: - struct: EnumItem - Enum.KeyCode.World23: - struct: EnumItem - Enum.KeyCode.World24: - struct: EnumItem - Enum.KeyCode.World25: - struct: EnumItem - Enum.KeyCode.World26: - struct: EnumItem - Enum.KeyCode.World27: - struct: EnumItem - Enum.KeyCode.World28: - struct: EnumItem - Enum.KeyCode.World29: - struct: EnumItem - Enum.KeyCode.World3: - struct: EnumItem - Enum.KeyCode.World30: - struct: EnumItem - Enum.KeyCode.World31: - struct: EnumItem - Enum.KeyCode.World32: - struct: EnumItem - Enum.KeyCode.World33: - struct: EnumItem - Enum.KeyCode.World34: - struct: EnumItem - Enum.KeyCode.World35: - struct: EnumItem - Enum.KeyCode.World36: - struct: EnumItem - Enum.KeyCode.World37: - struct: EnumItem - Enum.KeyCode.World38: - struct: EnumItem - Enum.KeyCode.World39: - struct: EnumItem - Enum.KeyCode.World4: - struct: EnumItem - Enum.KeyCode.World40: - struct: EnumItem - Enum.KeyCode.World41: - struct: EnumItem - Enum.KeyCode.World42: - struct: EnumItem - Enum.KeyCode.World43: - struct: EnumItem - Enum.KeyCode.World44: - struct: EnumItem - Enum.KeyCode.World45: - struct: EnumItem - Enum.KeyCode.World46: - struct: EnumItem - Enum.KeyCode.World47: - struct: EnumItem - Enum.KeyCode.World48: - struct: EnumItem - Enum.KeyCode.World49: - struct: EnumItem - Enum.KeyCode.World5: - struct: EnumItem - Enum.KeyCode.World50: - struct: EnumItem - Enum.KeyCode.World51: - struct: EnumItem - Enum.KeyCode.World52: - struct: EnumItem - Enum.KeyCode.World53: - struct: EnumItem - Enum.KeyCode.World54: - struct: EnumItem - Enum.KeyCode.World55: - struct: EnumItem - Enum.KeyCode.World56: - struct: EnumItem - Enum.KeyCode.World57: - struct: EnumItem - Enum.KeyCode.World58: - struct: EnumItem - Enum.KeyCode.World59: - struct: EnumItem - Enum.KeyCode.World6: - struct: EnumItem - Enum.KeyCode.World60: - struct: EnumItem - Enum.KeyCode.World61: - struct: EnumItem - Enum.KeyCode.World62: - struct: EnumItem - Enum.KeyCode.World63: - struct: EnumItem - Enum.KeyCode.World64: - struct: EnumItem - Enum.KeyCode.World65: - struct: EnumItem - Enum.KeyCode.World66: - struct: EnumItem - Enum.KeyCode.World67: - struct: EnumItem - Enum.KeyCode.World68: - struct: EnumItem - Enum.KeyCode.World69: - struct: EnumItem - Enum.KeyCode.World7: - struct: EnumItem - Enum.KeyCode.World70: - struct: EnumItem - Enum.KeyCode.World71: - struct: EnumItem - Enum.KeyCode.World72: - struct: EnumItem - Enum.KeyCode.World73: - struct: EnumItem - Enum.KeyCode.World74: - struct: EnumItem - Enum.KeyCode.World75: - struct: EnumItem - Enum.KeyCode.World76: - struct: EnumItem - Enum.KeyCode.World77: - struct: EnumItem - Enum.KeyCode.World78: - struct: EnumItem - Enum.KeyCode.World79: - struct: EnumItem - Enum.KeyCode.World8: - struct: EnumItem - Enum.KeyCode.World80: - struct: EnumItem - Enum.KeyCode.World81: - struct: EnumItem - Enum.KeyCode.World82: - struct: EnumItem - Enum.KeyCode.World83: - struct: EnumItem - Enum.KeyCode.World84: - struct: EnumItem - Enum.KeyCode.World85: - struct: EnumItem - Enum.KeyCode.World86: - struct: EnumItem - Enum.KeyCode.World87: - struct: EnumItem - Enum.KeyCode.World88: - struct: EnumItem - Enum.KeyCode.World89: - struct: EnumItem - Enum.KeyCode.World9: - struct: EnumItem - Enum.KeyCode.World90: - struct: EnumItem - Enum.KeyCode.World91: - struct: EnumItem - Enum.KeyCode.World92: - struct: EnumItem - Enum.KeyCode.World93: - struct: EnumItem - Enum.KeyCode.World94: - struct: EnumItem - Enum.KeyCode.World95: - struct: EnumItem - Enum.KeyCode.X: - struct: EnumItem - Enum.KeyCode.Y: - struct: EnumItem - Enum.KeyCode.Z: - struct: EnumItem - Enum.KeyCode.Zero: - struct: EnumItem - Enum.KeyInterpolationMode.Constant: - struct: EnumItem - Enum.KeyInterpolationMode.Cubic: - struct: EnumItem - Enum.KeyInterpolationMode.GetEnumItems: - args: [] - method: true - Enum.KeyInterpolationMode.Linear: - struct: EnumItem - Enum.KeywordFilterType.Exclude: - struct: EnumItem - Enum.KeywordFilterType.GetEnumItems: - args: [] - method: true - Enum.KeywordFilterType.Include: - struct: EnumItem - Enum.LSPMethodType.CancelRequest: - struct: EnumItem - Enum.LSPMethodType.Completion: - struct: EnumItem - Enum.LSPMethodType.Declaration: - struct: EnumItem - Enum.LSPMethodType.DocumentSymbols: - struct: EnumItem - Enum.LSPMethodType.GetEnumItems: - args: [] - method: true - Enum.LSPMethodType.Initialize: - struct: EnumItem - Enum.LSPMethodType.Initialized: - struct: EnumItem - Enum.LSPMethodType.Roblox_findColor3: - struct: EnumItem - Enum.LSPMethodType.Roblox_findExecutablePosition: - struct: EnumItem - Enum.LSPMethodType.Roblox_patchSnippetData: - struct: EnumItem - Enum.LSPMethodType.Roblox_registerSyntaxCategories: - struct: EnumItem - Enum.LSPMethodType.Roblox_signalQuiescence: - struct: EnumItem - Enum.LSPMethodType.Roblox_suggestExtraSelections: - struct: EnumItem - Enum.LSPMethodType.Roblox_syntaxHighlight: - struct: EnumItem - Enum.LSPMethodType.ShutdownRequest: - struct: EnumItem - Enum.LSPMethodType.TextDocument_didChange: - struct: EnumItem - Enum.LSPMethodType.TextDocument_didClose: - struct: EnumItem - Enum.LSPMethodType.TextDocument_didOpen: - struct: EnumItem - Enum.LSPMethodType.TextDocument_foldingRange: - struct: EnumItem - Enum.LSPMethodType.TextDocument_formatting: - struct: EnumItem - Enum.LSPMethodType.TextDocument_hover: - struct: EnumItem - Enum.LSPMethodType.TextDocument_onTypeFormatting: - struct: EnumItem - Enum.LSPMethodType.TextDocument_publishDiagnostics: - struct: EnumItem - Enum.LSPMethodType.TextDocument_rangeFormatting: - struct: EnumItem - Enum.LSPMethodType.TextDocument_signatureHelp: - struct: EnumItem - Enum.LSPMethodType.Window_showMessage: - struct: EnumItem - Enum.LSPMethodType.Window_showMessageRequest: - struct: EnumItem - Enum.LSPMethodType.Workspace_DidChangeConfiguration: - struct: EnumItem - Enum.Language.Default: - struct: EnumItem - Enum.Language.GetEnumItems: - args: [] - method: true - Enum.LeftRight.Center: - struct: EnumItem - Enum.LeftRight.GetEnumItems: - args: [] - method: true - Enum.LeftRight.Left: - struct: EnumItem - Enum.LeftRight.Right: - struct: EnumItem - Enum.LevelOfDetailSetting.GetEnumItems: - args: [] - method: true - Enum.LevelOfDetailSetting.High: - struct: EnumItem - Enum.LevelOfDetailSetting.Low: - struct: EnumItem - Enum.LevelOfDetailSetting.Medium: - struct: EnumItem - Enum.Limb.GetEnumItems: - args: [] - method: true - Enum.Limb.Head: - struct: EnumItem - Enum.Limb.LeftArm: - struct: EnumItem - Enum.Limb.LeftLeg: - struct: EnumItem - Enum.Limb.RightArm: - struct: EnumItem - Enum.Limb.RightLeg: - struct: EnumItem - Enum.Limb.Torso: - struct: EnumItem - Enum.Limb.Unknown: - struct: EnumItem - Enum.LineJoinMode.Bevel: - struct: EnumItem - Enum.LineJoinMode.GetEnumItems: - args: [] - method: true - Enum.LineJoinMode.Miter: - struct: EnumItem - Enum.LineJoinMode.Round: - struct: EnumItem - Enum.ListDisplayMode.GetEnumItems: - args: [] - method: true - Enum.ListDisplayMode.Horizontal: - struct: EnumItem - Enum.ListDisplayMode.Vertical: - struct: EnumItem - Enum.ListenerType.CFrame: - struct: EnumItem - Enum.ListenerType.Camera: - struct: EnumItem - Enum.ListenerType.GetEnumItems: - args: [] - method: true - Enum.ListenerType.ObjectCFrame: - struct: EnumItem - Enum.ListenerType.ObjectPosition: - struct: EnumItem - Enum.LoadCharacterLayeredClothing.Default: - struct: EnumItem - Enum.LoadCharacterLayeredClothing.Disabled: - struct: EnumItem - Enum.LoadCharacterLayeredClothing.Enabled: - struct: EnumItem - Enum.LoadCharacterLayeredClothing.GetEnumItems: - args: [] - method: true - Enum.Material.Air: - struct: EnumItem - Enum.Material.Asphalt: - struct: EnumItem - Enum.Material.Basalt: - struct: EnumItem - Enum.Material.Brick: - struct: EnumItem - Enum.Material.Cobblestone: - struct: EnumItem - Enum.Material.Concrete: - struct: EnumItem - Enum.Material.CorrodedMetal: - struct: EnumItem - Enum.Material.CrackedLava: - struct: EnumItem - Enum.Material.DiamondPlate: - struct: EnumItem - Enum.Material.Fabric: - struct: EnumItem - Enum.Material.Foil: - struct: EnumItem - Enum.Material.ForceField: - struct: EnumItem - Enum.Material.GetEnumItems: - args: [] - method: true - Enum.Material.Glacier: - struct: EnumItem - Enum.Material.Glass: - struct: EnumItem - Enum.Material.Granite: - struct: EnumItem - Enum.Material.Grass: - struct: EnumItem - Enum.Material.Ground: - struct: EnumItem - Enum.Material.Ice: - struct: EnumItem - Enum.Material.LeafyGrass: - struct: EnumItem - Enum.Material.Limestone: - struct: EnumItem - Enum.Material.Marble: - struct: EnumItem - Enum.Material.Metal: - struct: EnumItem - Enum.Material.Mud: - struct: EnumItem - Enum.Material.Neon: - struct: EnumItem - Enum.Material.Pavement: - struct: EnumItem - Enum.Material.Pebble: - struct: EnumItem - Enum.Material.Plastic: - struct: EnumItem - Enum.Material.Rock: - struct: EnumItem - Enum.Material.Salt: - struct: EnumItem - Enum.Material.Sand: - struct: EnumItem - Enum.Material.Sandstone: - struct: EnumItem - Enum.Material.Slate: - struct: EnumItem - Enum.Material.SmoothPlastic: - struct: EnumItem - Enum.Material.Snow: - struct: EnumItem - Enum.Material.Water: - struct: EnumItem - Enum.Material.Wood: - struct: EnumItem - Enum.Material.WoodPlanks: - struct: EnumItem - Enum.MaterialPattern.GetEnumItems: - args: [] - method: true - Enum.MaterialPattern.Organic: - struct: EnumItem - Enum.MaterialPattern.Regular: - struct: EnumItem - Enum.MembershipType.BuildersClub: - struct: EnumItem - Enum.MembershipType.GetEnumItems: - args: [] - method: true - Enum.MembershipType.None: - struct: EnumItem - Enum.MembershipType.OutrageousBuildersClub: - struct: EnumItem - Enum.MembershipType.Premium: - struct: EnumItem - Enum.MembershipType.TurboBuildersClub: - struct: EnumItem - Enum.MembershipType._MEMBERSHIP_TYPE: - struct: EnumItem - Enum.MeshPartDetailLevel.DistanceBased: - struct: EnumItem - Enum.MeshPartDetailLevel.GetEnumItems: - args: [] - method: true - Enum.MeshPartDetailLevel.Level01: - struct: EnumItem - Enum.MeshPartDetailLevel.Level02: - struct: EnumItem - Enum.MeshPartDetailLevel.Level03: - struct: EnumItem - Enum.MeshPartDetailLevel.Level04: - struct: EnumItem - Enum.MeshPartHeadsAndAccessories.Default: - struct: EnumItem - Enum.MeshPartHeadsAndAccessories.Disabled: - struct: EnumItem - Enum.MeshPartHeadsAndAccessories.Enabled: - struct: EnumItem - Enum.MeshPartHeadsAndAccessories.GetEnumItems: - args: [] - method: true - Enum.MeshScaleUnit.CM: - struct: EnumItem - Enum.MeshScaleUnit.Foot: - struct: EnumItem - Enum.MeshScaleUnit.GetEnumItems: - args: [] - method: true - Enum.MeshScaleUnit.Inch: - struct: EnumItem - Enum.MeshScaleUnit.MM: - struct: EnumItem - Enum.MeshScaleUnit.Meter: - struct: EnumItem - Enum.MeshScaleUnit.Stud: - struct: EnumItem - Enum.MeshType.Brick: - struct: EnumItem - Enum.MeshType.CornerWedge: - struct: EnumItem - Enum.MeshType.Cylinder: - struct: EnumItem - Enum.MeshType.FileMesh: - struct: EnumItem - Enum.MeshType.GetEnumItems: - args: [] - method: true - Enum.MeshType.Head: - struct: EnumItem - Enum.MeshType.ParallelRamp: - struct: EnumItem - Enum.MeshType.Prism: - struct: EnumItem - Enum.MeshType.Pyramid: - struct: EnumItem - Enum.MeshType.RightAngleRamp: - struct: EnumItem - Enum.MeshType.Sphere: - struct: EnumItem - Enum.MeshType.Torso: - struct: EnumItem - Enum.MeshType.Wedge: - struct: EnumItem - Enum.MessageType.GetEnumItems: - args: [] - method: true - Enum.MessageType.MessageError: - struct: EnumItem - Enum.MessageType.MessageInfo: - struct: EnumItem - Enum.MessageType.MessageOutput: - struct: EnumItem - Enum.MessageType.MessageWarning: - struct: EnumItem - Enum.ModelLevelOfDetail.Automatic: - struct: EnumItem - Enum.ModelLevelOfDetail.Disabled: - struct: EnumItem - Enum.ModelLevelOfDetail.GetEnumItems: - args: [] - method: true - Enum.ModelLevelOfDetail.StreamingMesh: - struct: EnumItem - Enum.ModifierKey.Alt: - struct: EnumItem - Enum.ModifierKey.Ctrl: - struct: EnumItem - Enum.ModifierKey.GetEnumItems: - args: [] - method: true - Enum.ModifierKey.Meta: - struct: EnumItem - Enum.ModifierKey.Shift: - struct: EnumItem - Enum.MouseBehavior.Default: - struct: EnumItem - Enum.MouseBehavior.GetEnumItems: - args: [] - method: true - Enum.MouseBehavior.LockCenter: - struct: EnumItem - Enum.MouseBehavior.LockCurrentPosition: - struct: EnumItem - Enum.MoveState.AirFree: - struct: EnumItem - Enum.MoveState.Coasting: - struct: EnumItem - Enum.MoveState.GetEnumItems: - args: [] - method: true - Enum.MoveState.Pushing: - struct: EnumItem - Enum.MoveState.Stopped: - struct: EnumItem - Enum.MoveState.Stopping: - struct: EnumItem - Enum.NameOcclusion.EnemyOcclusion: - struct: EnumItem - Enum.NameOcclusion.GetEnumItems: - args: [] - method: true - Enum.NameOcclusion.NoOcclusion: - struct: EnumItem - Enum.NameOcclusion.OccludeAll: - struct: EnumItem - Enum.NetworkOwnership.Automatic: - struct: EnumItem - Enum.NetworkOwnership.GetEnumItems: - args: [] - method: true - Enum.NetworkOwnership.Manual: - struct: EnumItem - Enum.NetworkOwnership.OnContact: - struct: EnumItem - Enum.NewAnimationRuntimeSetting.Default: - struct: EnumItem - Enum.NewAnimationRuntimeSetting.Disabled: - struct: EnumItem - Enum.NewAnimationRuntimeSetting.Enabled: - struct: EnumItem - Enum.NewAnimationRuntimeSetting.GetEnumItems: - args: [] - method: true - Enum.NormalId.Back: - struct: EnumItem - Enum.NormalId.Bottom: - struct: EnumItem - Enum.NormalId.Front: - struct: EnumItem - Enum.NormalId.GetEnumItems: - args: [] - method: true - Enum.NormalId.Left: - struct: EnumItem - Enum.NormalId.Right: - struct: EnumItem - Enum.NormalId.Top: - struct: EnumItem - Enum.OrientationAlignmentMode.GetEnumItems: - args: [] - method: true - Enum.OrientationAlignmentMode.OneAttachment: - struct: EnumItem - Enum.OrientationAlignmentMode.TwoAttachment: - struct: EnumItem - Enum.OutfitSource.All: - struct: EnumItem - Enum.OutfitSource.Created: - struct: EnumItem - Enum.OutfitSource.GetEnumItems: - args: [] - method: true - Enum.OutfitSource.Purchased: - struct: EnumItem - Enum.OutputLayoutMode.GetEnumItems: - args: [] - method: true - Enum.OutputLayoutMode.Horizontal: - struct: EnumItem - Enum.OutputLayoutMode.Vertical: - struct: EnumItem - Enum.OverrideMouseIconBehavior.ForceHide: - struct: EnumItem - Enum.OverrideMouseIconBehavior.ForceShow: - struct: EnumItem - Enum.OverrideMouseIconBehavior.GetEnumItems: - args: [] - method: true - Enum.OverrideMouseIconBehavior.None: - struct: EnumItem - Enum.PackagePermission.Edit: - struct: EnumItem - Enum.PackagePermission.GetEnumItems: - args: [] - method: true - Enum.PackagePermission.NoAccess: - struct: EnumItem - Enum.PackagePermission.None: - struct: EnumItem - Enum.PackagePermission.Own: - struct: EnumItem - Enum.PackagePermission.Revoked: - struct: EnumItem - Enum.PackagePermission.UseView: - struct: EnumItem - Enum.PartType.Ball: - struct: EnumItem - Enum.PartType.Block: - struct: EnumItem - Enum.PartType.Cylinder: - struct: EnumItem - Enum.PartType.GetEnumItems: - args: [] - method: true - Enum.ParticleEmitterShape.Box: - struct: EnumItem - Enum.ParticleEmitterShape.Cylinder: - struct: EnumItem - Enum.ParticleEmitterShape.Disc: - struct: EnumItem - Enum.ParticleEmitterShape.GetEnumItems: - args: [] - method: true - Enum.ParticleEmitterShape.Sphere: - struct: EnumItem - Enum.ParticleEmitterShapeInOut.GetEnumItems: - args: [] - method: true - Enum.ParticleEmitterShapeInOut.InAndOut: - struct: EnumItem - Enum.ParticleEmitterShapeInOut.Inward: - struct: EnumItem - Enum.ParticleEmitterShapeInOut.Outward: - struct: EnumItem - Enum.ParticleEmitterShapeStyle.GetEnumItems: - args: [] - method: true - Enum.ParticleEmitterShapeStyle.Surface: - struct: EnumItem - Enum.ParticleEmitterShapeStyle.Volume: - struct: EnumItem - Enum.ParticleFlipbookLayout.EightByEight: - struct: EnumItem - Enum.ParticleFlipbookLayout.FourByFour: - struct: EnumItem - Enum.ParticleFlipbookLayout.GetEnumItems: - args: [] - method: true - Enum.ParticleFlipbookLayout.None: - struct: EnumItem - Enum.ParticleFlipbookLayout.TwoByTwo: - struct: EnumItem - Enum.ParticleFlipbookMode.GetEnumItems: - args: [] - method: true - Enum.ParticleFlipbookMode.Loop: - struct: EnumItem - Enum.ParticleFlipbookMode.OneShot: - struct: EnumItem - Enum.ParticleFlipbookMode.PingPong: - struct: EnumItem - Enum.ParticleFlipbookMode.Random: - struct: EnumItem - Enum.ParticleOrientation.FacingCamera: - struct: EnumItem - Enum.ParticleOrientation.FacingCameraWorldUp: - struct: EnumItem - Enum.ParticleOrientation.GetEnumItems: - args: [] - method: true - Enum.ParticleOrientation.VelocityParallel: - struct: EnumItem - Enum.ParticleOrientation.VelocityPerpendicular: - struct: EnumItem - Enum.PathStatus.ClosestNoPath: - struct: EnumItem - Enum.PathStatus.ClosestOutOfRange: - struct: EnumItem - Enum.PathStatus.FailFinishNotEmpty: - struct: EnumItem - Enum.PathStatus.FailStartNotEmpty: - struct: EnumItem - Enum.PathStatus.GetEnumItems: - args: [] - method: true - Enum.PathStatus.NoPath: - struct: EnumItem - Enum.PathStatus.Success: - struct: EnumItem - Enum.PathWaypointAction.Custom: - struct: EnumItem - Enum.PathWaypointAction.GetEnumItems: - args: [] - method: true - Enum.PathWaypointAction.Jump: - struct: EnumItem - Enum.PathWaypointAction.Walk: - struct: EnumItem - Enum.PermissionLevelShown.Game: - struct: EnumItem - Enum.PermissionLevelShown.GetEnumItems: - args: [] - method: true - Enum.PermissionLevelShown.Roblox: - struct: EnumItem - Enum.PermissionLevelShown.RobloxGame: - struct: EnumItem - Enum.PermissionLevelShown.RobloxScript: - struct: EnumItem - Enum.PermissionLevelShown.Studio: - struct: EnumItem - Enum.PhysicsInertiaAndVolumeFix.Default: - struct: EnumItem - Enum.PhysicsInertiaAndVolumeFix.Disabled: - struct: EnumItem - Enum.PhysicsInertiaAndVolumeFix.Enabled: - struct: EnumItem - Enum.PhysicsInertiaAndVolumeFix.GetEnumItems: - args: [] - method: true - Enum.PhysicsSimulationRate.Fixed120Hz: - struct: EnumItem - Enum.PhysicsSimulationRate.Fixed240Hz: - struct: EnumItem - Enum.PhysicsSimulationRate.Fixed60Hz: - struct: EnumItem - Enum.PhysicsSimulationRate.GetEnumItems: - args: [] - method: true - Enum.PhysicsSteppingMethod.Adaptive: - struct: EnumItem - Enum.PhysicsSteppingMethod.Default: - struct: EnumItem - Enum.PhysicsSteppingMethod.Fixed: - struct: EnumItem - Enum.PhysicsSteppingMethod.GetEnumItems: - args: [] - method: true - Enum.Platform.Android: - struct: EnumItem - Enum.Platform.AndroidTV: - struct: EnumItem - Enum.Platform.BeOS: - struct: EnumItem - Enum.Platform.Chromecast: - struct: EnumItem - Enum.Platform.DOS: - struct: EnumItem - Enum.Platform.GetEnumItems: - args: [] - method: true - Enum.Platform.IOS: - struct: EnumItem - Enum.Platform.Linux: - struct: EnumItem - Enum.Platform.NX: - struct: EnumItem - Enum.Platform.None: - struct: EnumItem - Enum.Platform.OSX: - struct: EnumItem - Enum.Platform.Ouya: - struct: EnumItem - Enum.Platform.PS3: - struct: EnumItem - Enum.Platform.PS4: - struct: EnumItem - Enum.Platform.SteamOS: - struct: EnumItem - Enum.Platform.UWP: - struct: EnumItem - Enum.Platform.WebOS: - struct: EnumItem - Enum.Platform.WiiU: - struct: EnumItem - Enum.Platform.Windows: - struct: EnumItem - Enum.Platform.XBox360: - struct: EnumItem - Enum.Platform.XBoxOne: - struct: EnumItem - Enum.PlaybackState.Begin: - struct: EnumItem - Enum.PlaybackState.Cancelled: - struct: EnumItem - Enum.PlaybackState.Completed: - struct: EnumItem - Enum.PlaybackState.Delayed: - struct: EnumItem - Enum.PlaybackState.GetEnumItems: - args: [] - method: true - Enum.PlaybackState.Paused: - struct: EnumItem - Enum.PlaybackState.Playing: - struct: EnumItem - Enum.PlayerActions.CharacterBackward: - struct: EnumItem - Enum.PlayerActions.CharacterForward: - struct: EnumItem - Enum.PlayerActions.CharacterJump: - struct: EnumItem - Enum.PlayerActions.CharacterLeft: - struct: EnumItem - Enum.PlayerActions.CharacterRight: - struct: EnumItem - Enum.PlayerActions.GetEnumItems: - args: [] - method: true - Enum.PlayerChatType.All: - struct: EnumItem - Enum.PlayerChatType.GetEnumItems: - args: [] - method: true - Enum.PlayerChatType.Team: - struct: EnumItem - Enum.PlayerChatType.Whisper: - struct: EnumItem - Enum.PoseEasingDirection.GetEnumItems: - args: [] - method: true - Enum.PoseEasingDirection.In: - struct: EnumItem - Enum.PoseEasingDirection.InOut: - struct: EnumItem - Enum.PoseEasingDirection.Out: - struct: EnumItem - Enum.PoseEasingStyle.Bounce: - struct: EnumItem - Enum.PoseEasingStyle.Constant: - struct: EnumItem - Enum.PoseEasingStyle.Cubic: - struct: EnumItem - Enum.PoseEasingStyle.Elastic: - struct: EnumItem - Enum.PoseEasingStyle.GetEnumItems: - args: [] - method: true - Enum.PoseEasingStyle.Linear: - struct: EnumItem - Enum.PositionAlignmentMode.GetEnumItems: - args: [] - method: true - Enum.PositionAlignmentMode.OneAttachment: - struct: EnumItem - Enum.PositionAlignmentMode.TwoAttachment: - struct: EnumItem - Enum.PrivilegeType.Admin: - struct: EnumItem - Enum.PrivilegeType.Banned: - struct: EnumItem - Enum.PrivilegeType.GetEnumItems: - args: [] - method: true - Enum.PrivilegeType.Member: - struct: EnumItem - Enum.PrivilegeType.Owner: - struct: EnumItem - Enum.PrivilegeType.Visitor: - struct: EnumItem - Enum.ProductLocationRestriction.AllGames: - struct: EnumItem - Enum.ProductLocationRestriction.AllowedGames: - struct: EnumItem - Enum.ProductLocationRestriction.AvatarShop: - struct: EnumItem - Enum.ProductLocationRestriction.GetEnumItems: - args: [] - method: true - Enum.ProductPurchaseDecision.GetEnumItems: - args: [] - method: true - Enum.ProductPurchaseDecision.NotProcessedYet: - struct: EnumItem - Enum.ProductPurchaseDecision.PurchaseGranted: - struct: EnumItem - Enum.PropertyStatus.Error: - struct: EnumItem - Enum.PropertyStatus.GetEnumItems: - args: [] - method: true - Enum.PropertyStatus.Ok: - struct: EnumItem - Enum.PropertyStatus.Warning: - struct: EnumItem - Enum.ProximityPromptExclusivity.AlwaysShow: - struct: EnumItem - Enum.ProximityPromptExclusivity.GetEnumItems: - args: [] - method: true - Enum.ProximityPromptExclusivity.OneGlobally: - struct: EnumItem - Enum.ProximityPromptExclusivity.OnePerButton: - struct: EnumItem - Enum.ProximityPromptInputType.Gamepad: - struct: EnumItem - Enum.ProximityPromptInputType.GetEnumItems: - args: [] - method: true - Enum.ProximityPromptInputType.Keyboard: - struct: EnumItem - Enum.ProximityPromptInputType.Touch: - struct: EnumItem - Enum.ProximityPromptStyle.Custom: - struct: EnumItem - Enum.ProximityPromptStyle.Default: - struct: EnumItem - Enum.ProximityPromptStyle.GetEnumItems: - args: [] - method: true - Enum.QualityLevel.Automatic: - struct: EnumItem - Enum.QualityLevel.GetEnumItems: - args: [] - method: true - Enum.QualityLevel.Level01: - struct: EnumItem - Enum.QualityLevel.Level02: - struct: EnumItem - Enum.QualityLevel.Level03: - struct: EnumItem - Enum.QualityLevel.Level04: - struct: EnumItem - Enum.QualityLevel.Level05: - struct: EnumItem - Enum.QualityLevel.Level06: - struct: EnumItem - Enum.QualityLevel.Level07: - struct: EnumItem - Enum.QualityLevel.Level08: - struct: EnumItem - Enum.QualityLevel.Level09: - struct: EnumItem - Enum.QualityLevel.Level10: - struct: EnumItem - Enum.QualityLevel.Level11: - struct: EnumItem - Enum.QualityLevel.Level12: - struct: EnumItem - Enum.QualityLevel.Level13: - struct: EnumItem - Enum.QualityLevel.Level14: - struct: EnumItem - Enum.QualityLevel.Level15: - struct: EnumItem - Enum.QualityLevel.Level16: - struct: EnumItem - Enum.QualityLevel.Level17: - struct: EnumItem - Enum.QualityLevel.Level18: - struct: EnumItem - Enum.QualityLevel.Level19: - struct: EnumItem - Enum.QualityLevel.Level20: - struct: EnumItem - Enum.QualityLevel.Level21: - struct: EnumItem - Enum.R15CollisionType.GetEnumItems: - args: [] - method: true - Enum.R15CollisionType.InnerBox: - struct: EnumItem - Enum.R15CollisionType.OuterBox: - struct: EnumItem - Enum.RaycastFilterType.Blacklist: - struct: EnumItem - Enum.RaycastFilterType.GetEnumItems: - args: [] - method: true - Enum.RaycastFilterType.Whitelist: - struct: EnumItem - Enum.RenderFidelity.Automatic: - struct: EnumItem - Enum.RenderFidelity.GetEnumItems: - args: [] - method: true - Enum.RenderFidelity.Performance: - struct: EnumItem - Enum.RenderFidelity.Precise: - struct: EnumItem - Enum.RenderPriority.Camera: - struct: EnumItem - Enum.RenderPriority.Character: - struct: EnumItem - Enum.RenderPriority.First: - struct: EnumItem - Enum.RenderPriority.GetEnumItems: - args: [] - method: true - Enum.RenderPriority.Input: - struct: EnumItem - Enum.RenderPriority.Last: - struct: EnumItem - Enum.RenderingTestComparisonMethod.GetEnumItems: - args: [] - method: true - Enum.RenderingTestComparisonMethod.diff: - struct: EnumItem - Enum.RenderingTestComparisonMethod.psnr: - struct: EnumItem - Enum.ReplicateInstanceDestroySetting.Default: - struct: EnumItem - Enum.ReplicateInstanceDestroySetting.Disabled: - struct: EnumItem - Enum.ReplicateInstanceDestroySetting.Enabled: - struct: EnumItem - Enum.ReplicateInstanceDestroySetting.GetEnumItems: - args: [] - method: true - Enum.ResamplerMode.Default: - struct: EnumItem - Enum.ResamplerMode.GetEnumItems: - args: [] - method: true - Enum.ResamplerMode.Pixelated: - struct: EnumItem - Enum.ReturnKeyType.Default: - struct: EnumItem - Enum.ReturnKeyType.Done: - struct: EnumItem - Enum.ReturnKeyType.GetEnumItems: - args: [] - method: true - Enum.ReturnKeyType.Go: - struct: EnumItem - Enum.ReturnKeyType.Next: - struct: EnumItem - Enum.ReturnKeyType.Search: - struct: EnumItem - Enum.ReturnKeyType.Send: - struct: EnumItem - Enum.ReverbType.Alley: - struct: EnumItem - Enum.ReverbType.Arena: - struct: EnumItem - Enum.ReverbType.Auditorium: - struct: EnumItem - Enum.ReverbType.Bathroom: - struct: EnumItem - Enum.ReverbType.CarpettedHallway: - struct: EnumItem - Enum.ReverbType.Cave: - struct: EnumItem - Enum.ReverbType.City: - struct: EnumItem - Enum.ReverbType.ConcertHall: - struct: EnumItem - Enum.ReverbType.Forest: - struct: EnumItem - Enum.ReverbType.GenericReverb: - struct: EnumItem - Enum.ReverbType.GetEnumItems: - args: [] - method: true - Enum.ReverbType.Hallway: - struct: EnumItem - Enum.ReverbType.Hangar: - struct: EnumItem - Enum.ReverbType.LivingRoom: - struct: EnumItem - Enum.ReverbType.Mountains: - struct: EnumItem - Enum.ReverbType.NoReverb: - struct: EnumItem - Enum.ReverbType.PaddedCell: - struct: EnumItem - Enum.ReverbType.ParkingLot: - struct: EnumItem - Enum.ReverbType.Plain: - struct: EnumItem - Enum.ReverbType.Quarry: - struct: EnumItem - Enum.ReverbType.Room: - struct: EnumItem - Enum.ReverbType.SewerPipe: - struct: EnumItem - Enum.ReverbType.StoneCorridor: - struct: EnumItem - Enum.ReverbType.StoneRoom: - struct: EnumItem - Enum.ReverbType.UnderWater: - struct: EnumItem - Enum.RibbonTool.ColorPicker: - struct: EnumItem - Enum.RibbonTool.GetEnumItems: - args: [] - method: true - Enum.RibbonTool.Group: - struct: EnumItem - Enum.RibbonTool.MaterialPicker: - struct: EnumItem - Enum.RibbonTool.Move: - struct: EnumItem - Enum.RibbonTool.None: - struct: EnumItem - Enum.RibbonTool.Rotate: - struct: EnumItem - Enum.RibbonTool.Scale: - struct: EnumItem - Enum.RibbonTool.Select: - struct: EnumItem - Enum.RibbonTool.Transform: - struct: EnumItem - Enum.RibbonTool.Ungroup: - struct: EnumItem - Enum.RigType.Custom: - struct: EnumItem - Enum.RigType.GetEnumItems: - args: [] - method: true - Enum.RigType.None: - struct: EnumItem - Enum.RigType.R15: - struct: EnumItem - Enum.RigType.Rthro: - struct: EnumItem - Enum.RigType.RthroNarrow: - struct: EnumItem - Enum.RollOffMode.GetEnumItems: - args: [] - method: true - Enum.RollOffMode.Inverse: - struct: EnumItem - Enum.RollOffMode.InverseTapered: - struct: EnumItem - Enum.RollOffMode.Linear: - struct: EnumItem - Enum.RollOffMode.LinearSquare: - struct: EnumItem - Enum.RotationOrder.GetEnumItems: - args: [] - method: true - Enum.RotationOrder.XYZ: - struct: EnumItem - Enum.RotationOrder.XZY: - struct: EnumItem - Enum.RotationOrder.YXZ: - struct: EnumItem - Enum.RotationOrder.YZX: - struct: EnumItem - Enum.RotationOrder.ZXY: - struct: EnumItem - Enum.RotationOrder.ZYX: - struct: EnumItem - Enum.RotationType.CameraRelative: - struct: EnumItem - Enum.RotationType.GetEnumItems: - args: [] - method: true - Enum.RotationType.MovementRelative: - struct: EnumItem - Enum.RuntimeUndoBehavior.Aggregate: - struct: EnumItem - Enum.RuntimeUndoBehavior.GetEnumItems: - args: [] - method: true - Enum.RuntimeUndoBehavior.Hybrid: - struct: EnumItem - Enum.RuntimeUndoBehavior.Snapshot: - struct: EnumItem - Enum.SaveFilter.GetEnumItems: - args: [] - method: true - Enum.SaveFilter.SaveAll: - struct: EnumItem - Enum.SaveFilter.SaveGame: - struct: EnumItem - Enum.SaveFilter.SaveWorld: - struct: EnumItem - Enum.SavedQualitySetting.Automatic: - struct: EnumItem - Enum.SavedQualitySetting.GetEnumItems: - args: [] - method: true - Enum.SavedQualitySetting.QualityLevel1: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel10: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel2: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel3: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel4: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel5: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel6: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel7: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel8: - struct: EnumItem - Enum.SavedQualitySetting.QualityLevel9: - struct: EnumItem - Enum.ScaleType.Crop: - struct: EnumItem - Enum.ScaleType.Fit: - struct: EnumItem - Enum.ScaleType.GetEnumItems: - args: [] - method: true - Enum.ScaleType.Slice: - struct: EnumItem - Enum.ScaleType.Stretch: - struct: EnumItem - Enum.ScaleType.Tile: - struct: EnumItem - Enum.ScreenOrientation.GetEnumItems: - args: [] - method: true - Enum.ScreenOrientation.LandscapeLeft: - struct: EnumItem - Enum.ScreenOrientation.LandscapeRight: - struct: EnumItem - Enum.ScreenOrientation.LandscapeSensor: - struct: EnumItem - Enum.ScreenOrientation.Portrait: - struct: EnumItem - Enum.ScreenOrientation.Sensor: - struct: EnumItem - Enum.ScrollBarInset.Always: - struct: EnumItem - Enum.ScrollBarInset.GetEnumItems: - args: [] - method: true - Enum.ScrollBarInset.None: - struct: EnumItem - Enum.ScrollBarInset.ScrollBar: - struct: EnumItem - Enum.ScrollingDirection.GetEnumItems: - args: [] - method: true - Enum.ScrollingDirection.X: - struct: EnumItem - Enum.ScrollingDirection.XY: - struct: EnumItem - Enum.ScrollingDirection.Y: - struct: EnumItem - Enum.SelectionBehavior.Escape: - struct: EnumItem - Enum.SelectionBehavior.GetEnumItems: - args: [] - method: true - Enum.SelectionBehavior.Stop: - struct: EnumItem - Enum.ServerAudioBehavior.Enabled: - struct: EnumItem - Enum.ServerAudioBehavior.GetEnumItems: - args: [] - method: true - Enum.ServerAudioBehavior.Muted: - struct: EnumItem - Enum.ServerAudioBehavior.OnlineGame: - struct: EnumItem - Enum.SignalBehavior.AncestryDeferred: - struct: EnumItem - Enum.SignalBehavior.Default: - struct: EnumItem - Enum.SignalBehavior.Deferred: - struct: EnumItem - Enum.SignalBehavior.GetEnumItems: - args: [] - method: true - Enum.SignalBehavior.Immediate: - struct: EnumItem - Enum.SizeConstraint.GetEnumItems: - args: [] - method: true - Enum.SizeConstraint.RelativeXX: - struct: EnumItem - Enum.SizeConstraint.RelativeXY: - struct: EnumItem - Enum.SizeConstraint.RelativeYY: - struct: EnumItem - Enum.SortDirection.Ascending: - struct: EnumItem - Enum.SortDirection.Descending: - struct: EnumItem - Enum.SortDirection.GetEnumItems: - args: [] - method: true - Enum.SortOrder.Custom: - struct: EnumItem - Enum.SortOrder.GetEnumItems: - args: [] - method: true - Enum.SortOrder.LayoutOrder: - struct: EnumItem - Enum.SortOrder.Name: - struct: EnumItem - Enum.SpecialKey.ChatHotkey: - struct: EnumItem - Enum.SpecialKey.End: - struct: EnumItem - Enum.SpecialKey.GetEnumItems: - args: [] - method: true - Enum.SpecialKey.Home: - struct: EnumItem - Enum.SpecialKey.Insert: - struct: EnumItem - Enum.SpecialKey.PageDown: - struct: EnumItem - Enum.SpecialKey.PageUp: - struct: EnumItem - Enum.StartCorner.BottomLeft: - struct: EnumItem - Enum.StartCorner.BottomRight: - struct: EnumItem - Enum.StartCorner.GetEnumItems: - args: [] - method: true - Enum.StartCorner.TopLeft: - struct: EnumItem - Enum.StartCorner.TopRight: - struct: EnumItem - Enum.Status.Confusion: - struct: EnumItem - Enum.Status.GetEnumItems: - args: [] - method: true - Enum.Status.Poison: - struct: EnumItem - Enum.StreamOutBehavior.Default: - struct: EnumItem - Enum.StreamOutBehavior.GetEnumItems: - args: [] - method: true - Enum.StreamOutBehavior.LowMemory: - struct: EnumItem - Enum.StreamOutBehavior.Opportunistic: - struct: EnumItem - Enum.StreamingPauseMode.ClientPhysicsPause: - struct: EnumItem - Enum.StreamingPauseMode.Default: - struct: EnumItem - Enum.StreamingPauseMode.Disabled: - struct: EnumItem - Enum.StreamingPauseMode.GetEnumItems: - args: [] - method: true - Enum.StudioCloseMode.CloseDoc: - struct: EnumItem - Enum.StudioCloseMode.CloseStudio: - struct: EnumItem - Enum.StudioCloseMode.GetEnumItems: - args: [] - method: true - Enum.StudioCloseMode.None: - struct: EnumItem - Enum.StudioDataModelType.Edit: - struct: EnumItem - Enum.StudioDataModelType.GetEnumItems: - args: [] - method: true - Enum.StudioDataModelType.None: - struct: EnumItem - Enum.StudioDataModelType.PlayClient: - struct: EnumItem - Enum.StudioDataModelType.PlayServer: - struct: EnumItem - Enum.StudioDataModelType.Standalone: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.ActiveLine: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Background: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Bool: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Bracket: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Builtin: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Comment: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.DebuggerCurrentLine: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.DebuggerErrorLine: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Default: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.DocViewCodeBackground: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Error: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.FindSelectionBackground: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Function: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.FunctionName: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.GetEnumItems: - args: [] - method: true - Enum.StudioScriptEditorColorCategories.Keyword: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Local: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.LuauKeyword: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MatchingWordBackground: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuBackground: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuBorder: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuPrimaryText: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuScrollbarBackground: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuScrollbarHandle: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuSecondaryText: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuSelectedBackground: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.MenuSelectedText: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Method: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Nil: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Number: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Operator: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Property: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Ruler: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.SelectionBackground: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.SelectionText: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Self: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.String: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.TODO: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Warning: - struct: EnumItem - Enum.StudioScriptEditorColorCategories.Whitespace: - struct: EnumItem - Enum.StudioScriptEditorColorPresets.Custom: - struct: EnumItem - Enum.StudioScriptEditorColorPresets.Extra1: - struct: EnumItem - Enum.StudioScriptEditorColorPresets.Extra2: - struct: EnumItem - Enum.StudioScriptEditorColorPresets.GetEnumItems: - args: [] - method: true - Enum.StudioScriptEditorColorPresets.RobloxDefault: - struct: EnumItem - Enum.StudioStyleGuideColor.AttributeCog: - struct: EnumItem - Enum.StudioStyleGuideColor.Border: - struct: EnumItem - Enum.StudioStyleGuideColor.BrightText: - struct: EnumItem - Enum.StudioStyleGuideColor.Button: - struct: EnumItem - Enum.StudioStyleGuideColor.ButtonBorder: - struct: EnumItem - Enum.StudioStyleGuideColor.ButtonText: - struct: EnumItem - Enum.StudioStyleGuideColor.CategoryItem: - struct: EnumItem - Enum.StudioStyleGuideColor.ChatIncomingBgColor: - struct: EnumItem - Enum.StudioStyleGuideColor.ChatIncomingTextColor: - struct: EnumItem - Enum.StudioStyleGuideColor.ChatModeratedMessageColor: - struct: EnumItem - Enum.StudioStyleGuideColor.ChatOutgoingBgColor: - struct: EnumItem - Enum.StudioStyleGuideColor.ChatOutgoingTextColor: - struct: EnumItem - Enum.StudioStyleGuideColor.CheckedFieldBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.CheckedFieldBorder: - struct: EnumItem - Enum.StudioStyleGuideColor.CheckedFieldIndicator: - struct: EnumItem - Enum.StudioStyleGuideColor.ColorPickerFrame: - struct: EnumItem - Enum.StudioStyleGuideColor.CurrentMarker: - struct: EnumItem - Enum.StudioStyleGuideColor.Dark: - struct: EnumItem - Enum.StudioStyleGuideColor.DebuggerCurrentLine: - struct: EnumItem - Enum.StudioStyleGuideColor.DebuggerErrorLine: - struct: EnumItem - Enum.StudioStyleGuideColor.DialogButton: - struct: EnumItem - Enum.StudioStyleGuideColor.DialogButtonBorder: - struct: EnumItem - Enum.StudioStyleGuideColor.DialogButtonText: - struct: EnumItem - Enum.StudioStyleGuideColor.DialogMainButton: - struct: EnumItem - Enum.StudioStyleGuideColor.DialogMainButtonText: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffFilePathBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffFilePathBorder: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffFilePathText: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffLineNum: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffLineNumAdditionBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffLineNumDeletionBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffLineNumNoChangeBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffLineNumSeparatorBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextAddition: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextAdditionBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextDeletion: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextDeletionBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextHunkInfo: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextNoChange: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextNoChangeBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DiffTextSeparatorBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DimmedText: - struct: EnumItem - Enum.StudioStyleGuideColor.DocViewCodeBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.DropShadow: - struct: EnumItem - Enum.StudioStyleGuideColor.Dropdown: - struct: EnumItem - Enum.StudioStyleGuideColor.EmulatorBar: - struct: EnumItem - Enum.StudioStyleGuideColor.EmulatorDropDown: - struct: EnumItem - Enum.StudioStyleGuideColor.ErrorText: - struct: EnumItem - Enum.StudioStyleGuideColor.FilterButtonAccent: - struct: EnumItem - Enum.StudioStyleGuideColor.FilterButtonBorder: - struct: EnumItem - Enum.StudioStyleGuideColor.FilterButtonBorderAlt: - struct: EnumItem - Enum.StudioStyleGuideColor.FilterButtonChecked: - struct: EnumItem - Enum.StudioStyleGuideColor.FilterButtonDefault: - struct: EnumItem - Enum.StudioStyleGuideColor.FilterButtonHover: - struct: EnumItem - Enum.StudioStyleGuideColor.GameSettingsTableItem: - struct: EnumItem - Enum.StudioStyleGuideColor.GameSettingsTooltip: - struct: EnumItem - Enum.StudioStyleGuideColor.GetEnumItems: - args: [] - method: true - Enum.StudioStyleGuideColor.HeaderSection: - struct: EnumItem - Enum.StudioStyleGuideColor.InfoBarWarningBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.InfoBarWarningText: - struct: EnumItem - Enum.StudioStyleGuideColor.InfoText: - struct: EnumItem - Enum.StudioStyleGuideColor.InputFieldBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.InputFieldBorder: - struct: EnumItem - Enum.StudioStyleGuideColor.Item: - struct: EnumItem - Enum.StudioStyleGuideColor.Light: - struct: EnumItem - Enum.StudioStyleGuideColor.LinkText: - struct: EnumItem - Enum.StudioStyleGuideColor.MainBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.MainButton: - struct: EnumItem - Enum.StudioStyleGuideColor.MainText: - struct: EnumItem - Enum.StudioStyleGuideColor.Mid: - struct: EnumItem - Enum.StudioStyleGuideColor.Midlight: - struct: EnumItem - Enum.StudioStyleGuideColor.Notification: - struct: EnumItem - Enum.StudioStyleGuideColor.RibbonButton: - struct: EnumItem - Enum.StudioStyleGuideColor.RibbonTab: - struct: EnumItem - Enum.StudioStyleGuideColor.RibbonTabTopBar: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptBool: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptBracket: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptBuiltInFunction: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptComment: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptEditorCurrentLine: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptError: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptFindSelectionBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptFunction: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptFunctionName: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptKeyword: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptLocal: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptLuauKeyword: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptMatchingWordSelectionBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptMethod: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptNil: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptNumber: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptOperator: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptProperty: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptRuler: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptSelectionBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptSelectionText: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptSelf: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptSideWidget: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptString: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptText: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptTodo: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptWarning: - struct: EnumItem - Enum.StudioStyleGuideColor.ScriptWhitespace: - struct: EnumItem - Enum.StudioStyleGuideColor.ScrollBar: - struct: EnumItem - Enum.StudioStyleGuideColor.ScrollBarBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.SensitiveText: - struct: EnumItem - Enum.StudioStyleGuideColor.Separator: - struct: EnumItem - Enum.StudioStyleGuideColor.Shadow: - struct: EnumItem - Enum.StudioStyleGuideColor.StatusBar: - struct: EnumItem - Enum.StudioStyleGuideColor.SubText: - struct: EnumItem - Enum.StudioStyleGuideColor.Tab: - struct: EnumItem - Enum.StudioStyleGuideColor.TabBar: - struct: EnumItem - Enum.StudioStyleGuideColor.TableItem: - struct: EnumItem - Enum.StudioStyleGuideColor.Titlebar: - struct: EnumItem - Enum.StudioStyleGuideColor.TitlebarText: - struct: EnumItem - Enum.StudioStyleGuideColor.Tooltip: - struct: EnumItem - Enum.StudioStyleGuideColor.ViewPortBackground: - struct: EnumItem - Enum.StudioStyleGuideColor.WarningText: - struct: EnumItem - Enum.StudioStyleGuideModifier.Default: - struct: EnumItem - Enum.StudioStyleGuideModifier.Disabled: - struct: EnumItem - Enum.StudioStyleGuideModifier.GetEnumItems: - args: [] - method: true - Enum.StudioStyleGuideModifier.Hover: - struct: EnumItem - Enum.StudioStyleGuideModifier.Pressed: - struct: EnumItem - Enum.StudioStyleGuideModifier.Selected: - struct: EnumItem - Enum.Style.AlternatingSupports: - struct: EnumItem - Enum.Style.BridgeStyleSupports: - struct: EnumItem - Enum.Style.GetEnumItems: - args: [] - method: true - Enum.Style.NoSupports: - struct: EnumItem - Enum.SurfaceConstraint.GetEnumItems: - args: [] - method: true - Enum.SurfaceConstraint.Hinge: - struct: EnumItem - Enum.SurfaceConstraint.Motor: - struct: EnumItem - Enum.SurfaceConstraint.None: - struct: EnumItem - Enum.SurfaceConstraint.SteppingMotor: - struct: EnumItem - Enum.SurfaceGuiSizingMode.FixedSize: - struct: EnumItem - Enum.SurfaceGuiSizingMode.GetEnumItems: - args: [] - method: true - Enum.SurfaceGuiSizingMode.PixelsPerStud: - struct: EnumItem - Enum.SurfaceType.GetEnumItems: - args: [] - method: true - Enum.SurfaceType.Glue: - struct: EnumItem - Enum.SurfaceType.Hinge: - struct: EnumItem - Enum.SurfaceType.Inlet: - struct: EnumItem - Enum.SurfaceType.Motor: - struct: EnumItem - Enum.SurfaceType.Smooth: - struct: EnumItem - Enum.SurfaceType.SmoothNoOutlines: - struct: EnumItem - Enum.SurfaceType.SteppingMotor: - struct: EnumItem - Enum.SurfaceType.Studs: - struct: EnumItem - Enum.SurfaceType.Universal: - struct: EnumItem - Enum.SurfaceType.Weld: - struct: EnumItem - Enum.SwipeDirection.Down: - struct: EnumItem - Enum.SwipeDirection.GetEnumItems: - args: [] - method: true - Enum.SwipeDirection.Left: - struct: EnumItem - Enum.SwipeDirection.None: - struct: EnumItem - Enum.SwipeDirection.Right: - struct: EnumItem - Enum.SwipeDirection.Up: - struct: EnumItem - Enum.TableMajorAxis.ColumnMajor: - struct: EnumItem - Enum.TableMajorAxis.GetEnumItems: - args: [] - method: true - Enum.TableMajorAxis.RowMajor: - struct: EnumItem - Enum.Technology.Compatibility: - struct: EnumItem - Enum.Technology.Future: - struct: EnumItem - Enum.Technology.GetEnumItems: - args: [] - method: true - Enum.Technology.Legacy: - struct: EnumItem - Enum.Technology.ShadowMap: - struct: EnumItem - Enum.Technology.Voxel: - struct: EnumItem - Enum.TeleportMethod.GetEnumItems: - args: [] - method: true - Enum.TeleportMethod.TeleportPartyAsync: - struct: EnumItem - Enum.TeleportMethod.TeleportToPlaceInstance: - struct: EnumItem - Enum.TeleportMethod.TeleportToPrivateServer: - struct: EnumItem - Enum.TeleportMethod.TeleportToSpawnByName: - struct: EnumItem - Enum.TeleportMethod.TeleportUnknown: - struct: EnumItem - Enum.TeleportResult.Failure: - struct: EnumItem - Enum.TeleportResult.Flooded: - struct: EnumItem - Enum.TeleportResult.GameEnded: - struct: EnumItem - Enum.TeleportResult.GameFull: - struct: EnumItem - Enum.TeleportResult.GameNotFound: - struct: EnumItem - Enum.TeleportResult.GetEnumItems: - args: [] - method: true - Enum.TeleportResult.IsTeleporting: - struct: EnumItem - Enum.TeleportResult.Success: - struct: EnumItem - Enum.TeleportResult.Unauthorized: - struct: EnumItem - Enum.TeleportState.Failed: - struct: EnumItem - Enum.TeleportState.GetEnumItems: - args: [] - method: true - Enum.TeleportState.InProgress: - struct: EnumItem - Enum.TeleportState.RequestedFromServer: - struct: EnumItem - Enum.TeleportState.Started: - struct: EnumItem - Enum.TeleportState.WaitingForServer: - struct: EnumItem - Enum.TeleportType.GetEnumItems: - args: [] - method: true - Enum.TeleportType.ToInstance: - struct: EnumItem - Enum.TeleportType.ToPlace: - struct: EnumItem - Enum.TeleportType.ToReservedServer: - struct: EnumItem - Enum.TerrainAcquisitionMethod.Convert: - struct: EnumItem - Enum.TerrainAcquisitionMethod.EditAddTool: - struct: EnumItem - Enum.TerrainAcquisitionMethod.EditReplaceTool: - struct: EnumItem - Enum.TerrainAcquisitionMethod.EditSeaLevelTool: - struct: EnumItem - Enum.TerrainAcquisitionMethod.Generate: - struct: EnumItem - Enum.TerrainAcquisitionMethod.GetEnumItems: - args: [] - method: true - Enum.TerrainAcquisitionMethod.Import: - struct: EnumItem - Enum.TerrainAcquisitionMethod.Legacy: - struct: EnumItem - Enum.TerrainAcquisitionMethod.None: - struct: EnumItem - Enum.TerrainAcquisitionMethod.Other: - struct: EnumItem - Enum.TerrainAcquisitionMethod.RegionFillTool: - struct: EnumItem - Enum.TerrainAcquisitionMethod.RegionPasteTool: - struct: EnumItem - Enum.TerrainAcquisitionMethod.Template: - struct: EnumItem - Enum.TerrainFace.Bottom: - struct: EnumItem - Enum.TerrainFace.GetEnumItems: - args: [] - method: true - Enum.TerrainFace.Side: - struct: EnumItem - Enum.TerrainFace.Top: - struct: EnumItem - Enum.TextChatMessageStatus.Floodchecked: - struct: EnumItem - Enum.TextChatMessageStatus.GetEnumItems: - args: [] - method: true - Enum.TextChatMessageStatus.InvalidPrivacySettings: - struct: EnumItem - Enum.TextChatMessageStatus.InvalidTextChannelPermissions: - struct: EnumItem - Enum.TextChatMessageStatus.MessageTooLong: - struct: EnumItem - Enum.TextChatMessageStatus.Sending: - struct: EnumItem - Enum.TextChatMessageStatus.Success: - struct: EnumItem - Enum.TextChatMessageStatus.TextFilterFailed: - struct: EnumItem - Enum.TextChatMessageStatus.Unknown: - struct: EnumItem - Enum.TextFilterContext.GetEnumItems: - args: [] - method: true - Enum.TextFilterContext.PrivateChat: - struct: EnumItem - Enum.TextFilterContext.PublicChat: - struct: EnumItem - Enum.TextInputType.Default: - struct: EnumItem - Enum.TextInputType.Email: - struct: EnumItem - Enum.TextInputType.GetEnumItems: - args: [] - method: true - Enum.TextInputType.NoSuggestions: - struct: EnumItem - Enum.TextInputType.Number: - struct: EnumItem - Enum.TextInputType.OneTimePassword: - struct: EnumItem - Enum.TextInputType.Password: - struct: EnumItem - Enum.TextInputType.PasswordShown: - struct: EnumItem - Enum.TextInputType.Phone: - struct: EnumItem - Enum.TextInputType.Username: - struct: EnumItem - Enum.TextTruncate.AtEnd: - struct: EnumItem - Enum.TextTruncate.GetEnumItems: - args: [] - method: true - Enum.TextTruncate.None: - struct: EnumItem - Enum.TextXAlignment.Center: - struct: EnumItem - Enum.TextXAlignment.GetEnumItems: - args: [] - method: true - Enum.TextXAlignment.Left: - struct: EnumItem - Enum.TextXAlignment.Right: - struct: EnumItem - Enum.TextYAlignment.Bottom: - struct: EnumItem - Enum.TextYAlignment.Center: - struct: EnumItem - Enum.TextYAlignment.GetEnumItems: - args: [] - method: true - Enum.TextYAlignment.Top: - struct: EnumItem - Enum.TextureMode.GetEnumItems: - args: [] - method: true - Enum.TextureMode.Static: - struct: EnumItem - Enum.TextureMode.Stretch: - struct: EnumItem - Enum.TextureMode.Wrap: - struct: EnumItem - Enum.TextureQueryType.GetEnumItems: - args: [] - method: true - Enum.TextureQueryType.Humanoid: - struct: EnumItem - Enum.TextureQueryType.HumanoidOrphaned: - struct: EnumItem - Enum.TextureQueryType.NonHumanoid: - struct: EnumItem - Enum.TextureQueryType.NonHumanoidOrphaned: - struct: EnumItem - Enum.ThreadPoolConfig.Auto: - struct: EnumItem - Enum.ThreadPoolConfig.GetEnumItems: - args: [] - method: true - Enum.ThreadPoolConfig.PerCore1: - struct: EnumItem - Enum.ThreadPoolConfig.PerCore2: - struct: EnumItem - Enum.ThreadPoolConfig.PerCore3: - struct: EnumItem - Enum.ThreadPoolConfig.PerCore4: - struct: EnumItem - Enum.ThreadPoolConfig.Threads1: - struct: EnumItem - Enum.ThreadPoolConfig.Threads16: - struct: EnumItem - Enum.ThreadPoolConfig.Threads2: - struct: EnumItem - Enum.ThreadPoolConfig.Threads3: - struct: EnumItem - Enum.ThreadPoolConfig.Threads4: - struct: EnumItem - Enum.ThreadPoolConfig.Threads8: - struct: EnumItem - Enum.ThrottlingPriority.Default: - struct: EnumItem - Enum.ThrottlingPriority.ElevatedOnServer: - struct: EnumItem - Enum.ThrottlingPriority.Extreme: - struct: EnumItem - Enum.ThrottlingPriority.GetEnumItems: - args: [] - method: true - Enum.ThumbnailSize.GetEnumItems: - args: [] - method: true - Enum.ThumbnailSize.Size100x100: - struct: EnumItem - Enum.ThumbnailSize.Size150x150: - struct: EnumItem - Enum.ThumbnailSize.Size180x180: - struct: EnumItem - Enum.ThumbnailSize.Size352x352: - struct: EnumItem - Enum.ThumbnailSize.Size420x420: - struct: EnumItem - Enum.ThumbnailSize.Size48x48: - struct: EnumItem - Enum.ThumbnailSize.Size60x60: - struct: EnumItem - Enum.ThumbnailType.AvatarBust: - struct: EnumItem - Enum.ThumbnailType.AvatarThumbnail: - struct: EnumItem - Enum.ThumbnailType.GetEnumItems: - args: [] - method: true - Enum.ThumbnailType.HeadShot: - struct: EnumItem - Enum.TickCountSampleMethod.Benchmark: - struct: EnumItem - Enum.TickCountSampleMethod.Fast: - struct: EnumItem - Enum.TickCountSampleMethod.GetEnumItems: - args: [] - method: true - Enum.TickCountSampleMethod.Precise: - struct: EnumItem - Enum.TopBottom.Bottom: - struct: EnumItem - Enum.TopBottom.Center: - struct: EnumItem - Enum.TopBottom.GetEnumItems: - args: [] - method: true - Enum.TopBottom.Top: - struct: EnumItem - Enum.TouchCameraMovementMode.Classic: - struct: EnumItem - Enum.TouchCameraMovementMode.Default: - struct: EnumItem - Enum.TouchCameraMovementMode.Follow: - struct: EnumItem - Enum.TouchCameraMovementMode.GetEnumItems: - args: [] - method: true - Enum.TouchCameraMovementMode.Orbital: - struct: EnumItem - Enum.TouchMovementMode.ClickToMove: - struct: EnumItem - Enum.TouchMovementMode.DPad: - struct: EnumItem - Enum.TouchMovementMode.Default: - struct: EnumItem - Enum.TouchMovementMode.DynamicThumbstick: - struct: EnumItem - Enum.TouchMovementMode.GetEnumItems: - args: [] - method: true - Enum.TouchMovementMode.Thumbpad: - struct: EnumItem - Enum.TouchMovementMode.Thumbstick: - struct: EnumItem - Enum.TriStateBoolean.False: - struct: EnumItem - Enum.TriStateBoolean.GetEnumItems: - args: [] - method: true - Enum.TriStateBoolean.True: - struct: EnumItem - Enum.TriStateBoolean.Unknown: - struct: EnumItem - Enum.TweenStatus.Canceled: - struct: EnumItem - Enum.TweenStatus.Completed: - struct: EnumItem - Enum.TweenStatus.GetEnumItems: - args: [] - method: true - Enum.UITheme.Dark: - struct: EnumItem - Enum.UITheme.GetEnumItems: - args: [] - method: true - Enum.UITheme.Light: - struct: EnumItem - Enum.UiMessageType.GetEnumItems: - args: [] - method: true - Enum.UiMessageType.UiMessageError: - struct: EnumItem - Enum.UiMessageType.UiMessageInfo: - struct: EnumItem - Enum.UsageContext.Default: - struct: EnumItem - Enum.UsageContext.GetEnumItems: - args: [] - method: true - Enum.UsageContext.Preview: - struct: EnumItem - Enum.UserCFrame.GetEnumItems: - args: [] - method: true - Enum.UserCFrame.Head: - struct: EnumItem - Enum.UserCFrame.LeftHand: - struct: EnumItem - Enum.UserCFrame.RightHand: - struct: EnumItem - Enum.UserInputState.Begin: - struct: EnumItem - Enum.UserInputState.Cancel: - struct: EnumItem - Enum.UserInputState.Change: - struct: EnumItem - Enum.UserInputState.End: - struct: EnumItem - Enum.UserInputState.GetEnumItems: - args: [] - method: true - Enum.UserInputState.None: - struct: EnumItem - Enum.UserInputType.Accelerometer: - struct: EnumItem - Enum.UserInputType.Focus: - struct: EnumItem - Enum.UserInputType.Gamepad1: - struct: EnumItem - Enum.UserInputType.Gamepad2: - struct: EnumItem - Enum.UserInputType.Gamepad3: - struct: EnumItem - Enum.UserInputType.Gamepad4: - struct: EnumItem - Enum.UserInputType.Gamepad5: - struct: EnumItem - Enum.UserInputType.Gamepad6: - struct: EnumItem - Enum.UserInputType.Gamepad7: - struct: EnumItem - Enum.UserInputType.Gamepad8: - struct: EnumItem - Enum.UserInputType.GetEnumItems: - args: [] - method: true - Enum.UserInputType.Gyro: - struct: EnumItem - Enum.UserInputType.InputMethod: - struct: EnumItem - Enum.UserInputType.Keyboard: - struct: EnumItem - Enum.UserInputType.MouseButton1: - struct: EnumItem - Enum.UserInputType.MouseButton2: - struct: EnumItem - Enum.UserInputType.MouseButton3: - struct: EnumItem - Enum.UserInputType.MouseMovement: - struct: EnumItem - Enum.UserInputType.MouseWheel: - struct: EnumItem - Enum.UserInputType.None: - struct: EnumItem - Enum.UserInputType.TextInput: - struct: EnumItem - Enum.UserInputType.Touch: - struct: EnumItem - Enum.VRTouchpad.GetEnumItems: - args: [] - method: true - Enum.VRTouchpad.Left: - struct: EnumItem - Enum.VRTouchpad.Right: - struct: EnumItem - Enum.VRTouchpadMode.ABXY: - struct: EnumItem - Enum.VRTouchpadMode.GetEnumItems: - args: [] - method: true - Enum.VRTouchpadMode.Touch: - struct: EnumItem - Enum.VRTouchpadMode.VirtualThumbstick: - struct: EnumItem - Enum.VelocityConstraintMode.GetEnumItems: - args: [] - method: true - Enum.VelocityConstraintMode.Line: - struct: EnumItem - Enum.VelocityConstraintMode.Plane: - struct: EnumItem - Enum.VelocityConstraintMode.Vector: - struct: EnumItem - Enum.VerticalAlignment.Bottom: - struct: EnumItem - Enum.VerticalAlignment.Center: - struct: EnumItem - Enum.VerticalAlignment.GetEnumItems: - args: [] - method: true - Enum.VerticalAlignment.Top: - struct: EnumItem - Enum.VerticalScrollBarPosition.GetEnumItems: - args: [] - method: true - Enum.VerticalScrollBarPosition.Left: - struct: EnumItem - Enum.VerticalScrollBarPosition.Right: - struct: EnumItem - Enum.VibrationMotor.GetEnumItems: - args: [] - method: true - Enum.VibrationMotor.Large: - struct: EnumItem - Enum.VibrationMotor.LeftHand: - struct: EnumItem - Enum.VibrationMotor.LeftTrigger: - struct: EnumItem - Enum.VibrationMotor.RightHand: - struct: EnumItem - Enum.VibrationMotor.RightTrigger: - struct: EnumItem - Enum.VibrationMotor.Small: - struct: EnumItem - Enum.VirtualCursorMode.Default: - struct: EnumItem - Enum.VirtualCursorMode.Disabled: - struct: EnumItem - Enum.VirtualCursorMode.Enabled: - struct: EnumItem - Enum.VirtualCursorMode.GetEnumItems: - args: [] - method: true - Enum.VirtualInputMode.GetEnumItems: - args: [] - method: true - Enum.VirtualInputMode.None: - struct: EnumItem - Enum.VirtualInputMode.Playing: - struct: EnumItem - Enum.VirtualInputMode.Recording: - struct: EnumItem - Enum.VoiceChatState.Ended: - struct: EnumItem - Enum.VoiceChatState.Failed: - struct: EnumItem - Enum.VoiceChatState.GetEnumItems: - args: [] - method: true - Enum.VoiceChatState.Idle: - struct: EnumItem - Enum.VoiceChatState.Joined: - struct: EnumItem - Enum.VoiceChatState.Joining: - struct: EnumItem - Enum.VoiceChatState.JoiningRetry: - struct: EnumItem - Enum.VoiceChatState.Leaving: - struct: EnumItem - Enum.WaterDirection.GetEnumItems: - args: [] - method: true - Enum.WaterDirection.NegX: - struct: EnumItem - Enum.WaterDirection.NegY: - struct: EnumItem - Enum.WaterDirection.NegZ: - struct: EnumItem - Enum.WaterDirection.X: - struct: EnumItem - Enum.WaterDirection.Y: - struct: EnumItem - Enum.WaterDirection.Z: - struct: EnumItem - Enum.WaterForce.GetEnumItems: - args: [] - method: true - Enum.WaterForce.Max: - struct: EnumItem - Enum.WaterForce.Medium: - struct: EnumItem - Enum.WaterForce.None: - struct: EnumItem - Enum.WaterForce.Small: - struct: EnumItem - Enum.WaterForce.Strong: - struct: EnumItem - Enum.WrapLayerAutoSkin.Disabled: - struct: EnumItem - Enum.WrapLayerAutoSkin.EnabledOverride: - struct: EnumItem - Enum.WrapLayerAutoSkin.EnabledPreserve: - struct: EnumItem - Enum.WrapLayerAutoSkin.GetEnumItems: - args: [] - method: true - Enum.WrapLayerDebugMode.BoundCage: - struct: EnumItem - Enum.WrapLayerDebugMode.BoundCageAndLinks: - struct: EnumItem - Enum.WrapLayerDebugMode.GetEnumItems: - args: [] - method: true - Enum.WrapLayerDebugMode.HSRInner: - struct: EnumItem - Enum.WrapLayerDebugMode.HSRInnerReverse: - struct: EnumItem - Enum.WrapLayerDebugMode.HSROuter: - struct: EnumItem - Enum.WrapLayerDebugMode.HSROuterDetail: - struct: EnumItem - Enum.WrapLayerDebugMode.LayerCage: - struct: EnumItem - Enum.WrapLayerDebugMode.None: - struct: EnumItem - Enum.WrapLayerDebugMode.OuterCage: - struct: EnumItem - Enum.WrapLayerDebugMode.Rbf: - struct: EnumItem - Enum.WrapLayerDebugMode.Reference: - struct: EnumItem - Enum.WrapLayerDebugMode.ReferenceMeshAfterMorph: - struct: EnumItem - Enum.WrapTargetDebugMode.GetEnumItems: - args: [] - method: true - Enum.WrapTargetDebugMode.None: - struct: EnumItem - Enum.WrapTargetDebugMode.OuterCageDetail: - struct: EnumItem - Enum.WrapTargetDebugMode.Rbf: - struct: EnumItem - Enum.WrapTargetDebugMode.TargetCageCompressed: - struct: EnumItem - Enum.WrapTargetDebugMode.TargetCageInterface: - struct: EnumItem - Enum.WrapTargetDebugMode.TargetCageOriginal: - struct: EnumItem - Enum.WrapTargetDebugMode.TargetLayerCageCompressed: - struct: EnumItem - Enum.WrapTargetDebugMode.TargetLayerCageOriginal: - struct: EnumItem - Enum.WrapTargetDebugMode.TargetLayerInterface: - struct: EnumItem - Enum.ZIndexBehavior.GetEnumItems: - args: [] - method: true - Enum.ZIndexBehavior.Global: - struct: EnumItem - Enum.ZIndexBehavior.Sibling: - struct: EnumItem - Faces.new: - args: - - type: "..." - Instance.Lock: - args: - - type: "..." - Instance.Unlock: - args: - - type: "..." - Instance.new: - args: - - type: - - Accoutrement - - Accessory - - Hat - - AdvancedDragger - - AnalyticsService - - Animation - - CurveAnimation - - KeyframeSequence - - AnimationController - - AnimationRigData - - Animator - - Attachment - - Bone - - Backpack - - HopperBin - - Tool - - Flag - - WrapLayer - - WrapTarget - - Beam - - BindableEvent - - BindableFunction - - BodyAngularVelocity - - BodyForce - - BodyGyro - - BodyPosition - - BodyThrust - - BodyVelocity - - RocketPropulsion - - Breakpoint - - Camera - - BodyColors - - CharacterMesh - - Pants - - Shirt - - ShirtGraphic - - Skin - - ClickDetector - - Clouds - - Configuration - - AlignOrientation - - AlignPosition - - AngularVelocity - - BallSocketConstraint - - HingeConstraint - - LineForce - - LinearVelocity - - PlaneConstraint - - Plane - - RigidConstraint - - RodConstraint - - RopeConstraint - - CylindricalConstraint - - PrismaticConstraint - - SpringConstraint - - Torque - - TorsionSpringConstraint - - UniversalConstraint - - VectorForce - - HumanoidController - - SkateboardController - - VehicleController - - CustomEvent - - CustomEventReceiver - - BlockMesh - - CylinderMesh - - FileMesh - - SpecialMesh - - DataStoreIncrementOptions - - DataStoreOptions - - DataStoreSetOptions - - DebuggerWatch - - Dialog - - DialogChoice - - Dragger - - EulerRotationCurve - - Explosion - - FaceControls - - Decal - - Texture - - Hole - - MotorFeature - - Fire - - FloatCurve - - FlyweightService - - CSGDictionaryService - - NonReplicatedCSGDictionaryService - - ForceField - - FunctionalTest - - GetTextBoundsParams - - CanvasGroup - - Frame - - ImageButton - - TextButton - - ImageLabel - - TextLabel - - ScrollingFrame - - TextBox - - VideoFrame - - ViewportFrame - - BillboardGui - - ScreenGui - - GuiMain - - SurfaceGui - - FloorWire - - SelectionBox - - BoxHandleAdornment - - ConeHandleAdornment - - CylinderHandleAdornment - - ImageHandleAdornment - - LineHandleAdornment - - SphereHandleAdornment - - ParabolaAdornment - - SelectionSphere - - ArcHandles - - Handles - - SurfaceSelection - - SelectionPartLasso - - SelectionPointLasso - - HeightmapImporterService - - HiddenSurfaceRemovalAsset - - Highlight - - Humanoid - - HumanoidDescription - - RotateP - - RotateV - - Glue - - ManualGlue - - ManualWeld - - Motor - - Motor6D - - Rotate - - Snap - - VelocityMotor - - Weld - - Keyframe - - KeyframeMarker - - PointLight - - SpotLight - - SurfaceLight - - LocalizationTable - - Script - - LocalScript - - ModuleScript - - MarkerCurve - - MaterialVariant - - MemoryStoreService - - Message - - Hint - - NoCollisionConstraint - - CornerWedgePart - - Part - - FlagStand - - Seat - - SkateboardPlatform - - SpawnLocation - - WedgePart - - MeshPart - - PartOperation - - NegateOperation - - UnionOperation - - TrussPart - - VehicleSeat - - Model - - Actor - - WorldModel - - PartOperationAsset - - ParticleEmitter - - PathfindingLink - - PathfindingModifier - - Player - - PluginAction - - NumberPose - - Pose - - BloomEffect - - BlurEffect - - ColorCorrectionEffect - - DepthOfFieldEffect - - SunRaysEffect - - ReflectionMetadata - - ReflectionMetadataCallbacks - - ReflectionMetadataClasses - - ReflectionMetadataEnums - - ReflectionMetadataEvents - - ReflectionMetadataFunctions - - ReflectionMetadataClass - - ReflectionMetadataEnum - - ReflectionMetadataEnumItem - - ReflectionMetadataMember - - ReflectionMetadataProperties - - ReflectionMetadataYieldFunctions - - RemoteEvent - - RemoteFunction - - RenderingTest - - RotationCurve - - Sky - - Smoke - - Sound - - ChorusSoundEffect - - CompressorSoundEffect - - ChannelSelectorSoundEffect - - DistortionSoundEffect - - EchoSoundEffect - - EqualizerSoundEffect - - FlangeSoundEffect - - PitchShiftSoundEffect - - ReverbSoundEffect - - TremoloSoundEffect - - SoundGroup - - Sparkles - - Speaker - - StandalonePluginScripts - - StarterGear - - SurfaceAppearance - - Team - - TeleportOptions - - TerrainDetail - - TerrainRegion - - TestService - - TextChannel - - TextChatCommand - - TextChatMessageProperties - - TrackerStreamAnimation - - Trail - - Tween - - BinaryStringValue - - BoolValue - - BrickColorValue - - CFrameValue - - Color3Value - - DoubleConstrainedValue - - IntConstrainedValue - - IntValue - - NumberValue - - ObjectValue - - RayValue - - StringValue - - Vector3Value - - Vector3Curve - - VirtualInputManager - - VoiceChannel - - WeldConstraint - NumberRange.new: - args: - - type: number - - required: false - type: number - NumberSequence.new: - args: - - type: any - - required: false - type: number - NumberSequenceKeypoint.new: - args: - - type: number - - type: number - - required: false - type: number - OverlapParams.new: - args: [] - PathWaypoint.new: - args: - - required: false - type: - display: Vector3 - - required: false - type: - display: PathWaypointAction - PhysicalProperties.new: - args: - - type: any - - required: false - type: number - - required: false - type: number - - required: false - type: number - - required: false - type: number - Random.new: - args: - - required: false - type: number - Ray.new: - args: - - type: - display: Vector3 - - type: - display: Vector3 - RaycastParams.new: - args: [] - Rect.new: - args: - - type: any - - type: any - - required: false - type: number - - required: false - type: number - Region3.new: - args: - - type: - display: Vector3 - - type: - display: Vector3 - Region3int16.new: - args: - - required: false - type: - display: Vector3 - - required: false - type: - display: Vector3 - TweenInfo.new: - args: - - required: false - type: number - - required: false - type: - display: EasingStyle - - required: false - type: - display: EasingDirection - - required: false - type: number - - required: false - type: bool - - required: false - type: number - UDim.new: - args: - - required: false - type: number - - required: false - type: number - UDim2.fromOffset: - args: - - required: use UDim2.new() if you want an empty UDim2 - type: number - - required: false - type: number - UDim2.fromScale: - args: - - required: use UDim2.new() if you want an empty UDim2 - type: number - - required: false - type: number - UDim2.new: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: number - - required: false - type: number - UserSettings: - args: [] - Vector2.new: - args: - - required: false - type: number - - required: false - type: number - Vector2.one: - property: read-only - Vector2.xAxis: - property: read-only - Vector2.yAxis: - property: read-only - Vector2.zero: - property: read-only - Vector2int16.new: - args: - - required: false - type: number - - required: false - type: number - Vector3.FromAxis: - args: - - type: - display: Axis - Vector3.FromNormalId: - args: - - type: - display: NormalId - Vector3.new: - args: - - required: false - type: number - - required: false - type: number - - required: false - type: number - Vector3.one: - property: read-only - Vector3.xAxis: - property: read-only - Vector3.yAxis: - property: read-only - Vector3.zAxis: - property: read-only - Vector3.zero: - property: read-only - Vector3int16.new: - args: - - required: false - type: number - - required: false - type: number - - required: false - type: number - bit32.arshift: - args: - - type: number - - type: number - bit32.band: - args: - - type: "..." - bit32.bnot: - args: - - type: number - bit32.bor: - args: - - type: "..." - bit32.btest: - args: - - type: "..." - bit32.bxor: - args: - - type: "..." - bit32.countlz: - args: - - type: number - bit32.countrz: - args: - - type: number - bit32.extract: - args: - - type: number - - type: number - - required: false - type: number - bit32.lrotate: - args: - - type: number - - type: number - bit32.lshift: - args: - - type: number - - type: number - bit32.replace: - args: - - type: number - - type: number - - type: number - - required: false - type: number - bit32.rrotate: - args: - - type: number - - type: number - bit32.rshift: - args: - - type: number - - type: number - collectgarbage: - args: - - type: - - count - coroutine.close: - args: - - type: - display: thread - coroutine.isyieldable: - args: [] - debug.debug: - removed: true - debug.getfenv: - removed: true - debug.gethook: - removed: true - debug.getinfo: - removed: true - debug.getlocal: - removed: true - debug.getmetatable: - removed: true - debug.getregistry: - removed: true - debug.getupvalue: - removed: true - debug.info: - args: - - type: any - - type: any - - required: false - type: string - debug.profilebegin: - args: - - type: string - debug.profileend: - args: [] - debug.resetmemorycategory: - args: [] - debug.setfenv: - removed: true - debug.sethook: - removed: true - debug.setlocal: - removed: true - debug.setmemorycategory: - args: - - type: string - debug.setmetatable: - removed: true - debug.setupvalue: - removed: true - delay: - args: - - type: number - - type: function - Delay: - args: - - type: number - - type: function - dofile: - removed: true - elapsedTime: - args: [] - error: - args: - - required: Erroring without an explanation is unhelpful to users. - type: any - - required: false - type: number - game: - struct: DataModel - Game: - struct: DataModel - gcinfo: - args: [] - io: - removed: true - load: - removed: true - math.clamp: - args: - - type: number - - type: number - - type: number - math.log: - args: - - type: number - - required: false - type: number - math.noise: - args: - - type: number - - required: false - type: number - - required: false - type: number - math.round: - args: - - type: number - math.sign: - args: - - type: number - math.nan: - property: read-only - math.inf: - property: read-only - module: - removed: true - os.execute: - removed: true - os.exit: - removed: true - os.getenv: - removed: true - os.remove: - removed: true - os.rename: - removed: true - os.setlocale: - removed: true - os.tmpname: - removed: true - package: - removed: true - plugin: - struct: Plugin - require: - args: - - type: any - script: - struct: Script - settings: - args: [] - shared: - property: new-fields - spawn: - args: - - type: function - Spawn: - args: - - type: function - - required: false - type: "..." - LoadLibrary: - args: - - type: string - string.dump: - removed: true - string.pack: - args: - - type: string - - type: "..." - string.packsize: - args: - - type: string - string.split: - args: - - type: string - - required: false - type: string - string.unpack: - args: - - type: string - - type: string - - required: false - type: number - table.clear: - args: - - type: table - table.clone: - args: - - type: table - table.create: - args: - - type: number - - required: false - type: any - table.find: - args: - - type: table - - type: any - - required: false - type: number - table.freeze: - args: - - type: table - table.isfrozen: - args: - - type: table - table.move: - args: - - type: table - - type: number - - type: number - - type: number - - required: false - type: table - table.pack: - args: - - type: "..." - table.unpack: - args: - - type: table - - required: false - type: number - - required: false - type: number - task.cancel: - args: - - type: - display: thread - task.defer: - args: - - type: function - - required: false - type: "..." - task.delay: - args: - - required: false - type: number - - type: function - - required: false - type: "..." - task.desynchronize: - args: [] - task.spawn: - args: - - type: function - - required: false - type: "..." - task.synchronize: - args: [] - task.wait: - args: - - required: false - type: number - tick: - args: [] - time: - args: [] - typeof: - args: - - type: any - utf8.char: - args: - - required: utf8.char should be used with an argument despite it not throwing - type: number - - required: false - type: "..." - utf8.charpattern: - property: read-only - utf8.codepoint: - args: - - type: string - - required: false - type: number - - required: false - type: number - utf8.codes: - args: - - type: string - utf8.graphemes: - args: - - type: string - - required: false - type: number - - required: false - type: number - utf8.len: - args: - - type: string - - required: false - type: number - - required: false - type: number - utf8.nfcnormalize: - args: - - type: string - utf8.nfdnormalize: - args: - - type: string - utf8.offset: - args: - - type: string - - required: false - type: number - - required: false - type: number - wait: - args: - - required: false - type: number - warn: - args: - - type: string - - required: false - type: "..." - workspace: - struct: Workspace -structs: - BasePart: - "*": - struct: Instance - AncestryChanged: - struct: Event - Anchored: - property: override-fields - ApplyAngularImpulse: - args: - - required: false - type: any - method: true - ApplyImpulse: - args: - - required: false - type: any - method: true - ApplyImpulseAtPosition: - args: - - required: false - type: any - - required: false - type: any - method: true - Archivable: - property: override-fields - AssemblyAngularVelocity: - any: true - AssemblyCenterOfMass: - any: true - AssemblyLinearVelocity: - any: true - AssemblyMass: - property: read-only - AssemblyRootPart: - struct: BasePart - AttributeChanged: - struct: Event - BackParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BackParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BackSurface: - property: override-fields - BackSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BottomParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BottomParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BottomSurface: - property: override-fields - BottomSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BreakJoints: - args: [] - method: true - BrickColor: - property: override-fields - CFrame: - any: true - CanCollide: - property: override-fields - CanCollideWith: - args: - - required: false - type: any - method: true - CanQuery: - property: override-fields - CanSetNetworkOwnership: - args: [] - method: true - CanTouch: - property: override-fields - CastShadow: - property: override-fields - CenterOfMass: - any: true - Changed: - struct: Event - ChildAdded: - struct: Event - ChildRemoved: - struct: Event - ClassName: - property: read-only - ClearAllChildren: - args: [] - method: true - Clone: - args: [] - method: true - CollisionGroupId: - property: override-fields - Color: - property: override-fields - CustomPhysicalProperties: - property: override-fields - DescendantAdded: - struct: Event - DescendantRemoving: - struct: Event - Destroy: - args: [] - method: true - Destroying: - struct: Event - Elasticity: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FindFirstAncestor: - args: - - required: false - type: any - method: true - FindFirstAncestorOfClass: - args: - - required: false - type: any - method: true - FindFirstAncestorWhichIsA: - args: - - required: false - type: any - method: true - FindFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstChildOfClass: - args: - - required: false - type: any - method: true - FindFirstChildWhichIsA: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstDescendant: - args: - - required: false - type: any - method: true - Friction: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FrontParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FrontParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FrontSurface: - property: override-fields - FrontSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - GetActor: - args: [] - method: true - GetAttribute: - args: - - required: false - type: any - method: true - GetAttributeChangedSignal: - args: - - required: false - type: any - method: true - GetAttributes: - args: [] - method: true - GetChildren: - args: [] - method: true - GetConnectedParts: - args: - - required: false - type: any - method: true - GetDebugId: - args: - - required: false - type: any - method: true - GetDescendants: - args: [] - method: true - GetFullName: - args: [] - method: true - GetJoints: - args: [] - method: true - GetMass: - args: [] - method: true - GetNetworkOwner: - args: [] - method: true - GetNetworkOwnershipAuto: - args: [] - method: true - GetPivot: - args: [] - method: true - GetPropertyChangedSignal: - args: - - required: false - type: any - method: true - GetRenderCFrame: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - GetRootPart: - args: [] - method: true - GetTouchingParts: - args: [] - method: true - GetVelocityAtPosition: - args: - - required: false - type: any - method: true - IsA: - args: - - required: false - type: any - method: true - IsAncestorOf: - args: - - required: false - type: any - method: true - IsDescendantOf: - args: - - required: false - type: any - method: true - IsGrounded: - args: [] - method: true - LeftParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - LeftParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - LeftSurface: - property: override-fields - LeftSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - LocalSimulationTouched: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - LocalTransparencyModifier: - property: override-fields - Locked: - property: override-fields - MakeJoints: - args: [] - method: true - Mass: - property: read-only - Massless: - property: override-fields - Material: - property: override-fields - MaterialVariant: - property: override-fields - Name: - property: override-fields - Orientation: - any: true - Origin Orientation: - any: true - Origin Position: - any: true - OutfitChanged: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - Parent: - struct: Instance - Pivot Offset Orientation: - any: true - Pivot Offset Position: - any: true - PivotOffset: - any: true - PivotTo: - args: - - required: false - type: any - method: true - Position: - any: true - ReceiveAge: - property: read-only - Reflectance: - property: override-fields - Remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - Resize: - args: - - required: false - type: any - - required: false - type: any - method: true - ResizeIncrement: - property: read-only - ResizeableFaces: - property: read-only - RightParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - RightParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - RightSurface: - property: override-fields - RightSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - RootPriority: - property: override-fields - RotVelocity: - any: true - deprecated: - message: this property is deprecated. - replace: [] - Rotation: - any: true - SetAttribute: - args: - - required: false - type: any - - required: false - type: any - method: true - SetNetworkOwner: - args: - - required: false - type: any - method: true - SetNetworkOwnershipAuto: - args: [] - method: true - Size: - any: true - SpecificGravity: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - StoppedTouching: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - SubtractAsync: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - TopParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - TopParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - TopSurface: - property: override-fields - TopSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - TouchEnded: - struct: Event - Touched: - struct: Event - Transparency: - property: override-fields - UnionAsync: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - Velocity: - any: true - deprecated: - message: this property is deprecated. - replace: [] - WaitForChild: - args: - - required: false - type: any - - required: false - type: any - method: true - archivable: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - breakJoints: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - brickColor: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - childAdded: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - children: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - className: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - clone: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - destroy: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - findFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - getChildren: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - getMass: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - isA: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isDescendantOf: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - makeJoints: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - resize: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - Camera: - "*": - struct: Instance - AncestryChanged: - struct: Event - Archivable: - property: override-fields - AttributeChanged: - struct: Event - CFrame: - any: true - CameraSubject: - struct: Instance - CameraType: - property: override-fields - Changed: - struct: Event - ChildAdded: - struct: Event - ChildRemoved: - struct: Event - ClassName: - property: read-only - ClearAllChildren: - args: [] - method: true - Clone: - args: [] - method: true - CoordinateFrame: - any: true - DescendantAdded: - struct: Event - DescendantRemoving: - struct: Event - Destroy: - args: [] - method: true - Destroying: - struct: Event - DiagonalFieldOfView: - property: override-fields - FieldOfView: - property: override-fields - FieldOfViewMode: - property: override-fields - FindFirstAncestor: - args: - - required: false - type: any - method: true - FindFirstAncestorOfClass: - args: - - required: false - type: any - method: true - FindFirstAncestorWhichIsA: - args: - - required: false - type: any - method: true - FindFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstChildOfClass: - args: - - required: false - type: any - method: true - FindFirstChildWhichIsA: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstDescendant: - args: - - required: false - type: any - method: true - FirstPersonTransition: - struct: Event - Focus: - any: true - GetActor: - args: [] - method: true - GetAttribute: - args: - - required: false - type: any - method: true - GetAttributeChangedSignal: - args: - - required: false - type: any - method: true - GetAttributes: - args: [] - method: true - GetChildren: - args: [] - method: true - GetDebugId: - args: - - required: false - type: any - method: true - GetDescendants: - args: [] - method: true - GetFullName: - args: [] - method: true - GetLargestCutoffDistance: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - GetPanSpeed: - args: [] - method: true - GetPartsObscuringTarget: - args: - - required: false - type: any - - required: false - type: any - method: true - GetPropertyChangedSignal: - args: - - required: false - type: any - method: true - GetRenderCFrame: - args: [] - method: true - GetRoll: - args: [] - method: true - GetTiltSpeed: - args: [] - method: true - HeadLocked: - property: override-fields - HeadScale: - property: override-fields - Interpolate: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - InterpolationFinished: - struct: Event - IsA: - args: - - required: false - type: any - method: true - IsAncestorOf: - args: - - required: false - type: any - method: true - IsDescendantOf: - args: - - required: false - type: any - method: true - MaxAxisFieldOfView: - property: override-fields - Name: - property: override-fields - NearPlaneZ: - property: read-only - PanUnits: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - Parent: - struct: Instance - Remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - ScreenPointToRay: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - SetAttribute: - args: - - required: false - type: any - - required: false - type: any - method: true - SetCameraPanMode: - args: - - required: false - type: any - method: true - SetImageServerView: - args: - - required: false - type: any - method: true - SetRoll: - args: - - required: false - type: any - method: true - TiltUnits: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - ViewportPointToRay: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - ViewportSize: - any: true - WaitForChild: - args: - - required: false - type: any - - required: false - type: any - method: true - WorldToScreenPoint: - args: - - required: false - type: any - method: true - WorldToViewportPoint: - args: - - required: false - type: any - method: true - Zoom: - args: - - required: false - type: any - method: true - archivable: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - childAdded: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - children: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - className: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - clone: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - destroy: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - findFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - focus: - any: true - deprecated: - message: this property is deprecated. - replace: [] - getChildren: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - isA: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isDescendantOf: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - DataModel: - "*": - struct: Instance - AllowedGearTypeChanged: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - AncestryChanged: - struct: Event - Archivable: - property: override-fields - AttributeChanged: - struct: Event - BindToClose: - args: - - required: false - type: any - method: true - Changed: - struct: Event - ChildAdded: - struct: Event - ChildRemoved: - struct: Event - ClassName: - property: read-only - ClearAllChildren: - args: [] - method: true - Clone: - args: [] - method: true - Close: - struct: Event - CloseLate: - struct: Event - CreatorId: - property: read-only - CreatorType: - property: read-only - DefineFastFlag: - args: - - required: false - type: any - - required: false - type: any - method: true - DefineFastInt: - args: - - required: false - type: any - - required: false - type: any - method: true - DefineFastString: - args: - - required: false - type: any - - required: false - type: any - method: true - DescendantAdded: - struct: Event - DescendantRemoving: - struct: Event - Destroy: - args: [] - method: true - Destroying: - struct: Event - FindFirstAncestor: - args: - - required: false - type: any - method: true - FindFirstAncestorOfClass: - args: - - required: false - type: any - method: true - FindFirstAncestorWhichIsA: - args: - - required: false - type: any - method: true - FindFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstChildOfClass: - args: - - required: false - type: any - method: true - FindFirstChildWhichIsA: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstDescendant: - args: - - required: false - type: any - method: true - FindService: - args: - - required: false - type: any - method: true - GameId: - property: read-only - GearGenreSetting: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - Genre: - property: read-only - GetActor: - args: [] - method: true - GetAttribute: - args: - - required: false - type: any - method: true - GetAttributeChangedSignal: - args: - - required: false - type: any - method: true - GetAttributes: - args: [] - method: true - GetChildren: - args: [] - method: true - GetDebugId: - args: - - required: false - type: any - method: true - GetDescendants: - args: [] - method: true - GetEngineFeature: - args: - - required: false - type: any - method: true - GetFastFlag: - args: - - required: false - type: any - method: true - GetFastInt: - args: - - required: false - type: any - method: true - GetFastString: - args: - - required: false - type: any - method: true - GetFullName: - args: [] - method: true - GetJobsInfo: - args: [] - method: true - GetMessage: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - GetObjects: - args: - - required: false - type: any - method: true - GetObjectsAllOrNone: - args: - - required: false - type: any - method: true - GetObjectsAsync: - args: - - required: false - type: any - method: true - GetObjectsList: - args: - - required: false - type: any - method: true - GetPropertyChangedSignal: - args: - - required: false - type: any - method: true - GetRemoteBuildMode: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - SetRemoteBuildMode: - args: - - type: any - method: true - - SaveToRoblox: - method: true - args: - - required: false - type: any - FinishShutdown: - method: true - args: - - required: false - type: any - SetMessageBrickCount: - method: true - args: [] - GetService: - args: - - type: - - ABTestService - - AdService - - AnalyticsService - - AnimationClipProvider - - AnimationFromVideoCreatorService - - AnimationFromVideoCreatorStudioService - - AppUpdateService - - AssetCounterService - - AssetDeliveryProxy - - AssetImportService - - AssetManagerService - - AssetService - - AvatarEditorService - - AvatarImportService - - BadgeService - - CoreGui - - StarterGui - - BreakpointManager - - BrowserService - - BulkImportService - - CacheableContentProvider - - HSRDataContentProvider - - MeshContentProvider - - SolidModelContentProvider - - CalloutService - - ChangeHistoryService - - Chat - - ClusterPacketCache - - CollectionService - - CommandService - - ConfigureServerService - - ContentProvider - - ContextActionService - - ControllerService - - CookiesService - - CorePackages - - CoreScriptSyncService - - CrossDMScriptChangeListener - - DataModelPatchService - - DataStoreService - - Debris - - DebuggablePluginWatcher - - DebuggerConnectionManager - - DebuggerManager - - DebuggerUIService - - DraftsService - - DraggerService - - EventIngestService - - FaceAnimatorService - - FacialAnimationStreamingService - - FlagStandService - - FlyweightService - - CSGDictionaryService - - NonReplicatedCSGDictionaryService - - FriendService - - GamePassService - - GamepadService - - Geometry - - GoogleAnalyticsConfiguration - - GroupService - - GuiService - - GuidRegistryService - - HapticService - - HeightmapImporterService - - Hopper - - HttpRbxApiService - - HttpService - - ILegacyStudioBridge - - LegacyStudioBridge - - IXPService - - IncrementalPatchBuilder - - InsertService - - JointsService - - KeyboardService - - KeyframeSequenceProvider - - LSPFileSyncService - - LanguageService - - Lighting - - LocalStorageService - - AppStorageService - - UserStorageService - - LocalizationService - - LodDataService - - LoginService - - LuaWebService - - LuauScriptAnalyzerService - - MarketplaceService - - MaterialService - - MemStorageService - - MemoryStoreService - - MessageBusService - - MessagingService - - MouseService - - NetworkClient - - NetworkServer - - NetworkSettings - - NotificationService - - Workspace - - PackageService - - PackageUIService - - PathfindingService - - PermissionsService - - PersonalServerService - - PhysicsService - - PlayerEmulatorService - - Players - - PluginDebugService - - PluginGuiService - - PluginPolicyService - - PointsService - - PolicyService - - ProcessInstancePhysicsService - - ProximityPromptService - - PublishService - - RbxAnalyticsService - - RemoteDebuggerServer - - RenderSettings - - ReplicatedFirst - - ReplicatedStorage - - RobloxPluginGuiService - - RobloxReplicatedStorage - - RtMessagingService - - RunService - - RuntimeScriptService - - ScriptChangeService - - ScriptCloneWatcher - - ScriptCloneWatcherHelper - - ScriptContext - - ScriptEditorService - - ScriptInformationProvider - - ScriptRegistrationService - - ScriptService - - Selection - - ServerScriptService - - ServerStorage - - SessionService - - SnippetService - - SocialService - - SoundService - - SpawnerService - - StarterPack - - StarterPlayer - - Stats - - StopWatchReporter - - Studio - - StudioAssetService - - StudioData - - StudioDeviceEmulatorService - - StudioHighDpiService - - StudioPublishService - - StudioScriptDebugEventListener - - StudioService - - TaskScheduler - - Teams - - TeleportService - - TemporaryCageMeshProvider - - TemporaryScriptService - - Terrain - - TestService - - TextBoxService - - TextChatService - - TextService - - ThirdPartyUserService - - TimerService - - ToastNotificationService - - ToolboxService - - TouchInputService - - TracerService - - TweenService - - UGCValidationService - - UnvalidatedAssetService - - UserInputService - - UserService - - VRService - - VersionControlService - - VideoCaptureService - - VirtualInputManager - - VirtualUser - - VisibilityService - - Visit - - VoiceChatInternal - - VoiceChatService - method: true - GraphicsQualityChangeRequest: - struct: Event - HttpGet: - args: - - required: false - type: any - - required: false - type: any - method: true - HttpGetAsync: - args: - - required: false - type: any - - required: false - type: any - method: true - HttpPost: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - HttpPostAsync: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - InsertObjectsAndJoinIfLegacyAsync: - args: - - required: false - type: any - method: true - IsA: - args: - - required: false - type: any - method: true - IsAncestorOf: - args: - - required: false - type: any - method: true - IsDescendantOf: - args: - - required: false - type: any - method: true - IsGearTypeAllowed: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - IsLoaded: - args: [] - method: true - ItemChanged: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - JobId: - property: read-only - Load: - args: - - required: false - type: any - method: true - Loaded: - struct: Event - Name: - property: override-fields - OnClose: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - OpenScreenshotsFolder: - args: [] - method: true - OpenVideosFolder: - args: [] - method: true - Parent: - struct: Instance - PlaceId: - property: read-only - PlaceVersion: - property: read-only - PrivateServerId: - property: read-only - PrivateServerOwnerId: - property: read-only - Remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - ReportInGoogleAnalytics: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - SavePlace: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - ScreenshotReady: - struct: Event - ScreenshotSavedToAlbum: - struct: Event - ServiceAdded: - struct: Event - ServiceRemoving: - struct: Event - SetAttribute: - args: - - required: false - type: any - - required: false - type: any - method: true - SetFastFlagForTesting: - args: - - required: false - type: any - - required: false - type: any - method: true - SetFastIntForTesting: - args: - - required: false - type: any - - required: false - type: any - method: true - SetFastStringForTesting: - args: - - required: false - type: any - - required: false - type: any - method: true - SetPlaceId: - args: - - required: false - type: any - method: true - SetPlaceID: - args: - - type: any - - required: false - type: any - method: true - SetCreatorID: - args: - - type: any - - type: any - method: true - SetScreenshotInfo: - args: - - type: any - method: true - SetVideoInfo: - args: - - type: any - method: true - SetUniverseId: - args: - - required: false - type: any - method: true - SetMessage: - args: - - type: any - method: true - ClearMessage: - args: [] - method: true - Shutdown: - args: [] - method: true - VIPServerId: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - VIPServerOwnerId: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - WaitForChild: - args: - - required: false - type: any - - required: false - type: any - method: true - Workspace: - struct: Workspace - archivable: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - childAdded: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - children: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - className: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - clone: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - destroy: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - findFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - getChildren: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - getService: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isA: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isDescendantOf: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - lighting: - struct: Instance - deprecated: - message: this property is deprecated. - replace: [] - remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - service: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - workspace: - struct: Workspace - deprecated: - message: this property is deprecated. - replace: [] - EnumItem: - Name: - property: read-only - Value: - property: read-only - Event: - connect: - args: - - type: function - method: true - wait: - args: - - type: function - method: true - Instance: - "*": - any: true - Plugin: - "*": - struct: Instance - Activate: - args: - - required: false - type: any - method: true - AncestryChanged: - struct: Event - Archivable: - property: override-fields - AttributeChanged: - struct: Event - Changed: - struct: Event - ChildAdded: - struct: Event - ChildRemoved: - struct: Event - ClassName: - property: read-only - ClearAllChildren: - args: [] - method: true - Clone: - args: [] - method: true - CollisionEnabled: - property: read-only - CreateDockWidgetPluginGui: - args: - - required: false - type: any - - required: false - type: any - method: true - CreatePluginAction: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - CreatePluginMenu: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - CreateQWidgetPluginGui: - args: - - required: false - type: any - - required: false - type: any - method: true - CreateToolbar: - args: - - required: false - type: any - method: true - Deactivate: - args: [] - method: true - Deactivation: - struct: Event - DescendantAdded: - struct: Event - DescendantRemoving: - struct: Event - Destroy: - args: [] - method: true - Destroying: - struct: Event - FindFirstAncestor: - args: - - required: false - type: any - method: true - FindFirstAncestorOfClass: - args: - - required: false - type: any - method: true - FindFirstAncestorWhichIsA: - args: - - required: false - type: any - method: true - FindFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstChildOfClass: - args: - - required: false - type: any - method: true - FindFirstChildWhichIsA: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstDescendant: - args: - - required: false - type: any - method: true - GetActor: - args: [] - method: true - GetAttribute: - args: - - required: false - type: any - method: true - GetAttributeChangedSignal: - args: - - required: false - type: any - method: true - GetAttributes: - args: [] - method: true - GetChildren: - args: [] - method: true - GetDebugId: - args: - - required: false - type: any - method: true - GetDescendants: - args: [] - method: true - GetFullName: - args: [] - method: true - GetItem: - args: - - required: false - type: any - - required: false - type: any - method: true - GetJoinMode: - args: [] - method: true - GetMouse: - args: [] - method: true - GetPropertyChangedSignal: - args: - - required: false - type: any - method: true - GetSelectedRibbonTool: - args: [] - method: true - GetSetting: - args: - - required: false - type: any - method: true - GetStudioUserId: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - GridSize: - property: read-only - ImportFbxAnimation: - args: - - required: false - type: any - - required: false - type: any - method: true - ImportFbxRig: - args: - - required: false - type: any - method: true - Invoke: - args: - - required: false - type: any - - required: false - type: any - method: true - IsA: - args: - - required: false - type: any - method: true - IsActivated: - args: [] - method: true - IsActivatedWithExclusiveMouse: - args: [] - method: true - IsAncestorOf: - args: - - required: false - type: any - method: true - IsDescendantOf: - args: - - required: false - type: any - method: true - Name: - property: override-fields - Negate: - args: - - required: false - type: any - method: true - OnInvoke: - args: - - required: false - type: any - - required: false - type: any - method: true - OnSetItem: - args: - - required: false - type: any - - required: false - type: any - method: true - OpenScript: - args: - - required: false - type: any - - required: false - type: any - method: true - OpenWikiPage: - args: - - required: false - type: any - method: true - Parent: - struct: Instance - PauseSound: - args: - - required: false - type: any - method: true - PlaySound: - args: - - required: false - type: any - - required: false - type: any - method: true - PromptForExistingAssetId: - args: - - required: false - type: any - method: true - PromptSaveSelection: - args: - - required: false - type: any - method: true - Ready: - struct: Event - Remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - ResumeSound: - args: - - required: false - type: any - method: true - SaveSelectedToRoblox: - args: [] - method: true - SelectRibbonTool: - args: - - required: false - type: any - - required: false - type: any - method: true - Separate: - args: - - required: false - type: any - method: true - SetAttribute: - args: - - required: false - type: any - - required: false - type: any - method: true - SetItem: - args: - - required: false - type: any - - required: false - type: any - method: true - SetReady: - args: [] - method: true - SetSetting: - args: - - required: false - type: any - - required: false - type: any - method: true - StartDecalDrag: - args: - - required: false - type: any - method: true - StartDrag: - args: - - required: false - type: any - method: true - StopAllSounds: - args: [] - method: true - Union: - args: - - required: false - type: any - method: true - Unloading: - struct: Event - WaitForChild: - args: - - required: false - type: any - - required: false - type: any - method: true - archivable: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - childAdded: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - children: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - className: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - clone: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - destroy: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - findFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - getChildren: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - isA: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isDescendantOf: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - Script: - "*": - struct: Instance - AncestryChanged: - struct: Event - Archivable: - property: override-fields - AttributeChanged: - struct: Event - Changed: - struct: Event - ChildAdded: - struct: Event - ChildRemoved: - struct: Event - ClassName: - property: read-only - ClearAllChildren: - args: [] - method: true - Clone: - args: [] - method: true - CurrentEditor: - struct: Instance - DescendantAdded: - struct: Event - DescendantRemoving: - struct: Event - Destroy: - args: [] - method: true - Destroying: - struct: Event - Disabled: - property: override-fields - FindFirstAncestor: - args: - - required: false - type: any - method: true - FindFirstAncestorOfClass: - args: - - required: false - type: any - method: true - FindFirstAncestorWhichIsA: - args: - - required: false - type: any - method: true - FindFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstChildOfClass: - args: - - required: false - type: any - method: true - FindFirstChildWhichIsA: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstDescendant: - args: - - required: false - type: any - method: true - GetActor: - args: [] - method: true - GetAttribute: - args: - - required: false - type: any - method: true - GetAttributeChangedSignal: - args: - - required: false - type: any - method: true - GetAttributes: - args: [] - method: true - GetChildren: - args: [] - method: true - GetDebugId: - args: - - required: false - type: any - method: true - GetDescendants: - args: [] - method: true - GetFullName: - args: [] - method: true - GetHash: - args: [] - method: true - GetPropertyChangedSignal: - args: - - required: false - type: any - method: true - IsA: - args: - - required: false - type: any - method: true - IsAncestorOf: - args: - - required: false - type: any - method: true - IsDescendantOf: - args: - - required: false - type: any - method: true - LinkedSource: - property: override-fields - Name: - property: override-fields - Parent: - struct: Instance - Remove: - args: [] - method: true - SetAttribute: - args: - - required: false - type: any - - required: false - type: any - method: true - WaitForChild: - args: - - required: false - type: any - - required: false - type: any - method: true - archivable: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - childAdded: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - children: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - className: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - clone: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - destroy: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - findFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - getChildren: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - isA: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isDescendantOf: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - remove: - args: [] - method: true - Terrain: - "*": - struct: Instance - AncestryChanged: - struct: Event - Anchored: - property: override-fields - ApplyAngularImpulse: - args: - - required: false - type: any - method: true - ApplyImpulse: - args: - - required: false - type: any - method: true - ApplyImpulseAtPosition: - args: - - required: false - type: any - - required: false - type: any - method: true - Archivable: - property: override-fields - AssemblyAngularVelocity: - any: true - AssemblyCenterOfMass: - any: true - AssemblyLinearVelocity: - any: true - AssemblyMass: - property: read-only - AssemblyRootPart: - struct: BasePart - AttributeChanged: - struct: Event - AutowedgeCell: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - AutowedgeCells: - args: - - required: false - type: any - method: true - BackParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BackParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BackSurface: - property: override-fields - BackSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BottomParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BottomParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BottomSurface: - property: override-fields - BottomSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - BreakJoints: - args: [] - method: true - BrickColor: - property: override-fields - CFrame: - any: true - CanCollide: - property: override-fields - CanCollideWith: - args: - - required: false - type: any - method: true - CanQuery: - property: override-fields - CanSetNetworkOwnership: - args: [] - method: true - CanTouch: - property: override-fields - CastShadow: - property: override-fields - CellCenterToWorld: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - CellCornerToWorld: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - CenterOfMass: - any: true - Changed: - struct: Event - ChildAdded: - struct: Event - ChildRemoved: - struct: Event - ClassName: - property: read-only - Clear: - args: [] - method: true - ClearAllChildren: - args: [] - method: true - Clone: - args: [] - method: true - CollisionGroupId: - property: override-fields - Color: - property: override-fields - ConvertToSmooth: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - CopyRegion: - args: - - required: false - type: any - method: true - CountCells: - args: [] - method: true - CustomPhysicalProperties: - property: override-fields - Decoration: - property: override-fields - DescendantAdded: - struct: Event - DescendantRemoving: - struct: Event - Destroy: - args: [] - method: true - Destroying: - struct: Event - Elasticity: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FillBall: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - FillBlock: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - FillCylinder: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - FillRegion: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - FillWedge: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - FindFirstAncestor: - args: - - required: false - type: any - method: true - FindFirstAncestorOfClass: - args: - - required: false - type: any - method: true - FindFirstAncestorWhichIsA: - args: - - required: false - type: any - method: true - FindFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstChildOfClass: - args: - - required: false - type: any - method: true - FindFirstChildWhichIsA: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstDescendant: - args: - - required: false - type: any - method: true - Friction: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FrontParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FrontParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - FrontSurface: - property: override-fields - FrontSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - GetActor: - args: [] - method: true - GetAttribute: - args: - - required: false - type: any - method: true - GetAttributeChangedSignal: - args: - - required: false - type: any - method: true - GetAttributes: - args: [] - method: true - GetCell: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - GetChildren: - args: [] - method: true - GetConnectedParts: - args: - - required: false - type: any - method: true - GetDebugId: - args: - - required: false - type: any - method: true - GetDescendants: - args: [] - method: true - GetFullName: - args: [] - method: true - GetJoints: - args: [] - method: true - GetMass: - args: [] - method: true - GetMaterialColor: - args: - - required: false - type: any - method: true - GetNetworkOwner: - args: [] - method: true - GetNetworkOwnershipAuto: - args: [] - method: true - GetPivot: - args: [] - method: true - GetPropertyChangedSignal: - args: - - required: false - type: any - method: true - GetRenderCFrame: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - GetRootPart: - args: [] - method: true - GetTouchingParts: - args: [] - method: true - GetVelocityAtPosition: - args: - - required: false - type: any - method: true - GetWaterCell: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - IsA: - args: - - required: false - type: any - method: true - IsAncestorOf: - args: - - required: false - type: any - method: true - IsDescendantOf: - args: - - required: false - type: any - method: true - IsGrounded: - args: [] - method: true - IsSmooth: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - LeftParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - LeftParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - LeftSurface: - property: override-fields - LeftSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - LocalSimulationTouched: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - LocalTransparencyModifier: - property: override-fields - Locked: - property: override-fields - MakeJoints: - args: [] - method: true - Mass: - property: read-only - Massless: - property: override-fields - Material: - property: override-fields - MaterialColors: - property: override-fields - MaterialVariant: - property: override-fields - MaxExtents: - property: read-only - Name: - property: override-fields - Orientation: - any: true - Origin Orientation: - any: true - Origin Position: - any: true - OutfitChanged: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - Parent: - struct: Instance - PasteRegion: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - Pivot Offset Orientation: - any: true - Pivot Offset Position: - any: true - PivotOffset: - any: true - PivotTo: - args: - - required: false - type: any - method: true - Position: - any: true - ReadVoxels: - args: - - required: false - type: any - - required: false - type: any - method: true - ReceiveAge: - property: read-only - Reflectance: - property: override-fields - Remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - ReplaceMaterial: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - Resize: - args: - - required: false - type: any - - required: false - type: any - method: true - ResizeIncrement: - property: read-only - ResizeableFaces: - property: read-only - RightParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - RightParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - RightSurface: - property: override-fields - RightSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - RootPriority: - property: override-fields - RotVelocity: - any: true - deprecated: - message: this property is deprecated. - replace: [] - Rotation: - any: true - SetAttribute: - args: - - required: false - type: any - - required: false - type: any - method: true - SetCell: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - SetCells: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - SetMaterialColor: - args: - - required: false - type: any - - required: false - type: any - method: true - SetNetworkOwner: - args: - - required: false - type: any - method: true - SetNetworkOwnershipAuto: - args: [] - method: true - SetWaterCell: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - Size: - any: true - SpecificGravity: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - StoppedTouching: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - SubtractAsync: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - TopParamA: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - TopParamB: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - TopSurface: - property: override-fields - TopSurfaceInput: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - TouchEnded: - struct: Event - Touched: - struct: Event - Transparency: - property: override-fields - UnionAsync: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - Velocity: - any: true - deprecated: - message: this property is deprecated. - replace: [] - WaitForChild: - args: - - required: false - type: any - - required: false - type: any - method: true - WaterColor: - property: override-fields - WaterReflectance: - property: override-fields - WaterTransparency: - property: override-fields - WaterWaveSize: - property: override-fields - WaterWaveSpeed: - property: override-fields - WorldToCell: - args: - - required: false - type: any - method: true - WorldToCellPreferEmpty: - args: - - required: false - type: any - method: true - WorldToCellPreferSolid: - args: - - required: false - type: any - method: true - WriteVoxels: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - archivable: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - breakJoints: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - brickColor: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - childAdded: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - children: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - className: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - clone: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - destroy: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - findFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - getChildren: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - getMass: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - isA: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isDescendantOf: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - makeJoints: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - resize: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - Workspace: - "*": - struct: Instance - AllowThirdPartySales: - property: override-fields - AncestryChanged: - struct: Event - AnimationWeightedBlendFix: - property: override-fields - Archivable: - property: override-fields - ArePartsTouchingOthers: - args: - - required: false - type: any - - required: false - type: any - method: true - AttributeChanged: - struct: Event - BreakJoints: - args: [] - method: true - BulkMoveTo: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - CalculateJumpDistance: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - CalculateJumpHeight: - args: - - required: false - type: any - - required: false - type: any - method: true - CalculateJumpPower: - args: - - required: false - type: any - - required: false - type: any - method: true - Changed: - struct: Event - ChildAdded: - struct: Event - ChildRemoved: - struct: Event - ClassName: - property: read-only - ClearAllChildren: - args: [] - method: true - ClientAnimatorThrottling: - property: override-fields - Clone: - args: [] - method: true - CurrentCamera: - struct: Camera - DescendantAdded: - struct: Event - DescendantRemoving: - struct: Event - Destroy: - args: [] - method: true - Destroying: - struct: Event - DistributedGameTime: - property: override-fields - ExperimentalSolverIsEnabled: - args: [] - method: true - FindFirstAncestor: - args: - - required: false - type: any - method: true - FindFirstAncestorOfClass: - args: - - required: false - type: any - method: true - FindFirstAncestorWhichIsA: - args: - - required: false - type: any - method: true - FindFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstChildOfClass: - args: - - required: false - type: any - method: true - FindFirstChildWhichIsA: - args: - - required: false - type: any - - required: false - type: any - method: true - FindFirstDescendant: - args: - - required: false - type: any - method: true - FindPartOnRay: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - FindPartOnRayWithIgnoreList: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - FindPartOnRayWithWhitelist: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - FindPartsInRegion3: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - FindPartsInRegion3WithIgnoreList: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - FindPartsInRegion3WithWhiteList: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - GetActor: - args: [] - method: true - GetAttribute: - args: - - required: false - type: any - method: true - GetAttributeChangedSignal: - args: - - required: false - type: any - method: true - GetAttributes: - args: [] - method: true - GetBoundingBox: - args: [] - method: true - GetChildren: - args: [] - method: true - GetDebugId: - args: - - required: false - type: any - method: true - GetDescendants: - args: [] - method: true - GetExtentsSize: - args: [] - method: true - GetFullName: - args: [] - method: true - GetModelCFrame: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - GetModelSize: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - GetNumAwakeParts: - args: [] - method: true - GetPartBoundsInBox: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - GetPartBoundsInRadius: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - GetPartsInPart: - args: - - required: false - type: any - - required: false - type: any - method: true - GetPhysicsThrottling: - args: [] - method: true - GetPivot: - args: [] - method: true - GetPrimaryPartCFrame: - args: [] - method: true - GetPropertyChangedSignal: - args: - - required: false - type: any - method: true - GetRealPhysicsFPS: - args: [] - method: true - GetServerTimeNow: - args: [] - method: true - GlobalWind: - any: true - Gravity: - property: override-fields - HumanoidOnlySetCollisionsOnStateChange: - property: override-fields - IKMoveTo: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - IsA: - args: - - required: false - type: any - method: true - IsAncestorOf: - args: - - required: false - type: any - method: true - IsDescendantOf: - args: - - required: false - type: any - method: true - IsRegion3Empty: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - IsRegion3EmptyWithIgnoreList: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - JoinToOutsiders: - args: - - required: false - type: any - - required: false - type: any - method: true - MakeJoints: - args: [] - method: true - MeshPartHeadsAndAccessories: - property: override-fields - MoveTo: - args: - - required: false - type: any - method: true - Name: - property: override-fields - Origin Orientation: - any: true - Origin Position: - any: true - PGSIsEnabled: - args: [] - method: true - Parent: - struct: Instance - PhysicsInertiaAndVolumeFix: - property: override-fields - PhysicsSimulationRate: - property: override-fields - PhysicsSteppingMethod: - property: override-fields - Pivot Offset Orientation: - any: true - Pivot Offset Position: - any: true - PivotTo: - args: - - required: false - type: any - method: true - PrimaryPart: - struct: BasePart - Raycast: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - Remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - ReplicateInstanceDestroySetting: - property: override-fields - ResetOrientationToIdentity: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - Retargeting: - property: override-fields - SetAttribute: - args: - - required: false - type: any - - required: false - type: any - method: true - SetIdentityOrientation: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - SetInsertPoint: - args: - - required: false - type: any - - required: false - type: any - method: true - SetMeshPartHeadsAndAccessories: - args: - - required: false - type: any - method: true - SetPhysicsThrottleEnabled: - args: - - required: false - type: any - method: true - SetPrimaryPartCFrame: - args: - - required: false - type: any - method: true - SignalBehavior: - property: override-fields - StreamOutBehavior: - property: override-fields - StreamingMinRadius: - property: override-fields - StreamingPauseMode: - property: override-fields - StreamingTargetRadius: - property: override-fields - Terrain: - struct: Terrain - TouchesUseCollisionGroups: - property: override-fields - TranslateBy: - args: - - required: false - type: any - method: true - UnjoinFromOutsiders: - args: - - required: false - type: any - method: true - WaitForChild: - args: - - required: false - type: any - - required: false - type: any - method: true - World Pivot Orientation: - any: true - World Pivot Position: - any: true - WorldPivot: - any: true - ZoomToExtents: - args: [] - method: true - archivable: - property: override-fields - deprecated: - message: this property is deprecated. - replace: [] - breakJoints: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - childAdded: - struct: Event - deprecated: - message: this property is deprecated. - replace: [] - children: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - className: - property: read-only - deprecated: - message: this property is deprecated. - replace: [] - clone: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - destroy: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - findFirstChild: - args: - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - findPartOnRay: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - findPartsInRegion3: - args: - - required: false - type: any - - required: false - type: any - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - getChildren: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - isA: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - isDescendantOf: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - makeJoints: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] - move: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - moveTo: - args: - - required: false - type: any - method: true - deprecated: - message: this property is deprecated. - replace: [] - remove: - args: [] - method: true - deprecated: - message: this property is deprecated. - replace: [] -last_updated: 1655433513 diff --git a/selene.toml b/selene.toml deleted file mode 100644 index ee0ed93..0000000 --- a/selene.toml +++ /dev/null @@ -1,4 +0,0 @@ -std = "mercury" - -[lints] -multiple_statements = "allow" diff --git a/stylua.toml b/stylua.toml deleted file mode 100644 index 91aa655..0000000 --- a/stylua.toml +++ /dev/null @@ -1,6 +0,0 @@ -column_width = 80 -line_endings = "Unix" -indent_type = "Tabs" -indent_width = 4 -quote_style = "AutoPreferDouble" -call_parentheses = "None"