
Key RequiredUniversal

--[[
WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk!
]]
--[[
███████╗ ██████╗ ██████╗ ███████╗ █████╗ ██╗ ██╗███████╗███╗ ██╗
██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔══██╗██║ ██╔╝██╔════╝████╗ ██║
█████╗ ██║ ██║██████╔╝███████╗███████║█████╔╝ █████╗ ██╔██╗ ██║
██╔══╝ ██║ ██║██╔══██╗╚════██║██╔══██║██╔═██╗ ██╔══╝ ██║╚██╗██║
██║ ╚██████╔╝██║ ██║███████║██║ ██║██║ ██╗███████╗██║ ╚████║
╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝
GUEST 1337 FE ANIMATION SYSTEM — v5.1 (FIXED)
────────────────────────────────────────────────────────────
Created by : sonicisnumber12
Uploaded by : wasitpierce
Platform : Roblox / ScriptBlox
Fixes by : Claude AI
────────────────────────────────────────────────────────────
FIXES IN THIS VERSION:
• stale animation track references cleared on respawn
• double RenderStepped loop on respawn fixed
• headTrackRef / faceTrackRef reset on respawn
• ca (current action) reset on respawn so locomotion unblocks
• pcall guards on track AnimationId reads (prevents errors on destroyed tracks)
• animateConns grows unbounded — now cleaned per-character
• mobile UI: larger touch targets, bottom action row, responsive sizing
]]
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Debris = game:GetService("Debris")
local UserInputService = game:GetService("UserInputService")
local ContentProvider = game:GetService("ContentProvider")
local TweenService = game:GetService("TweenService")
local Lighting = game:GetService("Lighting")
local SoundService = game:GetService("SoundService")
local lp = Players.LocalPlayer
local playerGui = lp:WaitForChild("PlayerGui")
local camera = workspace.CurrentCamera
if getgenv().forsakenthingyguys then return end
getgenv().forsakenthingyguys = true
local ins = Instance.new
local c3 = Color3.fromRGB
local ud2 = UDim2.new
local v2 = Vector2.new
local v3 = Vector3.new
-- ─────────────────────────────────────────────────────────
-- MOBILE DETECTION
-- ─────────────────────────────────────────────────────────
local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
local function mobScale(desktop, mobile)
return isMobile and mobile or desktop
end
-- ─────────────────────────────────────────────────────────
-- TWEEN HELPER
-- ─────────────────────────────────────────────────────────
local function tw(obj, t, props)
TweenService:Create(obj,
TweenInfo.new(t, Enum.EasingStyle.Quint, Enum.EasingDirection.Out),
props
):Play()
end
-- ─────────────────────────────────────────────────────────
-- SOUND HELPER
-- ─────────────────────────────────────────────────────────
local function playSound(id, vol, pitch)
local s = ins("Sound")
s.SoundId = "rbxassetid://" .. tostring(id)
s.Volume = vol or 0.4
s.PlaybackSpeed = pitch or 1
s.Parent = SoundService
s:Play()
Debris:AddItem(s, 3)
end
local SFX_CLICK = 6042053626
local SFX_OPEN = 4590662766
local SFX_CLOSE = 4590662766
-- ─────────────────────────────────────────────────────────
-- ANIMATION IDs
-- ─────────────────────────────────────────────────────────
local P_ID = "rbxassetid://80057445812313"
local B_ID = "rbxassetid://105310177683245"
local I_ID = "rbxassetid://98946450554814"
local W_ID = "rbxassetid://119545916455209"
local R_ID = "rbxassetid://108891884872744"
local SL_ID = "rbxassetid://127436401745505"
local E1_ID = "rbxassetid://76389296606994"
local C_ID = "rbxassetid://126452924444711"
local H_ID = "rbxassetid://74100161379681"
local BU_ID = "rbxassetid://88570432473654"
local MM_ID = "rbxassetid://79481824762169"
local S3_ID = "rbxassetid://111993447655346"
local CD_ID = "rbxassetid://102908521825429"
local UN_ID = "rbxassetid://87033513223989"
local DP_ID = "rbxassetid://100370504940450"
local WW_ID = "rbxassetid://112767927202660"
local X_ID = "rbxassetid://126801473720398"
local LW_ID = "rbxassetid://108330858686045"
local S_ID = "rbxassetid://112109141479594"
local RI_ID = "rbxassetid://112757618232626"
local FACE_IDLE_ID = "rbxassetid://1"
local FACE_EMOTE_ID= "rbxassetid://1"
-- ─────────────────────────────────────────────────────────
-- ANIMATION LIBRARY
-- ─────────────────────────────────────────────────────────
local ANIM_LIBRARY = {
idle = {
{ name = "Default", id = "rbxassetid://98946450554814" },
{ name = "Thinker", id = "rbxassetid://134947274496123" },
{ name = "Salute", id = "rbxassetid://94066777876508" },
{ name = "Tweaker", id = "rbxassetid://78718423818649" },
{ name = "Shy", id = "rbxassetid://134305047738024" },
{ name = "C00LKIDD", id = "rbxassetid://92946600983329" },
{ name = "Old R15", id = "rbxassetid://119325894749018" },
{ name = "John Doe", id = "rbxassetid://72526127498800" },
{ name = "Noli", id = "rbxassetid://113047257611459" },
{ name = "Injured", id = "rbxassetid://90685886162807" },
{ name = "Two Time Crouching", id = "rbxassetid://120943636070660" },
{ name = "Nosferatu", id = "rbxassetid://129243618391641" },
{ name = "Mafioso", id = "rbxassetid://120527173641109" },
{ name = "Slasher/Jason", id = "rbxassetid://95612637518693" },
{ name = "1x1x1x1", id = "rbxassetid://74574367987310" },
{ name = "Retro", id = "rbxassetid://118461919095618" },
{ name = "Freddy", id = "rbxassetid://105174189783870" },
{ name = "Rewrite", id = "rbxassetid://135462734638074" },
{ name = "Rewrite 2", id = "rbxassetid://93819532575638" },
{ name = "Float", id = "rbxassetid://121210361161914" },
{ name = "Impatient", id = "rbxassetid://130912259300899" },
{ name = "2011x", id = "rbxassetid://80041404401815" },
{ name = "Tall", id = "rbxassetid://91348372558295" },
},
walk = {
{ name = "Default", id = "rbxassetid://119545916455209" },
{ name = "Gangnam", id = "rbxassetid://112342491908786" },
{ name = "Livesey", id = "rbxassetid://126769395026240" },
{ name = "Zombie", id = "rbxassetid://140703855480494" },
{ name = "C00LKIDD", id = "rbxassetid://93206157668596" },
{ name = "Retro", id = "rbxassetid://107806791584829" },
{ name = "1x1x1x1", id = "rbxassetid://138379855143069" },
{ name = "Old R15", id = "rbxassetid://94436206974808" },
{ name = "Nonchalant", id = "rbxassetid://95970874156673" },
{ name = "Chud", id = "rbxassetid://85887415033585" },
{ name = "Float", id = "rbxassetid://84988218571738" },
{ name = "Tall", id = "rbxassetid://100019669366103" },
{ name = "John Doe", id = "rbxassetid://138795419712161" },
{ name = "Injured", id = "rbxassetid://101924559363550" },
{ name = "Noli", id = "rbxassetid://90175656540190" },
{ name = "Styleized", id = "rbxassetid://117819103741451" },
},
run = {
{ name = "Default", id = "rbxassetid://108891884872744" },
{ name = "Scared", id = "rbxassetid://99823446208760" },
{ name = "Bird", id = "rbxassetid://115296225052210" },
{ name = "Old R15", id = "rbxassetid://94436206974808" },
{ name = "Void Rush", id = "rbxassetid://119380285634530" },
{ name = "Animal", id = "rbxassetid://102269417125238" },
{ name = "Retro", id = "rbxassetid://107806791584829" },
{ name = "1x1x1x1", id = "rbxassetid://138379855143069" },
{ name = "C00LKiDD", id = "rbxassetid://116229217913998" },
{ name = "Sonic", id = "rbxassetid://104074120169874" },
{ name = "Chud", id = "rbxassetid://85887415033585" },
{ name = "West", id = "rbxassetid://121350640829746" },
{ name = "Classic Sonic", id = "rbxassetid://137135247245806" },
{ name = "Freddy", id = "rbxassetid://70636286183373" },
{ name = "Rewrite", id = "rbxassetid://134540907860256" },
{ name = "Float", id = "rbxassetid://84988218571738" },
{ name = "Chase", id = "rbxassetid://82260970223217" },
{ name = "Tall", id = "rbxassetid://134010853417610" },
{ name = "John Doe", id = "rbxassetid://94467125495426" },
{ name = "Injured", id = "rbxassetid://101924559363550" },
{ name = "Noli", id = "rbxassetid://90175656540190" },
},
punch = {
{ name = "Default", combo = { "rbxassetid://80057445812313" } },
{ name = "Poorly Made", combo = { "rbxassetid://129358357219637" } },
{ name = "Quad Punch", combo = { "rbxassetid://139643944264511" } },
{ name = "Shedlesky Slash [BUGGED]",combo = { "rbxassetid://127792295696012" } },
{ name = "Slash", combo = { "rbxassetid://95046715221370" } },
{ name = "Spindash", combo = { "rbxassetid://119889021060156" } },
{ name = "Jumpscare", combo = { "rbxassetid://82436820061312" } },
{ name = "2011x Kill", combo = { "rbxassetid://119673703676481" } },
},
block = {
{ name = "Default", id = "rbxassetid://105310177683245" },
{ name = "Sans", id = "rbxassetid://76366756431367" },
{ name = "Corrupt Nature", id = "rbxassetid://70981913426043" },
{ name = "Laugh", id = "rbxassetid://77737003924429" },
},
}
local activeAnims = { idle=1, walk=1, run=1, punch=1, block=1 }
local LIVE = { idle=I_ID, walk=W_ID, run=R_ID, punch=P_ID, block=B_ID }
local preloadIds = {
P_ID, B_ID, I_ID, W_ID, R_ID,
E1_ID, C_ID, H_ID, BU_ID, MM_ID,
S3_ID, CD_ID, UN_ID, DP_ID,
FACE_IDLE_ID, FACE_EMOTE_ID
}
-- ─────────────────────────────────────────────────────────
-- ANIMATION STATE (all declared here so resets are easy)
-- ─────────────────────────────────────────────────────────
local active = true
local isSL = false
local ca = nil -- current action track
local st = {} -- locomotion tracks {idle,walk,run}
local ir = false -- is running
local isConga = false
local headTrackRef = nil
local faceTrackRef = nil
local renderConn = nil -- single RenderStepped connection (replaced on respawn)
local animateConns = {}
local charAddedConn = nil
local punchComboIndex = 1
local lastPunchTime = 0
local COMBO_WINDOW = 1.2
-- ─────────────────────────────────────────────────────────
-- LOADING SCREEN
-- ─────────────────────────────────────────────────────────
local loadGui = ins("ScreenGui")
loadGui.Name = "ForsakenLoading"
loadGui.DisplayOrder = 20
loadGui.ResetOnSpawn = false
loadGui.IgnoreGuiInset = true
loadGui.Parent = playerGui
local loadBg = ins("Frame")
loadBg.Size = ud2(1,0,1,0)
loadBg.BackgroundColor3= c3(6,6,10)
loadBg.BorderSizePixel = 0
loadBg.Parent = loadGui
local loadCard = ins("Frame")
loadCard.Size = ud2(0,320,0,110)
loadCard.Position = ud2(0.5,0,0.5,0)
loadCard.AnchorPoint = v2(0.5,0.5)
loadCard.BackgroundColor3= c3(14,12,22)
loadCard.BorderSizePixel = 0
loadCard.Parent = loadGui
local lcc = ins("UICorner"); lcc.CornerRadius = UDim.new(0,14); lcc.Parent = loadCard
local lcs = ins("UIStroke"); lcs.Color = c3(80,55,130); lcs.Thickness = 1.2; lcs.Transparency = 0.35; lcs.Parent = loadCard
local loadTitle = ins("TextLabel")
loadTitle.Size = ud2(1,0,0,28); loadTitle.Position = ud2(0,0,0,16)
loadTitle.BackgroundTransparency = 1; loadTitle.Text = "FORSAKEN"
loadTitle.TextColor3 = c3(255,255,255); loadTitle.Font = Enum.Font.GothamBlack
loadTitle.TextSize = 20; loadTitle.Parent = loadCard
local loadSub = ins("TextLabel")
loadSub.Size = ud2(1,0,0,18); loadSub.Position = ud2(0,0,0,42)
loadSub.BackgroundTransparency = 1; loadSub.Text = "LOADING ASSETS..."
loadSub.TextColor3 = c3(140,100,220); loadSub.Font = Enum.Font.GothamBold
loadSub.TextSize = 12; loadSub.Parent = loadCard
local barTrack = ins("Frame")
barTrack.Size = ud2(0,260,0,6); barTrack.Position = ud2(0.5,0,0,68)
barTrack.AnchorPoint = v2(0.5,0); barTrack.BackgroundColor3 = c3(30,26,44)
barTrack.BorderSizePixel = 0; barTrack.Parent = loadCard
local bttc = ins("UICorner"); bttc.CornerRadius = UDim.new(1,0); bttc.Parent = barTrack
local barFill = ins("Frame")
barFill.Size = ud2(0,0,1,0); barFill.BackgroundColor3 = c3(120,70,210)
barFill.BorderSizePixel = 0; barFill.Parent = barTrack
local bfc = ins("UICorner"); bfc.CornerRadius = UDim.new(1,0); bfc.Parent = barFill
local loadPct = ins("TextLabel")
loadPct.Size = ud2(1,0,0,16); loadPct.Position = ud2(0,0,0,82)
loadPct.BackgroundTransparency = 1; loadPct.Text = "0%"
loadPct.TextColor3 = c3(90,75,115); loadPct.Font = Enum.Font.Gotham
loadPct.TextSize = 11; loadPct.Parent = loadCard
local animObjects = {}
for _, id in ipairs(preloadIds) do
local a = ins("Animation"); a.AnimationId = id; table.insert(animObjects, a)
end
for i, animObj in ipairs(animObjects) do
ContentProvider:PreloadAsync({animObj})
local progress = i / #animObjects
TweenService:Create(barFill, TweenInfo.new(0.1, Enum.EasingStyle.Quad), {Size = ud2(progress,0,1,0)}):Play()
loadSub.Text = "LOADING ASSETS " .. math.floor(progress*100) .. "%"
loadPct.Text = math.floor(progress*100) .. "%"
end
task.wait(0.2)
tw(loadCard, 0.35, {BackgroundTransparency=1})
tw(loadTitle, 0.25, {TextTransparency=1}); tw(loadSub, 0.25, {TextTransparency=1})
tw(loadPct, 0.25, {TextTransparency=1}); tw(barTrack, 0.25, {BackgroundTransparency=1})
tw(barFill, 0.25, {BackgroundTransparency=1}); tw(loadBg, 0.4, {BackgroundTransparency=1})
task.wait(0.45)
loadGui:Destroy()
-- ─────────────────────────────────────────────────────────
-- MAIN GUI ROOT
-- ─────────────────────────────────────────────────────────
local gui = ins("ScreenGui")
gui.Name = "ForsakenHUD"; gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true; gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent = playerGui
local blur = ins("BlurEffect"); blur.Size = 0; blur.Parent = Lighting
-- ─────────────────────────────────────────────────────────
-- HUD BARS (top-left on desktop, top-center on mobile)
-- ─────────────────────────────────────────────────────────
local hudW = mobScale(420, math.min(workspace.CurrentCamera.ViewportSize.X - 20, 380))
local hudH = mobScale(88, 76)
local holder = ins("Frame")
holder.AnchorPoint = v2(0,1)
holder.Position = ud2(0,-600,1,-20) -- starts off-screen, animated in later
holder.Size = ud2(0,hudW,0,hudH)
holder.BackgroundTransparency = 1
holder.Visible = true
holder.Parent = gui
if isMobile then
holder.AnchorPoint = v2(0.5,1)
holder.Position = ud2(0.5,0,0,- 600)
end
local bg = ins("Frame")
bg.Size = ud2(1,0,1,0)
bg.BackgroundColor3= c3(8,6,14)
bg.BackgroundTransparency = 0.25
bg.BorderSizePixel = 0
bg.Parent = holder
local bgInner = ins("Frame")
bgInner.Size = ud2(1,-4,1,-4); bgInner.Position = ud2(0,2,0,2)
bgInner.BackgroundColor3 = c3(12,10,20); bgInner.BackgroundTransparency = 0.35
bgInner.BorderSizePixel = 0; bgInner.Parent = holder
ins("UICorner", bg).CornerRadius = UDim.new(0,10)
ins("UICorner", bgInner).CornerRadius = UDim.new(0,10)
local portraitSize = mobScale(72, 58)
local portraitHolder = ins("Frame")
portraitHolder.Size = ud2(0,portraitSize,0,portraitSize)
portraitHolder.Position = ud2(0,8,0.5,-portraitSize/2)
portraitHolder.BackgroundColor3= c3(15,12,25)
portraitHolder.BorderSizePixel = 0
portraitHolder.Parent = holder
ins("UICorner", portraitHolder).CornerRadius = UDim.new(1,0)
local ring = ins("UIStroke"); ring.Color = c3(100,65,190); ring.Thickness = 2.5; ring.Parent = portraitHolder
local avatar = ins("ImageLabel")
avatar.BackgroundTransparency = 1; avatar.Size = ud2(1,-6,1,-6); avatar.Position = ud2(0,3,0,3)
avatar.Parent = portraitHolder
ins("UICorner", avatar).CornerRadius = UDim.new(1,0)
local ok, thumb = pcall(function()
return Players:GetUserThumbnailAsync(lp.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size420x420)
end)
avatar.Image = ok and thumb or ""
local nameLabel = ins("TextLabel")
nameLabel.BackgroundTransparency = 1
nameLabel.Position = ud2(0,2,0,portraitSize + 4)
nameLabel.Size = ud2(0,portraitSize+8,0,12)
nameLabel.Font = Enum.Font.GothamBold
nameLabel.Text = lp.DisplayName
nameLabel.TextColor3= c3(150,120,210)
nameLabel.TextSize = mobScale(9, 8)
nameLabel.TextXAlignment = Enum.TextXAlignment.Center
nameLabel.Parent = holder
local barXOffset = portraitSize + 22
local barW = mobScale(230, hudW - barXOffset - 80)
local function makeForsakenBar(yOffset, iconText, iconColor, fillColor, lowColor)
local icon = ins("TextLabel")
icon.BackgroundTransparency = 1
icon.Position = ud2(0, portraitSize + 12, 0, yOffset)
icon.Size = ud2(0, 22, 0, 22)
icon.Text = iconText
icon.TextScaled = true
icon.Font = Enum.Font.GothamBold
icon.TextColor3 = iconColor
icon.Parent = holder
local track = ins("Frame")
track.Size = ud2(0, barW, 0, mobScale(14,12))
track.Position = ud2(0, barXOffset + 22, 0, yOffset + 4)
track.BackgroundColor3= c3(35,28,50)
track.BorderSizePixel = 0
track.Parent = holder
ins("UICorner", track).CornerRadius = UDim.new(0,2)
local fill = ins("Frame")
fill.Size = ud2(1,0,1,0)
fill.BackgroundColor3= fillColor
fill.BorderSizePixel = 0
fill.Parent = track
ins("UICorner", fill).CornerRadius = UDim.new(0,2)
local shine = ins("Frame")
shine.Size = ud2(1,0,0.35,0); shine.BackgroundColor3 = c3(255,255,255)
shine.BackgroundTransparency = 0.82; shine.BorderSizePixel = 0
shine.ZIndex = 2; shine.Parent = fill
ins("UICorner", shine).CornerRadius = UDim.new(0,2)
local valLabel = ins("TextLabel")
valLabel.BackgroundTransparency = 1
valLabel.Position = ud2(1, 6, 0.5, -8)
valLabel.Size = ud2(0, 58, 0, 16)
valLabel.Font = Enum.Font.GothamBold
valLabel.TextSize = mobScale(13,11)
valLabel.TextColor3 = c3(220,210,240)
valLabel.Text = "100/100"
valLabel.TextXAlignment = Enum.TextXAlignment.Left
valLabel.Parent = track
return fill, valLabel, fillColor, lowColor
end
local barY1 = mobScale(14, 10)
local barY2 = mobScale(44, 38)
local healthFill, healthText, hpNorm, hpLow = makeForsakenBar(barY1, "❤", c3(220,60,80), c3(200,50,70), c3(255,30,30))
local staminaFill, staminaText, stNorm, stLow = makeForsakenBar(barY2, "⚡", c3(200,200,200),c3(210,210,210),c3(255,80,80))
-- ─────────────────────────────────────────────────────────
-- WATERMARK
-- ─────────────────────────────────────────────────────────
local watermark = ins("TextLabel")
watermark.BackgroundTransparency = 1
watermark.Size = ud2(1,0,0,18)
watermark.Position = ud2(0,0,1,-18)
watermark.Font = Enum.Font.GothamBold
watermark.Text = "OWNED BY SONICISNUMBER12 • UI MADE BY FORSAKEN TEAM"
watermark.TextColor3 = c3(120,100,160)
watermark.TextSize = 10
watermark.TextXAlignment = Enum.TextXAlignment.Center
watermark.Parent = gui
-- ─────────────────────────────────────────────────────────
-- ACTION GUI
-- ─────────────────────────────────────────────────────────
local sg = ins("ScreenGui")
sg.Name = "ActionGui"; sg.ResetOnSpawn = false; sg.Parent = playerGui
-- ─── button size helpers ────────────────────────────────
-- On mobile we use a full-width bottom action bar with large tap targets
-- On desktop we keep the original compact corner layout
local BTN_MAIN = mobScale(ud2(0,130,0,130), ud2(0,72,0,72)) -- sprint (desktop big, mobile smaller)
local BTN_SMALL = mobScale(ud2(0,66,0,66), ud2(0,64,0,64))
local function hint(p, t)
if isMobile then return end -- no hotkey hints on mobile
local h = ins("TextLabel")
h.Size = ud2(1,0,0,16); h.Position = ud2(0,0,0,-20)
h.BackgroundTransparency = 1; h.Text = "[" .. t .. "]"
h.TextColor3 = c3(200,185,230); h.TextStrokeTransparency = 0.6
h.Font = Enum.Font.GothamBold; h.TextSize = 13; h.Parent = p
end
local function makeRoundBtn(parent, zIdx)
local b = ins("Frame")
b.BackgroundColor3 = c3(14,12,22); b.BackgroundTransparency = 0.15
b.BorderSizePixel = 0; b.ZIndex = zIdx or 1; b.Parent = parent
ins("UICorner", b).CornerRadius = UDim.new(0, mobScale(10, 12))
local s = ins("UIStroke"); s.Color = c3(80,55,130); s.Thickness = 1; s.Transparency = 0.4; s.Parent = b
return b, s
end
-- ─── MOBILE LAYOUT: bottom bar ──────────────────────────
local mobileBar -- container only created on mobile
local mobileSprint, mobileBlock, mobilePunch, mobileShiftlock, mobileEmote, mobileAnims
if isMobile then
-- Semi-transparent bar pinned to the bottom of the screen
mobileBar = ins("Frame")
mobileBar.AnchorPoint = v2(0.5, 1)
mobileBar.Position = ud2(0.5, 0, 1, -8)
mobileBar.Size = ud2(1, -16, 0, 86)
mobileBar.BackgroundColor3= c3(8, 6, 14)
mobileBar.BackgroundTransparency = 0.18
mobileBar.BorderSizePixel = 0
mobileBar.ZIndex = 5
mobileBar.Parent = sg
ins("UICorner", mobileBar).CornerRadius = UDim.new(0, 16)
local mbs = ins("UIStroke"); mbs.Color = c3(70,50,110); mbs.Thickness = 1; mbs.Transparency = 0.35; mbs.Parent = mobileBar
-- Horizontal list of equally-spaced buttons
local barList = ins("UIListLayout")
barList.FillDirection = Enum.FillDirection.Horizontal
barList.HorizontalAlignment = Enum.HorizontalAlignment.Center
barList.VerticalAlignment = Enum.VerticalAlignment.Center
barList.Padding = UDim.new(0, 8)
barList.Parent = mobileBar
local barPad = ins("UIPadding")
barPad.PaddingLeft = UDim.new(0,10); barPad.PaddingRight = UDim.new(0,10)
barPad.Parent = mobileBar
local function mobileActionBtn(label, color, accent)
local btn = ins("TextButton")
btn.Size = ud2(0, 70, 0, 64)
btn.BackgroundColor3 = color or c3(14,12,24)
btn.BackgroundTransparency = 0.12
btn.Text = label
btn.TextColor3 = accent or c3(210, 200, 240)
btn.Font = Enum.Font.GothamBlack
btn.TextSize = 12
btn.BorderSizePixel = 0
btn.AutoButtonColor = false
btn.ZIndex = 6
btn.Parent = mobileBar
ins("UICorner", btn).CornerRadius = UDim.new(0, 12)
local s = ins("UIStroke"); s.Color = accent or c3(80,55,130); s.Thickness = 1; s.Transparency = 0.4; s.Parent = btn
btn.MouseButton1Down:Connect(function() tw(btn,0.08,{BackgroundTransparency=0}) end)
btn.MouseButton1Up:Connect(function() tw(btn,0.12,{BackgroundTransparency=0.12}) end)
return btn
end
mobileSprint = mobileActionBtn("🏃 RUN", c3(14,22,14), c3(100,200,80))
mobilePunch = mobileActionBtn("👊 HIT", c3(22,12,12), c3(210,70,70))
mobileBlock = mobileActionBtn("🛡 BLOCK", c3(12,14,22), c3(70,110,220))
mobileEmote = mobileActionBtn("EMOTE", c3(14,12,22), c3(180,130,230))
mobileShiftlock = mobileActionBtn("🔒 SL", c3(12,16,22), c3(100,180,255))
mobileAnims = mobileActionBtn("ANIMS", c3(12,14,20), c3(140,200,255))
end
-- ─── DESKTOP LAYOUT: original corner buttons ────────────
local rb, slb, pb, bb -- declared regardless; only used on desktop
if not isMobile then
local function actionBtn(n, id, pos, size, hotkey)
local b = ins("ImageButton")
b.Name = n; b.Size = size; b.Position = pos
b.Image = (typeof(id)=="string" and id:find("rbxassetid") and id) or "rbxassetid://"..tostring(id)
b.BackgroundColor3 = c3(14,12,22); b.BackgroundTransparency = 0.15
b.BorderSizePixel = 0; b.ImageColor3 = c3(255,255,255); b.Parent = sg
ins("UICorner", b).CornerRadius = UDim.new(0,10)
local bs = ins("UIStroke"); bs.Color = c3(80,55,130); bs.Thickness = 1; bs.Transparency = 0.4; bs.Parent = b
b.MouseEnter:Connect(function()
tw(b, 0.12, {BackgroundTransparency=0})
playSound(SFX_CLICK, 0.12, 1.4)
end)
b.MouseLeave:Connect(function() tw(b, 0.12, {BackgroundTransparency=0.15}) end)
b.MouseButton1Click:Connect(function() playSound(SFX_CLICK, 0.4, 1) end)
if hotkey then hint(b, hotkey) end
return b
end
rb = actionBtn("Run", 89719285639088, ud2(1,-20,1,-20), BTN_MAIN, "SHIFT"); rb.AnchorPoint = v2(1,1)
slb = actionBtn("ShiftLock", SL_ID, ud2(1,-165,1,-20), BTN_SMALL, "CTRL"); slb.AnchorPoint = v2(1,1)
pb = actionBtn("Punch", 113322091360332, ud2(1,-20,1,-165), BTN_SMALL, "E"); pb.AnchorPoint = v2(1,1)
bb = actionBtn("Block", 81303931345144, ud2(1,-96,1,-165), BTN_SMALL, "Q"); bb.AnchorPoint = v2(1,1)
end
-- ─────────────────────────────────────────────────────────
-- DRAGGABLE EMOTE BUTTON (desktop only)
-- ─────────────────────────────────────────────────────────
local eb
if not isMobile then
eb = ins("TextButton")
eb.Name = "EmoteToggle"; eb.Size = BTN_SMALL
eb.Position = ud2(0, 20, 1, -165); eb.AnchorPoint = v2(0,1)
eb.BackgroundColor3 = c3(14,12,22); eb.BackgroundTransparency = 0.15
eb.Text = "EMOTE"; eb.TextColor3 = c3(200,185,230)
eb.Font = Enum.Font.GothamBold; eb.TextSize = 14
eb.BorderSizePixel = 0; eb.AutoButtonColor = false; eb.Parent = sg
ins("UICorner", eb).CornerRadius = UDim.new(0,10)
local ebs = ins("UIStroke"); ebs.Color = c3(80,55,130); ebs.Thickness = 1; ebs.Transparency = 0.4; ebs.Parent = eb
local dragHint = ins("TextLabel")
dragHint.BackgroundTransparency = 1; dragHint.Size = ud2(1,0,0,12)
dragHint.Position = ud2(0,0,1,2); dragHint.Text = ":: drag ::"
dragHint.TextColor3 = c3(100,80,140); dragHint.Font = Enum.Font.Gotham
dragHint.TextSize = 10; dragHint.Parent = eb
eb.MouseEnter:Connect(function()
tw(eb, 0.12, {BackgroundTransparency=0})
playSound(SFX_CLICK, 0.12, 1.4)
end)
eb.MouseLeave:Connect(function() tw(eb, 0.12, {BackgroundTransparency=0.15}) end)
-- Drag logic
local draggingEmote = false
local dragStartPos
local dragMoved = false
eb.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or
input.UserInputType == Enum.UserInputType.Touch then
draggingEmote = true
dragMoved = false
local absPos = eb.AbsolutePosition
local absSize = sg.AbsoluteSize
dragStartPos = {
x = absPos.X / absSize.X,
y = absPos.Y / absSize.Y,
mx = input.Position.X,
my = input.Position.Y
}
end
end)
UserInputService.InputChanged:Connect(function(input)
if not draggingEmote then return end
if input.UserInputType == Enum.UserInputType.MouseMovement or
input.UserInputType == Enum.UserInputType.Touch then
local dx = input.Position.X - dragStartPos.mx
local dy = input.Position.Y - dragStartPos.my
if math.sqrt(dx*dx + dy*dy) > 6 then
dragMoved = true
local screenSize = sg.AbsoluteSize
local newX = math.clamp(dragStartPos.x + dx/screenSize.X, 0, 1-(eb.AbsoluteSize.X/screenSize.X))
local newY = math.clamp(dragStartPos.y + dy/screenSize.Y, 0, 1-(eb.AbsoluteSize.Y/screenSize.Y))
eb.AnchorPoint = v2(0,0)
eb.Position = ud2(newX,0,newY,0)
end
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or
input.UserInputType == Enum.UserInputType.Touch then
draggingEmote = false
end
end)
eb.MouseButton1Click:Connect(function()
if not dragMoved then
ef.Visible = not ef.Visible
if ef.Visible then animPanel.Visible = false end
playSound(ef.Visible and SFX_OPEN or SFX_CLOSE, 0.3, 1)
end
end)
end
-- ─────────────────────────────────────────────────────────
-- EMOTE MENU
-- ─────────────────────────────────────────────────────────
-- position & size differ between mobile and desktop
local emoteMenuW = mobScale(210, math.min(workspace.CurrentCamera.ViewportSize.X - 20, 260))
local emoteMenuH = mobScale(270, 340)
local ef = ins("Frame")
ef.Name = "EmoteMenu"
ef.Size = ud2(0, emoteMenuW, 0, emoteMenuH)
ef.BackgroundColor3 = c3(10,9,16); ef.BackgroundTransparency = 0.08
ef.BorderSizePixel = 0; ef.Visible = false; ef.Parent = sg; ef.ZIndex = 10
ins("UICorner", ef).CornerRadius = UDim.new(0,12)
local efs = ins("UIStroke"); efs.Color = c3(80,55,130); efs.Thickness = 1.2; efs.Transparency = 0.4; efs.Parent = ef
if isMobile then
-- centred just above the mobile bar
ef.AnchorPoint = v2(0.5, 1)
ef.Position = ud2(0.5, 0, 1, -102)
else
ef.Position = ud2(0, 20, 1, -242); ef.AnchorPoint = v2(0,1)
end
local efTitle = ins("TextLabel")
efTitle.Size = ud2(1,0,0,28); efTitle.Position = ud2(0,0,0,4)
efTitle.BackgroundTransparency = 1; efTitle.Text = "EMOTES"
efTitle.TextColor3 = c3(160,130,220); efTitle.Font = Enum.Font.GothamBlack
efTitle.TextSize = 13; efTitle.ZIndex = 11; efTitle.Parent = ef
local sf = ins("ScrollingFrame")
sf.Size = ud2(1,-12,1,-38); sf.Position = ud2(0,6,0,32)
sf.BackgroundTransparency = 1; sf.CanvasSize = ud2(0,0,0,0)
sf.AutomaticCanvasSize = Enum.AutomaticSize.Y; sf.ScrollBarThickness = 3
sf.ScrollBarImageColor3 = c3(120,70,210); sf.ZIndex = 11; sf.Parent = ef
local uiList = ins("UIListLayout"); uiList.Padding = UDim.new(0,4); uiList.Parent = sf
-- Stop Emote button
local stopE = ins("TextButton")
stopE.Name = "StopEmote"
stopE.Size = ud2(0,160,0,mobScale(36,44))
stopE.BackgroundColor3 = c3(160,30,60); stopE.BackgroundTransparency = 0.1
stopE.Text = "STOP EMOTE"; stopE.TextColor3 = c3(255,255,255)
stopE.Font = Enum.Font.GothamBold; stopE.TextSize = mobScale(13,14)
stopE.BorderSizePixel = 0; stopE.AutoButtonColor = false
stopE.Visible = false; stopE.ZIndex = 10; stopE.Parent = sg
ins("UICorner", stopE).CornerRadius = UDim.new(0,8)
stopE.MouseEnter:Connect(function() tw(stopE,0.12,{BackgroundColor3=c3(200,40,70)}); playSound(SFX_CLICK,0.1,1.3) end)
stopE.MouseLeave:Connect(function() tw(stopE,0.12,{BackgroundColor3=c3(160,30,60)}) end)
stopE.MouseButton1Click:Connect(function() playSound(SFX_CLICK,0.4,0.9) end)
if isMobile then
stopE.AnchorPoint = v2(0.5,1)
stopE.Position = ud2(0.5,0,1,-98)
stopE.Size = ud2(0,180,0,44)
else
stopE.AnchorPoint = v2(0,1)
stopE.Position = ud2(0,20,1,-110)
end
-- ─────────────────────────────────────────────────────────
-- ANIMATION CUSTOMIZER BUTTON (desktop corner / mobile bar)
-- ─────────────────────────────────────────────────────────
local animBtn
if not isMobile then
animBtn = ins("TextButton")
animBtn.Name = "AnimCustomizer"; animBtn.Size = BTN_SMALL
animBtn.Position = ud2(0,96,1,-165); animBtn.AnchorPoint = v2(0,1)
animBtn.BackgroundColor3 = c3(14,12,22); animBtn.BackgroundTransparency = 0.15
animBtn.Text = "ANIMS"; animBtn.TextColor3 = c3(180,220,255)
animBtn.Font = Enum.Font.GothamBold; animBtn.TextSize = 13
animBtn.BorderSizePixel = 0; animBtn.AutoButtonColor = false; animBtn.Parent = sg
ins("UICorner", animBtn).CornerRadius = UDim.new(0,10)
local animBtnS = ins("UIStroke"); animBtnS.Color = c3(55,100,160); animBtnS.Thickness = 1; animBtnS.Transparency = 0.4; animBtnS.Parent = animBtn
animBtn.MouseEnter:Connect(function() tw(animBtn,0.12,{BackgroundTransparency=0}); playSound(SFX_CLICK,0.12,1.4) end)
animBtn.MouseLeave:Connect(function() tw(animBtn,0.12,{BackgroundTransparency=0.15}) end)
animBtn.MouseButton1Click:Connect(function() playSound(SFX_CLICK,0.4,1) end)
end
-- ─────────────────────────────────────────────────────────
-- ANIMATION CUSTOMIZER PANEL
-- ─────────────────────────────────────────────────────────
local panelW = mobScale(380, math.min(workspace.CurrentCamera.ViewportSize.X - 20, 340))
local panelH = mobScale(440, math.min(workspace.CurrentCamera.ViewportSize.Y - 120, 420))
local animPanel = ins("Frame")
animPanel.Name = "AnimPanel"
animPanel.Size = ud2(0,panelW,0,panelH)
animPanel.Position = ud2(0.5,0,0.5,0); animPanel.AnchorPoint = v2(0.5,0.5)
animPanel.BackgroundColor3 = c3(10,9,18); animPanel.BackgroundTransparency = 0.04
animPanel.BorderSizePixel = 0; animPanel.Visible = false; animPanel.ZIndex = 60
animPanel.Parent = sg
ins("UICorner", animPanel).CornerRadius = UDim.new(0,14)
local aps = ins("UIStroke"); aps.Color = c3(55,100,170); aps.Thickness = 1.5; aps.Transparency = 0.3; aps.Parent = animPanel
local apTitleBar = ins("Frame")
apTitleBar.Size = ud2(1,0,0,42); apTitleBar.BackgroundColor3 = c3(14,12,26)
apTitleBar.BorderSizePixel = 0; apTitleBar.ZIndex = 61; apTitleBar.Parent = animPanel
ins("UICorner", apTitleBar).CornerRadius = UDim.new(0,14)
local apTitleBarFill = ins("Frame")
apTitleBarFill.Size = ud2(1,0,0,14); apTitleBarFill.Position = ud2(0,0,1,-14)
apTitleBarFill.BackgroundColor3 = c3(14,12,26); apTitleBarFill.BorderSizePixel = 0
apTitleBarFill.ZIndex = 61; apTitleBarFill.Parent = apTitleBar
local apAccent = ins("Frame")
apAccent.Size = ud2(0,340,0,2); apAccent.Position = ud2(0.5,0,0,42)
apAccent.AnchorPoint = v2(0.5,0); apAccent.BackgroundColor3 = c3(60,120,220)
apAccent.BorderSizePixel = 0; apAccent.ZIndex = 62; apAccent.Parent = animPanel
ins("UICorner", apAccent).CornerRadius = UDim.new(1,0)
local apTitle = ins("TextLabel")
apTitle.BackgroundTransparency = 1; apTitle.Size = ud2(1,-50,1,0)
apTitle.Position = ud2(0,16,0,0); apTitle.Text = "ANIMATION CUSTOMIZER"
apTitle.TextColor3 = c3(180,220,255); apTitle.Font = Enum.Font.GothamBlack
apTitle.TextSize = mobScale(15,13); apTitle.TextXAlignment = Enum.TextXAlignment.Left
apTitle.ZIndex = 62; apTitle.Parent = apTitleBar
local apCloseBtn = ins("TextButton")
apCloseBtn.Size = ud2(0,mobScale(26,34),0,mobScale(26,34))
apCloseBtn.Position = ud2(1,-40,0.5,-(mobScale(26,34)/2))
apCloseBtn.BackgroundColor3 = c3(160,30,60); apCloseBtn.BackgroundTransparency = 0.15
apCloseBtn.Text = "✕"; apCloseBtn.TextColor3 = c3(255,255,255)
apCloseBtn.Font = Enum.Font.GothamBold; apCloseBtn.TextSize = mobScale(13,15)
apCloseBtn.BorderSizePixel = 0; apCloseBtn.AutoButtonColor = false
apCloseBtn.ZIndex = 62; apCloseBtn.Parent = apTitleBar
ins("UICorner", apCloseBtn).CornerRadius = UDim.new(0,6)
apCloseBtn.MouseEnter:Connect(function() tw(apCloseBtn,0.1,{BackgroundColor3=c3(200,40,70)}); playSound(SFX_CLICK,0.1,1.3) end)
apCloseBtn.MouseLeave:Connect(function() tw(apCloseBtn,0.1,{BackgroundColor3=c3(160,30,60)}) end)
apCloseBtn.MouseButton1Click:Connect(function()
playSound(SFX_CLOSE,0.3,1.1); animPanel.Visible = false
end)
-- Tab bar
local TAB_NAMES = {"IDLE","WALK","RUN","PUNCH","BLOCK"}
local TAB_SLOTS = {"idle","walk","run","punch","block"}
local TAB_COLORS = {
idle = c3(120,70,210), walk = c3(60,180,120),
run = c3(220,140,40), punch = c3(210,60,80), block = c3(60,130,220),
}
local tabHolder = ins("Frame")
tabHolder.Size = ud2(1,-20,0,32); tabHolder.Position = ud2(0,10,0,50)
tabHolder.BackgroundTransparency = 1; tabHolder.ZIndex = 61; tabHolder.Parent = animPanel
local tabLayout = ins("UIListLayout")
tabLayout.FillDirection = Enum.FillDirection.Horizontal
tabLayout.Padding = UDim.new(0,3); tabLayout.Parent = tabHolder
local currentTab = "idle"
local tabBtns = {}
local slotFrames = {}
local function switchTab(slot)
currentTab = slot
for s, f in pairs(slotFrames) do f.Visible = (s == slot) end
for s, btn in pairs(tabBtns) do
local col = TAB_COLORS[s]
if s == slot then
tw(btn,0.15,{BackgroundColor3=col,BackgroundTransparency=0.1})
btn.TextColor3 = c3(255,255,255)
else
tw(btn,0.15,{BackgroundColor3=c3(20,18,32),BackgroundTransparency=0.2})
btn.TextColor3 = c3(140,130,170)
end
end
end
-- calculate tab button width dynamically
local tabBtnW = math.floor((panelW - 20 - 4*4) / 5)
for i, name in ipairs(TAB_NAMES) do
local slot = TAB_SLOTS[i]
local tb = ins("TextButton")
tb.Size = ud2(0, tabBtnW, 0, 30)
tb.BackgroundColor3 = c3(20,18,32); tb.BackgroundTransparency = 0.2
tb.Text = name; tb.TextColor3 = c3(140,130,170)
tb.Font = Enum.Font.GothamBold; tb.TextSize = mobScale(10,9)
tb.BorderSizePixel = 0; tb.AutoButtonColor = false; tb.ZIndex = 62; tb.Parent = tabHolder
ins("UICorner", tb).CornerRadius = UDim.new(0,6)
tb.MouseEnter:Connect(function() playSound(SFX_CLICK,0.08,1.5) end)
tb.MouseButton1Click:Connect(function()
playSound(SFX_CLICK,0.3,1.1); switchTab(slot)
end)
tabBtns[slot] = tb
end
local contentArea = ins("Frame")
contentArea.Size = ud2(1,-20,1,-100); contentArea.Position = ud2(0,10,0,92)
contentArea.BackgroundTransparency = 1; contentArea.ZIndex = 61; contentArea.Parent = animPanel
local function makeOptionBtn(parent, label, subLabel, zIdx)
local rowH = mobScale(44, 50)
local row = ins("TextButton")
row.Size = ud2(1,0,0,rowH)
row.BackgroundColor3 = c3(18,16,30); row.BackgroundTransparency = 0.1
row.Text = ""; row.BorderSizePixel = 0; row.AutoButtonColor = false
row.ZIndex = zIdx; row.Parent = parent
ins("UICorner", row).CornerRadius = UDim.new(0,8)
local rs = ins("UIStroke"); rs.Color = c3(50,45,75); rs.Thickness = 1; rs.Transparency = 0.5; rs.Parent = row
local nameL = ins("TextLabel")
nameL.BackgroundTransparency = 1; nameL.Size = ud2(1,-50,0,22)
nameL.Position = ud2(0,12,0,mobScale(5,7)); nameL.Text = label
nameL.TextColor3 = c3(210,200,240); nameL.Font = Enum.Font.GothamBold
nameL.TextSize = mobScale(13,14); nameL.TextXAlignment = Enum.TextXAlignment.Left
nameL.ZIndex = zIdx+1; nameL.Parent = row
if subLabel and subLabel ~= "" then
local subL = ins("TextLabel")
subL.BackgroundTransparency = 1; subL.Size = ud2(1,-50,0,16)
subL.Position = ud2(0,12,0,mobScale(24,28)); subL.Text = subLabel
subL.TextColor3 = c3(100,90,130); subL.Font = Enum.Font.Gotham
subL.TextSize = mobScale(10,11); subL.TextXAlignment = Enum.TextXAlignment.Left
subL.ZIndex = zIdx+1; subL.Parent = row
end
local check = ins("TextLabel")
check.BackgroundTransparency = 1; check.Size = ud2(0,30,1,0)
check.Position = ud2(1,-36,0,0); check.Text = ""
check.TextColor3 = c3(100,200,120); check.Font = Enum.Font.GothamBold
check.TextSize = 16; check.ZIndex = zIdx+1; check.Parent = row
row.MouseEnter:Connect(function() tw(row,0.1,{BackgroundColor3=c3(28,24,44)}); playSound(SFX_CLICK,0.08,1.4) end)
row.MouseLeave:Connect(function() tw(row,0.1,{BackgroundColor3=c3(18,16,30)}) end)
return row, check, rs
end
local activeLabels = {}
local function buildSlotFrame(slot, zOff)
local frame = ins("ScrollingFrame")
frame.Size = ud2(1,0,1,0); frame.BackgroundTransparency = 1
frame.CanvasSize = ud2(0,0,0,0); frame.AutomaticCanvasSize = Enum.AutomaticSize.Y
frame.ScrollBarThickness = 3; frame.ScrollBarImageColor3 = c3(60,120,220)
frame.ZIndex = 61+zOff; frame.Visible = false; frame.Parent = contentArea
local fLayout = ins("UIListLayout"); fLayout.Padding = UDim.new(0,5); fLayout.Parent = frame
local activeLbl = ins("TextLabel")
activeLbl.BackgroundTransparency = 1; activeLbl.Size = ud2(1,0,0,20)
activeLbl.Text = "Active: " .. ANIM_LIBRARY[slot][activeAnims[slot]].name
activeLbl.TextColor3 = TAB_COLORS[slot]; activeLbl.Font = Enum.Font.GothamBold
activeLbl.TextSize = 11; activeLbl.TextXAlignment = Enum.TextXAlignment.Left
activeLbl.ZIndex = 62+zOff; activeLbl.Parent = frame
activeLabels[slot] = activeLbl
local checkRefs = {}
local function refreshChecks()
for idx, refs in ipairs(checkRefs) do
refs.check.Text = (idx == activeAnims[slot]) and "✔" or ""
refs.stroke.Color = (idx == activeAnims[slot]) and TAB_COLORS[slot] or c3(50,45,75)
refs.stroke.Transparency = (idx == activeAnims[slot]) and 0.2 or 0.5
end
activeLbl.Text = "Active: " .. ANIM_LIBRARY[slot][activeAnims[slot]].name
end
for idx, entry in ipairs(ANIM_LIBRARY[slot]) do
local sub = ""
if entry.combo then
sub = #entry.combo == 1 and "Single hit" or (#entry.combo .. "-hit combo")
end
local btn, check, stroke = makeOptionBtn(frame, entry.name, sub, 62+zOff)
table.insert(checkRefs, { check=check, stroke=stroke })
local capturedIdx = idx
btn.MouseButton1Click:Connect(function()
playSound(SFX_CLICK,0.35,1.1)
activeAnims[slot] = capturedIdx
if slot == "punch" then
LIVE.punch = entry.combo and entry.combo[1] or entry.id
else
LIVE[slot] = entry.id
end
st = {} -- force locomotion reload
if slot == "punch" then punchComboIndex=1; lastPunchTime=0 end
refreshChecks()
end)
end
refreshChecks()
return frame
end
for i, slot in ipairs(TAB_SLOTS) do
slotFrames[slot] = buildSlotFrame(slot, i)
end
switchTab("idle")
-- Open/close panel
local animPanelOpen = false
local function toggleAnimPanel()
animPanelOpen = not animPanelOpen
animPanel.Visible = animPanelOpen
if animPanelOpen then
playSound(SFX_OPEN,0.3,1)
ef.Visible = false
if credPanel then credPanel.Visible = false end
else
playSound(SFX_CLOSE,0.3,1)
end
end
if animBtn then
animBtn.MouseButton1Click:Connect(toggleAnimPanel)
end
if mobileAnims then
mobileAnims.MouseButton1Click:Connect(function()
playSound(SFX_CLICK,0.4,1); toggleAnimPanel()
end)
end
-- ─────────────────────────────────────────────────────────
-- CREDITS BUTTON + PANEL
-- ─────────────────────────────────────────────────────────
local credBtn = ins("TextButton")
credBtn.Size = ud2(0,90,0,28); credBtn.Position = ud2(0.5,0,0,14)
credBtn.AnchorPoint = v2(0.5,0); credBtn.BackgroundColor3 = c3(20,16,34)
credBtn.BackgroundTransparency = 0.1; credBtn.Text = "CREDITS"
credBtn.TextColor3 = c3(170,140,230); credBtn.Font = Enum.Font.GothamBold
credBtn.TextSize = 12; credBtn.BorderSizePixel = 0; credBtn.AutoButtonColor = false
credBtn.Parent = sg
ins("UICorner", credBtn).CornerRadius = UDim.new(0,8)
local cbs = ins("UIStroke"); cbs.Color = c3(80,55,130); cbs.Thickness = 1; cbs.Transparency = 0.4; cbs.Parent = credBtn
credBtn.MouseEnter:Connect(function() tw(credBtn,0.12,{BackgroundTransparency=0}); playSound(SFX_CLICK,0.1,1.4) end)
credBtn.MouseLeave:Connect(function() tw(credBtn,0.12,{BackgroundTransparency=0.1}) end)
local credPanel = ins("Frame")
credPanel.Size = ud2(0,320,0,210); credPanel.Position = ud2(0.5,0,0.5,0)
credPanel.AnchorPoint = v2(0.5,0.5); credPanel.BackgroundColor3 = c3(10,8,18)
credPanel.BackgroundTransparency = 0.05; credPanel.BorderSizePixel = 0
credPanel.Visible = false; credPanel.ZIndex = 50; credPanel.Parent = sg
ins("UICorner", credPanel).CornerRadius = UDim.new(0,14)
local cps = ins("UIStroke"); cps.Color = c3(90,60,150); cps.Thickness = 1.5; cps.Transparency = 0.3; cps.Parent = credPanel
local credAccent = ins("Frame")
credAccent.Size = ud2(0,260,0,2); credAccent.Position = ud2(0.5,0,0,42)
credAccent.AnchorPoint = v2(0.5,0); credAccent.BackgroundColor3 = c3(120,70,210)
credAccent.BorderSizePixel = 0; credAccent.ZIndex = 51; credAccent.Parent = credPanel
ins("UICorner", credAccent).CornerRadius = UDim.new(1,0)
local credTitle = ins("TextLabel")
credTitle.BackgroundTransparency = 1; credTitle.Size = ud2(1,0,0,36)
credTitle.Position = ud2(0,0,0,6); credTitle.Text = "CREDITS"
credTitle.TextColor3 = c3(255,255,255); credTitle.Font = Enum.Font.GothamBlack
credTitle.TextSize = 20; credTitle.ZIndex = 51; credTitle.Parent = credPanel
local credEntries = {
{"OWNER", "sonicisnumber12/whospierce", c3(200,160,255)},
{"SPRINT, BLOCK & PUNCH UI", "Forsaken Team", c3(170,220,255)},
{"UI TOUCH UPS", "Claude AI", c3(180,255,200)},
}
for i, entry in ipairs(credEntries) do
local row = ins("Frame")
row.Size = ud2(1,-32,0,30); row.Position = ud2(0,16,0,46+(i-1)*36)
row.BackgroundTransparency = 1; row.ZIndex = 51; row.Parent = credPanel
local roleLabel = ins("TextLabel")
roleLabel.BackgroundTransparency = 1; roleLabel.Size = ud2(0.52,0,1,0)
roleLabel.Text = entry[1]; roleLabel.TextColor3 = c3(130,110,160)
roleLabel.Font = Enum.Font.GothamBold; roleLabel.TextSize = 11
roleLabel.TextXAlignment = Enum.TextXAlignment.Left; roleLabel.ZIndex = 51; roleLabel.Parent = row
local nameL = ins("TextLabel")
nameL.BackgroundTransparency = 1; nameL.Size = ud2(0.48,0,1,0)
nameL.Position = ud2(0.52,0,0,0); nameL.Text = entry[2]
nameL.TextColor3 = entry[3]; nameL.Font = Enum.Font.GothamBold
nameL.TextSize = 13; nameL.TextXAlignment = Enum.TextXAlignment.Right
nameL.ZIndex = 51; nameL.Parent = row
end
local closeCredBtn = ins("TextButton")
closeCredBtn.Size = ud2(0,100,0,32); closeCredBtn.Position = ud2(0.5,0,1,-46)
closeCredBtn.AnchorPoint = v2(0.5,0); closeCredBtn.BackgroundColor3 = c3(100,60,190)
closeCredBtn.BackgroundTransparency = 0.1; closeCredBtn.Text = "CLOSE"
closeCredBtn.TextColor3 = c3(255,255,255); closeCredBtn.Font = Enum.Font.GothamBold
closeCredBtn.TextSize = 13; closeCredBtn.BorderSizePixel = 0; closeCredBtn.AutoButtonColor = false
closeCredBtn.ZIndex = 51; closeCredBtn.Parent = credPanel
ins("UICorner", closeCredBtn).CornerRadius = UDim.new(0,8)
closeCredBtn.MouseEnter:Connect(function() tw(closeCredBtn,0.12,{BackgroundColor3=c3(130,80,220)}); playSound(SFX_CLICK,0.1,1.3) end)
closeCredBtn.MouseLeave:Connect(function() tw(closeCredBtn,0.12,{BackgroundColor3=c3(100,60,190)}) end)
closeCredBtn.MouseButton1Click:Connect(function()
playSound(SFX_CLOSE,0.3,1.1); credPanel.Visible = false
end)
credBtn.MouseButton1Click:Connect(function()
playSound(SFX_OPEN,0.35,1)
credPanel.Visible = not credPanel.Visible
if credPanel.Visible then animPanel.Visible = false end
end)
-- ─────────────────────────────────────────────────────────
-- UNLOAD CONFIRM
-- ─────────────────────────────────────────────────────────
local xb = ins("ImageButton")
xb.Size = ud2(0,32,0,32); xb.Position = ud2(0.5,38,0,14)
xb.AnchorPoint = v2(0.5,0); xb.Image = "http://www.roblox.com/asset/?id=16201262"
xb.BackgroundColor3 = c3(14,12,22); xb.BackgroundTransparency = 0.2
xb.BorderSizePixel = 0; xb.Parent = sg
ins("UICorner", xb).CornerRadius = UDim.new(0,8)
xb.MouseEnter:Connect(function() playSound(SFX_CLICK,0.1,1.4) end)
xb.MouseButton1Click:Connect(function() playSound(SFX_CLICK,0.35,0.9) end)
local cf = ins("Frame")
cf.Size = ud2(0,300,0,170); cf.Position = ud2(0.5,-150,0.5,-85)
cf.BackgroundColor3 = c3(10,9,16); cf.BackgroundTransparency = 0.08
cf.BorderSizePixel = 0; cf.Visible = false; cf.ZIndex = 50; cf.Parent = sg
ins("UICorner", cf).CornerRadius = UDim.new(0,14)
local cfs2 = ins("UIStroke"); cfs2.Color = c3(80,55,130); cfs2.Thickness = 1.2; cfs2.Transparency = 0.35; cfs2.Parent = cf
local cl = ins("TextLabel")
cl.Size = ud2(1,-24,0,70); cl.Position = ud2(0,12,0,18)
cl.BackgroundTransparency = 1; cl.Text = "Stop larping as guest 1367?"
cl.TextColor3 = c3(200,185,230); cl.TextWrapped = true
cl.Font = Enum.Font.GothamBold; cl.TextSize = 16; cl.ZIndex = 51; cl.Parent = cf
local function confirmBtn(n, t, xpos, clr)
local b = ins("TextButton")
b.Name = n; b.Size = ud2(0,110,0,38); b.Position = ud2(0,xpos,0,104)
b.BackgroundColor3 = clr; b.BackgroundTransparency = 0.1
b.Text = t; b.TextColor3 = c3(255,255,255)
b.Font = Enum.Font.GothamBold; b.TextSize = 15
b.BorderSizePixel = 0; b.AutoButtonColor = false; b.ZIndex = 51; b.Parent = cf
ins("UICorner", b).CornerRadius = UDim.new(0,8)
b.MouseEnter:Connect(function() playSound(SFX_CLICK,0.1,1.3) end)
b.MouseButton1Click:Connect(function() playSound(SFX_CLICK,0.4,1) end)
return b
end
local bn = confirmBtn("No", "No", 26, c3(40,35,60))
local by = confirmBtn("Yes", "Yes", 164, c3(150,25,50))
bn.MouseEnter:Connect(function() tw(bn,0.12,{BackgroundColor3=c3(60,50,90)}) end)
bn.MouseLeave:Connect(function() tw(bn,0.12,{BackgroundColor3=c3(40,35,60)}) end)
by.MouseEnter:Connect(function() tw(by,0.12,{BackgroundColor3=c3(190,35,60)}) end)
by.MouseLeave:Connect(function() tw(by,0.12,{BackgroundColor3=c3(150,25,50)}) end)
-- ─────────────────────────────────────────────────────────
-- EMOTE BUTTONS
-- ─────────────────────────────────────────────────────────
local function addEmoteBtn(name, id)
local btnH = mobScale(32, 40)
local b = ins("TextButton")
b.Size = ud2(1,0,0,btnH); b.BackgroundColor3 = c3(22,18,35)
b.BackgroundTransparency = 0.1; b.Text = name
b.TextColor3 = c3(200,185,230); b.Font = Enum.Font.GothamBold
b.TextSize = mobScale(13,14); b.BorderSizePixel = 0
b.AutoButtonColor = false; b.ZIndex = 12; b.Parent = sf
ins("UICorner", b).CornerRadius = UDim.new(0,6)
b.MouseEnter:Connect(function() tw(b,0.1,{BackgroundTransparency=0}); playSound(SFX_CLICK,0.1,1.3) end)
b.MouseLeave:Connect(function() tw(b,0.1,{BackgroundTransparency=0.1}) end)
b.MouseButton1Click:Connect(function()
playSound(SFX_OPEN,0.3,1)
playEmote(id)
end)
end
-- ─────────────────────────────────────────────────────────
-- ANIMATION HELPERS
-- ─────────────────────────────────────────────────────────
local function loadAnim(animator, id)
local anim = ins("Animation"); anim.AnimationId = id
return animator:LoadAnimation(anim)
end
local function stopOthers(animator)
for _, t in ipairs(animator:GetPlayingAnimationTracks()) do
if t ~= headTrackRef and t ~= ca and t ~= faceTrackRef then t:Stop(0.25) end
end
end
local function stopCurrent()
if ca then ca:Stop(0.25); ca = nil end
end
local function updateFace(isEmoting, animator)
if not animator then return end
if isEmoting then
if faceTrackRef then
local ok2, fid = pcall(function() return faceTrackRef.Animation.AnimationId end)
if ok2 and fid == FACE_IDLE_ID then faceTrackRef:AdjustWeight(0); faceTrackRef = nil end
end
if not faceTrackRef then
local fa = ins("Animation"); fa.AnimationId = FACE_EMOTE_ID
faceTrackRef = animator:LoadAnimation(fa)
faceTrackRef.Priority = Enum.AnimationPriority.Action4; faceTrackRef.Looped = true
faceTrackRef:Play(0.25)
end
else
if faceTrackRef then
local ok2, fid = pcall(function() return faceTrackRef.Animation.AnimationId end)
if ok2 and fid == FACE_EMOTE_ID then faceTrackRef:AdjustWeight(0); faceTrackRef = nil end
end
if not faceTrackRef then
local fa = ins("Animation"); fa.AnimationId = FACE_IDLE_ID
faceTrackRef = animator:LoadAnimation(fa)
faceTrackRef.Priority = Enum.AnimationPriority.Action4; faceTrackRef.Looped = true
faceTrackRef:Play(0.25)
end
end
end
-- ─── SAFE ANIM ID READER ────────────────────────────────
-- Prevents errors when a track belongs to a destroyed animator
local function safeGetId(track)
if not track then return nil end
local ok2, id = pcall(function() return track.Animation.AnimationId end)
return ok2 and id or nil
end
local function updateLocomotion(char, hum, animator)
if not active or not char or not hum or not animator then return end
if ca and ca.IsPlaying then return end -- action (punch/block/emote) has control
local rp = char:FindFirstChild("HumanoidRootPart")
if not rp then return end
local vel = v3(rp.AssemblyLinearVelocity.X, 0, rp.AssemblyLinearVelocity.Z)
local moving = vel.Magnitude > 0.5
local state = "idle"
if moving then state = ir and "run" or "walk" end
local liveIdle = LIVE.idle
local liveWalk = LIVE.walk
local liveRun = LIVE.run
-- Stop tracks that shouldn't be playing
for k, t in pairs(st) do
if k ~= state and t and t.IsPlaying then t:Stop(0.25) end
end
if state == "idle" then
-- Reload if ID changed or track dead
if st.idle and st.idle.IsPlaying and safeGetId(st.idle) ~= liveIdle then
st.idle:Stop(0.25); st.idle = nil
end
if not st.idle or not st.idle.IsPlaying then
stopOthers(animator)
st.idle = loadAnim(animator, liveIdle)
st.idle.Priority = Enum.AnimationPriority.Idle; st.idle:Play(0.25)
end
hum.WalkSpeed = 16
elseif state == "walk" then
if st.walk and st.walk.IsPlaying and safeGetId(st.walk) ~= liveWalk then
st.walk:Stop(0.25); st.walk = nil
end
if not st.walk or not st.walk.IsPlaying then
stopOthers(animator)
st.walk = loadAnim(animator, liveWalk)
st.walk.Priority = Enum.AnimationPriority.Movement; st.walk:Play(0.1)
end
st.walk:AdjustSpeed(1.2); hum.WalkSpeed = 12
elseif state == "run" then
if st.run and st.run.IsPlaying and safeGetId(st.run) ~= liveRun then
st.run:Stop(0.25); st.run = nil
end
if not st.run or not st.run.IsPlaying then
stopOthers(animator)
st.run = loadAnim(animator, liveRun)
st.run.Priority = Enum.AnimationPriority.Movement; st.run:Play(0.25)
st.run:AdjustSpeed(2.4)
end
hum.WalkSpeed = 28
end
end
-- ─────────────────────────────────────────────────────────
-- ACTIONS
-- ─────────────────────────────────────────────────────────
function playEmote(id)
local char = lp.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local anim = hum and hum:FindFirstChildOfClass("Animator")
if not anim then return end
ef.Visible = false; stopCurrent(); stopOthers(anim)
local t = loadAnim(anim, id); ca = t
t.Looped = true; t.Priority = Enum.AnimationPriority.Action3
isConga = (id == C_ID)
hum.WalkSpeed = isConga and 8 or 0
t:Play(0.25); stopE.Visible = true; updateFace(true, anim)
task.spawn(function()
while ca == t and t.IsPlaying do stopOthers(anim); task.wait(0.1) end
end)
end
local function clearEmote()
stopCurrent(); isConga = false; stopE.Visible = false
playSound(SFX_CLOSE, 0.3, 0.9)
local char = lp.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local anim = hum and hum:FindFirstChildOfClass("Animator")
if hum then hum.WalkSpeed = ir and 26 or 16 end
if anim then updateFace(false, anim) end
end
-- ─────────────────────────────────────────────────────────
-- PUNCH
-- ─────────────────────────────────────────────────────────
local function doPunch()
if stopE.Visible then return end
local char = lp.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local rp = char and char:FindFirstChild("HumanoidRootPart")
local anim = hum and hum:FindFirstChildOfClass("Animator")
if not anim or not rp then return end
local comboEntry = ANIM_LIBRARY.punch[activeAnims.punch]
local combo = comboEntry.combo or { comboEntry.id }
local now = tick()
if now - lastPunchTime > COMBO_WINDOW then punchComboIndex = 1 end
lastPunchTime = now
local hitId = combo[punchComboIndex]
punchComboIndex = punchComboIndex % #combo + 1
stopCurrent(); stopOthers(anim)
local t = loadAnim(anim, hitId); ca = t
t.Priority = Enum.AnimationPriority.Action2
if t.Length == 0 then t:GetPropertyChangedSignal("Length"):Wait() end
local PUNCH_SPEED = 3.5
hum.WalkSpeed = 2
t:Play(0.08); t:AdjustSpeed(PUNCH_SPEED)
updateFace(true, anim)
local att = ins("Attachment", rp)
local vl = ins("LinearVelocity")
vl.MaxForce = 99999
vl.VectorVelocity = rp.CFrame.LookVector * 78
vl.Attachment0 = att; vl.Parent = rp
Debris:AddItem(vl, 0.12); Debris:AddItem(att, 0.12)
task.wait(t.Length / PUNCH_SPEED)
if ca == t then
t:Stop(0.2); ca = nil
hum.WalkSpeed = ir and 26 or 16
updateFace(false, anim)
end
end
-- ─────────────────────────────────────────────────────────
-- BLOCK
-- ─────────────────────────────────────────────────────────
local function doBlock()
if stopE.Visible then return end
local char = lp.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
local anim = hum and hum:FindFirstChildOfClass("Animator")
if not anim then return end
stopCurrent(); stopOthers(anim)
local t = loadAnim(anim, LIVE.block); ca = t
t.Priority = Enum.AnimationPriority.Action2
if t.Length == 0 then t:GetPropertyChangedSignal("Length"):Wait() end
hum.WalkSpeed = 0.1; t:Play(0.1); t:AdjustSpeed(3)
updateFace(true, anim)
task.wait((t.Length * 0.3) / 3); t:AdjustSpeed(1); t.Stopped:Wait()
task.wait(0.3)
if ca == t then ca = nil; hum.WalkSpeed = ir and 26 or 16; updateFace(false, anim) end
end
-- ─────────────────────────────────────────────────────────
-- SPRINT
-- ─────────────────────────────────────────────────────────
local function setRun(state)
ir = state
if rb then rb.ImageColor3 = ir and c3(120,200,100) or c3(255,255,255) end
if mobileSprint then
mobileSprint.BackgroundColor3 = ir and c3(18,32,14) or c3(14,22,14)
end
local char = lp.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if hum and not (ca and ca.IsPlaying) then hum.WalkSpeed = ir and 26 or 16 end
end
-- ─────────────────────────────────────────────────────────
-- INPUT BINDINGS
-- ─────────────────────────────────────────────────────────
UserInputService.InputBegan:Connect(function(input, gp)
if gp or not active then return end
if input.KeyCode == Enum.KeyCode.LeftShift then setRun(true)
elseif input.KeyCode == Enum.KeyCode.E then doPunch()
elseif input.KeyCode == Enum.KeyCode.Q then doBlock()
elseif input.KeyCode == Enum.KeyCode.LeftControl then
isSL = not isSL
if slb then slb.ImageColor3 = isSL and c3(100,180,255) or c3(255,255,255) end
end
end)
UserInputService.InputEnded:Connect(function(input, gp)
if gp or not active then return end
if input.KeyCode == Enum.KeyCode.LeftShift then setRun(false) end
end)
-- Desktop button bindings
if rb then rb.MouseButton1Down:Connect(function() setRun(true) end)
rb.MouseButton1Up:Connect(function() setRun(false) end)
rb.MouseLeave:Connect(function() if ir then setRun(false) end end) end
if slb then slb.MouseButton1Click:Connect(function()
isSL = not isSL
slb.ImageColor3 = isSL and c3(100,180,255) or c3(255,255,255)
playSound(SFX_CLICK, 0.35, isSL and 1.1 or 0.9)
end) end
if pb then pb.MouseButton1Click:Connect(doPunch) end
if bb then bb.MouseButton1Click:Connect(doBlock) end
-- Mobile button bindings
if mobileSprint then
mobileSprint.MouseButton1Down:Connect(function() setRun(true) end)
mobileSprint.MouseButton1Up:Connect(function() setRun(false) end)
mobileSprint.TouchLongPress:Connect(function() setRun(false) end)
end
if mobilePunch then mobilePunch.MouseButton1Click:Connect(doPunch) end
if mobileBlock then mobileBlock.MouseButton1Click:Connect(doBlock) end
if mobileShiftlock then
mobileShiftlock.MouseButton1Click:Connect(function()
isSL = not isSL
mobileShiftlock.BackgroundColor3 = isSL and c3(14,20,28) or c3(12,16,22)
playSound(SFX_CLICK,0.35,isSL and 1.1 or 0.9)
end)
end
if mobileEmote then
mobileEmote.MouseButton1Click:Connect(function()
ef.Visible = not ef.Visible
if ef.Visible then animPanel.Visible = false end
playSound(ef.Visible and SFX_OPEN or SFX_CLOSE,0.3,1)
end)
end
stopE.MouseButton1Click:Connect(clearEmote)
xb.MouseButton1Click:Connect(function() cf.Visible = true end)
bn.MouseButton1Click:Connect(function() cf.Visible = false end)
addEmoteBtn("California Girls", E1_ID)
addEmoteBtn("Conga!", C_ID)
addEmoteBtn("Bag Up", BU_ID)
addEmoteBtn("Metro Man", MM_ID)
addEmoteBtn("Subject Theee", S3_ID)
addEmoteBtn("Caramelldansen", CD_ID)
addEmoteBtn("Unemployment", UN_ID)
addEmoteBtn("Bang Bang!", DP_ID)
addEmoteBtn("Stretching", WW_ID)
addEmoteBtn("2011x Taunt", X_ID)
addEmoteBtn("Low Cortisol", LW_ID)
addEmoteBtn("S RANK!", S_ID)
addEmoteBtn("Two time ritual", RI_ID)
-- ─────────────────────────────────────────────────────────
-- TOP RIGHT HUD BUTTONS
-- ─────────────────────────────────────────────────────────
local hudConnections = {}
local hudHidden = false
local buttonHolder = ins("Frame")
buttonHolder.Size = ud2(0,264,0,40); buttonHolder.Position = ud2(1,60,0,20)
buttonHolder.BackgroundTransparency = 1; buttonHolder.Parent = gui
local bLayout = ins("UIListLayout")
bLayout.FillDirection = Enum.FillDirection.Horizontal
bLayout.HorizontalAlignment = Enum.HorizontalAlignment.Right
bLayout.Padding = UDim.new(0,8); bLayout.Parent = buttonHolder
local function makeHudBtn(text)
local btn = ins("TextButton")
btn.Size = ud2(0,122,0,34); btn.BackgroundColor3 = c3(20,18,28)
btn.Text = text; btn.TextColor3 = c3(210,200,240)
btn.Font = Enum.Font.GothamBold; btn.TextSize = 12
btn.BorderSizePixel = 0; btn.AutoButtonColor = false
ins("UICorner", btn).CornerRadius = UDim.new(0,8)
local bs = ins("UIStroke"); bs.Color = c3(80,65,110); bs.Thickness = 1; bs.Transparency = 0.3; bs.Parent = btn
btn.MouseEnter:Connect(function() tw(btn,0.15,{BackgroundColor3=c3(38,30,58)}); playSound(SFX_CLICK,0.1,1.4) end)
btn.MouseLeave:Connect(function() tw(btn,0.15,{BackgroundColor3=c3(20,18,28)}) end)
btn.MouseButton1Click:Connect(function() playSound(SFX_CLICK,0.4,1) end)
return btn
end
local hideButton = makeHudBtn("Hide HUD")
local unloadButton = makeHudBtn("Unload HUD")
hideButton.Parent = buttonHolder; unloadButton.Parent = buttonHolder
local hudHidePos = isMobile and ud2(0.5,0,0,-500) or ud2(0,-500,1,-20)
local hudShowPos = isMobile and ud2(0.5,0,0,16) or ud2(0,18,1,-20)
table.insert(hudConnections, hideButton.MouseButton1Click:Connect(function()
hudHidden = not hudHidden
if hudHidden then
tw(holder,0.35,{Position=hudHidePos}); hideButton.Text = "Show HUD"
else
tw(holder,0.5,{Position=hudShowPos}); hideButton.Text = "Hide HUD"
end
end))
table.insert(hudConnections, unloadButton.MouseButton1Click:Connect(function()
tw(holder,0.35,{Position=hudHidePos})
tw(buttonHolder,0.3,{Position=ud2(1,60,0,20)})
task.wait(0.4)
for _, c in pairs(hudConnections) do c:Disconnect() end
gui:Destroy()
end))
-- ─────────────────────────────────────────────────────────
-- SPLASH SCREEN
-- ─────────────────────────────────────────────────────────
local splashBG = ins("Frame")
splashBG.Size = ud2(1,0,1,0); splashBG.BackgroundColor3 = c3(6,6,10)
splashBG.BackgroundTransparency = 0; splashBG.ZIndex = 100; splashBG.Parent = gui
local splashW = mobScale(420, math.min(workspace.CurrentCamera.ViewportSize.X - 20, 360))
local splash = ins("Frame")
splash.AnchorPoint = v2(0.5,0.5); splash.Position = ud2(0.5,0,0.58,0)
splash.Size = ud2(0,splashW,0,268); splash.BackgroundColor3 = c3(14,12,22)
splash.BackgroundTransparency = 1; splash.BorderSizePixel = 0
splash.ZIndex = 101; splash.Parent = gui
ins("UICorner", splash).CornerRadius = UDim.new(0,14)
local sps = ins("UIStroke"); sps.Color = c3(90,60,150); sps.Thickness = 1.5; sps.Transparency = 0.3; sps.Parent = splash
local splashAccent = ins("Frame")
splashAccent.Size = ud2(0,0,0,2); splashAccent.Position = ud2(0.5,0,0,0)
splashAccent.AnchorPoint = v2(0.5,0); splashAccent.BackgroundColor3 = c3(130,80,230)
splashAccent.BorderSizePixel = 0; splashAccent.ZIndex = 102; splashAccent.Parent = splash
ins("UICorner", splashAccent).CornerRadius = UDim.new(1,0)
local function makeSplashLbl(text, size, color, yPos, font)
local lbl = ins("TextLabel")
lbl.BackgroundTransparency = 1; lbl.Position = ud2(0,0,0,yPos)
lbl.Size = ud2(1,0,0,size+10); lbl.Font = font or Enum.Font.GothamBlack
lbl.Text = text; lbl.TextColor3 = color; lbl.TextSize = size
lbl.TextTransparency = 1; lbl.ZIndex = 102; lbl.Parent = splash
return lbl
end
local titleLbl = makeSplashLbl("FORSAKEN", mobScale(44,38), c3(255,255,255), 36)
local subtitleLbl = makeSplashLbl("GUEST FE USE • R15", 14, c3(140,90,230), 90, Enum.Font.GothamBold)
local versionLbl = makeSplashLbl("v5.1 — Fixed + Mobile UI", 11, c3(90,75,115), 118, Enum.Font.Gotham)
local splashDiv = ins("Frame")
splashDiv.Size = ud2(0,0,0,1); splashDiv.Position = ud2(0.5,0,0,112)
splashDiv.AnchorPoint = v2(0.5,0); splashDiv.BackgroundColor3 = c3(60,50,85)
splashDiv.BackgroundTransparency = 1; splashDiv.BorderSizePixel = 0
splashDiv.ZIndex = 102; splashDiv.Parent = splash
local startBtn = ins("TextButton")
startBtn.AnchorPoint = v2(0.5,0); startBtn.Position = ud2(0.5,0,0,155)
startBtn.Size = ud2(0,mobScale(180,220),0,mobScale(46,54))
startBtn.BackgroundColor3 = c3(100,60,195); startBtn.BackgroundTransparency = 1
startBtn.Text = "START"; startBtn.TextColor3 = c3(255,255,255); startBtn.TextTransparency = 1
startBtn.Font = Enum.Font.GothamBlack; startBtn.TextSize = mobScale(15,17)
startBtn.BorderSizePixel = 0; startBtn.AutoButtonColor = false
startBtn.ZIndex = 102; startBtn.Parent = splash
ins("UICorner", startBtn).CornerRadius = UDim.new(0,10)
local sbtnS = ins("UIStroke"); sbtnS.Color = c3(160,110,255); sbtnS.Thickness = 1; sbtnS.Transparency = 0.4; sbtnS.Parent = startBtn
startBtn.MouseEnter:Connect(function()
tw(startBtn,0.15,{BackgroundColor3=c3(120,78,215)})
tw(startBtn,0.15,{Size=ud2(0,mobScale(190,230),0,mobScale(46,54))})
playSound(SFX_CLICK,0.12,1.4)
end)
startBtn.MouseLeave:Connect(function()
tw(startBtn,0.15,{BackgroundColor3=c3(100,60,195)})
tw(startBtn,0.15,{Size=ud2(0,mobScale(180,220),0,mobScale(46,54))})
end)
task.defer(function()
tw(blur,0.6,{Size=28})
tw(splash,0.4,{Position=ud2(0.5,0,0.5,0),BackgroundTransparency=0})
task.wait(0.3)
tw(splashAccent,0.5,{Size=ud2(0,splashW-60,0,2)})
task.wait(0.18)
tw(titleLbl,0.35,{TextTransparency=0}); task.wait(0.1)
tw(subtitleLbl,0.35,{TextTransparency=0}); task.wait(0.1)
tw(splashDiv,0.35,{Size=ud2(0,splashW-60,0,1),BackgroundTransparency=0}); task.wait(0.08)
tw(versionLbl,0.3,{TextTransparency=0}); task.wait(0.12)
tw(startBtn,0.35,{TextTransparency=0,BackgroundTransparency=0})
end)
startBtn.MouseButton1Click:Connect(function()
playSound(SFX_OPEN,0.5,1)
tw(startBtn,0.1,{BackgroundColor3=c3(200,160,255)})
task.wait(0.1)
TweenService:Create(splash,TweenInfo.new(0.25,Enum.EasingStyle.Quint),{BackgroundTransparency=1,Position=ud2(0.5,0,0.44,0)}):Play()
TweenService:Create(splashBG,TweenInfo.new(0.25,Enum.EasingStyle.Quint),{BackgroundTransparency=1}):Play()
for _, lbl in ipairs({titleLbl,subtitleLbl,versionLbl}) do tw(lbl,0.2,{TextTransparency=1}) end
tw(startBtn,0.2,{TextTransparency=1,BackgroundTransparency=1})
tw(splashDiv,0.2,{BackgroundTransparency=1})
tw(splashAccent,0.2,{BackgroundTransparency=1})
tw(blur,0.7,{Size=0})
task.wait(0.4)
splashBG:Destroy(); splash:Destroy(); blur:Destroy()
-- Animate HUD in
if isMobile then
tw(holder,0.55,{Position=ud2(0.5,0,0,16)})
else
tw(holder,0.55,{Position=ud2(0,18,1,-20)})
end
task.wait(0.15)
tw(buttonHolder,0.45,{Position=ud2(1,-280,0,20)})
end)
-- ─────────────────────────────────────────────────────────
-- HUD BARS UPDATE
-- ─────────────────────────────────────────────────────────
local MAX_STAMINA = 100
local stamina = 100
local function tweenBar(bar, pct)
TweenService:Create(bar,
TweenInfo.new(0.13,Enum.EasingStyle.Sine),
{Size=ud2(math.clamp(pct,0,1),0,1,0)}
):Play()
end
local prevHp = -1
local function updateHealthBar()
local char = lp.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if not hum then return end
local hp, max = hum.Health, hum.MaxHealth
if math.abs(hp - prevHp) < 0.1 then return end
prevHp = hp
local pct = hp / max
tweenBar(healthFill, pct)
healthText.Text = math.floor(hp) .. "/" .. math.floor(max)
tw(healthFill,0.15,{BackgroundColor3 = pct < 0.3 and c3(255,30,30) or hpNorm})
end
local prevSt = -1
local function updateStaminaBar()
local pct = stamina / MAX_STAMINA
if math.abs(pct - prevSt) < 0.005 then return end
prevSt = pct
tweenBar(staminaFill, pct)
staminaText.Text = math.floor(stamina) .. "/" .. MAX_STAMINA
tw(staminaFill,0.15,{BackgroundColor3 = pct < 0.15 and stLow or stNorm})
end
-- ─────────────────────────────────────────────────────────
-- UNLOAD YES
-- ─────────────────────────────────────────────────────────
by.MouseButton1Click:Connect(function()
active = false; getgenv().forsakenthingyguys = nil
-- Stop the render loop
if renderConn then renderConn:Disconnect(); renderConn = nil end
local char = lp.Character
if char then
local hum = char:FindFirstChildOfClass("Humanoid")
local anim = hum and hum:FindFirstChildOfClass("Animator")
if anim then for _, t in ipairs(anim:GetPlayingAnimationTracks()) do t:Stop(0) end end
if hum then hum.WalkSpeed = 16; hum.JumpPower = 50; hum:SetStateEnabled(Enum.HumanoidStateType.Seated,true) end
for _, s in ipairs(char:GetDescendants()) do
if s:IsA("Script") and s.Name == "Animate" then s.Disabled=false; s.Enabled=false; s.Enabled=true; break end
end
end
for _, c in pairs(animateConns) do c:Disconnect() end
animateConns = {}
if charAddedConn then charAddedConn:Disconnect(); charAddedConn = nil end
sg:Destroy(); gui:Destroy()
end)
-- ─────────────────────────────────────────────────────────
-- CHARACTER MAIN (all the bug fixes live here)
-- ─────────────────────────────────────────────────────────
local function watchAnimate(char)
-- Disconnect old per-character animate watchers before adding new ones
for _, c in pairs(animateConns) do c:Disconnect() end
animateConns = {}
local conn = char.DescendantAdded:Connect(function(d)
if d:IsA("Script") and d.Name == "Animate" then d.Disabled = true end
end)
table.insert(animateConns, conn)
for _, o in ipairs(char:GetDescendants()) do
if o:IsA("Script") and o.Name == "Animate" then o.Disabled = true end
end
end
local function main(char)
local hum = char:WaitForChild("Humanoid")
-- ── CRITICAL: reset all animation state for this new character ──
if renderConn then renderConn:Disconnect(); renderConn = nil end
ca = nil
st = {}
headTrackRef = nil
faceTrackRef = nil
isConga = false
ir = false
punchComboIndex = 1
lastPunchTime = 0
-- ────────────────────────────────────────────────────────────────
if hum.RigType == Enum.HumanoidRigType.R6 then
sg.Enabled = false
local wGui = ins("ScreenGui"); wGui.Name = "R6Warning"; wGui.Parent = playerGui
local wBg = ins("Frame"); wBg.Size = ud2(0,300,0,75); wBg.Position = ud2(0.5,0,0.15,0)
wBg.AnchorPoint = v2(0.5,0.5); wBg.BackgroundColor3 = c3(10,9,16); wBg.BorderSizePixel = 0; wBg.Parent = wGui
ins("UICorner", wBg).CornerRadius = UDim.new(0,10)
local ws = ins("UIStroke"); ws.Color = c3(160,30,60); ws.Thickness = 1; ws.Parent = wBg
local wTxt = ins("TextLabel"); wTxt.Size = ud2(1,0,1,0); wTxt.BackgroundTransparency = 1
wTxt.Text = "R15 REQUIRED — R6 NOT SUPPORTED"; wTxt.TextColor3 = c3(255,60,80)
wTxt.Font = Enum.Font.GothamBold; wTxt.TextSize = 16; wTxt.Parent = wBg
task.spawn(function()
task.wait(3); tw(wBg,1,{BackgroundTransparency=1}); tw(wTxt,1,{TextTransparency=1}); task.wait(1); wGui:Destroy()
end)
return
else
sg.Enabled = true
local old = playerGui:FindFirstChild("R6Warning")
if old then old:Destroy() end
end
local animator = hum:WaitForChild("Animator")
-- Kill the default Animate script and stop all existing tracks
for _, o in ipairs(char:GetDescendants()) do
if o:IsA("Script") and o.Name == "Animate" then o.Disabled = true; break end
end
for _, t in ipairs(animator:GetPlayingAnimationTracks()) do t:Stop(0) end
for _, t in ipairs(hum:GetPlayingAnimationTracks()) do t:Stop(0) end
hum.JumpPower = 0; hum:SetStateEnabled(Enum.HumanoidStateType.Seated, false)
-- Load initial idle
local it = loadAnim(animator, LIVE.idle)
it.Priority = Enum.AnimationPriority.Idle; it:Play(0.25); st.idle = it
-- Head turn track
local headAnim = ins("Animation"); headAnim.AnimationId = H_ID
headTrackRef = animator:LoadAnimation(headAnim)
headTrackRef.Priority = Enum.AnimationPriority.Action4
headTrackRef:Play(0,1,0); headTrackRef:AdjustWeight(0.2)
updateFace(false, animator)
-- Per-frame state
local currentYaw = 0; local targetYaw = 0
local yawVelocity = 0; local yawAccel = 0; local prevTarget = 0
-- ── Single RenderStepped connection stored at module scope ──────
renderConn = RunService.RenderStepped:Connect(function(dt)
if not active or not char or not char.Parent then
renderConn:Disconnect(); renderConn = nil; return
end
updateLocomotion(char, hum, animator)
updateHealthBar()
stamina = math.clamp(stamina + (ir and -12 or 9)*dt, 0, MAX_STAMINA)
updateStaminaBar()
local rp = char:FindFirstChild("HumanoidRootPart")
if not rp then return end
local targetFov = (ir and hum.MoveDirection.Magnitude > 0) and 80 or 70
camera.FieldOfView = camera.FieldOfView + (targetFov - camera.FieldOfView) * math.min(dt*2,1)
if isSL then
local cl = camera.CFrame.LookVector
local targetCF = CFrame.lookAt(rp.Position, rp.Position + v3(cl.X,0,cl.Z))
rp.CFrame = rp.CFrame:Lerp(targetCF, 0.5)
elseif hum.MoveDirection.Magnitude > 0 then
local targetCF = CFrame.lookAt(rp.Position, rp.Position + hum.MoveDirection)
rp.CFrame = rp.CFrame:Lerp(targetCF, 0.1)
end
if isConga then hum:Move(rp.CFrame.LookVector) end
if not (ca and ca.IsPlaying) then
local camObj = rp.CFrame:VectorToObjectSpace(camera.CFrame.LookVector)
targetYaw = math.clamp(-math.atan2(camObj.X,-camObj.Z), -math.rad(75), math.rad(75))
local delta = targetYaw - currentYaw
local pred = (targetYaw - prevTarget) * 8
prevTarget = targetYaw
yawAccel = (yawAccel + (delta+pred)*12*dt) * 0.92
yawVelocity = yawVelocity*0.98 + yawAccel*dt
currentYaw = currentYaw + yawVelocity*dt
currentYaw = currentYaw + (targetYaw-currentYaw)*math.min(dt*3,0.15)
else
yawAccel = (yawAccel + (0-currentYaw)*12*dt) * 0.92
yawVelocity = yawVelocity*0.98 + yawAccel*dt
currentYaw = currentYaw + yawVelocity*dt
currentYaw = currentYaw + (0-currentYaw)*math.min(dt*3,0.15)
end
local yawMapped = currentYaw < 0 and currentYaw + math.pi*2 or currentYaw
if headTrackRef and headTrackRef.Length > 0 then
headTrackRef.TimePosition = (yawMapped/(math.pi*2)) * headTrackRef.Length
end
end)
end
charAddedConn = lp.CharacterAdded:Connect(function(char)
watchAnimate(char); main(char)
end)
if lp.Character then
watchAnimate(lp.Character); task.spawn(main, lp.Character)
endNo comments yet for this script.



