-- [[ MINECRAFT WITHER BOSS - BEDROCK ARTILLERY & FLING OVERLOAD V6.0.9 ]] -- -- Engine Core: DYTON_txt (Engine Reset Layout) -- Josep Bart Core: Absolute Head Tumpuk, Pet Breath & Levitation Sway Idle Animation local Players = game:GetService("Players") local LP = Players.LocalPlayer local RS = game:GetService("RunService") local UIS = game:GetService("UserInputService") local CoreGui = game:GetService("CoreGui") local OwnerName = LP.Name local petMode = false local rampageMode = false local wingRemoteCache = {} local PERMANENT_PROP_LOCK = {} local currentCFrames = {} local lastNetworkUpdate = 0 local lastColorUpdate = 0 local lastScanTime = 0 local colorIndex = 1 -- [[ ANIMATION & ADAPTIVE SYSTEM VARIABLES ]] -- local isSummoning = false local summonStartTime = 0 local summonOriginPos = Vector3.zero local rampageBlacklist = {} local targetAttackTrack = { player = nil, startTime = 0, initialPos = Vector3.zero } local hasFetchedBall = false -- [[ ADAPTIVE VARIABLE CONTROL ]] -- local estimatedPing = 0.03 local witherCurrentPos = Vector3.zero local lastAttackTime = 0 local activeProjectiles = {} local lastLookAtPos = Vector3.zero -- ============================================================================= -- [[ CONFIGURASI MANUAL WITHER BOSS - BY JOSEP BART ]] -- -- ============================================================================= local WITHER_SPEED = 8 -- Kecepatan terbang Wither mengejar target local PROJECTILE_SPEED = 15 -- Dipercepat agar proyektil melesat responsif local ATTACK_COOLDOWN = 1.3 -- Cooldown jeda tembakan (detik) local HOVER_HEIGHT = 24 -- Tinggi Wither melayang di atas kepala target local RANDOM_DRIFT_SCALE = 50 -- Jangkauan gerak acak Wither saat menyerang local RAMPAGE_RADIUS = 400 -- Jarak maksimal Wither mau mengejar target local SUMMON_DURATION = 11.5 -- Durasi waktu animasi spawn (detik) local IMPACT_LINGER_TIME = 0.5 -- Durasi proyektil nempel + Fling di badan target local MAX_STUCK_TIME = 6.0 -- Batas waktu toleransi jika target kebal sebelum di-skip -- [[ PENGATURAN POSISI WITHER SAAT JADI PET (Belakang Player) ]] -- local PET_OFFSET = Vector3.new(-5, 6, 1) -- (Kanan/Kiri, Atas/Bawah, Belakang/Depan) local MANUAL_ROTATION = Vector3.new(-20, 360, 0) local TargetPlayer = nil -- ============================================================================= local COLORS = { AbyssRed = Color3.fromRGB(100, 0, 180), DarkAbyss = Color3.fromRGB(30, 0, 60), Void = Color3.fromRGB(10, 0, 20), Accent = Color3.fromRGB(255, 255, 255), SuccessGreen = Color3.fromRGB(0, 255, 120), WarningRed = Color3.fromRGB(15, 30, 60), PureWhiteOnly = Color3.fromRGB(255, 255, 255), SoulArmorWhite = Color3.fromRGB(0, 0, 0), SoulAuraBlue = Color3.fromRGB(180, 220, 255) } local function getAbyssColor(t, offset) if isSummoning then return COLORS.PureWhiteOnly elseif rampageMode then local cycle = (t * 1.5 + (offset * 0.15)) % 1 return cycle < 0.5 and COLORS.SoulArmorWhite:Lerp(COLORS.SoulAuraBlue, cycle * 2) or COLORS.SoulAuraBlue:Lerp(COLORS.SoulArmorWhite, (cycle - 0.5) * 2) else local cycle = (t * 0.3 + (offset * 0.1)) % 1 return cycle < 0.5 and COLORS.AbyssRed:Lerp(COLORS.DarkAbyss, cycle * 2) or COLORS.DarkAbyss:Lerp(COLORS.Void, (cycle - 0.5) * 2) end end local function getOff(base, target) return base:ToObjectSpace(target) end local baseRef = CFrame.new(199.91932678222656, 12.894913673400879, -64.45938873291016, -0.9999717473983765, 0.0023622966837137938, -0.007140748668462038, 0.00002453153138048947, 0.9504163265228271, 0.31098055839538574, 0.0075213126838207245, 0.31097161769866943, -0.9503894448280334) local WitherParts = { getOff(baseRef, CFrame.new(199.91932678222656, 12.894913673400879, -64.45938873291016, -0.9999717473983765, 0.0023622966837137938, -0.007140748668462038, 0.00002453153138048947, 0.9504163265228271, 0.31098055839538574, 0.0075213126838207245, 0.31097161769866943, -0.9503894448280334)), -- [1] Kepala Tengah (Utama) getOff(baseRef, CFrame.new(203.3807373046875, 12.144608497619629, -64.58366394042969, -0.9881877899169922, 0.0020154754165560007, 0.15324385464191437, 0.04300922527909279, 0.9633787870407104, 0.2646729052066803, -0.14709845185279846, 0.26813700795173645, -0.9520856738090515)), -- [2] Kepala Kanan getOff(baseRef, CFrame.new(196.47140502929688, 12.144608497619629, -64.46726989746094, -0.9922080039978027, 0.0019081804202869534, -0.12461142241954803, -0.030268877744674683, 0.9662537574768066, 0.255808562040329, 0.12089492380619049, 0.25758394598960876, -0.9586628675460815)), -- [3] Kepala Kiri getOff(baseRef, CFrame.new(200.55374145507812, 9.997815132141113, -65.8962631225586, 0.011634256690740585, -0.9998592734336853, 0.01209464855492115, -0.9996784925460815, -0.011900508776307106, -0.022389855235815048, 0.02253078483045101, -0.011830298230051994, -0.9996806383132935)), getOff(baseRef, CFrame.new(201.73304748535156, 11.699615478515625, -65.55762481689453, -0.9997870922088623, -0.020352469757199287, 0.0034083069767802954, -0.020009975880384445, 0.9965177774429321, 0.08094435930252075, -0.005043855868279934, 0.08085893094539642, -0.9967127442359924)), getOff(baseRef, CFrame.new(197.95692443847656, 11.64893627166748, -65.57623291015625, -0.9997870922088623, -0.020352384075522423, 0.003408305812627077, -0.020009886473417282, 0.9965177774429321, 0.08094478398561478, -0.005043855868279934, 0.08085934817790985, -0.9967127442359924)), getOff(baseRef, CFrame.new(199.9916534423828, 9.876144409179688, -65.82450103759766, -0.9997870922088623, -0.020351946353912354, 0.0034083069767802954, -0.020009439438581467, 0.9965176582336426, 0.08094686269760132, -0.005043855868279934, 0.08086142688989639, -0.9967127442359924)), getOff(baseRef, CFrame.new(200.1062469482422, 8.116905212402344, -65.7476577758789, -0.9997904300689697, -0.020351704210042953, 0.0034083081409335136, -0.020009208470582962, 0.9965173006057739, 0.08094825595617294, -0.005043872632086277, 0.08086279034614563, -0.9967158436775208)), getOff(baseRef, CFrame.new(200.07086181640625, 6.217313766479492, -65.79713439941406, -0.9997870922088623, -0.020351329818367958, 0.0034082906786352396, -0.020008813589811325, 0.9965173006057739, 0.08094976842403412, -0.005043855868279934, 0.0808643251657486, -0.9967123866081238)), getOff(baseRef, CFrame.new(200.62400817871094, 6.589557647705078, -66.70326232910156, 0.014601275324821472, -0.999857485294342, 0.008065760135650635, -0.9589880108833313, -0.01172405481338501, 0.2832024097442627, -0.2830718159675598, -0.011869758367538452, -0.9590224027633667)) } local function GetBallSilent() local b = LP.Backpack:FindFirstChild("SoccerBall") or (LP.Character and LP.Character:FindFirstChild("SoccerBall")) if not b and not hasFetchedBall then hasFetchedBall = true pcall(function() game:GetService("ReplicatedStorage").RE:FindFirstChild("1Too1l"):InvokeServer("PickingTools", "SoccerBall") end) end local ballsFolder = workspace:FindFirstChild("WorkspaceCom") and workspace.WorkspaceCom:FindFirstChild("001_SoccerBalls") if ballsFolder then local ball = ballsFolder:FindFirstChild("Soccer" .. LP.Name) if ball then ball.CanCollide = false return ball end end return nil end local function FindNearestPrey() local nearestPlayer = nil local shortestDistance = RAMPAGE_RADIUS local myPos = witherCurrentPos for _, p in ipairs(Players:GetPlayers()) do if p ~= LP and Players:FindFirstChild(p.Name) and not rampageBlacklist[p.Name] then local char = p.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum and hum.Health > 0 and not hum.Sit then local torso = char:FindFirstChild("Torso") or char:FindFirstChild("UpperTorso") or char:FindFirstChild("HumanoidRootPart") if torso then local dist = (myPos - torso.Position).Magnitude if dist < shortestDistance then shortestDistance = dist nearestPlayer = p end end end end end end return nearestPlayer end -- [[ GUI SYSTEM V6.0.9 ]] -- local sg = Instance.new("ScreenGui", CoreGui) sg.Name = "Abyss_Wither_Control" local main = Instance.new("Frame", sg) main.Size, main.Position = UDim2.new(0, 180, 0, 165), UDim2.new(0.05, 0, 0.4, 0) main.BackgroundColor3, main.BorderSizePixel = Color3.fromRGB(10, 10, 10), 0 main.ClipsDescendants = true local titleBar = Instance.new("Frame", main) titleBar.Size, titleBar.BackgroundColor3 = UDim2.new(1, 0, 0, 25), Color3.fromRGB(25, 25, 25) titleBar.BorderSizePixel = 0 local titleLabel = Instance.new("TextLabel", titleBar) titleLabel.Size, titleLabel.Position = UDim2.new(1, -10, 1, 0), UDim2.new(0, 5, 0, 0) titleLabel.BackgroundTransparency, titleLabel.Text = 1, "Wither Of Soulking V6.0.9" titleLabel.TextColor3, titleLabel.Font, titleLabel.TextSize = Color3.new(1, 1, 1), Enum.Font.SourceSansBold, 12 titleLabel.TextXAlignment = Enum.TextXAlignment.Left local ballStatusLabel = Instance.new("TextLabel", main) ballStatusLabel.Size = UDim2.new(1, -10, 0, 15) ballStatusLabel.Position = UDim2.new(0, 5, 1, -30) ballStatusLabel.BackgroundTransparency = 1 ballStatusLabel.Text = "BALL: FETCHING..." ballStatusLabel.TextColor3 = Color3.fromRGB(200, 200, 200) ballStatusLabel.Font = Enum.Font.Code ballStatusLabel.TextSize = 10 ballStatusLabel.TextXAlignment = Enum.TextXAlignment.Left local creditLabel = Instance.new("TextLabel", main) creditLabel.Size, creditLabel.Position = UDim2.new(1, 0, 0, 15), UDim2.new(0, 0, 1, -15) creditLabel.BackgroundTransparency, creditLabel.Text = 1, "By DYTON_txt " creditLabel.TextColor3, creditLabel.Font, creditLabel.TextSize = COLORS.Accent, Enum.Font.Code, 10 local dragging, dragStart, startPos titleBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging, dragStart, startPos = true, input.Position, main.Position end end) UIS.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart main.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) local function styleBtn(b) b.BackgroundColor3, b.BorderSizePixel, b.BorderColor3 = COLORS.Void, 1, Color3.fromRGB(40, 40, 40) b.TextColor3, b.Font, b.TextSize = Color3.new(0.8, 0.8, 0.8), Enum.Font.SourceSansBold, 11 b.MouseEnter:Connect(function() b.BorderColor3 = (rampageMode and COLORS.SoulAuraBlue or COLORS.Accent) b.TextColor3 = Color3.new(1,1,1) end) b.MouseLeave:Connect(function() b.BorderColor3 = Color3.fromRGB(40, 40, 40) b.TextColor3 = Color3.new(0.8,0.8,0.8) end) end local container = Instance.new("Frame", main) container.Size, container.Position, container.BackgroundTransparency = UDim2.new(1, -10, 1, -65), UDim2.new(0, 5, 0, 30), 1 local function createBtn(txt, pos, size) local b = Instance.new("TextButton", container) b.Text, b.Position, b.Size = txt, pos, size styleBtn(b) return b end local SummonBtn = createBtn("ACTIVATE WITHER", UDim2.new(0,0,0,0), UDim2.new(1,0,0.28,0)) local TargetBox = Instance.new("TextBox", container) TargetBox.Size = UDim2.new(1, 0, 0.26, 0) TargetBox.Position = UDim2.new(0, 0, 0.34, 0) TargetBox.BackgroundColor3 = Color3.fromRGB(5, 5, 5) TargetBox.BorderSizePixel = 1 TargetBox.BorderColor3 = Color3.fromRGB(40, 40, 40) TargetBox.TextColor3 = Color3.fromRGB(180, 180, 180) TargetBox.PlaceholderText = "Type Target & Press Enter" TargetBox.PlaceholderColor3 = Color3.fromRGB(80, 80, 80) TargetBox.Font = Enum.Font.Code TargetBox.TextSize = 10 TargetBox.ClearTextOnFocus = false local RampageBtn = createBtn("TARGET ALL: OFF", UDim2.new(0, 0, 0.66, 0), UDim2.new(1, 0, 0.28, 0)) TargetBox.FocusLost:Connect(function(enterPressed) if enterPressed then if rampageMode then return end local searchKey = TargetBox.Text:lower() if searchKey == "" then TargetPlayer = nil TargetBox.Text = "" TargetBox.BorderColor3 = Color3.fromRGB(40, 40, 40) return end local found = false for _, p in ipairs(Players:GetPlayers()) do if p.Name:lower():find(searchKey) or p.DisplayName:lower():find(searchKey) then TargetPlayer = p TargetBox.Text = p.DisplayName TargetBox.BorderColor3 = COLORS.SuccessGreen found = true break end end if not found then TargetPlayer = nil TargetBox.Text = "[NOT FOUND]" TargetBox.BorderColor3 = COLORS.WarningRed task.wait(1) TargetBox.Text = "" TargetBox.BorderColor3 = Color3.fromRGB(40, 40, 40) end end end) SummonBtn.MouseButton1Click:Connect(function() petMode = not petMode if petMode then SummonBtn.TextColor3 = COLORS.Accent SummonBtn.Text = "DEACTIVATE WITHER" hasFetchedBall = false local char = LP.Character if char and char:FindFirstChild("HumanoidRootPart") then summonOriginPos = char.HumanoidRootPart.Position witherCurrentPos = summonOriginPos lastLookAtPos = summonOriginPos + Vector3.new(0, 0, -1) isSummoning = true summonStartTime = tick() end local p = workspace:WaitForChild("WorkspaceCom"):WaitForChild("001_TrafficCones") local targetName = (OwnerName == "terasiremik") and "Propterasiremik" or ("Prop" .. OwnerName) local rawProps = {} for _, v in ipairs(p:GetChildren()) do if v.Name == targetName then table.insert(rawProps, v) end end for id, storedProp in pairs(PERMANENT_PROP_LOCK) do if not storedProp or not storedProp.Parent then PERMANENT_PROP_LOCK[id] = nil end end for _, prop in ipairs(rawProps) do local alreadyRegistered = false for id, storedProp in pairs(PERMANENT_PROP_LOCK) do if storedProp == prop then alreadyRegistered = true break end end if not alreadyRegistered then for id = 1, 15 do if not PERMANENT_PROP_LOCK[id] then PERMANENT_PROP_LOCK[id] = prop break end end end end wingRemoteCache = {} for id = 1, 15 do if PERMANENT_PROP_LOCK[id] and PERMANENT_PROP_LOCK[id].Parent then table.insert(wingRemoteCache, PERMANENT_PROP_LOCK[id]) end end else SummonBtn.TextColor3 = Color3.new(0.8,0.8,0.8) SummonBtn.Text = "ACTIVATE WITHER" rampageMode = false isSummoning = false hasFetchedBall = false RampageBtn.Text = "TARGET ALL: OFF" RampageBtn.TextColor3 = Color3.new(0.8, 0.8, 0.8) TargetBox.Text = "" TargetBox.BorderColor3 = Color3.fromRGB(40, 40, 40) table.clear(currentCFrames) table.clear(activeProjectiles) table.clear(rampageBlacklist) end end) RampageBtn.MouseButton1Click:Connect(function() if not petMode or isSummoning then return end rampageMode = not rampageMode if rampageMode then table.clear(rampageBlacklist) RampageBtn.Text = "SOUL RAMPAGE: ACTIVE " RampageBtn.TextColor3 = COLORS.SoulAuraBlue TargetBox.Text = "[SOUL HUNTER]" TargetBox.BorderColor3 = COLORS.SoulAuraBlue else rampageMode = false RampageBtn.Text = "TARGET ALL: OFF" RampageBtn.TextColor3 = Color3.new(0.8, 0.8, 0.8) TargetPlayer = nil TargetBox.Text = "" TargetBox.BorderColor3 = Color3.fromRGB(40, 40, 40) end end) local function getTargetTorso(player) if not player or not player.Parent or not Players:FindFirstChild(player.Name) or not player.Character then return nil end local char = player.Character return char:FindFirstChild("Torso") or char:FindFirstChild("UpperTorso") or char:FindFirstChild("HumanoidRootPart") end -- [[ MAIN PATHFINDER & BEDROCK FLING ENGINE WITH JOSEP PREDICTIVE MATH ]] -- RS.Heartbeat:Connect(function(dt) local totalProps = #wingRemoteCache if not petMode or totalProps < 1 then return end local t = tick() local activeBall = GetBallSilent() local flingActiveThisFrame = false for _, proj in pairs(activeProjectiles) do if proj.IsStuck then flingActiveThisFrame = true break end end if isSummoning then ballStatusLabel.Text = "WITHER: AWAKENING (WHITE)..." ballStatusLabel.TextColor3 = COLORS.PureWhiteOnly elseif not activeBall then ballStatusLabel.Text = "BALL: DISPAWNED / MISSING " ballStatusLabel.TextColor3 = COLORS.WarningRed elseif flingActiveThisFrame then ballStatusLabel.Text = "BALL: FLINGING TARGET " ballStatusLabel.TextColor3 = (rampageMode and COLORS.SoulAuraBlue or COLORS.Accent) else ballStatusLabel.Text = rampageMode and "BALL: SOUL RAMPAGE MODE " or "BALL: PET HOVER LOCK " ballStatusLabel.TextColor3 = rampageMode and COLORS.SoulAuraBlue or COLORS.SuccessGreen end if rampageMode and not isSummoning then if TargetPlayer then local enemyChar = TargetPlayer.Character local enemyHum = enemyChar and enemyChar:FindFirstChildOfClass("Humanoid") local enemyTorso = getTargetTorso(TargetPlayer) if not enemyChar or not enemyHum or enemyHum.Health <= 0 or enemyHum.Sit or rampageBlacklist[TargetPlayer.Name] or not Players:FindFirstChild(TargetPlayer.Name) then TargetPlayer = nil elseif enemyTorso then local currentVelocity = enemyTorso.AssemblyLinearVelocity.Magnitude local distanceMoved = (enemyTorso.Position - targetAttackTrack.initialPos).Magnitude if currentVelocity > 120 or (flingActiveThisFrame and distanceMoved > 85) then rampageBlacklist[TargetPlayer.Name] = true TargetPlayer = nil elseif t - targetAttackTrack.startTime > MAX_STUCK_TIME and distanceMoved < 8 then rampageBlacklist[TargetPlayer.Name] = true TargetPlayer = nil end end end if t - lastScanTime > 0.35 then lastScanTime = t if not TargetPlayer then local prey = FindNearestPrey() if prey then TargetPlayer = prey targetAttackTrack.player = prey targetAttackTrack.startTime = t if prey.Character and getTargetTorso(prey) then targetAttackTrack.initialPos = getTargetTorso(prey).Position end TargetBox.Text = "HUNTING: " .. prey.DisplayName TargetBox.BorderColor3 = COLORS.SoulAuraBlue else TargetBox.Text = "[SCANNING FAIL...]" TargetBox.BorderColor3 = Color3.fromRGB(40, 40, 40) end end end end local finalPos local isPetState = false if isSummoning then local elapsed = t - summonStartTime if elapsed >= SUMMON_DURATION then isSummoning = false else local rotationSpeed = (elapsed ^ 2) * 12 local currentAngle = elapsed * rotationSpeed local currentHeight = (elapsed / SUMMON_DURATION) * HOVER_HEIGHT witherCurrentPos = summonOriginPos + Vector3.new(0, currentHeight, 0) finalPos = CFrame.new(witherCurrentPos) * CFrame.Angles(0, currentAngle, 0) end end if not isSummoning then local currentTarget = TargetPlayer if not rampageMode and (not currentTarget or not currentTarget.Character or not getTargetTorso(currentTarget)) then currentTarget = LP isPetState = true end local targetTorso = getTargetTorso(currentTarget) if not targetTorso and rampageMode then finalPos = CFrame.new(witherCurrentPos, lastLookAtPos) elseif targetTorso then local idealTargetPos if isPetState then local ownerChar = LP.Character local ownerRoot = ownerChar and ownerChar:FindFirstChild("HumanoidRootPart") if ownerRoot then -- [[ Poin B: Levitation Sway (Ayunan Melayang Naik-Turun) khusus posisi Pet ]] -- local swayY = math.sin(t * 1.8) * 0.45 local animatedOffset = PET_OFFSET + Vector3.new(0, swayY, 0) idealTargetPos = (ownerRoot.CFrame * CFrame.new(animatedOffset)).Position else idealTargetPos = targetTorso.Position + Vector3.new(0, 8, 5) end else local driftX = math.sin(t * 1.5) * RANDOM_DRIFT_SCALE local driftZ = math.cos(t * 1.2) * RANDOM_DRIFT_SCALE local driftY = math.sin(t * 2.5) * (RANDOM_DRIFT_SCALE * 0.4) idealTargetPos = targetTorso.Position + Vector3.new(driftX, HOVER_HEIGHT + driftY, driftZ) end local moveDirection = (idealTargetPos - witherCurrentPos) local distance = moveDirection.Magnitude if distance > 0.1 then local speedMod = isPetState and 15 or 5 local maxMove = WITHER_SPEED * speedMod * dt local step = math.min(distance, maxMove) witherCurrentPos = witherCurrentPos + (moveDirection.Unit * step) end local rawLookAt if isPetState then local ownerChar = LP.Character local ownerRoot = ownerChar and ownerChar:FindFirstChild("HumanoidRootPart") if ownerRoot then rawLookAt = ownerRoot.Position + (ownerRoot.CFrame.LookVector * 50) else rawLookAt = witherCurrentPos + Vector3.new(0, 0, -5) end else rawLookAt = Vector3.new(targetTorso.Position.X, witherCurrentPos.Y, targetTorso.Position.Z) end lastLookAtPos = lastLookAtPos:Lerp(rawLookAt, 1 - math.exp(-14 * dt)) finalPos = CFrame.new(witherCurrentPos, lastLookAtPos) else finalPos = CFrame.new(witherCurrentPos) end end local rotCF = CFrame.Angles(math.rad(MANUAL_ROTATION.X), math.rad(MANUAL_ROTATION.Y), math.rad(MANUAL_ROTATION.Z)) local lerpAlpha = 1 - math.exp(-22 * dt) if not isSummoning then for auraId, projData in pairs(activeProjectiles) do local currentEnemyTorso = getTargetTorso(TargetPlayer) if currentEnemyTorso then local enemyVelocity = currentEnemyTorso.AssemblyLinearVelocity local pingAndFpsOffset = dt + 0.05 local predictedPosition = currentEnemyTorso.Position + (enemyVelocity * pingAndFpsOffset) if projData.IsStuck then projData.CurrentPos = predictedPosition if activeBall then activeBall.CFrame = CFrame.new(predictedPosition) activeBall.Velocity = Vector3.new(0, 9e10, 0) end if t - projData.ImpactTime >= IMPACT_LINGER_TIME then activeProjectiles[auraId] = nil end else projData.TargetPos = predictedPosition local pDir = (projData.TargetPos - projData.CurrentPos) local pDist = pDir.Magnitude if pDist > 1.8 then local pStep = math.min(pDist, PROJECTILE_SPEED * 3.5 * dt) projData.CurrentPos = projData.CurrentPos + (pDir.Unit * pStep) else projData.IsStuck = true projData.ImpactTime = t projData.CurrentPos = predictedPosition if activeBall then activeBall.CFrame = CFrame.new(predictedPosition) activeBall.Velocity = Vector3.new(0, 9e10, 0) end end end else activeProjectiles[auraId] = nil end end else table.clear(activeProjectiles) end for i = 1, totalProps do local targetCF if i <= 10 then local offset = WitherParts[i] -- [[ Poin 1: Breath of the Void (Efek Bernapas Asynchronous di 3 Kepala) ]] -- if isPetState and not isSummoning then if i == 1 then -- Kepala Tengah (Maju Mundur) local breathZ = math.sin(t * 2.5) * 0.22 offset = offset * CFrame.new(0, 0, breathZ) elseif i == 2 then -- Kepala Kanan (Asynchronous breathing) local breathZ = math.cos(t * 2.3) * 0.18 offset = offset * CFrame.new(0, 0, breathZ) elseif i == 3 then -- Kepala Kiri (Asynchronous breathing) local breathZ = math.sin(t * 2.1) * 0.18 offset = offset * CFrame.new(0, 0, breathZ) end end targetCF = finalPos * rotCF * offset else -- [[ ABSOLUTE HEAD STACK ALIGNMENT WITH INTEGRATED BREATH SYNC ]] -- local auraId = i - 10 local activeProj = activeProjectiles[auraId] if activeProj and not isSummoning then targetCF = CFrame.new(activeProj.CurrentPos, lastLookAtPos) else local targetHeadId if auraId == 1 or auraId == 2 then targetHeadId = 2 elseif auraId == 3 or auraId == 4 then targetHeadId = 3 else targetHeadId = 1 end -- Mengambil CFrame Kepala yang sudah teranimasi napas di loop atas agar peluru ikut menempel sempurna local headCFrame = currentCFrames[targetHeadId] or finalPos targetCF = headCFrame end end currentCFrames[i] = (currentCFrames[i] or targetCF):Lerp(targetCF, lerpAlpha) end if TargetPlayer and getTargetTorso(TargetPlayer) and not isSummoning then if t - lastAttackTime > ATTACK_COOLDOWN then lastAttackTime = t local availableAuras = {} for auraId = 1, 5 do if not activeProjectiles[auraId] then table.insert(availableAuras, auraId) end end local freeCount = #availableAuras if freeCount > 0 then local burstCount = math.random(1, math.min(3, freeCount)) local enemyTorso = getTargetTorso(TargetPlayer) task.defer(function() for k = 1, burstCount do local auraId = availableAuras[k] local targetHeadId if auraId == 1 or auraId == 2 then targetHeadId = 2 elseif auraId == 3 or auraId == 4 then targetHeadId = 3 else targetHeadId = 1 end local headCFrame = currentCFrames[targetHeadId] if headCFrame and enemyTorso and TargetPlayer then local enemyVelocity = enemyTorso.AssemblyLinearVelocity local predictedTargetPos = enemyTorso.Position + (enemyVelocity * (dt + 0.05)) activeProjectiles[auraId] = { CurrentPos = headCFrame.Position, TargetPos = predictedTargetPos, IsStuck = false, ImpactTime = 0 } end if k < burstCount then task.wait(math.random(4, 9) / 100) end end end) end end end if t - lastNetworkUpdate > 0.014 then local canUpdateColor = (t - lastColorUpdate > 0.05) local frameCFrames = currentCFrames local startSend = os.clock() for i = 1, totalProps do local prop = wingRemoteCache[i] local targetCFrame = frameCFrames[i] if prop and targetCFrame then task.spawn(function() local cfR = prop:FindFirstChild("SetCurrentCFrame") if cfR then pcall(function() cfR:InvokeServer(targetCFrame) if i == 1 then estimatedPing = (estimatedPing * 0.85) + ((os.clock() - startSend) * 0.15) end end) end if canUpdateColor and i == colorIndex then local crR = prop:FindFirstChild("ChangePropColor") if crR then pcall(function() crR:InvokeServer(getAbyssColor(t, i)) end) end end end) end end if canUpdateColor then colorIndex = (colorIndex % totalProps) + 1 lastColorUpdate = t end lastNetworkUpdate = t end end)