1. local oldWarn = warn
  2. warn = function(...) end
  3.  
  4. local Players = game:GetService("Players")
  5. local RunService = game:GetService("RunService")
  6. local TweenService = game:GetService("TweenService")
  7. local UserInputService = game:GetService("UserInputService")
  8. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  9. local HttpService = game:GetService("HttpService")
  10. local StarterPlayer = game:GetService("StarterPlayer")
  11. local plr = Players.LocalPlayer
  12.  
  13. local VALID_KEY = "KEY39277716@dj293X67"
  14. local CONFIG_FOLDER = "Yorijin Changer"
  15. local SAVE_FILE = CONFIG_FOLDER .. "/YorijinChanger.json"
  16. local KEY_FILE = CONFIG_FOLDER .. "/YorijinKey.txt"
  17. local SPOOFER_FILE = CONFIG_FOLDER .. "/YorijinSpoofer.json"
  18. local UNLOCK_SAVE_FILE = CONFIG_FOLDER .. "/unlockall.json"
  19. local SELECTIVE_UNLOCK_FILE = CONFIG_FOLDER .. "/selectiveunlock.json"
  20. local AUTOLOAD_FILE = "autoexec/YorijinAutoLoad.lua"
  21. local DISCORD_URL = "https://discord.gg/zv8Tdmds";
  22.  
  23. pcall(function()
  24. if makefolder and not isfolder(CONFIG_FOLDER) then
  25. makefolder(CONFIG_FOLDER)
  26. end
  27. end)
  28.  
  29. local keyVerified = false
  30.  
  31. local function saveKey(key)
  32. pcall(function() writefile(KEY_FILE, key) end)
  33. end
  34.  
  35. local function loadSavedKey()
  36. local ok, result = pcall(function()
  37. if isfile(KEY_FILE) then return readfile(KEY_FILE) end
  38. return nil
  39. end)
  40. if ok and result then return result:gsub("%s+", "") end
  41. return nil
  42. end
  43.  
  44. local function setupAutoLoad(enabled)
  45. pcall(function()
  46. if enabled then
  47. local src = 'if game.PlaceId == 17625359962 then\n'
  48. src = src .. ' task.wait(3)\n'
  49. src = src .. ' local ok, err = pcall(function()\n'
  50. src = src .. ' if isfile and isfile("Yorijin Changer/YorijinKey.txt") then\n'
  51. src = src .. ' loadstring(game:HttpGet("https://raw.githubusercontent.com/ofugii/Yorijin/refs/heads/main/rivals.lua";, true))()\n'
  52. src = src .. ' end\n'
  53. src = src .. ' end)\n'
  54. src = src .. 'end\n'
  55. pcall(function() writefile(AUTOLOAD_FILE, src) end)
  56. pcall(function() writefile("autoexec\\YorijinAutoLoad.lua", src) end)
  57. else
  58. pcall(function() if isfile(AUTOLOAD_FILE) then writefile(AUTOLOAD_FILE, "") end end)
  59. pcall(function() if isfile("autoexec\\YorijinAutoLoad.lua") then writefile("autoexec\\YorijinAutoLoad.lua", "") end end)
  60. end
  61. end)
  62. end
  63.  
  64. local savedKey = loadSavedKey()
  65. if savedKey and savedKey == VALID_KEY then
  66. keyVerified = true
  67. end
  68.  
  69. if not keyVerified then
  70. local function tw(obj, t, props)
  71. TweenService:Create(obj, TweenInfo.new(t, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props):Play()
  72. end
  73.  
  74. local kGui = Instance.new("ScreenGui")
  75. kGui.Name = "YorijinKey"
  76. kGui.ResetOnSpawn = false
  77. kGui.DisplayOrder = 999
  78. kGui.Parent = plr:WaitForChild("PlayerGui")
  79.  
  80. local bg = Instance.new("Frame", kGui)
  81. bg.Size = UDim2.new(1, 0, 1, 0)
  82. bg.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
  83. bg.BackgroundTransparency = 0.3
  84. bg.BorderSizePixel = 0
  85.  
  86. local win = Instance.new("Frame", kGui)
  87. win.Size = UDim2.new(0, 340, 0, 260)
  88. win.Position = UDim2.new(0.5, -170, 0.5, -130)
  89. win.BackgroundColor3 = Color3.fromRGB(12, 12, 12)
  90. win.BorderSizePixel = 0
  91. win.BackgroundTransparency = 1
  92. win.ZIndex = 2
  93. Instance.new("UICorner", win).CornerRadius = UDim.new(0, 10)
  94. local winStroke = Instance.new("UIStroke", win)
  95. winStroke.Color = Color3.fromRGB(30, 30, 30)
  96. winStroke.Thickness = 1
  97. winStroke.Transparency = 1
  98.  
  99. local titleLbl = Instance.new("TextLabel", win)
  100. titleLbl.Size = UDim2.new(1, 0, 0, 44)
  101. titleLbl.BackgroundTransparency = 1
  102. titleLbl.Text = "Yorijin"
  103. titleLbl.TextColor3 = Color3.fromRGB(255, 255, 255)
  104. titleLbl.TextSize = 15
  105. titleLbl.Font = Enum.Font.GothamBold
  106. titleLbl.ZIndex = 3
  107.  
  108. local inputBox = Instance.new("TextBox", win)
  109. inputBox.Size = UDim2.new(1, -32, 0, 42)
  110. inputBox.Position = UDim2.new(0, 16, 0, 50)
  111. inputBox.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
  112. inputBox.Text = ""
  113. inputBox.PlaceholderText = "Paste key here"
  114. inputBox.PlaceholderColor3 = Color3.fromRGB(55, 55, 55)
  115. inputBox.TextColor3 = Color3.fromRGB(255, 255, 255)
  116. inputBox.TextSize = 13
  117. inputBox.Font = Enum.Font.GothamMedium
  118. inputBox.TextXAlignment = Enum.TextXAlignment.Left
  119. inputBox.ClearTextOnFocus = false
  120. inputBox.BorderSizePixel = 0
  121. inputBox.ZIndex = 3
  122. Instance.new("UICorner", inputBox).CornerRadius = UDim.new(0, 8)
  123. Instance.new("UIPadding", inputBox).PaddingLeft = UDim.new(0, 12)
  124.  
  125. local statusLbl = Instance.new("TextLabel", win)
  126. statusLbl.Size = UDim2.new(1, -32, 0, 18)
  127. statusLbl.Position = UDim2.new(0, 16, 0, 96)
  128. statusLbl.BackgroundTransparency = 1
  129. statusLbl.Text = ""
  130. statusLbl.TextColor3 = Color3.fromRGB(100, 100, 100)
  131. statusLbl.TextSize = 11
  132. statusLbl.Font = Enum.Font.GothamMedium
  133. statusLbl.TextXAlignment = Enum.TextXAlignment.Left
  134. statusLbl.ZIndex = 3
  135.  
  136. local verifyBtn = Instance.new("TextButton", win)
  137. verifyBtn.Size = UDim2.new(1, -32, 0, 42)
  138. verifyBtn.Position = UDim2.new(0, 16, 0, 120)
  139. verifyBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
  140. verifyBtn.Text = "Verify"
  141. verifyBtn.TextColor3 = Color3.fromRGB(0, 0, 0)
  142. verifyBtn.TextSize = 13
  143. verifyBtn.Font = Enum.Font.GothamBold
  144. verifyBtn.BorderSizePixel = 0
  145. verifyBtn.ZIndex = 3
  146. Instance.new("UICorner", verifyBtn).CornerRadius = UDim.new(0, 8)
  147.  
  148. verifyBtn.MouseEnter:Connect(function()
  149. tw(verifyBtn, 0.1, {BackgroundColor3 = Color3.fromRGB(210, 210, 210)})
  150. end)
  151. verifyBtn.MouseLeave:Connect(function()
  152. tw(verifyBtn, 0.1, {BackgroundColor3 = Color3.fromRGB(255, 255, 255)})
  153. end)
  154.  
  155. local bottomRow = Instance.new("Frame", win)
  156. bottomRow.Size = UDim2.new(1, -32, 0, 34)
  157. bottomRow.Position = UDim2.new(0, 16, 0, 170)
  158. bottomRow.BackgroundTransparency = 1
  159. bottomRow.ZIndex = 3
  160.  
  161. local getKeyBtn = Instance.new("TextButton", bottomRow)
  162. getKeyBtn.Size = UDim2.new(0.5, -4, 1, 0)
  163. getKeyBtn.Position = UDim2.new(0, 0, 0, 0)
  164. getKeyBtn.BackgroundTransparency = 1
  165. getKeyBtn.Text = "Get Key"
  166. getKeyBtn.TextColor3 = Color3.fromRGB(100, 100, 100)
  167. getKeyBtn.TextSize = 12
  168. getKeyBtn.Font = Enum.Font.GothamMedium
  169. getKeyBtn.BorderSizePixel = 0
  170. getKeyBtn.ZIndex = 3
  171.  
  172. getKeyBtn.MouseEnter:Connect(function() getKeyBtn.TextColor3 = Color3.fromRGB(255, 255, 255) end)
  173. getKeyBtn.MouseLeave:Connect(function() getKeyBtn.TextColor3 = Color3.fromRGB(100, 100, 100) end)
  174.  
  175. local discordBtn = Instance.new("TextButton", bottomRow)
  176. discordBtn.Size = UDim2.new(0.5, -4, 1, 0)
  177. discordBtn.Position = UDim2.new(0.5, 4, 0, 0)
  178. discordBtn.BackgroundTransparency = 1
  179. discordBtn.Text = "Discord"
  180. discordBtn.TextColor3 = Color3.fromRGB(100, 100, 100)
  181. discordBtn.TextSize = 12
  182. discordBtn.Font = Enum.Font.GothamMedium
  183. discordBtn.BorderSizePixel = 0
  184. discordBtn.ZIndex = 3
  185.  
  186. discordBtn.MouseEnter:Connect(function() discordBtn.TextColor3 = Color3.fromRGB(255, 255, 255) end)
  187. discordBtn.MouseLeave:Connect(function() discordBtn.TextColor3 = Color3.fromRGB(100, 100, 100) end)
  188.  
  189. local sep = Instance.new("Frame", win)
  190. sep.Size = UDim2.new(1, -32, 0, 1)
  191. sep.Position = UDim2.new(0, 16, 0, 212)
  192. sep.BackgroundColor3 = Color3.fromRGB(22, 22, 22)
  193. sep.BorderSizePixel = 0
  194. sep.ZIndex = 3
  195.  
  196. local footLbl = Instance.new("TextLabel", win)
  197. footLbl.Size = UDim2.new(1, -32, 0, 40)
  198. footLbl.Position = UDim2.new(0, 16, 0, 218)
  199. footLbl.BackgroundTransparency = 1
  200. footLbl.Text = "Key resets every 24h"
  201. footLbl.TextColor3 = Color3.fromRGB(35, 35, 35)
  202. footLbl.TextSize = 10
  203. footLbl.Font = Enum.Font.Gotham
  204. footLbl.ZIndex = 3
  205.  
  206. getKeyBtn.MouseButton1Click:Connect(function()
  207. pcall(function() setclipboard(KEY_URL) end)
  208. statusLbl.Text = "Link copied"
  209. statusLbl.TextColor3 = Color3.fromRGB(255, 255, 255)
  210. task.delay(2, function() statusLbl.Text = "" end)
  211. end)
  212.  
  213. discordBtn.MouseButton1Click:Connect(function()
  214. pcall(function() setclipboard(DISCORD_URL) end)
  215. statusLbl.Text = "Discord link copied"
  216. statusLbl.TextColor3 = Color3.fromRGB(255, 255, 255)
  217. task.delay(0.3, function()
  218. pcall(function()
  219. if request or http_request or syn then
  220. (request or http_request or syn.request)({
  221. Method = "POST",
  222. Headers = {["Content-Type"] = "application/json", Origin = "https://discord.com";},
  223. Body = HttpService:JSONEncode({cmd = "INVITE_BROWSER", args = {code = "zv8Tdmds"}, nonce = HttpService:GenerateGUID(false)})
  224. })
  225. end
  226. end)
  227. end)
  228. task.delay(2, function() statusLbl.Text = "" end)
  229. end)
  230.  
  231. verifyBtn.MouseButton1Click:Connect(function()
  232. local entered = inputBox.Text:gsub("%s+", "")
  233. if entered == "" then
  234. statusLbl.Text = "Enter a key"
  235. statusLbl.TextColor3 = Color3.fromRGB(100, 100, 100)
  236. return
  237. end
  238. if entered == VALID_KEY then
  239. saveKey(entered)
  240. statusLbl.Text = "Verified"
  241. statusLbl.TextColor3 = Color3.fromRGB(255, 255, 255)
  242. verifyBtn.Text = "Done"
  243. task.delay(0.6, function()
  244. tw(win, 0.25, {BackgroundTransparency = 1})
  245. tw(winStroke, 0.25, {Transparency = 1})
  246. tw(bg, 0.25, {BackgroundTransparency = 1})
  247. task.delay(0.3, function()
  248. kGui:Destroy()
  249. keyVerified = true
  250. end)
  251. end)
  252. else
  253. statusLbl.Text = "Invalid key"
  254. statusLbl.TextColor3 = Color3.fromRGB(180, 50, 50)
  255. local orig = inputBox.Position
  256. task.spawn(function()
  257. for _, v in ipairs({5, -4, 3, -2, 1, 0}) do
  258. inputBox.Position = UDim2.new(orig.X.Scale, orig.X.Offset + v, orig.Y.Scale, orig.Y.Offset)
  259. task.wait(0.03)
  260. end
  261. inputBox.Position = orig
  262. task.delay(2, function() statusLbl.Text = "" end)
  263. end)
  264. end
  265. end)
  266.  
  267. inputBox.FocusLost:Connect(function(enter)
  268. if enter then verifyBtn.MouseButton1Click:Fire() end
  269. end)
  270.  
  271. task.spawn(function()
  272. task.wait(0.05)
  273. win.Position = UDim2.new(0.5, -170, 0.5, -150)
  274. TweenService:Create(win, TweenInfo.new(0.3, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {
  275. BackgroundTransparency = 0,
  276. Position = UDim2.new(0.5, -170, 0.5, -130)
  277. }):Play()
  278. tw(winStroke, 0.3, {Transparency = 0})
  279. end)
  280.  
  281. repeat task.wait(0.05) until keyVerified
  282. end
  283.  
  284. local SkinLists = {
  285. ["Assault Rifle"] = {"Default","AK-47","AUG","Tommy Gun","Boneclaw Rifle","Gingerbread AUG","AKEY-47","Phoenix Rifle","10B Visits","Glorious Assault Rifle"},
  286. ["Bow"] = {"Default","Compound Bow","Raven Bow","Dream Bow","Bat Bow","Balloon Bow","Frostbite Bow","Beloved Bow","Key Bow","Glorious Bow"},
  287. ["Burst Rifle"] = {"Default","Electro Rifle","Aqua Burst","FAMAS","Spectral Burst","Pine Burst","Pixel Burst","Keyst Rifle","Glorious Burst Rifle"},
  288. ["Crossbow"] = {"Default","Pixel Crossbow","Harpoon Crossbow","Violin Crossbow","Frostbite Crossbow","Crossbone","Arch Crossbow","Glorious Crossbow"},
  289. ["Distortion"] = {"Default","Electropunk Distortion","Glorious Distortion","Experiment D15","Plasma Distortion","Magma Distortion","Sleighstortion","Cyber Distortion"},
  290. ["Energy Rifle"] = {"Default","Hacker Rifle","Hydro Rifle","Void Rifle","New Year Energy Rifle","Apex Rifle","Soul Rifle","Glorious Energy Rifle"},
  291. ["Flamethrower"] = {"Default","Pixel Flamethrower","Lamethrower","Rainbowthrower","Glitterthrower","Jack o' Thrower","Snowblower","Keythrower","Glorious Flamethrower"},
  292. ["Grenade Launcher"] = {"Default","Swashbuckler","Uranium Launcher","Balloon Launcher","Gearnade Launcher","Skull Launcher","Snowball Launcher","Glorious Grenade Launcher"},
  293. ["Gunblade"] = {"Default","Hyper Gunblade","Crude Gunblade","Gunsaw","Boneblade","Elf's Gunblade","Glorious Gunblade"},
  294. ["Minigun"] = {"Default","Lasergun 3000","Pixel Minigun","Fighter Jet","Pumpkin Minigun","Wrapped Minigun","Glorious Minigun"},
  295. ["Paintball Gun"] = {"Default","Slime Gun","Boba Gun","Paintballoon Gun","Ketchup Gun","Brain Gun","Snowball Gun","Glorious Paintball Gun"},
  296. ["Permafrost"] = {"Default","Snowman Permafrost","Ice Permafrost","Glorious Permafrost"},
  297. ["RPG"] = {"Default","Nuke Launcher","Spaceship Launcher","Squid Launcher","Pumpkin Launcher","Firework Launcher","Pencil Launcher","Rocket Launcher","RPKEY","Glorious RPG"},
  298. ["Shotgun"] = {"Default","Balloon Shotgun","Hyper Shotgun","Cactus Shotgun","Broomstick","Wrapped Shotgun","Shotkey","Glorious Shotgun"},
  299. ["Sniper"] = {"Default","Pixel Sniper","Hyper Sniper","Event Horizon","Eyething Sniper","Gingerbread Sniper","Keyper","Glorious Sniper"},
  300. ["Daggers"] = {"Default","Aces","Paper Planes","Shurikens","Cookies","Crystal Daggers","Broken Hearts","Bat Daggers","Keynais","Glorious Daggers"},
  301. ["Energy Pistols"] = {"Default","Void Pistols","Hyperlaser Guns","Hydro Pistols","Soul Pistols","Apex Pistols","Hacker Pistols","New Year Energy Pistols","Glorious Energy Pistols"},
  302. ["Exogun"] = {"Default","Singularity","Ray Gun","Repulsor","Wondergun","Exogourd","Midnight Festive Exogun","Glorious Exogun"},
  303. ["Flare Gun"] = {"Default","Firework Gun","Dynamite Gun","Banana Flare","Vexed Flare Gun","Wrapped Flare Gun","Glorious Flare Gun"},
  304. ["Handgun"] = {"Default","Blaster","Stealth Handgun","Gumball Handgun","Pumpkin Handgun","Towerstone Handgun","Warp Handgun","Gingerbread Handgun","Pixel Handgun","Glorious Handgun"},
  305. ["Revolver"] = {"Default","Desert Eagle","Sheriff","Peppergun","Boneclaw Revolver","Peppermint Sheriff","Keyvolver","Glorious Revolver"},
  306. ["Shorty"] = {"Default","Not So Shorty","Lovely Shorty","Balloon Shorty","Demon Shorty","Wrapped Shorty","Too Shorty","Glorious Shorty"},
  307. ["Slingshot"] = {"Default","Stick","Goalpost","Harp","Boneshot","Reindeer Slingshot","Lucky Horseshoe","Glorious Slingshot"},
  308. ["Spray"] = {"Default","Lovely Spray","Nail Gun","Spray Bottle","Boneclaw Spray","Pine Spray","Key Spray","Glorious Spray"},
  309. ["Uzi"] = {"Default","Water Uzi","Electro Uzi","Money Gun","Demon Uzi","Pine Uzi","Keyzi","Glorious Uzi"},
  310. ["Warper"] = {"Default","Glitter Warper","Arcane Warper","Hotel Bell","Experiment W4","Frost Warper","Electropunk Warper","Glorious Warper"},
  311. ["Battle Axe"] = {"Default","The Shred","Ban Axe","Cerulean Axe","Mimic Axe","Balloon Axe","Nordic Axe","Keyttle Axe","Glorious Battle Axe"},
  312. ["Chainsaw"] = {"Default","Blobsaw","Handsaws","Mega Drill","Buzzsaw","Festive Buzzsaw","Glorious Chainsaw"},
  313. ["Fists"] = {"Default","Boxing Gloves","Brass Knuckles","Fists of Hurt","Pumpkin Claws","Festive Fists","Fist","Glorious Fists"},
  314. ["Katana"] = {"Default","Saber","Lightning Bolt","Stellar Katana","Evil Trident","New Year Katana","Keytana","Arch Katana","Crystal Katana","Pixel Katana","Linked Sword","Glorious Katana"},
  315. ["Knife"] = {"Default","Chancla","Karambit","Armature.001","Balisong","Machete","Candy Cane","Keylisong","Keyrambit","Caladbolg","Glorious Knife"},
  316. ["Maul"] = {"Default","Ban Hammer","Ice Maul","Sleigh Maul","Glorious Maul"},
  317. ["Riot Shield"] = {"Default","Door","Energy Shield","Masterpiece","Tombstone Shield","Sled","Glorious Riot Shield"},
  318. ["Scythe"] = {"Default","Scythe of Death","Anchor","Bug Net","Sakura Scythe","Bat Scythe","Cryo Scythe","Crystal Scythe","Keythe","Glorious Scythe"},
  319. ["Trowel"] = {"Default","Plastic Shovel","Garden Shovel","Paintbrush","Pumpkin Carver","Snow Shovel","Glorious Trowel"},
  320. ["Flashbang"] = {"Default","Disco Ball","Camera","Pixel Flashbang","Lightbulb","Skullbang","Shining Star","Glorious Flashbang"},
  321. ["Freeze Ray"] = {"Default","Temporal Ray","Bubble Ray","Gum Ray","Spider Ray","Wrapped Freeze Ray","Glorious Freeze Ray"},
  322. ["Grenade"] = {"Default","Whoopee Cushion","Water Balloon","Dynamite","Soul Grenade","Jingle Grenade","Frozen Grenade","Cuddle Bomb","Keynade","Glorious Grenade"},
  323. ["Jump Pad"] = {"Default","Trampoline","Bounce House","Shady Chicken Sandwhich","Spider Web","Jolly Man","Glorious Jump Pad"},
  324. ["Medkit"] = {"Default","Sandwich","Laptop","Medkitty","Box of Chocolates","Bucket of Candy","Milk & Cookies","Briefcase","Glorious Medkit"},
  325. ["Molotov"] = {"Default","Coffee","Torch","Lava Lamp","Vexed Candle","Hot Coals","Arch Molotov","Glorious Molotov"},
  326. ["Satchel"] = {"Default","Advanced Satchel","Notebook Satchel","Bag o' Money","Potion Satchel","Suspicious Gift","Glorious Satchel"},
  327. ["Smoke Grenade"] = {"Default","Emoji Cloud","Balance","Hourglass","Eyeball","Snowglobe","Glorious Smoke Grenade"},
  328. ["Subspace Tripmine"] = {"Default","Don't Press","Spring","DIY Tripmine","Trick or Treat","Dev-in-the-Box","Pot o' Keys","Glorious Subspace Tripmine"},
  329. ["War Horn"] = {"Default","Trumpet","Megaphone","Air Horn","Boneclaw Horn","Mammoth Horn","Glorious War Horn"},
  330. ["Warpstone"] = {"Default","Cyber Warpstone","Teleport Disc","Electropunk Warpstone","Warpbone","Warpstar","Warpeye","Unstable Warpstone","Glorious Warpstone"},
  331. ["Elixir"] = {"Default"},
  332. ["Glass Cannon"] = {"Default"},
  333. ["Glast Shard"] = {"Default"},
  334. ["RNG Dice"] = {"Default"},
  335. ["Scepter"] = {"Default"},
  336. }
  337.  
  338. local WrapList = {
  339. "None",
  340. "Beige","Blue","Bluesteel","Blush","Brown","Cheese","Cool","Copper",
  341. "Crimson","Cursed","Frigid","Glorious","Green","Gunmetal","Haunted",
  342. "Highlighter","Hot Cocoa","Jean","Lapis","Lavish Crystal","Lemon",
  343. "Lumber","Machine","MaGGenta","Maroon","Midnight","Mint","Mustard",
  344. "Navy","Noir","Normal","Olive","Olo","Orange","Ornate","Pink",
  345. "Pink Lemonade","Playful","Purple","Red","Rust","Salmon","Sky",
  346. "Sleet","Slush","Spiral","Stained","Tawny","Teal","Titanium",
  347. "Tungsten","Tusky","Venom","Vexed","Violet","Yellow","Zombie",
  348. "Ancient","Antimatter","Arbiter","Arctic Camo","Black","Black Granite",
  349. "Bliss","Blush Wrapping","Brain","Bunsen","Caned Wrapping",
  350. "Carbon Wrapping","Carmine","Carpet","Cashmere Wrapping","Celtic",
  351. "Cerulean","Chilled Wrapping","Chrome Webs","Circuit","Clamshell",
  352. "Clouds","Cold Metal","Cool Crochet","Cork","Creme Wrapping",
  353. "Crimson Art","Crossed","Dawn","Desert Camo","Digital Camo","Dunes",
  354. "Dusky Wrapping","Eco","Evergreen Wrapping","Experience","Facility",
  355. "Fiery","Fire","Forest Camo","Forest Wrapping","Fortune Wrapping",
  356. "Frosted","Frosty Wrapping","Glisten","Glossy","Gold","Grass",
  357. "Green Goo","Hammered Copper","Holly Wrapping","Honeycomb","Hypnotic",
  358. "Igneous","Indigo Wrapping","Inlets","Jolly Wrapping","Leafy Grass",
  359. "Liquid Chrome","Lovely Leopard","Luxury Wrapping","Mahogany",
  360. "Mainframe","Maize","Medium stone grey","Merlot Wrapping","Mintbread",
  361. "Minty Wrapping","Mocha Wrapping","Model","Money","Mousse Wrapping",
  362. "Neo","Nova","Obsidian","Ocean Camo","OranGG","Patriot","PB & J",
  363. "Pearly Wrapping","Peppermint Wrapping","Periwinkle Wrapping",
  364. "Pink Crochet","Pink Glitter","Plasma","Polar Wrapping","Portal",
  365. "Purple Goo","Purpleize","Rage","Regal","Regal Wrapping","Reptile",
  366. "Rug","Rustic","Scales","Sentinel","Snowfall","Spartan",
  367. "Spellslinger","Steel","Storm","Street Camo","Strobe","Studded",
  368. "Studs","Surge","Swirls","Tealur","Tempest","Termination","TIX",
  369. "Toy","Trophy","Ugly Sweater","Universal","Urban Camo","Vigor",
  370. "Vile","Voltaic","Waste","Well Done","Werewolf Fur","White",
  371. "Winter Solstice","Winter Wrapping","Yang","Yin",
  372. ".dll",".exe","2025 Wrapping","2026 Wrapping","A5","Amber",
  373. "Arabesque","Arena","Aurora","Aurum","Beach","Bee",
  374. "Birthday Wrapping","Black Damascus","Black Glass","Black Opal",
  375. "Blaze","Bombastic","Bright","Bubbles","Candlelight","Candy Apple",
  376. "Carbon Fiber","Cardboard","Cardinal","Chrome","Classic","Clovers",
  377. "Crystallized","Damascus","Dark","Dark Arena","Devourer","Diamond",
  378. "Disco","Empress","Encrypt","Fire Horse","Frankenstein","Frostbite",
  379. "Geometric","Gingerbread","Glass","Green Sparkle","Greenflame",
  380. "Groove","Hallow","Heirloom","Hesper","Hologram","Hologram Arena",
  381. "Honey","Hyperdrive","Indigo Sparkle","Insidious","Insignia",
  382. "Iridescent","Ladybug","Lightning","Liquid Gold","Lucre","Luxe",
  383. "Luxurious","Magma","Magnetite","Malachite","Malevolent","Mesh",
  384. "Messis","Mint Choco Chip","Mischief","Moonstone","Mummy","Nebula",
  385. "Necromancer","Omnisand","Ornamented","Paint","Peppermint","Peril",
  386. "Pixel Blight","Plaid Pajama","Plastic","Quasar","Red Rubber",
  387. "Resolute","Rift","RIVALS Wrapping","Scorched","Scourge","Serenity",
  388. "Shadow Ink","Simulation","Slime","Spectral","Starblaze","Starfall",
  389. "Stocking Fur","Sunset","Sunset Sparkle","Supernova","Thunderburst",
  390. "Tiger","Triplaser","Water","Watermelon","Wealth","Webbed",
  391. "Wintergreen","Wintry","Woven",
  392. "Aegis","Blizzard","Borealis","Celestial","Dark Matter","Encroached",
  393. "Festive Lights","Fracture","Heartfelt","Ice Queen","Neon Lights",
  394. "Polaris","Solar","Soul Scourge","Speed","The Heights",
  395. "1B Visits","Beggar","Cream","Community","Danger","Glamour",
  396. "Glacier","Pine","Snowy Night","Boomore","Brianore","Nekore",
  397. "Nosnite","Sensite","Shadore",
  398. "Scribble","Net","Rivalry","Only Six"
  399. }
  400.  
  401. local CharmList = {
  402. "None",
  403. "Armchair","Bone","Bowling Pin","Cage","Candy","Candy Corn",
  404. "Chombie Head","Cobweb","Cog","Cookie","Crystal","Cupcake","Dice",
  405. "Elf Hat","Fedora Stack","Firework","Glory Coin","Hammer",
  406. "Happy Gingerbread","Heart","Hook","Ice Cube","Jolly Hat",
  407. "Lemon Slice","Life Buoy","Magnet","Mini Candy Cane",
  408. "Mini Shining Star","Ninja Star","Ornament","Pawn","Peppermint Candy",
  409. "Potted Cactus","Potted Flower","Rune Ring","Runes","Ship Wheel",
  410. "Snowflake","Snowflake Ring","Snowman","Spider","Star","Table Lamp",
  411. "Thorn Circle","Traffic Cone","Witch Hat",
  412. "10 Gallon Hat","Anvil","Basketball","Bitster","Blobfish",
  413. "Candy Bucket","Caramel Apple","Chocolate Scoop","Decorated Tree",
  414. "Devious Pumpkin","Emoji: Weary","Festive Light","Football",
  415. "Golf Ball","Gravestone","Hot Chocolate","Hotdog","Jolly Chair",
  416. "Melonkin","Mini Portal","Mini Unstable Portal","Moai","Money Bag",
  417. "Mystery Block","Potion","Pufferfish","Rainbow","Rocket Ship",
  418. "Rubber Duck","Snowflakes","Stocking","Tennis Ball","UFO",
  419. "Alien Head","Balloon Dog","Black Cat","Cauldron","Chillman",
  420. "Cryo Capsule","Crystal Heart","Dumbkin","Emoji: Imp",
  421. "Emoji: Nauseated","Emoji: Nerd","Energy Cell","Explosion",
  422. "Eyeclipse","EZ","First Aid","Four-Leaf Clover","Frankenblob",
  423. "Ghost","Gingerbread Cat","Gingerbread Man","Happy Home","Jingle Bell",
  424. "Keycard 3","Mini Ban Hammer","Mini Disco Ball","Mini Key",
  425. "Mini Snowglobe","Penguin","Pierced Heart","Pumpkin Cat","Skull",
  426. "Skullgourd","Sneaker","Snowblob","Warp Disc","Wreath","Yeti",
  427. "100M Visits","1st Birthday Cake","3D Glasses","8sty","Applino",
  428. "atorix","Bandites","Bell","Blizmid","BobbVX","Brian1KB",
  429. "Bungeoppang","CarbonMeister","Chex","D_reamz","Darktru","Day 1",
  430. "DV","elixir","enriquebruv","Fireplace","Frozen Gaming Chair",
  431. "Gaming Headset","GreatGuyBoom","Hoopie","hoppy819","Hunt Token",
  432. "I Survived Season 0","KaiM","Karful","Kashy","Kaye","Khayri",
  433. "Mega Token","Milo","Mini Present","MiniBloxia","Mud","nekoanims",
  434. "Nosniy","Nosniy Games","oPixel","philhood","RIA25 Award","RIVALS",
  435. "Season 0","Season 1","Season 2","SenseiWarrior","ShadowTrojan",
  436. "SharkTactics","Shooting Star","Streamer Microphone","TanqR","viecti",
  437. "WE1RD",
  438. "Alpha Coin","Coinbama","Team Crown",
  439. "Chibi Assault Rifle","Chibi Bow","Chibi Burst Rifle","Chibi Crossbow",
  440. "Chibi Energy Rifle","Chibi Flamethrower","Chibi Grenade Launcher",
  441. "Chibi Gunblade","Chibi Minigun","Chibi Paintball Gun","Chibi RPG",
  442. "Chibi Shotgun","Chibi Sniper","Chibi Daggers","Chibi Energy Pistols",
  443. "Chibi Exogun","Chibi Flare Gun","Chibi Handgun","Chibi Revolver",
  444. "Chibi Shorty","Chibi Slingshot","Chibi Spray","Chibi Uzi",
  445. "Chibi Warper","Chibi Battle Axe","Chibi Chainsaw","Chibi Fists",
  446. "Chibi Katana","Chibi Knife","Chibi Riot Shield","Chibi Scythe",
  447. "Chibi Trowel","Chibi Flashbang","Chibi Freeze Ray","Chibi Grenade",
  448. "Chibi Jump Pad","Chibi Medkit","Chibi Molotov","Chibi Satchel",
  449. "Chibi Smoke Grenade","Chibi Subspace Tripmine","Chibi War Horn",
  450. "Chibi Warpstone"
  451. }
  452.  
  453. local FinisherList = {
  454. "None","Ragdoll",
  455. "Flop","Confetti","Hacked","Petrify","Toot","Yoink",
  456. "Spooky Confetti","Bite","Batsplosion","Festive Confetti","Wrapped",
  457. "Ascend","Bad Mood","Bogey","Bonesplosion","Collapse",
  458. "Decorated Player","Flick","Freeze","Frozen","Gingerbreadify",
  459. "Heavy Head","High Gravity","Hooked","Lost Soul","Midas Touch",
  460. "Reaper","Roadrunner","Rush","Snowmanify","Splatter","Tremble",
  461. "Warp Sickness",
  462. "Balloons","Beacon","BONK!","Boogie","Broom Ride","Chark Attack",
  463. "Clapped","Crushed","Darkheart","David","Dematerialize",
  464. "Diamond Hands","Disintegrate","DRIP","Electrocute","Enlightened",
  465. "Erased","Falling Icicles","Firework Show","Giant Ice Spike",
  466. "Giant Snowball","GOOAAALLLL","Greenflame","Heartbeat","Ignite",
  467. "Impaled","Inflate","Instability","Leprechaunify","Low Gravity","OOF",
  468. "Opulent","Orbital Strike","Pixel Coins","Plushify","Poof",
  469. "Rainbow Barf","RIP","Sleigh Away","Snowballed","Spaghettified",
  470. "Stiff","Those Who Know","Tough Crowd","Zombified",
  471. "5B Visits","Director's Cut","Elfify","Jolly Judgement"
  472. }
  473.  
  474. local AllSkinNames = {}
  475. do
  476. local seen = {}
  477. for _, skins in pairs(SkinLists) do
  478. for _, s in ipairs(skins) do
  479. if s ~= "Default" and not seen[s] then
  480. seen[s] = true
  481. table.insert(AllSkinNames, s)
  482. end
  483. end
  484. end
  485. table.sort(AllSkinNames)
  486. end
  487.  
  488. local PlayerScripts = plr:WaitForChild("PlayerScripts")
  489. local Controllers = PlayerScripts:WaitForChild("Controllers")
  490. local PlayerDataController = require(Controllers:WaitForChild("PlayerDataController", 10))
  491.  
  492. repeat task.wait() until PlayerDataController.CurrentData
  493. local PlayerData = PlayerDataController.CurrentData
  494.  
  495. local CosmeticLibrary = require(ReplicatedStorage.Modules.CosmeticLibrary)
  496. local EnumLibrary = require(ReplicatedStorage.Modules:WaitForChild("EnumLibrary", 10))
  497.  
  498. local ItemLibrary
  499. pcall(function()
  500. ItemLibrary = require(ReplicatedStorage.Modules.ItemLibrary)
  501. end)
  502.  
  503. local cosmeticConfig = {}
  504. pcall(function()
  505. if readfile and isfile and isfile(SAVE_FILE) then
  506. cosmeticConfig = HttpService:JSONDecode(readfile(SAVE_FILE))
  507. end
  508. end)
  509.  
  510. local function saveConfig()
  511. pcall(function()
  512. if writefile then
  513. writefile(SAVE_FILE, HttpService:JSONEncode(cosmeticConfig))
  514. end
  515. end)
  516. end
  517.  
  518. _G.GlobalData = _G.GlobalData or {AutoLoad = false, SilentLoad = false}
  519. if cosmeticConfig._global then
  520. _G.GlobalData.AutoLoad = cosmeticConfig._global.AutoLoad or false
  521. _G.GlobalData.SilentLoad = cosmeticConfig._global.SilentLoad or false
  522. end
  523.  
  524. local function saveGlobalToConfig()
  525. cosmeticConfig._global = {
  526. AutoLoad = _G.GlobalData.AutoLoad,
  527. SilentLoad = _G.GlobalData.SilentLoad,
  528. }
  529. saveConfig()
  530. end
  531.  
  532. setupAutoLoad(_G.GlobalData.AutoLoad)
  533.  
  534. local function waitForAssets(timeout)
  535. local start = tick()
  536. local assetsFolder, charmsFolder
  537. while tick() - start < (timeout or 10) do
  538. pcall(function()
  539. local ps = plr:FindFirstChild("PlayerScripts")
  540. if ps then
  541. assetsFolder = ps:FindFirstChild("Assets")
  542. if assetsFolder then
  543. charmsFolder = assetsFolder:FindFirstChild("Charms")
  544. end
  545. end
  546. end)
  547. if assetsFolder and charmsFolder then
  548. return assetsFolder, charmsFolder
  549. end
  550. task.wait(0.1)
  551. end
  552. return assetsFolder, charmsFolder
  553. end
  554.  
  555. local AssetsFolder, CharmsFolder = waitForAssets(15)
  556.  
  557. if not CharmsFolder then
  558. pcall(function()
  559. local sps = StarterPlayer:WaitForChild("StarterPlayerScripts", 5)
  560. if sps then
  561. local af = sps:FindFirstChild("Assets")
  562. if af then
  563. CharmsFolder = af:FindFirstChild("Charms")
  564. end
  565. end
  566. end)
  567. end
  568.  
  569. local SkinImageIds = {}
  570.  
  571. local function buildSkinImageMap()
  572. pcall(function()
  573. for name, data in pairs(CosmeticLibrary.Cosmetics) do
  574. if type(data) == "table" then
  575. local img = data.Icon or data.Image or data.Thumbnail or data.ImageId or data.TextureId
  576. if img and type(img) == "string" and img ~= "" then
  577. SkinImageIds[name] = img
  578. end
  579. end
  580. end
  581. end)
  582. pcall(function()
  583. local folders = {"ViewModels", "Assets", "Weapons", "Cosmetics", "CosmeticModels", "Icons", "SkinIcons", "ItemIcons"}
  584. for _, folderName in ipairs(folders) do
  585. local folder = ReplicatedStorage:FindFirstChild(folderName)
  586. if folder then
  587. for _, desc in pairs(folder:GetDescendants()) do
  588. if desc:IsA("Decal") or desc:IsA("Texture") then
  589. local skinName = desc.Parent and desc.Parent.Name
  590. if skinName and desc.Texture ~= "" and not SkinImageIds[skinName] then
  591. SkinImageIds[skinName] = desc.Texture
  592. end
  593. elseif desc:IsA("MeshPart") and desc.TextureID ~= "" then
  594. if not SkinImageIds[desc.Name] then
  595. SkinImageIds[desc.Name] = desc.TextureID
  596. end
  597. elseif (desc:IsA("ImageLabel") or desc:IsA("ImageButton")) and desc.Image ~= "" then
  598. if not SkinImageIds[desc.Name] then
  599. SkinImageIds[desc.Name] = desc.Image
  600. end
  601. end
  602. end
  603. end
  604. end
  605. end)
  606. pcall(function()
  607. if ItemLibrary then
  608. for weaponName in pairs(SkinLists) do
  609. pcall(function()
  610. local img = ItemLibrary:GetViewModelImage(weaponName)
  611. if img and img ~= "" and not SkinImageIds[weaponName] then
  612. SkinImageIds[weaponName] = img
  613. end
  614. end)
  615. end
  616. end
  617. end)
  618. end
  619.  
  620. buildSkinImageMap()
  621.  
  622. local function getSkinImage(skinName)
  623. if SkinImageIds[skinName] then return SkinImageIds[skinName] end
  624. if ItemLibrary then
  625. local ok, img = pcall(function() return ItemLibrary:GetViewModelImage(skinName) end)
  626. if ok and img and img ~= "" then
  627. SkinImageIds[skinName] = img
  628. return img
  629. end
  630. end
  631. return ""
  632. end
  633.  
  634. local function cloneCosmetic(name, cosmeticType)
  635. if not name or name:lower() == "none" or name == "Default" then return nil end
  636.  
  637. local base = CosmeticLibrary.Cosmetics[name]
  638. local data = {}
  639.  
  640. if base then
  641. for k, v in pairs(base) do data[k] = v end
  642. end
  643.  
  644. data.Name = name
  645. data.Type = cosmeticType
  646. data.Seed = data.Seed or math.random(1, 1000000)
  647.  
  648. pcall(function()
  649. if EnumLibrary then
  650. local e = EnumLibrary:ToEnum(name)
  651. if e then
  652. data.Enum = e
  653. data.ObjectID = e
  654. end
  655. end
  656. end)
  657.  
  658. if not base then
  659. pcall(function()
  660. for _, obj in pairs(getgc(true)) do
  661. if type(obj) == "table" and rawget(obj, name) and type(rawget(obj, name)) == "table" then
  662. local candidate = rawget(obj, name)
  663. if candidate.Type == cosmeticType or candidate.Name == name then
  664. for k, v in pairs(candidate) do
  665. if data[k] == nil then
  666. data[k] = v
  667. end
  668. end
  669. break
  670. end
  671. end
  672. end
  673. end)
  674. end
  675.  
  676. return data
  677. end
  678.  
  679. local function findWeaponEntry(weaponName)
  680. local weaponInventory = PlayerData:Get("WeaponInventory")
  681. if not weaponInventory then return nil end
  682. for _, weaponEntry in pairs(weaponInventory) do
  683. if weaponEntry.Name == weaponName then
  684. return weaponEntry
  685. end
  686. end
  687. return nil
  688. end
  689.  
  690. local function injectWeaponData(weaponName)
  691. local weaponInventory = PlayerData:Get("WeaponInventory")
  692. if not weaponInventory then return end
  693.  
  694. local cfg = cosmeticConfig[weaponName]
  695. if not cfg then return end
  696.  
  697. local weaponEntry = findWeaponEntry(weaponName)
  698. if not weaponEntry then return end
  699.  
  700. weaponEntry.Skin = cfg.Skin
  701. weaponEntry.Wrap = cfg.Wrap
  702. weaponEntry.Charm = cfg.Charm
  703. weaponEntry.Finisher = cfg.Finisher
  704. return weaponEntry
  705. end
  706.  
  707. local function injectActiveWeapon()
  708. local ok, FighterController = pcall(function()
  709. return require(Controllers:WaitForChild("FighterController", 10))
  710. end)
  711. if not ok then return end
  712.  
  713. local fighter = FighterController:GetFighter(plr)
  714. if not fighter or not fighter.Items then return end
  715.  
  716. for _, item in pairs(fighter.Items) do
  717. local weaponName = item.Name
  718. if cosmeticConfig[weaponName] then
  719. local cfg = cosmeticConfig[weaponName]
  720. pcall(function()
  721. if cfg.Skin then item:Set("Skin", cfg.Skin) end
  722. if cfg.Wrap then item:Set("Wrap", cfg.Wrap) end
  723. if cfg.Charm then item:Set("Charm", cfg.Charm) end
  724. if cfg.Finisher then item:Set("Finisher", cfg.Finisher) end
  725.  
  726. if item._ViewModel then
  727. local vm = item._ViewModel
  728. if cfg.Skin and vm.SetSkin then vm:SetSkin(cfg.Skin) end
  729. if cfg.Wrap and vm.SetWrap then vm:SetWrap(cfg.Wrap) end
  730. if cfg.Charm and vm.SetCharm then vm:SetCharm(cfg.Charm) end
  731. if vm._UpdateSkin then vm:_UpdateSkin() end
  732. if vm._UpdateWrap then vm:_UpdateWrap() end
  733. if vm._UpdateCharm then vm:_UpdateCharm() end
  734. end
  735. end)
  736. end
  737. end
  738. end
  739.  
  740. pcall(function()
  741. local ClientItem = require(PlayerScripts.Modules.ClientReplicatedClasses.ClientFighter.ClientItem)
  742. local original_CreateViewModel = ClientItem._CreateViewModel
  743.  
  744. ClientItem._CreateViewModel = function(self, replicatedData)
  745. local weaponName = self.Name
  746. local ownerPlayer = self.ClientFighter and self.ClientFighter.Player
  747.  
  748. if ownerPlayer == plr and cosmeticConfig[weaponName] then
  749. local cfg = cosmeticConfig[weaponName]
  750. if not replicatedData then replicatedData = {} end
  751.  
  752. if cfg.Skin then
  753. pcall(function()
  754. if replicatedData.Data then
  755. replicatedData.Data.Skin = cfg.Skin
  756. replicatedData.Data.Name = cfg.Skin.Name
  757. else
  758. local RepClass = require(ReplicatedStorage.Modules.ReplicatedClass)
  759. local dataKey = RepClass:ToEnum("Data")
  760. local skinKey = RepClass:ToEnum("Skin")
  761. local nameKey = RepClass:ToEnum("Name")
  762.  
  763. if replicatedData[dataKey] then
  764. replicatedData[dataKey][skinKey] = cfg.Skin
  765. replicatedData[dataKey][nameKey] = cfg.Skin.Name
  766. end
  767. end
  768. end)
  769. end
  770. end
  771.  
  772. return original_CreateViewModel(self, replicatedData)
  773. end
  774. end)
  775.  
  776. pcall(function()
  777. local vmModule = PlayerScripts.Modules.ClientReplicatedClasses.ClientFighter.ClientItem:FindFirstChild("ClientViewModel")
  778. if not vmModule then return end
  779.  
  780. local ClientViewModel = require(vmModule)
  781.  
  782. local originalGetWrap = ClientViewModel.GetWrap
  783. ClientViewModel.GetWrap = function(self)
  784. local clientItem = self.ClientItem
  785. if not clientItem then return originalGetWrap(self) end
  786.  
  787. local weaponName = clientItem.Name
  788. local ownerPlayer = clientItem.ClientFighter and clientItem.ClientFighter.Player
  789.  
  790. if ownerPlayer == plr and cosmeticConfig[weaponName] and cosmeticConfig[weaponName].Wrap then
  791. return cosmeticConfig[weaponName].Wrap
  792. end
  793. return originalGetWrap(self)
  794. end
  795.  
  796. local originalNew = ClientViewModel.new
  797. ClientViewModel.new = function(replicatedData, clientItem)
  798. if not clientItem then return originalNew(replicatedData, clientItem) end
  799.  
  800. local ownerPlayer = clientItem.ClientFighter and clientItem.ClientFighter.Player
  801. local weaponName = clientItem.Name
  802.  
  803. if ownerPlayer == plr and cosmeticConfig[weaponName] then
  804. pcall(function()
  805. local RepClass = require(ReplicatedStorage.Modules.ReplicatedClass)
  806. local dataKey = RepClass:ToEnum("Data")
  807.  
  808. replicatedData[dataKey] = replicatedData[dataKey] or {}
  809. local cfg = cosmeticConfig[weaponName]
  810.  
  811. if cfg.Skin then replicatedData[dataKey][RepClass:ToEnum("Skin")] = cfg.Skin end
  812. if cfg.Wrap then replicatedData[dataKey][RepClass:ToEnum("Wrap")] = cfg.Wrap end
  813. if cfg.Charm then replicatedData[dataKey][RepClass:ToEnum("Charm")] = cfg.Charm end
  814. end)
  815. end
  816.  
  817. local vm = originalNew(replicatedData, clientItem)
  818.  
  819. if vm and ownerPlayer == plr and cosmeticConfig[weaponName] then
  820. local cfg = cosmeticConfig[weaponName]
  821. pcall(function()
  822. if cfg.Wrap and vm._UpdateWrap then vm:_UpdateWrap() end
  823. if cfg.Skin and vm._UpdateSkin then vm:_UpdateSkin() end
  824. end)
  825. end
  826.  
  827. return vm
  828. end
  829. end)
  830.  
  831. local function equipCosmetic(weaponName, cosmeticType, cosmeticName)
  832. if cosmeticName == "None" or cosmeticName == "Default" then
  833. if cosmeticConfig[weaponName] then
  834. cosmeticConfig[weaponName][cosmeticType] = nil
  835. local hasKeys = false
  836. for k, _ in pairs(cosmeticConfig[weaponName]) do
  837. hasKeys = true
  838. break
  839. end
  840. if not hasKeys then
  841. cosmeticConfig[weaponName] = nil
  842. end
  843. end
  844. if findWeaponEntry(weaponName) then
  845. injectWeaponData(weaponName)
  846. end
  847. injectActiveWeapon()
  848. saveConfig()
  849. pcall(function() PlayerData:Replicate("WeaponInventory") end)
  850. return
  851. end
  852.  
  853. local cloned = cloneCosmetic(cosmeticName, cosmeticType)
  854. if not cloned then return end
  855.  
  856. if not cosmeticConfig[weaponName] then
  857. cosmeticConfig[weaponName] = {}
  858. end
  859.  
  860. cosmeticConfig[weaponName][cosmeticType] = cloned
  861.  
  862. if findWeaponEntry(weaponName) then
  863. injectWeaponData(weaponName)
  864. end
  865.  
  866. injectActiveWeapon()
  867. saveConfig()
  868.  
  869. pcall(function() PlayerData:Replicate("WeaponInventory") end)
  870. end
  871.  
  872. local function applyWrapToAll(wrapName)
  873. for weapon in pairs(SkinLists) do
  874. if wrapName == "None" then
  875. if cosmeticConfig[weapon] then
  876. cosmeticConfig[weapon].Wrap = nil
  877. local hasKeys = false
  878. for k, _ in pairs(cosmeticConfig[weapon]) do
  879. hasKeys = true
  880. break
  881. end
  882. if not hasKeys then
  883. cosmeticConfig[weapon] = nil
  884. end
  885. end
  886. else
  887. local cloned = cloneCosmetic(wrapName, "Wrap")
  888. if cloned then
  889. if not cosmeticConfig[weapon] then cosmeticConfig[weapon] = {} end
  890. cosmeticConfig[weapon].Wrap = cloned
  891. end
  892. end
  893. if findWeaponEntry(weapon) then
  894. injectWeaponData(weapon)
  895. end
  896. end
  897. injectActiveWeapon()
  898. saveConfig()
  899. pcall(function() PlayerData:Replicate("WeaponInventory") end)
  900. end
  901.  
  902. local _unlockAllApplied = false
  903.  
  904. local function unlockAllCosmetics()
  905. if _unlockAllApplied then return end
  906. _unlockAllApplied = true
  907.  
  908. local _player = plr
  909. local _playerScripts = _player:WaitForChild("PlayerScripts")
  910. local _controllers = _playerScripts:WaitForChild("Controllers")
  911.  
  912. local _EnumLibrary = require(ReplicatedStorage.Modules:WaitForChild("EnumLibrary", 10))
  913. if _EnumLibrary then _EnumLibrary:WaitForEnumBuilder() end
  914. local _CosmeticLibrary = require(ReplicatedStorage.Modules:WaitForChild("CosmeticLibrary", 10))
  915. local _ItemLibrary = require(ReplicatedStorage.Modules:WaitForChild("ItemLibrary", 10))
  916. local _DataController = require(_controllers:WaitForChild("PlayerDataController", 10))
  917.  
  918. local _equipped, _favorites = {}, {}
  919. local _constructingWeapon, _viewingProfile = nil, nil
  920. local _lastUsedWeapon = nil
  921.  
  922. local function _cloneCosmetic(name, cosmeticType, options)
  923. local base = _CosmeticLibrary.Cosmetics[name]
  924. if not base then return nil end
  925. local data = {}
  926. for key, value in pairs(base) do data[key] = value end
  927. data.Name = name
  928. data.Type = data.Type or cosmeticType
  929. data.Seed = data.Seed or math.random(1, 1000000)
  930. if _EnumLibrary then
  931. local success, enumId = pcall(_EnumLibrary.ToEnum, _EnumLibrary, name)
  932. if success and enumId then data.Enum, data.ObjectID = enumId, data.ObjectID or enumId end
  933. end
  934. if options then
  935. if options.inverted ~= nil then data.Inverted = options.inverted end
  936. if options.favoritesOnly ~= nil then data.OnlyUseFavorites = options.favoritesOnly end
  937. end
  938. return data
  939. end
  940.  
  941. local function _saveConfig()
  942. if not writefile then return end
  943. pcall(function()
  944. local config = {equipped = {}, favorites = _favorites}
  945. for weapon, cosmetics in pairs(_equipped) do
  946. config.equipped[weapon] = {}
  947. for cosmeticType, cosmeticData in pairs(cosmetics) do
  948. if cosmeticData and cosmeticData.Name then
  949. config.equipped[weapon][cosmeticType] = {
  950. name = cosmeticData.Name, seed = cosmeticData.Seed, inverted = cosmeticData.Inverted
  951. }
  952. end
  953. end
  954. end
  955. writefile(UNLOCK_SAVE_FILE, HttpService:JSONEncode(config))
  956. end)
  957. end
  958.  
  959. local function _loadConfig()
  960. if not readfile or not isfile or not isfile(UNLOCK_SAVE_FILE) then return end
  961. pcall(function()
  962. local config = HttpService:JSONDecode(readfile(UNLOCK_SAVE_FILE))
  963. if config.equipped then
  964. for weapon, cosmetics in pairs(config.equipped) do
  965. _equipped[weapon] = {}
  966. for cosmeticType, cosmeticData in pairs(cosmetics) do
  967. local cloned = _cloneCosmetic(cosmeticData.name, cosmeticType, {inverted = cosmeticData.inverted})
  968. if cloned then cloned.Seed = cosmeticData.seed _equipped[weapon][cosmeticType] = cloned end
  969. end
  970. end
  971. end
  972. _favorites = config.favorites or {}
  973. end)
  974. end
  975.  
  976. _CosmeticLibrary.OwnsCosmeticNormally = function() return true end
  977. _CosmeticLibrary.OwnsCosmeticUniversally = function() return true end
  978. _CosmeticLibrary.OwnsCosmeticForWeapon = function() return true end
  979. local _originalOwnsCosmetic = _CosmeticLibrary.OwnsCosmetic
  980. _CosmeticLibrary.OwnsCosmetic = function(self, inventory, name, weapon)
  981. if name:find("MISSING_") then return _originalOwnsCosmetic(self, inventory, name, weapon) end
  982. return true
  983. end
  984.  
  985. local _originalGet = _DataController.Get
  986. _DataController.Get = function(self, key)
  987. local data = _originalGet(self, key)
  988. if key == "CosmeticInventory" then
  989. local proxy = {}
  990. if data then for k, v in pairs(data) do proxy[k] = v end end
  991. return setmetatable(proxy, {__index = function() return true end})
  992. end
  993. if key == "FavoritedCosmetics" then
  994. local result = data and table.clone(data) or {}
  995. for weapon, favs in pairs(_favorites) do
  996. result[weapon] = result[weapon] or {}
  997. for name, isFav in pairs(favs) do result[weapon][name] = isFav end
  998. end
  999. return result
  1000. end
  1001. return data
  1002. end
  1003.  
  1004. local _originalGetWeaponData = _DataController.GetWeaponData
  1005. _DataController.GetWeaponData = function(self, weaponName)
  1006. local data = _originalGetWeaponData(self, weaponName)
  1007. if not data then return nil end
  1008.  
  1009. local merged = {}
  1010. for key, value in pairs(data) do merged[key] = value end
  1011. merged.Name = weaponName
  1012. if _equipped[weaponName] then
  1013. for cosmeticType, cosmeticData in pairs(_equipped[weaponName]) do merged[cosmeticType] = cosmeticData end
  1014. end
  1015. return merged
  1016. end
  1017.  
  1018. local _FighterController
  1019. pcall(function() _FighterController = require(_controllers:WaitForChild("FighterController", 10)) end)
  1020.  
  1021. if hookmetamethod then
  1022. local remotes = ReplicatedStorage:FindFirstChild("Remotes")
  1023. local dataRemotes = remotes and remotes:FindFirstChild("Data")
  1024. local equipRemote = dataRemotes and dataRemotes:FindFirstChild("EquipCosmetic")
  1025. local favoriteRemote = dataRemotes and dataRemotes:FindFirstChild("FavoriteCosmetic")
  1026. local replicationRemotes = remotes and remotes:FindFirstChild("Replication")
  1027. local fighterRemotes = replicationRemotes and replicationRemotes:FindFirstChild("Fighter")
  1028. local useItemRemote = fighterRemotes and fighterRemotes:FindFirstChild("UseItem")
  1029.  
  1030. if equipRemote then
  1031. local oldNamecall
  1032. oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
  1033. if getnamecallmethod() ~= "FireServer" then return oldNamecall(self, ...) end
  1034. local args = {...}
  1035.  
  1036. if useItemRemote and self == useItemRemote then
  1037. local objectID = args[1]
  1038. if _FighterController then
  1039. pcall(function()
  1040. local fighter = _FighterController:GetFighter(_player)
  1041. if fighter and fighter.Items then
  1042. for _, item in pairs(fighter.Items) do
  1043. if item:Get("ObjectID") == objectID then
  1044. _lastUsedWeapon = item.Name
  1045. break
  1046. end
  1047. end
  1048. end
  1049. end)
  1050. end
  1051. end
  1052.  
  1053. if self == equipRemote then
  1054. local weaponName, cosmeticType, cosmeticName, options = args[1], args[2], args[3], args[4] or {}
  1055.  
  1056. if cosmeticName and cosmeticName ~= "None" and cosmeticName ~= "" then
  1057. local inventory = _DataController:Get("CosmeticInventory")
  1058. if inventory and rawget(inventory, cosmeticName) then return oldNamecall(self, ...) end
  1059. end
  1060.  
  1061. _equipped[weaponName] = _equipped[weaponName] or {}
  1062.  
  1063. if not cosmeticName or cosmeticName == "None" or cosmeticName == "" then
  1064. _equipped[weaponName][cosmeticType] = nil
  1065. if not next(_equipped[weaponName]) then _equipped[weaponName] = nil end
  1066. else
  1067. local cloned = _cloneCosmetic(cosmeticName, cosmeticType, {inverted = options.IsInverted, favoritesOnly = options.OnlyUseFavorites})
  1068. if cloned then _equipped[weaponName][cosmeticType] = cloned end
  1069. end
  1070.  
  1071. task.defer(function()
  1072. pcall(function() _DataController.CurrentData:Replicate("WeaponInventory") end)
  1073. task.wait(0.2)
  1074. _saveConfig()
  1075. end)
  1076. return
  1077. end
  1078.  
  1079. if self == favoriteRemote then
  1080. _favorites[args[1]] = _favorites[args[1]] or {}
  1081. _favorites[args[1]][args[2]] = args[3] or nil
  1082. _saveConfig()
  1083. task.spawn(function() pcall(function() _DataController.CurrentData:Replicate("FavoritedCosmetics") end) end)
  1084. return
  1085. end
  1086.  
  1087. return oldNamecall(self, ...)
  1088. end)
  1089. end
  1090. end
  1091.  
  1092. local _ClientItem
  1093. pcall(function() _ClientItem = require(_player.PlayerScripts.Modules.ClientReplicatedClasses.ClientFighter.ClientItem) end)
  1094. if _ClientItem and _ClientItem._CreateViewModel then
  1095. local _originalCreateViewModel = _ClientItem._CreateViewModel
  1096. _ClientItem._CreateViewModel = function(self, viewmodelRef)
  1097. local weaponName = self.Name
  1098. local weaponPlayer = self.ClientFighter and self.ClientFighter.Player
  1099. _constructingWeapon = (weaponPlayer == _player) and weaponName or nil
  1100.  
  1101. if weaponPlayer == _player and _equipped[weaponName] and _equipped[weaponName].Skin and viewmodelRef then
  1102. local dataKey, skinKey, nameKey = self:ToEnum("Data"), self:ToEnum("Skin"), self:ToEnum("Name")
  1103. if viewmodelRef[dataKey] then
  1104. viewmodelRef[dataKey][skinKey] = _equipped[weaponName].Skin
  1105. viewmodelRef[dataKey][nameKey] = _equipped[weaponName].Skin.Name
  1106. elseif viewmodelRef.Data then
  1107. viewmodelRef.Data.Skin = _equipped[weaponName].Skin
  1108. viewmodelRef.Data.Name = _equipped[weaponName].Skin.Name
  1109. end
  1110. end
  1111.  
  1112. local result = _originalCreateViewModel(self, viewmodelRef)
  1113. _constructingWeapon = nil
  1114. return result
  1115. end
  1116. end
  1117.  
  1118. local _viewModelModule = _player.PlayerScripts.Modules.ClientReplicatedClasses.ClientFighter.ClientItem:FindFirstChild("ClientViewModel")
  1119. if _viewModelModule then
  1120. local _ClientViewModel = require(_viewModelModule)
  1121. if _ClientViewModel.GetWrap then
  1122. local _originalGetWrap = _ClientViewModel.GetWrap
  1123. _ClientViewModel.GetWrap = function(self)
  1124. local weaponName = self.ClientItem and self.ClientItem.Name
  1125. local weaponPlayer = self.ClientItem and self.ClientItem.ClientFighter and self.ClientItem.ClientFighter.Player
  1126. if weaponName and weaponPlayer == _player and _equipped[weaponName] and _equipped[weaponName].Wrap then
  1127. return _equipped[weaponName].Wrap
  1128. end
  1129. return _originalGetWrap(self)
  1130. end
  1131. end
  1132. local _originalNew = _ClientViewModel.new
  1133. _ClientViewModel.new = function(replicatedData, clientItem)
  1134. local weaponPlayer = clientItem.ClientFighter and clientItem.ClientFighter.Player
  1135. local weaponName = _constructingWeapon or clientItem.Name
  1136. if weaponPlayer == _player and _equipped[weaponName] then
  1137. local ReplicatedClass = require(ReplicatedStorage.Modules.ReplicatedClass)
  1138. local dataKey = ReplicatedClass:ToEnum("Data")
  1139. replicatedData[dataKey] = replicatedData[dataKey] or {}
  1140. local cosmetics = _equipped[weaponName]
  1141. if cosmetics.Skin then replicatedData[dataKey][ReplicatedClass:ToEnum("Skin")] = cosmetics.Skin end
  1142. if cosmetics.Wrap then replicatedData[dataKey][ReplicatedClass:ToEnum("Wrap")] = cosmetics.Wrap end
  1143. if cosmetics.Charm then replicatedData[dataKey][ReplicatedClass:ToEnum("Charm")] = cosmetics.Charm end
  1144. end
  1145. local result = _originalNew(replicatedData, clientItem)
  1146. if weaponPlayer == _player and _equipped[weaponName] and _equipped[weaponName].Wrap and result._UpdateWrap then
  1147. result:_UpdateWrap()
  1148. task.delay(0.1, function() if not result._destroyed then result:_UpdateWrap() end end)
  1149. end
  1150. return result
  1151. end
  1152. end
  1153.  
  1154. if _ItemLibrary and _ItemLibrary.GetViewModelImageFromWeaponData then
  1155. local _originalGetViewModelImage = _ItemLibrary.GetViewModelImageFromWeaponData
  1156. _ItemLibrary.GetViewModelImageFromWeaponData = function(self, weaponData, highRes)
  1157. if not weaponData then return _originalGetViewModelImage(self, weaponData, highRes) end
  1158. local weaponName = weaponData.Name
  1159. local shouldShowSkin = (weaponData.Skin and _equipped[weaponName] and weaponData.Skin == _equipped[weaponName].Skin) or (_viewingProfile == _player and _equipped[weaponName] and _equipped[weaponName].Skin)
  1160. if shouldShowSkin and _equipped[weaponName] and _equipped[weaponName].Skin then
  1161. local skinInfo = self.ViewModels[_equipped[weaponName].Skin.Name]
  1162. if skinInfo then return skinInfo[highRes and "ImageHighResolution" or "Image"] or skinInfo.Image end
  1163. end
  1164. return _originalGetViewModelImage(self, weaponData, highRes)
  1165. end
  1166. end
  1167.  
  1168. pcall(function()
  1169. local ViewProfile = require(_player.PlayerScripts.Modules.Pages.ViewProfile)
  1170. if ViewProfile and ViewProfile.Fetch then
  1171. local _originalFetch = ViewProfile.Fetch
  1172. ViewProfile.Fetch = function(self, targetPlayer)
  1173. _viewingProfile = targetPlayer
  1174. return _originalFetch(self, targetPlayer)
  1175. end
  1176. end
  1177. end)
  1178.  
  1179. local _ClientEntity
  1180. pcall(function() _ClientEntity = require(_player.PlayerScripts.Modules.ClientReplicatedClasses.ClientEntity) end)
  1181. if _ClientEntity and _ClientEntity.ReplicateFromServer then
  1182. local _originalReplicateFromServer = _ClientEntity.ReplicateFromServer
  1183. _ClientEntity.ReplicateFromServer = function(self, action, ...)
  1184. if action == "FinisherEffect" then
  1185. local args = {...}
  1186. local killerName = args[3]
  1187. local decodedKiller = killerName
  1188. if type(killerName) == "userdata" and _EnumLibrary and _EnumLibrary.FromEnum then
  1189. local ok, decoded = pcall(_EnumLibrary.FromEnum, _EnumLibrary, killerName)
  1190. if ok and decoded then decodedKiller = decoded end
  1191. end
  1192. local isOurKill = tostring(decodedKiller) == _player.Name or tostring(decodedKiller):lower() == _player.Name:lower()
  1193. if isOurKill and _lastUsedWeapon and _equipped[_lastUsedWeapon] and _equipped[_lastUsedWeapon].Finisher then
  1194. local finisherData = _equipped[_lastUsedWeapon].Finisher
  1195. local finisherEnum = finisherData.Enum
  1196. if not finisherEnum and _EnumLibrary then
  1197. local ok, result = pcall(_EnumLibrary.ToEnum, _EnumLibrary, finisherData.Name)
  1198. if ok and result then finisherEnum = result end
  1199. end
  1200. if finisherEnum then
  1201. args[1] = finisherEnum
  1202. return _originalReplicateFromServer(self, action, unpack(args))
  1203. end
  1204. end
  1205. end
  1206. return _originalReplicateFromServer(self, action, ...)
  1207. end
  1208. end
  1209.  
  1210. _loadConfig()
  1211. end
  1212.  
  1213. local _selectiveUnlockApplied = false
  1214. local _selectiveUnlockedItems = {}
  1215. local _selectiveEquipped = {}
  1216. local _selectiveFavorites = {}
  1217. local _selectiveLastUsedWeapon = nil
  1218.  
  1219. local function _saveSelectiveConfig()
  1220. if not writefile then return end
  1221. pcall(function()
  1222. local config = {equipped = {}, favorites = _selectiveFavorites, unlocked = {}}
  1223. for name, _ in pairs(_selectiveUnlockedItems) do
  1224. config.unlocked[name] = true
  1225. end
  1226. for weapon, cosmetics in pairs(_selectiveEquipped) do
  1227. config.equipped[weapon] = {}
  1228. for cosmeticType, cosmeticData in pairs(cosmetics) do
  1229. if cosmeticData and cosmeticData.Name then
  1230. config.equipped[weapon][cosmeticType] = {
  1231. name = cosmeticData.Name, seed = cosmeticData.Seed, inverted = cosmeticData.Inverted
  1232. }
  1233. end
  1234. end
  1235. end
  1236. writefile(SELECTIVE_UNLOCK_FILE, HttpService:JSONEncode(config))
  1237. end)
  1238. end
  1239.  
  1240. local function _loadSelectiveConfig()
  1241. if not readfile or not isfile or not isfile(SELECTIVE_UNLOCK_FILE) then return end
  1242. pcall(function()
  1243. local _CosmeticLibrary = require(ReplicatedStorage.Modules:WaitForChild("CosmeticLibrary", 10))
  1244. local _EnumLibrary = require(ReplicatedStorage.Modules:WaitForChild("EnumLibrary", 10))
  1245. local config = HttpService:JSONDecode(readfile(SELECTIVE_UNLOCK_FILE))
  1246. if config.unlocked then
  1247. for name, _ in pairs(config.unlocked) do
  1248. _selectiveUnlockedItems[name] = true
  1249. end
  1250. end
  1251. if config.equipped then
  1252. for weapon, cosmetics in pairs(config.equipped) do
  1253. _selectiveEquipped[weapon] = {}
  1254. for cosmeticType, cosmeticData in pairs(cosmetics) do
  1255. local base = _CosmeticLibrary.Cosmetics[cosmeticData.name]
  1256. if base then
  1257. local data = {}
  1258. for key, value in pairs(base) do data[key] = value end
  1259. data.Name = cosmeticData.name
  1260. data.Type = data.Type or cosmeticType
  1261. data.Seed = cosmeticData.seed or math.random(1, 1000000)
  1262. if cosmeticData.inverted ~= nil then data.Inverted = cosmeticData.inverted end
  1263. if _EnumLibrary then
  1264. local success, enumId = pcall(_EnumLibrary.ToEnum, _EnumLibrary, cosmeticData.name)
  1265. if success and enumId then data.Enum = enumId data.ObjectID = data.ObjectID or enumId end
  1266. end
  1267. _selectiveEquipped[weapon][cosmeticType] = data
  1268. end
  1269. end
  1270. end
  1271. end
  1272. _selectiveFavorites = config.favorites or {}
  1273. end)
  1274. end
  1275.  
  1276. local function unlockSelectiveCosmetics(selectedSkins, selectedWraps, selectedCharms, selectedFinishers)
  1277. local _player = plr
  1278. local _playerScripts = _player:WaitForChild("PlayerScripts")
  1279. local _controllers = _playerScripts:WaitForChild("Controllers")
  1280.  
  1281. local _EnumLibrary = require(ReplicatedStorage.Modules:WaitForChild("EnumLibrary", 10))
  1282. if _EnumLibrary then _EnumLibrary:WaitForEnumBuilder() end
  1283. local _CosmeticLibrary = require(ReplicatedStorage.Modules:WaitForChild("CosmeticLibrary", 10))
  1284. local _ItemLibrary = require(ReplicatedStorage.Modules:WaitForChild("ItemLibrary", 10))
  1285. local _DataController = require(_controllers:WaitForChild("PlayerDataController", 10))
  1286.  
  1287. local unlockSet = {}
  1288. if selectedSkins then
  1289. for _, name in ipairs(selectedSkins) do
  1290. unlockSet[name] = true
  1291. end
  1292. end
  1293. if selectedWraps then
  1294. for _, name in ipairs(selectedWraps) do
  1295. unlockSet[name] = true
  1296. end
  1297. end
  1298. if selectedCharms then
  1299. for _, name in ipairs(selectedCharms) do
  1300. unlockSet[name] = true
  1301. end
  1302. end
  1303. if selectedFinishers then
  1304. for _, name in ipairs(selectedFinishers) do
  1305. unlockSet[name] = true
  1306. end
  1307. end
  1308.  
  1309. for name, _ in pairs(unlockSet) do
  1310. _selectiveUnlockedItems[name] = true
  1311. end
  1312.  
  1313. local function _selCloneCosmetic(name, cosmeticType, options)
  1314. local base = _CosmeticLibrary.Cosmetics[name]
  1315. if not base then return nil end
  1316. local data = {}
  1317. for key, value in pairs(base) do data[key] = value end
  1318. data.Name = name
  1319. data.Type = data.Type or cosmeticType
  1320. data.Seed = data.Seed or math.random(1, 1000000)
  1321. if _EnumLibrary then
  1322. local success, enumId = pcall(_EnumLibrary.ToEnum, _EnumLibrary, name)
  1323. if success and enumId then data.Enum = enumId data.ObjectID = data.ObjectID or enumId end
  1324. end
  1325. if options then
  1326. if options.inverted ~= nil then data.Inverted = options.inverted end
  1327. if options.favoritesOnly ~= nil then data.OnlyUseFavorites = options.favoritesOnly end
  1328. end
  1329. return data
  1330. end
  1331.  
  1332. if not _selectiveUnlockApplied then
  1333. _selectiveUnlockApplied = true
  1334.  
  1335. _loadSelectiveConfig()
  1336.  
  1337. local _origOwnsCosmetic = _CosmeticLibrary.OwnsCosmetic
  1338. _CosmeticLibrary.OwnsCosmetic = function(self, inventory, name, weapon)
  1339. if _selectiveUnlockedItems[name] then return true end
  1340. return _origOwnsCosmetic(self, inventory, name, weapon)
  1341. end
  1342.  
  1343. if _CosmeticLibrary.OwnsCosmeticNormally then
  1344. local _origNormally = _CosmeticLibrary.OwnsCosmeticNormally
  1345. _CosmeticLibrary.OwnsCosmeticNormally = function(self, inventory, name, weapon)
  1346. if _selectiveUnlockedItems[name] then return true end
  1347. if type(_origNormally) == "function" then return _origNormally(self, inventory, name, weapon) end
  1348. return false
  1349. end
  1350. end
  1351.  
  1352. if _CosmeticLibrary.OwnsCosmeticUniversally then
  1353. local _origUniversally = _CosmeticLibrary.OwnsCosmeticUniversally
  1354. _CosmeticLibrary.OwnsCosmeticUniversally = function(self, inventory, name)
  1355. if _selectiveUnlockedItems[name] then return true end
  1356. if type(_origUniversally) == "function" then return _origUniversally(self, inventory, name) end
  1357. return false
  1358. end
  1359. end
  1360.  
  1361. if _CosmeticLibrary.OwnsCosmeticForWeapon then
  1362. local _origForWeapon = _CosmeticLibrary.OwnsCosmeticForWeapon
  1363. _CosmeticLibrary.OwnsCosmeticForWeapon = function(self, inventory, name, weapon)
  1364. if _selectiveUnlockedItems[name] then return true end
  1365. if type(_origForWeapon) == "function" then return _origForWeapon(self, inventory, name, weapon) end
  1366. return false
  1367. end
  1368. end
  1369.  
  1370. local _origGet = _DataController.Get
  1371. _DataController.Get = function(self, key)
  1372. local data = _origGet(self, key)
  1373. if key == "CosmeticInventory" then
  1374. local proxy = {}
  1375. if data then for k, v in pairs(data) do proxy[k] = v end end
  1376. return setmetatable(proxy, {
  1377. __index = function(_, k)
  1378. if _selectiveUnlockedItems[k] then return true end
  1379. return nil
  1380. end
  1381. })
  1382. end
  1383. if key == "FavoritedCosmetics" then
  1384. local result = data and table.clone(data) or {}
  1385. for weapon, favs in pairs(_selectiveFavorites) do
  1386. result[weapon] = result[weapon] or {}
  1387. for name, isFav in pairs(favs) do result[weapon][name] = isFav end
  1388. end
  1389. return result
  1390. end
  1391. return data
  1392. end
  1393.  
  1394. local _origGetWeaponData = _DataController.GetWeaponData
  1395. _DataController.GetWeaponData = function(self, weaponName)
  1396. local data = _origGetWeaponData(self, weaponName)
  1397. if not data then return nil end
  1398. local merged = {}
  1399. for key, value in pairs(data) do merged[key] = value end
  1400. merged.Name = weaponName
  1401. if _selectiveEquipped[weaponName] then
  1402. for cosmeticType, cosmeticData in pairs(_selectiveEquipped[weaponName]) do
  1403. merged[cosmeticType] = cosmeticData
  1404. end
  1405. end
  1406. return merged
  1407. end
  1408.  
  1409. local _FighterController
  1410. pcall(function() _FighterController = require(_controllers:WaitForChild("FighterController", 10)) end)
  1411.  
  1412. if hookmetamethod then
  1413. local remotes = ReplicatedStorage:FindFirstChild("Remotes")
  1414. local dataRemotes = remotes and remotes:FindFirstChild("Data")
  1415. local equipRemote = dataRemotes and dataRemotes:FindFirstChild("EquipCosmetic")
  1416. local favoriteRemote = dataRemotes and dataRemotes:FindFirstChild("FavoriteCosmetic")
  1417. local replicationRemotes = remotes and remotes:FindFirstChild("Replication")
  1418. local fighterRemotes = replicationRemotes and replicationRemotes:FindFirstChild("Fighter")
  1419. local useItemRemote = fighterRemotes and fighterRemotes:FindFirstChild("UseItem")
  1420.  
  1421. if equipRemote then
  1422. local oldNamecall
  1423. oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
  1424. if getnamecallmethod() ~= "FireServer" then return oldNamecall(self, ...) end
  1425. local args = {...}
  1426.  
  1427. if useItemRemote and self == useItemRemote then
  1428. local objectID = args[1]
  1429. if _FighterController then
  1430. pcall(function()
  1431. local fighter = _FighterController:GetFighter(_player)
  1432. if fighter and fighter.Items then
  1433. for _, item in pairs(fighter.Items) do
  1434. if item:Get("ObjectID") == objectID then
  1435. _selectiveLastUsedWeapon = item.Name
  1436. break
  1437. end
  1438. end
  1439. end
  1440. end)
  1441. end
  1442. end
  1443.  
  1444. if self == equipRemote then
  1445. local weaponName, cosmeticType, cosmeticName, options = args[1], args[2], args[3], args[4] or {}
  1446.  
  1447. if cosmeticName and cosmeticName ~= "None" and cosmeticName ~= "" then
  1448. if not _selectiveUnlockedItems[cosmeticName] then
  1449. return oldNamecall(self, ...)
  1450. end
  1451. local inventory = _origGet(_DataController, "CosmeticInventory")
  1452. if inventory and type(inventory) == "table" and rawget(inventory, cosmeticName) then
  1453. return oldNamecall(self, ...)
  1454. end
  1455. end
  1456.  
  1457. _selectiveEquipped[weaponName] = _selectiveEquipped[weaponName] or {}
  1458.  
  1459. if not cosmeticName or cosmeticName == "None" or cosmeticName == "" then
  1460. _selectiveEquipped[weaponName][cosmeticType] = nil
  1461. if not next(_selectiveEquipped[weaponName]) then _selectiveEquipped[weaponName] = nil end
  1462. else
  1463. local cloned = _selCloneCosmetic(cosmeticName, cosmeticType, {inverted = options.IsInverted, favoritesOnly = options.OnlyUseFavorites})
  1464. if cloned then _selectiveEquipped[weaponName][cosmeticType] = cloned end
  1465. end
  1466.  
  1467. task.defer(function()
  1468. pcall(function() _DataController.CurrentData:Replicate("WeaponInventory") end)
  1469. task.wait(0.2)
  1470. _saveSelectiveConfig()
  1471. end)
  1472. return
  1473. end
  1474.  
  1475. if self == favoriteRemote then
  1476. local cosmeticName = args[2]
  1477. if cosmeticName and _selectiveUnlockedItems[cosmeticName] then
  1478. _selectiveFavorites[args[1]] = _selectiveFavorites[args[1]] or {}
  1479. _selectiveFavorites[args[1]][cosmeticName] = args[3] or nil
  1480. _saveSelectiveConfig()
  1481. task.spawn(function() pcall(function() _DataController.CurrentData:Replicate("FavoritedCosmetics") end) end)
  1482. return
  1483. end
  1484. end
  1485.  
  1486. return oldNamecall(self, ...)
  1487. end)
  1488. end
  1489. end
  1490.  
  1491. local _selConstructingWeapon = nil
  1492.  
  1493. local _ClientItem
  1494. pcall(function() _ClientItem = require(_player.PlayerScripts.Modules.ClientReplicatedClasses.ClientFighter.ClientItem) end)
  1495. if _ClientItem and _ClientItem._CreateViewModel then
  1496. local _originalCreateViewModel = _ClientItem._CreateViewModel
  1497. _ClientItem._CreateViewModel = function(self, viewmodelRef)
  1498. local weaponName = self.Name
  1499. local weaponPlayer = self.ClientFighter and self.ClientFighter.Player
  1500. _selConstructingWeapon = (weaponPlayer == _player) and weaponName or nil
  1501.  
  1502. if weaponPlayer == _player and _selectiveEquipped[weaponName] and _selectiveEquipped[weaponName].Skin and viewmodelRef then
  1503. pcall(function()
  1504. local dataKey, skinKey, nameKey = self:ToEnum("Data"), self:ToEnum("Skin"), self:ToEnum("Name")
  1505. if viewmodelRef[dataKey] then
  1506. viewmodelRef[dataKey][skinKey] = _selectiveEquipped[weaponName].Skin
  1507. viewmodelRef[dataKey][nameKey] = _selectiveEquipped[weaponName].Skin.Name
  1508. elseif viewmodelRef.Data then
  1509. viewmodelRef.Data.Skin = _selectiveEquipped[weaponName].Skin
  1510. viewmodelRef.Data.Name = _selectiveEquipped[weaponName].Skin.Name
  1511. end
  1512. end)
  1513. end
  1514.  
  1515. local result = _originalCreateViewModel(self, viewmodelRef)
  1516. _selConstructingWeapon = nil
  1517. return result
  1518. end
  1519. end
  1520.  
  1521. local _viewModelModule = _player.PlayerScripts.Modules.ClientReplicatedClasses.ClientFighter.ClientItem:FindFirstChild("ClientViewModel")
  1522. if _viewModelModule then
  1523. local _ClientViewModel = require(_viewModelModule)
  1524. if _ClientViewModel.GetWrap then
  1525. local _originalGetWrap = _ClientViewModel.GetWrap
  1526. _ClientViewModel.GetWrap = function(self)
  1527. local weaponName = self.ClientItem and self.ClientItem.Name
  1528. local weaponPlayer = self.ClientItem and self.ClientItem.ClientFighter and self.ClientItem.ClientFighter.Player
  1529. if weaponName and weaponPlayer == _player and _selectiveEquipped[weaponName] and _selectiveEquipped[weaponName].Wrap then
  1530. return _selectiveEquipped[weaponName].Wrap
  1531. end
  1532. return _originalGetWrap(self)
  1533. end
  1534. end
  1535. local _originalNew = _ClientViewModel.new
  1536. _ClientViewModel.new = function(replicatedData, clientItem)
  1537. local weaponPlayer = clientItem.ClientFighter and clientItem.ClientFighter.Player
  1538. local weaponName = _selConstructingWeapon or clientItem.Name
  1539. if weaponPlayer == _player and _selectiveEquipped[weaponName] then
  1540. pcall(function()
  1541. local ReplicatedClass = require(ReplicatedStorage.Modules.ReplicatedClass)
  1542. local dataKey = ReplicatedClass:ToEnum("Data")
  1543. replicatedData[dataKey] = replicatedData[dataKey] or {}
  1544. local cosmetics = _selectiveEquipped[weaponName]
  1545. if cosmetics.Skin then replicatedData[dataKey][ReplicatedClass:ToEnum("Skin")] = cosmetics.Skin end
  1546. if cosmetics.Wrap then replicatedData[dataKey][ReplicatedClass:ToEnum("Wrap")] = cosmetics.Wrap end
  1547. if cosmetics.Charm then replicatedData[dataKey][ReplicatedClass:ToEnum("Charm")] = cosmetics.Charm end
  1548. end)
  1549. end
  1550. local result = _originalNew(replicatedData, clientItem)
  1551. if weaponPlayer == _player and _selectiveEquipped[weaponName] and _selectiveEquipped[weaponName].Wrap and result._UpdateWrap then
  1552. result:_UpdateWrap()
  1553. task.delay(0.1, function() if not result._destroyed then result:_UpdateWrap() end end)
  1554. end
  1555. return result
  1556. end
  1557. end
  1558.  
  1559. if _ItemLibrary and _ItemLibrary.GetViewModelImageFromWeaponData then
  1560. local _originalGetViewModelImage = _ItemLibrary.GetViewModelImageFromWeaponData
  1561. _ItemLibrary.GetViewModelImageFromWeaponData = function(self, weaponData, highRes)
  1562. if not weaponData then return _originalGetViewModelImage(self, weaponData, highRes) end
  1563. local weaponName = weaponData.Name
  1564. if _selectiveEquipped[weaponName] and _selectiveEquipped[weaponName].Skin then
  1565. local skinInfo = self.ViewModels[_selectiveEquipped[weaponName].Skin.Name]
  1566. if skinInfo then return skinInfo[highRes and "ImageHighResolution" or "Image"] or skinInfo.Image end
  1567. end
  1568. return _originalGetViewModelImage(self, weaponData, highRes)
  1569. end
  1570. end
  1571.  
  1572. local _ClientEntity
  1573. pcall(function() _ClientEntity = require(_player.PlayerScripts.Modules.ClientReplicatedClasses.ClientEntity) end)
  1574. if _ClientEntity and _ClientEntity.ReplicateFromServer then
  1575. local _originalReplicateFromServer = _ClientEntity.ReplicateFromServer
  1576. _ClientEntity.ReplicateFromServer = function(self, action, ...)
  1577. if action == "FinisherEffect" then
  1578. local args = {...}
  1579. local killerName = args[3]
  1580. local decodedKiller = killerName
  1581. if type(killerName) == "userdata" and _EnumLibrary and _EnumLibrary.FromEnum then
  1582. local ok, decoded = pcall(_EnumLibrary.FromEnum, _EnumLibrary, killerName)
  1583. if ok and decoded then decodedKiller = decoded end
  1584. end
  1585. local isOurKill = tostring(decodedKiller) == _player.Name or tostring(decodedKiller):lower() == _player.Name:lower()
  1586. if isOurKill and _selectiveLastUsedWeapon and _selectiveEquipped[_selectiveLastUsedWeapon] and _selectiveEquipped[_selectiveLastUsedWeapon].Finisher then
  1587. local finisherData = _selectiveEquipped[_selectiveLastUsedWeapon].Finisher
  1588. local finisherEnum = finisherData.Enum
  1589. if not finisherEnum and _EnumLibrary then
  1590. local ok2, result = pcall(_EnumLibrary.ToEnum, _EnumLibrary, finisherData.Name)
  1591. if ok2 and result then finisherEnum = result end
  1592. end
  1593. if finisherEnum then
  1594. args[1] = finisherEnum
  1595. return _originalReplicateFromServer(self, action, unpack(args))
  1596. end
  1597. end
  1598. end
  1599. return _originalReplicateFromServer(self, action, ...)
  1600. end
  1601. end
  1602. end
  1603.  
  1604. _saveSelectiveConfig()
  1605. pcall(function() _DataController.CurrentData:Replicate("CosmeticInventory") end)
  1606. pcall(function() _DataController.CurrentData:Replicate("WeaponInventory") end)
  1607.  
  1608. return unlockSet
  1609. end
  1610.  
  1611. RunService.Heartbeat:Connect(injectActiveWeapon)
  1612.  
  1613. PlayerData:GetDataChangedSignal("WeaponInventory"):Connect(function()
  1614. for weaponName, _ in pairs(cosmeticConfig) do
  1615. if weaponName ~= "_global" then
  1616. if findWeaponEntry(weaponName) then
  1617. injectWeaponData(weaponName)
  1618. end
  1619. end
  1620. end
  1621. end)
  1622.  
  1623. for weaponName, _ in pairs(cosmeticConfig) do
  1624. if weaponName ~= "_global" then
  1625. if findWeaponEntry(weaponName) then
  1626. injectWeaponData(weaponName)
  1627. end
  1628. end
  1629. end
  1630.  
  1631. local function getEquippedSkin(weapon)
  1632. if cosmeticConfig[weapon] and cosmeticConfig[weapon].Skin then
  1633. return cosmeticConfig[weapon].Skin.Name or "Default"
  1634. end
  1635. local weaponInventory = PlayerData:Get("WeaponInventory")
  1636. if weaponInventory then
  1637. for _, weaponEntry in pairs(weaponInventory) do
  1638. if weaponEntry.Name == weapon then
  1639. if weaponEntry.Skin and type(weaponEntry.Skin) == "table" and weaponEntry.Skin.Name then
  1640. return weaponEntry.Skin.Name
  1641. elseif weaponEntry.Skin and type(weaponEntry.Skin) == "string" and weaponEntry.Skin ~= "" then
  1642. return weaponEntry.Skin
  1643. end
  1644. break
  1645. end
  1646. end
  1647. end
  1648. return "Default"
  1649. end
  1650.  
  1651. local function getEquippedWrap(weapon)
  1652. if cosmeticConfig[weapon] and cosmeticConfig[weapon].Wrap then
  1653. return cosmeticConfig[weapon].Wrap.Name or "None"
  1654. end
  1655. local weaponInventory = PlayerData:Get("WeaponInventory")
  1656. if weaponInventory then
  1657. for _, weaponEntry in pairs(weaponInventory) do
  1658. if weaponEntry.Name == weapon then
  1659. if weaponEntry.Wrap and type(weaponEntry.Wrap) == "table" and weaponEntry.Wrap.Name then
  1660. return weaponEntry.Wrap.Name
  1661. elseif weaponEntry.Wrap and type(weaponEntry.Wrap) == "string" and weaponEntry.Wrap ~= "" then
  1662. return weaponEntry.Wrap
  1663. end
  1664. break
  1665. end
  1666. end
  1667. end
  1668. return "None"
  1669. end
  1670.  
  1671. local function getEquippedCharm(weapon)
  1672. if cosmeticConfig[weapon] and cosmeticConfig[weapon].Charm then
  1673. return cosmeticConfig[weapon].Charm.Name or "None"
  1674. end
  1675. local weaponInventory = PlayerData:Get("WeaponInventory")
  1676. if weaponInventory then
  1677. for _, weaponEntry in pairs(weaponInventory) do
  1678. if weaponEntry.Name == weapon then
  1679. if weaponEntry.Charm and type(weaponEntry.Charm) == "table" and weaponEntry.Charm.Name then
  1680. return weaponEntry.Charm.Name
  1681. elseif weaponEntry.Charm and type(weaponEntry.Charm) == "string" and weaponEntry.Charm ~= "" then
  1682. return weaponEntry.Charm
  1683. end
  1684. break
  1685. end
  1686. end
  1687. end
  1688. return "None"
  1689. end
  1690.  
  1691. local function getEquippedFinisher(weapon)
  1692. if cosmeticConfig[weapon] and cosmeticConfig[weapon].Finisher then
  1693. return cosmeticConfig[weapon].Finisher.Name or "None"
  1694. end
  1695. local weaponInventory = PlayerData:Get("WeaponInventory")
  1696. if weaponInventory then
  1697. for _, weaponEntry in pairs(weaponInventory) do
  1698. if weaponEntry.Name == weapon then
  1699. if weaponEntry.Finisher and type(weaponEntry.Finisher) == "table" and weaponEntry.Finisher.Name then
  1700. return weaponEntry.Finisher.Name
  1701. elseif weaponEntry.Finisher and type(weaponEntry.Finisher) == "string" and weaponEntry.Finisher ~= "" then
  1702. return weaponEntry.Finisher
  1703. end
  1704. break
  1705. end
  1706. end
  1707. end
  1708. return "None"
  1709. end
  1710.  
  1711. local sortedWeapons = {}
  1712. for weapon in pairs(SkinLists) do
  1713. table.insert(sortedWeapons, weapon)
  1714. end
  1715. table.sort(sortedWeapons)
  1716.  
  1717. local Library = loadstring(game:HttpGet(repo .. "Library.lua"))()
  1718. local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))()
  1719. local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))()
  1720.  
  1721. local Options = Library.Options
  1722. local Toggles = Library.Toggles
  1723.  
  1724. Library.ShowToggleFrameInKeybinds = true
  1725.  
  1726. local Window = Library:CreateWindow({
  1727. Title = "Yorijin",
  1728. Footer = "Cosmetic Changer",
  1729. Center = true,
  1730. AutoShow = not _G.GlobalData.SilentLoad,
  1731. ShowCustomCursor = true,
  1732. NotifySide = "Right",
  1733. })
  1734.  
  1735. local Tabs = {
  1736. Weapons = Window:AddTab("Weapons", "swords"),
  1737. Unlock = Window:AddTab("Unlock", "unlock"),
  1738. Spoofer = Window:AddTab("Spoofer", "eye"),
  1739. Settings = Window:AddTab("Settings", "settings"),
  1740. ["UI Settings"] = Window:AddTab("UI Settings", "palette"),
  1741. }
  1742.  
  1743. local WeaponSelectGroup = Tabs.Weapons:AddLeftGroupbox("Weapon Selection")
  1744.  
  1745. WeaponSelectGroup:AddDropdown("WeaponSelect", {
  1746. Text = "Select Weapon",
  1747. Values = sortedWeapons,
  1748. Default = nil,
  1749. Multi = false,
  1750. })
  1751.  
  1752. local PreviewGroup = Tabs.Weapons:AddLeftGroupbox("Preview")
  1753.  
  1754. local previewImage = nil
  1755. local previewLabel = nil
  1756. local previewSubLabel = nil
  1757.  
  1758. do
  1759. local container = PreviewGroup.Container
  1760.  
  1761. local previewHolder = Instance.new("Frame")
  1762. previewHolder.Name = "PreviewHolder"
  1763. previewHolder.Size = UDim2.new(1, 0, 0, 160)
  1764. previewHolder.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
  1765. previewHolder.BorderSizePixel = 0
  1766. previewHolder.LayoutOrder = 1
  1767. previewHolder.Parent = container
  1768. Instance.new("UICorner", previewHolder).CornerRadius = UDim.new(0, 8)
  1769.  
  1770. previewImage = Instance.new("ImageLabel")
  1771. previewImage.Name = "PreviewImage"
  1772. previewImage.Size = UDim2.new(1, -16, 1, -50)
  1773. previewImage.Position = UDim2.new(0, 8, 0, 8)
  1774. previewImage.BackgroundTransparency = 1
  1775. previewImage.Image = ""
  1776. previewImage.ScaleType = Enum.ScaleType.Fit
  1777. previewImage.Parent = previewHolder
  1778.  
  1779. previewLabel = Instance.new("TextLabel")
  1780. previewLabel.Name = "PreviewName"
  1781. previewLabel.Size = UDim2.new(1, -16, 0, 20)
  1782. previewLabel.Position = UDim2.new(0, 8, 1, -38)
  1783. previewLabel.BackgroundTransparency = 1
  1784. previewLabel.Text = "No selection"
  1785. previewLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
  1786. previewLabel.Font = Enum.Font.GothamBold
  1787. previewLabel.TextSize = 12
  1788. previewLabel.TextXAlignment = Enum.TextXAlignment.Left
  1789. previewLabel.TextTruncate = Enum.TextTruncate.AtEnd
  1790. previewLabel.Parent = previewHolder
  1791.  
  1792. previewSubLabel = Instance.new("TextLabel")
  1793. previewSubLabel.Name = "PreviewSub"
  1794. previewSubLabel.Size = UDim2.new(1, -16, 0, 16)
  1795. previewSubLabel.Position = UDim2.new(0, 8, 1, -18)
  1796. previewSubLabel.BackgroundTransparency = 1
  1797. previewSubLabel.Text = ""
  1798. previewSubLabel.TextColor3 = Color3.fromRGB(120, 120, 120)
  1799. previewSubLabel.Font = Enum.Font.GothamMedium
  1800. previewSubLabel.TextSize = 10
  1801. previewSubLabel.TextXAlignment = Enum.TextXAlignment.Left
  1802. previewSubLabel.TextTruncate = Enum.TextTruncate.AtEnd
  1803. previewSubLabel.Parent = previewHolder
  1804. end
  1805.  
  1806. local function updatePreview(itemName, itemType)
  1807. if not itemName or itemName == "None" or itemName == "Default" then
  1808. previewImage.Image = ""
  1809. previewLabel.Text = itemName or "No selection"
  1810. previewSubLabel.Text = itemType or ""
  1811. return
  1812. end
  1813. local img = getSkinImage(itemName)
  1814. previewImage.Image = img
  1815. previewLabel.Text = itemName
  1816. local rarity = ""
  1817. pcall(function()
  1818. local cosData = CosmeticLibrary.Cosmetics[itemName]
  1819. if cosData and cosData.Rarity then
  1820. rarity = " • " .. cosData.Rarity
  1821. end
  1822. end)
  1823. previewSubLabel.Text = (itemType or "") .. rarity
  1824. end
  1825.  
  1826. local SkinGroup = Tabs.Weapons:AddRightGroupbox("Skin")
  1827. local WrapGroup = Tabs.Weapons:AddRightGroupbox("Wrap")
  1828. local CharmGroup = Tabs.Weapons:AddRightGroupbox("Charm")
  1829. local FinisherGroup = Tabs.Weapons:AddRightGroupbox("Finisher")
  1830.  
  1831. SkinGroup:AddDropdown("SkinSelect", {
  1832. Text = "Select Skin",
  1833. Values = {"Default"},
  1834. Default = "Default",
  1835. Multi = false,
  1836. })
  1837.  
  1838. WrapGroup:AddDropdown("WrapSelect", {
  1839. Text = "Select Wrap",
  1840. Values = WrapList,
  1841. Default = "None",
  1842. Multi = false,
  1843. })
  1844.  
  1845. CharmGroup:AddDropdown("CharmSelect", {
  1846. Text = "Select Charm",
  1847. Values = CharmList,
  1848. Default = "None",
  1849. Multi = false,
  1850. })
  1851.  
  1852. FinisherGroup:AddDropdown("FinisherSelect", {
  1853. Text = "Select Finisher",
  1854. Values = FinisherList,
  1855. Default = "None",
  1856. Multi = false,
  1857. })
  1858.  
  1859. local selectedWeapon = nil
  1860. local ignoreCallbacks = false
  1861. local lastPreviewType = "Weapon"
  1862.  
  1863. local function refreshDropdownsForWeapon(weapon)
  1864. if not weapon then return end
  1865. selectedWeapon = weapon
  1866. ignoreCallbacks = true
  1867.  
  1868. local skins = SkinLists[weapon] or {"Default"}
  1869. Options.SkinSelect:SetValues(skins)
  1870. Options.SkinSelect:SetValue(getEquippedSkin(weapon))
  1871. Options.WrapSelect:SetValue(getEquippedWrap(weapon))
  1872. Options.CharmSelect:SetValue(getEquippedCharm(weapon))
  1873. Options.FinisherSelect:SetValue(getEquippedFinisher(weapon))
  1874.  
  1875. updatePreview(weapon, "Weapon")
  1876. lastPreviewType = "Weapon"
  1877.  
  1878. ignoreCallbacks = false
  1879. end
  1880.  
  1881. Options.WeaponSelect:OnChanged(function()
  1882. local val = Options.WeaponSelect.Value
  1883. if val and SkinLists[val] then
  1884. refreshDropdownsForWeapon(val)
  1885. end
  1886. end)
  1887.  
  1888. Options.SkinSelect:OnChanged(function()
  1889. if ignoreCallbacks then return end
  1890. if not selectedWeapon then return end
  1891. local val = Options.SkinSelect.Value
  1892. if val then
  1893. equipCosmetic(selectedWeapon, "Skin", val)
  1894. updatePreview(val, "Skin")
  1895. lastPreviewType = "Skin"
  1896. end
  1897. end)
  1898.  
  1899. Options.WrapSelect:OnChanged(function()
  1900. if ignoreCallbacks then return end
  1901. if not selectedWeapon then return end
  1902. local val = Options.WrapSelect.Value
  1903. if val then
  1904. equipCosmetic(selectedWeapon, "Wrap", val)
  1905. updatePreview(val, "Wrap")
  1906. lastPreviewType = "Wrap"
  1907. end
  1908. end)
  1909.  
  1910. Options.CharmSelect:OnChanged(function()
  1911. if ignoreCallbacks then return end
  1912. if not selectedWeapon then return end
  1913. local val = Options.CharmSelect.Value
  1914. if val then
  1915. equipCosmetic(selectedWeapon, "Charm", val)
  1916. updatePreview(val, "Charm")
  1917. lastPreviewType = "Charm"
  1918. end
  1919. end)
  1920.  
  1921. Options.FinisherSelect:OnChanged(function()
  1922. if ignoreCallbacks then return end
  1923. if not selectedWeapon then return end
  1924. local val = Options.FinisherSelect.Value
  1925. if val then
  1926. equipCosmetic(selectedWeapon, "Finisher", val)
  1927. updatePreview(val, "Finisher")
  1928. lastPreviewType = "Finisher"
  1929. end
  1930. end)
  1931.  
  1932. local WrapAllGroup = Tabs.Weapons:AddLeftGroupbox("Batch Actions")
  1933.  
  1934. WrapAllGroup:AddButton({
  1935. Text = "Apply Current Wrap to All Weapons",
  1936. Func = function()
  1937. if not selectedWeapon then
  1938. Library:Notify("Select a weapon first", 2)
  1939. return
  1940. end
  1941. local currentWrap = getEquippedWrap(selectedWeapon)
  1942. if currentWrap == "None" then
  1943. Library:Notify("Select a wrap on the current weapon first", 2)
  1944. return
  1945. end
  1946. applyWrapToAll(currentWrap)
  1947. Library:Notify("Wrap '" .. currentWrap .. "' applied to all weapons!", 3)
  1948. end,
  1949. })
  1950.  
  1951. WrapAllGroup:AddButton({
  1952. Text = "Remove All Wraps",
  1953. Func = function()
  1954. applyWrapToAll("None")
  1955. if selectedWeapon then
  1956. ignoreCallbacks = true
  1957. Options.WrapSelect:SetValue("None")
  1958. ignoreCallbacks = false
  1959. end
  1960. Library:Notify("All wraps removed!", 2)
  1961. end,
  1962. })
  1963.  
  1964. WrapAllGroup:AddButton({
  1965. Text = "Reset Current Weapon",
  1966. Func = function()
  1967. if not selectedWeapon then
  1968. Library:Notify("Select a weapon first", 2)
  1969. return
  1970. end
  1971. cosmeticConfig[selectedWeapon] = nil
  1972. if findWeaponEntry(selectedWeapon) then
  1973. local weaponInventory = PlayerData:Get("WeaponInventory")
  1974. if weaponInventory then
  1975. for _, weaponEntry in pairs(weaponInventory) do
  1976. if weaponEntry.Name == selectedWeapon then
  1977. weaponEntry.Skin = nil
  1978. weaponEntry.Wrap = nil
  1979. weaponEntry.Charm = nil
  1980. weaponEntry.Finisher = nil
  1981. break
  1982. end
  1983. end
  1984. end
  1985. end
  1986. injectActiveWeapon()
  1987. saveConfig()
  1988. pcall(function() PlayerData:Replicate("WeaponInventory") end)
  1989. refreshDropdownsForWeapon(selectedWeapon)
  1990. Library:Notify(selectedWeapon .. " reset to default!", 2)
  1991. end,
  1992. })
  1993.  
  1994. WrapAllGroup:AddButton({
  1995. Text = "Reset All Weapons",
  1996. Func = function()
  1997. local weaponInventory = PlayerData:Get("WeaponInventory")
  1998. for weaponName, _ in pairs(cosmeticConfig) do
  1999. if weaponName ~= "_global" and weaponInventory then
  2000. for _, weaponEntry in pairs(weaponInventory) do
  2001. if weaponEntry.Name == weaponName then
  2002. weaponEntry.Skin = nil
  2003. weaponEntry.Wrap = nil
  2004. weaponEntry.Charm = nil
  2005. weaponEntry.Finisher = nil
  2006. break
  2007. end
  2008. end
  2009. end
  2010. end
  2011. local globalBackup = cosmeticConfig._global
  2012. cosmeticConfig = {}
  2013. if globalBackup then
  2014. cosmeticConfig._global = globalBackup
  2015. end
  2016. injectActiveWeapon()
  2017. saveConfig()
  2018. pcall(function() PlayerData:Replicate("WeaponInventory") end)
  2019. if selectedWeapon then
  2020. refreshDropdownsForWeapon(selectedWeapon)
  2021. end
  2022. Library:Notify("All weapons reset to default!", 2)
  2023. end,
  2024. })
  2025.  
  2026. local UnlockAllGroup = Tabs.Unlock:AddLeftGroupbox("Unlock All")
  2027.  
  2028. UnlockAllGroup:AddButton({
  2029. Text = "Unlock All Cosmetics",
  2030. Func = function()
  2031. task.spawn(function()
  2032. unlockAllCosmetics()
  2033. Library:Notify("All cosmetics unlocked! You can now equip anything from the in-game menu.", 4)
  2034. end)
  2035. end,
  2036. })
  2037.  
  2038. UnlockAllGroup:AddLabel("Unlocks every skin, wrap, charm & finisher at once.")
  2039.  
  2040. local UnlockSkinsGroup = Tabs.Unlock:AddRightGroupbox("Unlock Specific Skins")
  2041.  
  2042. UnlockSkinsGroup:AddDropdown("SelectiveUnlockSkins", {
  2043. Text = "Select Skins",
  2044. Values = AllSkinNames,
  2045. Default = {},
  2046. Multi = true,
  2047. })
  2048.  
  2049. UnlockSkinsGroup:AddButton({
  2050. Text = "Unlock Selected Skins",
  2051. Func = function()
  2052. local selected = Options.SelectiveUnlockSkins.Value
  2053. local list = {}
  2054. for name, enabled in pairs(selected) do
  2055. if enabled then table.insert(list, name) end
  2056. end
  2057. if #list == 0 then
  2058. Library:Notify("No skins selected", 2)
  2059. return
  2060. end
  2061. unlockSelectiveCosmetics(list, nil, nil, nil)
  2062. Library:Notify("Unlocked " .. #list .. " skin(s)!", 3)
  2063. end,
  2064. })
  2065.  
  2066. local UnlockWrapsGroup = Tabs.Unlock:AddRightGroupbox("Unlock Specific Wraps")
  2067.  
  2068. local wrapUnlockValues = {}
  2069. for _, w in ipairs(WrapList) do
  2070. if w ~= "None" then table.insert(wrapUnlockValues, w) end
  2071. end
  2072.  
  2073. UnlockWrapsGroup:AddDropdown("SelectiveUnlockWraps", {
  2074. Text = "Select Wraps",
  2075. Values = wrapUnlockValues,
  2076. Default = {},
  2077. Multi = true,
  2078. })
  2079.  
  2080. UnlockWrapsGroup:AddButton({
  2081. Text = "Unlock Selected Wraps",
  2082. Func = function()
  2083. local selected = Options.SelectiveUnlockWraps.Value
  2084. local list = {}
  2085. for name, enabled in pairs(selected) do
  2086. if enabled then table.insert(list, name) end
  2087. end
  2088. if #list == 0 then
  2089. Library:Notify("No wraps selected", 2)
  2090. return
  2091. end
  2092. unlockSelectiveCosmetics(nil, list, nil, nil)
  2093. Library:Notify("Unlocked " .. #list .. " wrap(s)!", 3)
  2094. end,
  2095. })
  2096.  
  2097. local UnlockCharmsGroup = Tabs.Unlock:AddLeftGroupbox("Unlock Specific Charms")
  2098.  
  2099. local charmUnlockValues = {}
  2100. for _, c in ipairs(CharmList) do
  2101. if c ~= "None" then table.insert(charmUnlockValues, c) end
  2102. end
  2103.  
  2104. UnlockCharmsGroup:AddDropdown("SelectiveUnlockCharms", {
  2105. Text = "Select Charms",
  2106. Values = charmUnlockValues,
  2107. Default = {},
  2108. Multi = true,
  2109. })
  2110.  
  2111. UnlockCharmsGroup:AddButton({
  2112. Text = "Unlock Selected Charms",
  2113. Func = function()
  2114. local selected = Options.SelectiveUnlockCharms.Value
  2115. local list = {}
  2116. for name, enabled in pairs(selected) do
  2117. if enabled then table.insert(list, name) end
  2118. end
  2119. if #list == 0 then
  2120. Library:Notify("No charms selected", 2)
  2121. return
  2122. end
  2123. unlockSelectiveCosmetics(nil, nil, list, nil)
  2124. Library:Notify("Unlocked " .. #list .. " charm(s)!", 3)
  2125. end,
  2126. })
  2127.  
  2128. local UnlockFinishersGroup = Tabs.Unlock:AddLeftGroupbox("Unlock Specific Finishers")
  2129.  
  2130. local finisherUnlockValues = {}
  2131. for _, f in ipairs(FinisherList) do
  2132. if f ~= "None" and f ~= "Ragdoll" then table.insert(finisherUnlockValues, f) end
  2133. end
  2134.  
  2135. UnlockFinishersGroup:AddDropdown("SelectiveUnlockFinishers", {
  2136. Text = "Select Finishers",
  2137. Values = finisherUnlockValues,
  2138. Default = {},
  2139. Multi = true,
  2140. })
  2141.  
  2142. UnlockFinishersGroup:AddButton({
  2143. Text = "Unlock Selected Finishers",
  2144. Func = function()
  2145. local selected = Options.SelectiveUnlockFinishers.Value
  2146. local list = {}
  2147. for name, enabled in pairs(selected) do
  2148. if enabled then table.insert(list, name) end
  2149. end
  2150. if #list == 0 then
  2151. Library:Notify("No finishers selected", 2)
  2152. return
  2153. end
  2154. unlockSelectiveCosmetics(nil, nil, nil, list)
  2155. Library:Notify("Unlocked " .. #list .. " finisher(s)!", 3)
  2156. end,
  2157. })
  2158.  
  2159. do
  2160. local cloneref = cloneref or function(o) return o end
  2161. local clonefunction = clonefunction or clonefunc or function(f) return f end
  2162. local hookfunction = hookfunction or replaceclosure or detour_function
  2163. local hookmetamethod = hookmetamethod
  2164. local newcclosure = newcclosure
  2165. local checkcaller = checkcaller
  2166. local getconnections = getconnections
  2167. local getnamecallmethod = getnamecallmethod
  2168. local iscclosure = iscclosure
  2169. local getinfo = getinfo or debug.getinfo
  2170.  
  2171. local Ps = cloneref(game:GetService("Players"))
  2172. local Sg = cloneref(game:GetService("StarterGui"))
  2173. local Cg = cloneref(game:GetService("CoreGui"))
  2174. local Tcs = cloneref(game:GetService("TextChatService"))
  2175.  
  2176. local LP = Ps.LocalPlayer
  2177.  
  2178. local RealDisplayName = LP.DisplayName
  2179. local RealName = LP.Name
  2180. local RealUserId = LP.UserId
  2181.  
  2182. local SPOOFED_DISPLAY_NAME = RealDisplayName
  2183. local SPOOFED_USERNAME = RealName
  2184. local SPOOFED_USERID = nil
  2185.  
  2186. local spooferActive = false
  2187.  
  2188. local oldKick
  2189. oldKick = hookmetamethod(game, "__namecall", newcclosure(function(self, ...)
  2190. local method = getnamecallmethod()
  2191. if method == "Kick" and self == LP then
  2192. return
  2193. end
  2194. if not checkcaller() and spooferActive then
  2195. if self == LP and method == "GetFullName" then
  2196. return "Players." .. SPOOFED_USERNAME
  2197. end
  2198. end
  2199. return oldKick(self, ...)
  2200. end))
  2201.  
  2202. local oldIndex
  2203. oldIndex = hookmetamethod(game, "__index", newcclosure(function(self, key)
  2204. if not checkcaller() and spooferActive then
  2205. if self == LP then
  2206. if key == "DisplayName" then return SPOOFED_DISPLAY_NAME end
  2207. if key == "Name" then return SPOOFED_USERNAME end
  2208. if key == "UserId" and SPOOFED_USERID then return SPOOFED_USERID end
  2209. end
  2210. if typeof(self) == "Instance" and self:IsA("Humanoid") then
  2211. local ch = LP.Character
  2212. if ch and self:IsDescendantOf(ch) and key == "DisplayName" then
  2213. return SPOOFED_DISPLAY_NAME
  2214. end
  2215. end
  2216. end
  2217. return oldIndex(self, key)
  2218. end))
  2219.  
  2220. local oldNewindex
  2221. oldNewindex = hookmetamethod(game, "__newindex", newcclosure(function(self, key, value)
  2222. if not checkcaller() and spooferActive then
  2223. if typeof(self) == "Instance" and self:IsA("Humanoid") then
  2224. local ch = LP.Character
  2225. if ch and self:IsDescendantOf(ch) and key == "DisplayName" and value ~= SPOOFED_DISPLAY_NAME then
  2226. return oldNewindex(self, key, SPOOFED_DISPLAY_NAME)
  2227. end
  2228. end
  2229. end
  2230. return oldNewindex(self, key, value)
  2231. end))
  2232.  
  2233. pcall(function()
  2234. for _, conn in getconnections(LP.OnTeleport) do
  2235. if conn.Function then
  2236. pcall(function() conn:Disable() end)
  2237. end
  2238. end
  2239. end)
  2240.  
  2241. pcall(function()
  2242. for _, v in Ps:GetPlayers() do
  2243. if v == LP then
  2244. for _, conn in getconnections(v.Idled) do
  2245. pcall(function() conn:Disable() end)
  2246. end
  2247. end
  2248. end
  2249. end)
  2250.  
  2251. local realGetName = clonefunction(Ps.GetNameFromUserIdAsync)
  2252. hookfunction(Ps.GetNameFromUserIdAsync, newcclosure(function(self, userId)
  2253. if not checkcaller() and spooferActive and userId == RealUserId then return SPOOFED_USERNAME end
  2254. return realGetName(self, userId)
  2255. end))
  2256.  
  2257. local realGetId = clonefunction(Ps.GetUserIdFromNameAsync)
  2258. hookfunction(Ps.GetUserIdFromNameAsync, newcclosure(function(self, name)
  2259. if not checkcaller() and spooferActive and name == SPOOFED_USERNAME then return SPOOFED_USERID or RealUserId end
  2260. return realGetId(self, name)
  2261. end))
  2262.  
  2263. pcall(function()
  2264. local realGetInfo = clonefunction(Ps.GetPlayerInfoAsync)
  2265. hookfunction(Ps.GetPlayerInfoAsync, newcclosure(function(self, userId)
  2266. local info = realGetInfo(self, userId)
  2267. if not checkcaller() and spooferActive and userId == RealUserId then
  2268. info.Username = SPOOFED_USERNAME
  2269. info.DisplayName = SPOOFED_DISPLAY_NAME
  2270. end
  2271. return info
  2272. end))
  2273. end)
  2274.  
  2275. local function forceHumanoid()
  2276. local ch = LP.Character
  2277. if not ch then return end
  2278. local hum = ch:FindFirstChildOfClass("Humanoid")
  2279. if hum then
  2280. oldNewindex(hum, "DisplayName", SPOOFED_DISPLAY_NAME)
  2281. end
  2282. end
  2283.  
  2284. local bound = setmetatable({}, { __mode = "k" })
  2285.  
  2286. local function shouldReplace(t)
  2287. if t == RealDisplayName then return SPOOFED_DISPLAY_NAME end
  2288. if t == RealName then return SPOOFED_USERNAME end
  2289. if t == "@" .. RealName then return "@" .. SPOOFED_USERNAME end
  2290. return nil
  2291. end
  2292.  
  2293. local function isLibraryGui(obj)
  2294. local p = obj
  2295. while p do
  2296. if p == Library.ScreenGui then return true end
  2297. if p:IsA("ScreenGui") and p.Name == "Obsidian" then return true end
  2298. p = p.Parent
  2299. end
  2300. return false
  2301. end
  2302.  
  2303. local function bindText(obj)
  2304. if bound[obj] then return end
  2305. if isLibraryGui(obj) then return end
  2306. bound[obj] = true
  2307. pcall(function()
  2308. local r = shouldReplace(obj.Text)
  2309. if r then obj.Text = r end
  2310. end)
  2311. pcall(function()
  2312. obj:GetPropertyChangedSignal("Text"):Connect(function()
  2313. if not spooferActive then return end
  2314. local r = shouldReplace(obj.Text)
  2315. if r then obj.Text = r end
  2316. end)
  2317. end)
  2318. end
  2319.  
  2320. local function scanRoot(root)
  2321. for _, obj in root:GetDescendants() do
  2322. pcall(function()
  2323. if (obj:IsA("TextLabel") or obj:IsA("TextButton") or obj:IsA("TextBox")) and not isLibraryGui(obj) then
  2324. bindText(obj)
  2325. end
  2326. end)
  2327. end
  2328. end
  2329.  
  2330. local function hookRoot(root)
  2331. scanRoot(root)
  2332. root.DescendantAdded:Connect(function(obj)
  2333. task.defer(function()
  2334. if not spooferActive then return end
  2335. pcall(function()
  2336. if (obj:IsA("TextLabel") or obj:IsA("TextButton") or obj:IsA("TextBox")) and not isLibraryGui(obj) then
  2337. bindText(obj)
  2338. end
  2339. end)
  2340. end)
  2341. end)
  2342. end
  2343.  
  2344. local function fullApply()
  2345. if not spooferActive then return end
  2346. forceHumanoid()
  2347. pcall(function() hookRoot(Cg) end)
  2348. pcall(function()
  2349. local pg = LP:FindFirstChild("PlayerGui")
  2350. if pg then hookRoot(pg) end
  2351. end)
  2352. end
  2353.  
  2354. LP.CharacterAdded:Connect(function(character)
  2355. if not spooferActive then return end
  2356. local hum = character:WaitForChild("Humanoid", 10)
  2357. if hum then
  2358. oldNewindex(hum, "DisplayName", SPOOFED_DISPLAY_NAME)
  2359. hum:GetPropertyChangedSignal("DisplayName"):Connect(function()
  2360. if spooferActive and hum.DisplayName ~= SPOOFED_DISPLAY_NAME then
  2361. oldNewindex(hum, "DisplayName", SPOOFED_DISPLAY_NAME)
  2362. end
  2363. end)
  2364. end
  2365. task.defer(fullApply)
  2366. end)
  2367.  
  2368. pcall(function()
  2369. local ch = LP.Character
  2370. if ch then
  2371. local hum = ch:FindFirstChildOfClass("Humanoid")
  2372. if hum then
  2373. hum:GetPropertyChangedSignal("DisplayName"):Connect(function()
  2374. if spooferActive and hum.DisplayName ~= SPOOFED_DISPLAY_NAME then
  2375. oldNewindex(hum, "DisplayName", SPOOFED_DISPLAY_NAME)
  2376. end
  2377. end)
  2378. end
  2379. end
  2380. end)
  2381.  
  2382. local spoofConfig = {}
  2383. pcall(function()
  2384. if readfile and isfile and isfile(SPOOFER_FILE) then
  2385. spoofConfig = HttpService:JSONDecode(readfile(SPOOFER_FILE))
  2386. end
  2387. end)
  2388.  
  2389. local function saveSpoofConfig()
  2390. pcall(function()
  2391. if writefile then
  2392. writefile(SPOOFER_FILE, HttpService:JSONEncode(spoofConfig))
  2393. end
  2394. end)
  2395. end
  2396.  
  2397. local NameSpooferGroup = Tabs.Spoofer:AddLeftGroupbox("Name Spoofer")
  2398.  
  2399. NameSpooferGroup:AddInput("SpoofDisplayName", {
  2400. Default = RealDisplayName,
  2401. Numeric = false,
  2402. Finished = false,
  2403. Text = "Display Name",
  2404. Placeholder = "Enter display name...",
  2405. })
  2406.  
  2407. NameSpooferGroup:AddInput("SpoofUsername", {
  2408. Default = RealName,
  2409. Numeric = false,
  2410. Finished = false,
  2411. Text = "Username",
  2412. Placeholder = "Enter username...",
  2413. })
  2414.  
  2415. NameSpooferGroup:AddButton({
  2416. Text = "Apply Spoof",
  2417. Func = function()
  2418. local dName = Options.SpoofDisplayName.Value
  2419. local uName = Options.SpoofUsername.Value
  2420.  
  2421. if dName == "" then dName = RealDisplayName end
  2422. if uName == "" then uName = RealName end
  2423.  
  2424. SPOOFED_DISPLAY_NAME = dName
  2425. SPOOFED_USERNAME = uName
  2426. spooferActive = true
  2427.  
  2428. spoofConfig.DisplayName = dName
  2429. spoofConfig.Username = uName
  2430. spoofConfig.Active = true
  2431. saveSpoofConfig()
  2432.  
  2433. bound = setmetatable({}, { __mode = "k" })
  2434. fullApply()
  2435.  
  2436. Library:Notify("Name spoofed to: " .. dName .. " (@" .. uName .. ")", 3)
  2437. end,
  2438. })
  2439.  
  2440. NameSpooferGroup:AddButton({
  2441. Text = "Reset to Real Name",
  2442. Func = function()
  2443. SPOOFED_DISPLAY_NAME = RealDisplayName
  2444. SPOOFED_USERNAME = RealName
  2445. spooferActive = false
  2446.  
  2447. Options.SpoofDisplayName:SetValue(RealDisplayName)
  2448. Options.SpoofUsername:SetValue(RealName)
  2449.  
  2450. spoofConfig.DisplayName = RealDisplayName
  2451. spoofConfig.Username = RealName
  2452. spoofConfig.Active = false
  2453. saveSpoofConfig()
  2454.  
  2455. forceHumanoid()
  2456. bound = setmetatable({}, { __mode = "k" })
  2457.  
  2458. Library:Notify("Name restored to: " .. RealDisplayName .. " (@" .. RealName .. ")", 3)
  2459. end,
  2460. })
  2461.  
  2462. local DeviceSpooferGroup = Tabs.Spoofer:AddLeftGroupbox("Device Spoofer")
  2463.  
  2464. local SetControlsRemote = nil
  2465. pcall(function()
  2466. SetControlsRemote = ReplicatedStorage:WaitForChild("Remotes", 5)
  2467. :WaitForChild("Replication", 5)
  2468. :WaitForChild("Fighter", 5)
  2469. :WaitForChild("SetControls", 5)
  2470. end)
  2471.  
  2472. local deviceOptions = {"MouseKeyboard", "Gamepad", "Touch", "VR"}
  2473. local currentSpoofedDevice = "MouseKeyboard"
  2474. local deviceSpoofEnabled = false
  2475.  
  2476. local function detectCurrentDevice()
  2477. if UserInputService.VREnabled then
  2478. return "VR"
  2479. elseif UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled then
  2480. return "Touch"
  2481. elseif UserInputService.GamepadEnabled and not UserInputService.KeyboardEnabled then
  2482. return "Gamepad"
  2483. else
  2484. return "MouseKeyboard"
  2485. end
  2486. end
  2487.  
  2488. local realDevice = detectCurrentDevice()
  2489. currentSpoofedDevice = spoofConfig.SpoofedDevice or realDevice
  2490.  
  2491. DeviceSpooferGroup:AddDropdown("DeviceSpoofSelect", {
  2492. Text = "Spoof Device",
  2493. Values = deviceOptions,
  2494. Default = currentSpoofedDevice,
  2495. Multi = false,
  2496. })
  2497.  
  2498. local deviceStatusLabel = DeviceSpooferGroup:AddLabel("Device: " .. realDevice)
  2499.  
  2500. local function applyDeviceSpoof()
  2501. if not deviceSpoofEnabled then return end
  2502. if not SetControlsRemote then return end
  2503. pcall(function()
  2504. SetControlsRemote:FireServer(currentSpoofedDevice)
  2505. end)
  2506. deviceStatusLabel:SetText("Device: " .. currentSpoofedDevice .. " (Spoofed)")
  2507. end
  2508. local function removeDeviceSpoof()
  2509. if not SetControlsRemote then return end
  2510. pcall(function()
  2511. SetControlsRemote:FireServer(realDevice)
  2512. end)
  2513. deviceStatusLabel:SetText("Device: " .. realDevice)
  2514. end
  2515.  
  2516. DeviceSpooferGroup:AddToggle("DeviceSpoofToggle", {
  2517. Text = "Enable Device Spoof",
  2518. Default = spoofConfig.DeviceSpoofEnabled or false,
  2519. })
  2520.  
  2521. Toggles.DeviceSpoofToggle:OnChanged(function()
  2522. deviceSpoofEnabled = Toggles.DeviceSpoofToggle.Value
  2523. spoofConfig.DeviceSpoofEnabled = deviceSpoofEnabled
  2524. saveSpoofConfig()
  2525.  
  2526. if deviceSpoofEnabled then
  2527. applyDeviceSpoof()
  2528. Library:Notify("Device spoofed to: " .. currentSpoofedDevice, 2)
  2529. else
  2530. removeDeviceSpoof()
  2531. Library:Notify("Device spoof disabled", 2)
  2532. end
  2533. end)
  2534.  
  2535. Options.DeviceSpoofSelect:OnChanged(function()
  2536. local selected = Options.DeviceSpoofSelect.Value
  2537. if not selected then return end
  2538. currentSpoofedDevice = selected
  2539. spoofConfig.SpoofedDevice = selected
  2540. saveSpoofConfig()
  2541.  
  2542. if deviceSpoofEnabled then
  2543. applyDeviceSpoof()
  2544. Library:Notify("Device spoofed to: " .. selected, 2)
  2545. end
  2546. end)
  2547.  
  2548. if spoofConfig.DeviceSpoofEnabled and SetControlsRemote then
  2549. deviceSpoofEnabled = true
  2550. task.defer(applyDeviceSpoof)
  2551. end
  2552.  
  2553. local SpoofInfoGroup = Tabs.Spoofer:AddRightGroupbox("Info")
  2554.  
  2555. SpoofInfoGroup:AddLabel("More Spoofing Options coming Soon...")
  2556.  
  2557. local StatusGroup = Tabs.Spoofer:AddRightGroupbox("Status")
  2558. local spoofStatusLabel = StatusGroup:AddLabel("Spoofer: Inactive")
  2559.  
  2560. local function updateStatusLabel()
  2561. local deviceStr = deviceSpoofEnabled and (currentSpoofedDevice .. " (Spoofed)") or realDevice
  2562. if spooferActive then
  2563. spoofStatusLabel:SetText("Spoofer: Active\nDisplay: " .. SPOOFED_DISPLAY_NAME .. "\nUsername: " .. SPOOFED_USERNAME .. "\nDevice: " .. deviceStr)
  2564. else
  2565. spoofStatusLabel:SetText("Spoofer: Inactive\nDevice: " .. deviceStr)
  2566. end
  2567. end
  2568.  
  2569. if spoofConfig.Active and spoofConfig.DisplayName and spoofConfig.Username then
  2570. SPOOFED_DISPLAY_NAME = spoofConfig.DisplayName
  2571. SPOOFED_USERNAME = spoofConfig.Username
  2572. spooferActive = true
  2573.  
  2574. pcall(function()
  2575. Options.SpoofDisplayName:SetValue(spoofConfig.DisplayName)
  2576. Options.SpoofUsername:SetValue(spoofConfig.Username)
  2577. end)
  2578.  
  2579. task.defer(function()
  2580. fullApply()
  2581. updateStatusLabel()
  2582. end)
  2583. end
  2584.  
  2585. task.spawn(function()
  2586. while task.wait(1) do
  2587. pcall(updateStatusLabel)
  2588. end
  2589. end)
  2590. end
  2591.  
  2592. local GeneralGroup = Tabs.Settings:AddLeftGroupbox("General")
  2593.  
  2594. GeneralGroup:AddToggle("AutoLoadToggle", {
  2595. Text = "Auto Load on Join",
  2596. Default = _G.GlobalData.AutoLoad,
  2597. })
  2598.  
  2599. GeneralGroup:AddToggle("SilentLoadToggle", {
  2600. Text = "Silent Load",
  2601. Default = _G.GlobalData.SilentLoad,
  2602. })
  2603.  
  2604. Toggles.AutoLoadToggle:OnChanged(function()
  2605. _G.GlobalData.AutoLoad = Toggles.AutoLoadToggle.Value
  2606. setupAutoLoad(_G.GlobalData.AutoLoad)
  2607. saveGlobalToConfig()
  2608. end)
  2609.  
  2610. Toggles.SilentLoadToggle:OnChanged(function()
  2611. _G.GlobalData.SilentLoad = Toggles.SilentLoadToggle.Value
  2612. saveGlobalToConfig()
  2613. end)
  2614.  
  2615. local LinksGroup = Tabs.Settings:AddLeftGroupbox("Links")
  2616.  
  2617. LinksGroup:AddButton({
  2618. Text = "Copy Discord Invite",
  2619. Func = function()
  2620. pcall(function() setclipboard(DISCORD_URL) end)
  2621. Library:Notify("Discord link copied to clipboard!", 2)
  2622. pcall(function()
  2623. if request or http_request or (syn and syn.request) then
  2624. (request or http_request or syn.request)({
  2625. Method = "POST",
  2626. Headers = {["Content-Type"] = "application/json", Origin = "https://discord.com";},
  2627. Body = HttpService:JSONEncode({cmd = "INVITE_BROWSER", args = {code = "zv8Tdmds"}, nonce = HttpService:GenerateGUID(false)})
  2628. })
  2629. end
  2630. end)
  2631. end,
  2632. })
  2633.  
  2634. LinksGroup:AddButton({
  2635. Text = "Copy Key Link",
  2636. Func = function()
  2637. pcall(function() setclipboard(KEY_URL) end)
  2638. Library:Notify("Key link copied to clipboard!", 2)
  2639. end,
  2640. })
  2641.  
  2642. local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("Menu")
  2643.  
  2644. MenuGroup:AddButton({
  2645. Text = "Unload Script",
  2646. Func = function()
  2647. Library:Unload()
  2648. end,
  2649. })
  2650.  
  2651. MenuGroup:AddLabel("Menu bind")
  2652. MenuGroup:AddKeybind("MenuKeybind", {
  2653. Default = "RightShift",
  2654. NoUI = true,
  2655. Text = "Menu Toggle",
  2656. })
  2657.  
  2658. Library.ToggleKeybind = Options.MenuKeybind
  2659.  
  2660. ThemeManager:SetLibrary(Library)
  2661. SaveManager:SetLibrary(Library)
  2662.  
  2663. SaveManager:IgnoreThemeSettings()
  2664. ThemeManager:SetFolder("Yorijin")
  2665. SaveManager:SetFolder("Yorijin/configs")
  2666.  
  2667. SaveManager:BuildConfigSection(Tabs["UI Settings"])
  2668. ThemeManager:ApplyToTab(Tabs["UI Settings"])
  2669.  
  2670. Library:Notify("Yorijin loaded! (" .. #sortedWeapons .. " weapons)", 3)