
Key Required VerifiedUniversal

local economy = knit.GetService('EconomyService')
local data = knit.GetController('DataController').Data
local inventoryFrames = localPlayer.PlayerGui.Main.Inventory
local storeFrames = localPlayer.PlayerGui.Main.Store.StoreFrames
local function WaitForChildWhichIsA(self: Instance, ClassName: string)
while self:FindFirstChildWhichIsA(ClassName) == nil do
task.wait()
end
end
local storeButtons = {
Equipped = {
Text = 'USING',
Color = ColorSequence.new(Color3.fromRGB(146, 26, 221), Color3.fromRGB(53, 7, 71)),
Image = 'rbxassetid://16546841553'
};
Equip = {
Text = 'EQUIP',
Color = ColorSequence.new(Color3.fromRGB(23, 221, 198), Color3.fromRGB(8, 71, 64)),
Image = 'rbxassetid://16546837268'
}
}
local function unlockAll()
local bannerAssets = game.ReplicatedStorage.Assets.Banners
local effectAssets = game.ReplicatedStorage.Assets.Effects
local dunks = {}
for dunk, dunkData in next, items.Dunks do
dunks[dunk] = false
end
local newInventory = {Skins={},Effects={},Banners={},Emotes={}}
for category, _ in next, newInventory do
for item, _ in next, items[category] do
newInventory[category][#newInventory[category]+1] = {item, false}
end
end
for gamepass, _ in next, data.Gamepasses do
data.Gamepasses[gamepass] = true
end
data.Prestige = 3
for dunk, _ in next, items.Dunks do
data.Dunks.Owned[dunk] = true
end
data.Inventory = newInventory
local function unequipAll(category: string)
for i,v in next, inventoryFrames[category]:GetChildren() do
if v:FindFirstChild('Using') then
v.Using.Visible = false
end
end
end
inventory:UpdateInventory(newInventory)
inventory.UpdateInventory = function() end
store.UpdateData = function() end
local ball = localPlayer.Character:FindFirstChild('Basketball')
local currentSkin = nil
local currentEffect = nil
local currentBanner = nil
local currentEmote = nil
local currentDunk = nil
local function getItemDataByName(category: string, name: string)
local nigga = nil
for i,v in next, items[category] do
if v[1] == name then
nigga = v
break
end
end
return nigga
end
local function getRealItemName(category: string, name: string)
local nigga = nil
local nameIdx = 1
if category == 'Dunks' then
nameIdx = 2
end
for i,v in next, items[category] do
if v[nameIdx] == name then
nigga = i
break
end
end
return nigga
end
local function getMyWorkspaceBall()
local nigger = nil
for i,v in next, workspace:GetChildren() do
if v.Name == 'Basketball' and v:GetAttribute('Owner') == localPlayer.UserId then
nigger = v
break
end
end
return nigger
end
local oldEffects = {}
local oldBallEffects = {}
local function applyBallAppearance(name: string)
for i,v in next, oldEffects do
v.Parent = nil
v:Destroy()
end
local realName = getRealItemName('Skins', name)
if not realName then return end
local effects = repStorage.Assets.Ball:FindFirstChild(realName)
if not effects then return end
for _, possibleEffect in next, effects:GetChildren() do
if possibleEffect:IsA('ParticleEmitter') then
local newEffect = possibleEffect:Clone()
newEffect.Parent = ball.Attach:FindFirstChildWhichIsA('SpecialMesh')
table.insert(oldEffects, newEffect)
end
end
if effects:FindFirstChild('CUSTOM_SKIN_HOLDER') then
local skinHolder = effects.CUSTOM_SKIN_HOLDER.CUSTOM_SKIN_HOLDER
for _, skinElement in next, skinHolder:GetChildren() do
if skinElement:IsA('MeshPart') then
local newEffect = skinElement:Clone()
local weld = newEffect:FindFirstChildWhichIsA('WeldConstraint')
newEffect.CFrame = ball.Attach.CFrame
weld.Part0 = ball.Attach
newEffect.Parent = ball.Attach
table.insert(oldEffects, newEffect)
end
end
if skinHolder:FindFirstChild('AttHolder') then
for _, attEffect in next, skinHolder.AttHolder:GetChildren() do
local newAttEffect = attEffect:Clone()
newAttEffect.Parent = ball.Attach
table.insert(oldEffects, newAttEffect)
end
end
end
if effects:FindFirstChild('CUSTOM_AURA') then
for _, bodyPart in next, effects.CUSTOM_AURA:GetChildren() do
for _, effect in next, bodyPart:GetChildren() do
if effect:IsA('CFrameValue') then
local attachment = Instance.new('Attachment')
attachment.Parent = character[bodyPart.Name]
attachment.CFrame = effect.Value
for _, cfEffect in next, effect:GetChildren() do
local newCfEffect = cfEffect:Clone()
newCfEffect.Parent = attachment
table.insert(oldEffects, newCfEffect)
end
continue
end
if effect:IsA('BasePart') then
local newPart = effect:Clone()
local weld = Instance.new('WeldConstraint')
weld.Parent = newPart
newPart.CFrame = character[bodyPart.Name].CFrame * newPart:GetAttribute('Offset')
weld.Part0 = character[bodyPart.Name]
weld.Part1 = newPart
newPart.Parent = character[bodyPart.Name]
table.insert(oldEffects, newPart)
continue
end
local newEffect = effect:Clone()
newEffect.Parent = character[bodyPart.Name]
table.insert(oldEffects, newEffect)
end
end
end
end
local sharedUtil = require(game.ReplicatedStorage.Modules.SharedUtil)
local function applyBallEffects(name: string, basketball: Instance)
local effectFolder = effectAssets:FindFirstChild(name)
if not effectFolder then
return
end
local basketball = sharedUtil.Ball:GetClosestBall(localPlayer)
if basketball:FindFirstChildWhichIsA('Trail') then
basketball:FindFirstChildWhichIsA('Trail'):Destroy()
end
for i,v in next, effectFolder:GetChildren() do
if v:IsA('Trail') then
local a = v:Clone()
a.Enabled = true
a.Attachment0 = basketball.A0
a.Attachment1 = basketball.A1
a.Parent = basketball
table.insert(oldBallEffects, a)
end
if v.Name == 'EffectAtt' then
for _,effect in next, v:GetChildren() do
local newEffect = effect:Clone()
newEffect.Parent = basketball.A0
table.insert(oldBallEffects, newEffect)
end
end
if v.Name == 'EffectAtt2' then
for _,effect in next, v:GetChildren() do
local newEffect = effect:Clone()
newEffect.Parent = basketball.A1
table.insert(oldBallEffects, newEffect)
end
end
if v:IsA('ParticleEmitter') then
v.Parent = basketball
table.insert(oldBallEffects, v)
end
end
end
local function changeEmote(name: string)
local realName = getRealItemName('Emotes', name)
data.Emotes.Equipped = realName
end
local function changeBallSkin(ball: Tool | Part)
if ball and currentSkin then
local skinData = getItemDataByName('Skins', currentSkin)
if ball.Parent == character then
ball:WaitForChild('Attach')
end
local attach = ball:FindFirstChild('Attach') or ball
WaitForChildWhichIsA(attach, 'SpecialMesh')
if typeof(skinData[3]) == 'number' then
attach.Transparency = 0
attach:FindFirstChildWhichIsA('SpecialMesh').MeshId = 'rbxassetid://14536927547'
attach:FindFirstChildWhichIsA('SpecialMesh').TextureId = 'rbxassetid://' .. skinData[3]
end
if typeof(skinData[3]) == 'table' then
attach.Transparency = 1
attach:FindFirstChildWhichIsA('SpecialMesh').TextureId = ''
attach:FindFirstChildWhichIsA('SpecialMesh').MeshId = 'rbxassetid://' .. skinData[4]
end
if ball.Parent == character then
applyBallAppearance(currentSkin)
end
end
end
local function changeBanner(name: string)
local bannerName = getRealItemName('Banners', name)
local newBg = bannerAssets:FindFirstChild(bannerName)
if not newBg then
return
end
local infoUi = character.HumanoidRootPart.Info
local currentBg = infoUi.BG
if infoUi:FindFirstChild('Frame') then
infoUi.Frame:Destroy()
end
local score = currentBg.Score.Record.Text
local streak = currentBg.Streak.Title.Text
currentBg:Destroy()
local newBgFrame = newBg.BG:Clone()
local newAnimFrame = newBg:FindFirstChild('Frame')
if newAnimFrame then
newAnimFrame = newAnimFrame:Clone()
newAnimFrame.ZIndex = 0
newAnimFrame.Parent = infoUi
end
newBgFrame.UsernameBox.Username.Text = localPlayer.Name
newBgFrame.Streak.Title.Text = streak
newBgFrame.Score.Record.Text = score
newBgFrame.Parent = infoUi
end
local function newEquip(category: string, name: string)
for i,v in next, data[category].Inventory do
if v[1] == name then
data[category].Inventory[i][2] = true
else
data[category].Inventory[i][2] = false
end
end
end
for _, category in next, inventoryFrames:GetChildren() do
if not newInventory[category.Name] then continue end
for _, item in next, category:GetChildren() do
if item:IsA('ImageButton') then
if item.Name:match('Model') then continue end
if category.Name == 'Banners' then
local bannerName = getRealItemName('Banners', item.Name)
item.Icon.Image = bannerAssets[bannerName].BG.BasicBanner.Image
end
hookfunction(getconnections(item.MouseButton1Click)[1].Function, function() end)
item.MouseButton1Click:Connect(function()
unequipAll(category.Name)
newEquip(category.Name, item.Name)
item.Using.Visible = true
if category.Name == 'Skins' then
currentSkin = item.Name
changeBallSkin(ball)
elseif category.Name == 'Emotes' then
currentEmote = item.Name
changeEmote(currentEmote)
elseif category.Name == 'Banners' then
currentBanner = item.Name
changeBanner(currentBanner)
elseif category.Name == 'Effects' then
currentEffect = item.Name
end
end)
end
end
end
local dunkInfo = storeFrames.Dunks.Info
local equipDunkButton = dunkInfo.Buy
for _,dunkItem in next, storeFrames.Dunks.List:GetChildren() do
if dunkItem:IsA('ImageButton') then
hookfunction(getconnections(dunkItem.MouseButton1Click)[1].Function, function()
local dunkName = dunkItem.Name
dunkInfo.Title.Text = dunkItem.Title.Text
if dunks[dunkName] then
equipDunkButton.UIGradient.Color = storeButtons.Equipped.Color
equipDunkButton.Title.Text = storeButtons.Equipped.Text
equipDunkbutton.Image = storeButtons.Equipped.Image
else
equipDunkButton.UIGradient.Color = storeButtons.Equip.Color
equipDunkButton.Title.Text = storeButtons.Equip.Text
equipDunkButton.Image = storeButtons.Equip.Image
end
end)
end
end
oldEquipDunk = hookfunction(getconnections(equipDunkButton.MouseButton1Click)[1].Function, function()
local dunkName = getRealItemName('Dunks', storeFrames.Dunks.Info.Title.Text)
for dunkState,_ in next, dunks do
dunks[dunkState] = false
end
dunks[dunkName] = true
data.Dunks.Equipped = dunkName
equipDunkButton.UIGradient.Color = storeButtons.Equipped.Color
equipDunkButton.Title.Text = storeButtons.Equipped.Text
end)
local function ballAdded()
character.ChildAdded:Connect(function(ballObj: Tool)
if ballObj.Name ~= 'Basketball' then return end
ball = ballObj
if currentSkin then
changeBallSkin(ball)
end
ball.AncestryChanged:Connect(function()
for i,v in next, oldEffects do
v.Parent = nil
v:Destroy()
end
changeBallSkin(getMyWorkspaceBall())
end)
end)
end
localPlayer.CharacterAdded:Connect(ballAdded)
ballAdded()
character.ChildAdded:Connect(function(ballObj: Tool)
if ballObj.Name ~= 'Basketball' then return end
ball = ballObj
if currentSkin then
changeBallSkin(ball)
end
ball.AncestryChanged:Connect(function()
for i,v in next, oldEffects do
v.Parent = nil
v:Destroy()
end
changeBallSkin(getMyWorkspaceBall())
end)
end)
local c = require(game.ReplicatedStorage.Controllers.VisualController.TOOL_Emotes)
oldEffect = hookfunction(visuals.Effect, function(self, effect, ...)
local args = {...}
if effect == 'StartBallEffect' then
local effectOwner = args[3]
if effectOwner == character.HumanoidRootPart then
local effectName = getRealItemName('Effects', currentEffect) or 'Default'
args[1] = effectName or 'Default'
local ball = sharedUtil.Ball:GetClosestBall(localPlayer)
applyBallEffects(effectName, ball)
c:Emote(data.Emotes.Equipped)
end
end
if effect == 'BallEffect' then
local effectBall = args[3]
if effectBall == sharedUtil.Ball:GetClosestBall(localPlayer) then
for _, effectObj in next, oldBallEffects do
effectObj.Parent = nil
effectObj:Destroy()
end
local effectName = getRealItemName('Effects', currentEffect)
args[1] = effectName or 'Default'
end
end
return oldEffect(self, effect, unpack(args))
end)
end
unlockAll()
]])



for?'
skin changer is patched