
Key Required

local env = getgenv()
env.FSSAutoToken = (env.FSSAutoToken or 0) + 1
env.FSSAutoEnabled = false
if env.FSSRayfield then
pcall(function()
env.FSSRayfield:Destroy()
end)
end
if env.FSSGKConnection then
pcall(function()
env.FSSGKConnection:Disconnect()
end)
end
local token = env.FSSAutoToken
local config = {
enabled = true,
autoGoal = true,
looseBalls = false,
requireGoalkeeper = true,
alternateCentered = true,
shotSpeed = 205,
directShotSpeed = 160,
directGoalDistance = 11,
teleportSettle = 0.1,
cornerOffset = 12,
targetHeight = 2.7,
gravityCompensation = 55,
goalkeeperPrediction = 0.45,
goalkeeperSaveDistance = 80,
centerThreshold = 2.5,
maxStealDistance = 400,
tackleRetry = 0.3,
tackleCooldown = 3.05,
ownershipWait = 0.9,
scoreWait = 1.8,
}
assert(config.shotSpeed <= 240 and config.directShotSpeed <= 205 and config.cornerOffset < 14, "unsafe default shot settings")
local stats
local function resetStats()
stats = {
started = os.time(),
tackleRequests = 0,
tackleAccepted = 0,
tackleRejected = 0,
steals = 0,
loosePickups = 0,
acquireFailures = 0,
shots = 0,
goals = 0,
saves = 0,
saveReplies = 0,
originRejections = 0,
errors = 0,
last = "Idle",
}
env.FSSAutoStats = stats
end
resetStats()
env.FSSConfig = config
env.FSSAutoEnabled = true
local Rayfield = loadstring(game:HttpGet("https://sirius.menu/rayfield"))()
env.FSSRayfield = Rayfield
local Window = Rayfield:CreateWindow({
Name = "FIFA Super Soccer",
Icon = "shield-check",
LoadingTitle = "FIFA Super Soccer",
LoadingSubtitle = "discord.gg/ArtemisClient",
ShowText = "FIFA Super Soccer",
Theme = "Default",
ToggleUIKeybind = "K",
DisableRayfieldPrompts = true,
DisableBuildWarnings = false,
ConfigurationSaving = {
Enabled = true,
FolderName = "FIFASuperSoccer",
FileName = "Settings",
},
KeySystem = false,
})
local Automation = Window:CreateTab("Automation", "zap")
local Shooting = Window:CreateTab("Shooting", "crosshair")
local Goalkeeper = Window:CreateTab("Goalkeeper", "shield")
local Timing = Window:CreateTab("Timing", "timer")
local Status = Window:CreateTab("Status", "activity")
Automation:CreateSection("Main")
local MasterToggle = Automation:CreateToggle({
Name = "Enabled",
CurrentValue = config.enabled,
Flag = "Enabled",
Callback = function(value)
config.enabled = value
env.FSSAutoEnabled = value
end,
})
Automation:CreateToggle({
Name = "Auto Goal",
CurrentValue = config.autoGoal,
Flag = "AutoGoal",
Callback = function(value)
config.autoGoal = value
end,
})
Automation:CreateToggle({
Name = "Acquire loose balls",
CurrentValue = config.looseBalls,
Flag = "LooseBalls",
Callback = function(value)
config.looseBalls = value
end,
})
Automation:CreateSlider({
Name = "Maximum steal distance",
Range = { 10, 500 },
Increment = 5,
Suffix = " studs",
CurrentValue = config.maxStealDistance,
Flag = "MaxStealDistance",
Callback = function(value)
config.maxStealDistance = value
end,
})
Automation:CreateKeybind({
Name = "Toggle automation",
CurrentKeybind = "L",
HoldToInteract = false,
Flag = "AutomationKey",
Callback = function()
config.enabled = not config.enabled
env.FSSAutoEnabled = config.enabled
MasterToggle:Set(config.enabled)
end,
})
Shooting:CreateSection("Direct goal")
Shooting:CreateToggle({
Name = "Require opposing goalkeeper",
CurrentValue = config.requireGoalkeeper,
Flag = "RequireGoalkeeper",
Callback = function(value)
config.requireGoalkeeper = value
end,
})
Shooting:CreateToggle({
Name = "Alternate when GK is centered",
CurrentValue = config.alternateCentered,
Flag = "AlternateCentered",
Callback = function(value)
config.alternateCentered = value
end,
})
Shooting:CreateSlider({
Name = "Shot speed",
Range = { 120, 240 },
Increment = 1,
Suffix = " studs/s",
CurrentValue = config.shotSpeed,
Flag = "ShotSpeed",
Callback = function(value)
config.shotSpeed = value
end,
})
Shooting:CreateSlider({
Name = "Direct shot speed",
Range = { 100, 205 },
Increment = 1,
Suffix = " studs/s",
CurrentValue = config.directShotSpeed,
Flag = "DirectShotSpeed",
Callback = function(value)
config.directShotSpeed = value
end,
})
Shooting:CreateSlider({
Name = "Direct goal distance",
Range = { 8, 25 },
Increment = 0.5,
Suffix = " studs",
CurrentValue = config.directGoalDistance,
Flag = "DirectGoalDistance",
Callback = function(value)
config.directGoalDistance = value
end,
})
Shooting:CreateSlider({
Name = "Corner offset",
Range = { 5, 13 },
Increment = 0.1,
Suffix = " studs",
CurrentValue = config.cornerOffset,
Flag = "CornerOffset",
Callback = function(value)
config.cornerOffset = value
end,
})
Shooting:CreateSlider({
Name = "Target height",
Range = { 0, 3.2 },
Increment = 0.05,
Suffix = " Y",
CurrentValue = config.targetHeight,
Flag = "TargetHeight",
Callback = function(value)
config.targetHeight = value
end,
})
Shooting:CreateSlider({
Name = "GK prediction",
Range = { 0, 0.8 },
Increment = 0.05,
Suffix = " s",
CurrentValue = config.goalkeeperPrediction,
Flag = "GoalkeeperPrediction",
Callback = function(value)
config.goalkeeperPrediction = value
end,
})
Shooting:CreateSlider({
Name = "Centered threshold",
Range = { 0.5, 6 },
Increment = 0.1,
Suffix = " studs",
CurrentValue = config.centerThreshold,
Flag = "CenterThreshold",
Callback = function(value)
config.centerThreshold = value
end,
})
Shooting:CreateSlider({
Name = "Gravity compensation",
Range = { 0, 90 },
Increment = 1,
CurrentValue = config.gravityCompensation,
Flag = "GravityCompensation",
Callback = function(value)
config.gravityCompensation = value
end,
})
Goalkeeper:CreateSection("Automatic saves")
Goalkeeper:CreateSlider({
Name = "Save distance",
Range = { 10, 200 },
Increment = 5,
Suffix = " studs",
CurrentValue = config.goalkeeperSaveDistance,
Flag = "GoalkeeperSaveDistance",
Callback = function(value)
config.goalkeeperSaveDistance = value
end,
})
Timing:CreateSection("Server acknowledgement")
Timing:CreateSlider({
Name = "Rejected tackle retry",
Range = { 0.1, 1 },
Increment = 0.05,
Suffix = " s",
CurrentValue = config.tackleRetry,
Flag = "TackleRetry",
Callback = function(value)
config.tackleRetry = value
end,
})
Timing:CreateSlider({
Name = "Accepted tackle cooldown",
Range = { 2.8, 4 },
Increment = 0.05,
Suffix = " s",
CurrentValue = config.tackleCooldown,
Flag = "TackleCooldown",
Callback = function(value)
config.tackleCooldown = value
end,
})
Timing:CreateSlider({
Name = "Ownership confirmation",
Range = { 0.3, 1.5 },
Increment = 0.05,
Suffix = " s",
CurrentValue = config.ownershipWait,
Flag = "OwnershipWait",
Callback = function(value)
config.ownershipWait = value
end,
})
Timing:CreateSlider({
Name = "Score observation",
Range = { 1, 3 },
Increment = 0.1,
Suffix = " s",
CurrentValue = config.scoreWait,
Flag = "ScoreWait",
Callback = function(value)
config.scoreWait = value
end,
})
local Counters = Status:CreateLabel("Waiting for the next possession...")
local LastAction = Status:CreateParagraph({
Title = "Last action",
Content = stats.last,
})
Status:CreateButton({
Name = "Reset counters",
Callback = resetStats,
})
Status:CreateButton({
Name = "Unload UI and worker",
Callback = function()
config.enabled = false
env.FSSAutoEnabled = false
env.FSSAutoToken = env.FSSAutoToken + 1
env.FSSGKConnection:Disconnect()
Rayfield:Destroy()
end,
})
Rayfield:LoadConfiguration()
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local LocalPlayer = Players.LocalPlayer
local PerformAction = ReplicatedStorage.Packages._Index["sleitnick_knit@1.7.0"].knit.Services.ActionService.RE.PerformAction
local cornerFlip = false
env.FSSGKConnection = ReplicatedStorage.__GamemodeComm.RE.GetBallTouchResult.OnClientEvent:Connect(function()
if config.enabled and LocalPlayer:GetAttribute("TeamRole") == "Goalkeeper" then
ReplicatedStorage.__GamemodeComm.RE.SetBallTouchResult:FireServer(true)
stats.saveReplies += 1
end
end)
local function activeBall()
for _, ball in CollectionService:GetTagged("Football") do
if ball:IsA("BasePart") and ball:IsDescendantOf(workspace) and ball:GetAttribute("Enabled") == true then
return ball
end
end
end
local function playerByAgentId(agentId)
if not agentId then
return
end
for _, player in Players:GetPlayers() do
if player:GetAttribute("AgentId") == agentId then
return player
end
end
end
local function opposingGoalkeeper(side)
for _, player in Players:GetPlayers() do
if player.Team and player.Team.Name == side and (player:GetAttribute("TeamRole") == "Goalkeeper" or player:GetAttribute("TeamPosition") == "GK") then
local root = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
if root then
return root
end
end
end
for _, model in workspace:GetDescendants() do
if model:IsA("Model") and model:GetAttribute("TeamRole") == "Goalkeeper" and model:GetAttribute("IsHomeOrAway") == side then
local root = model:FindFirstChild("HumanoidRootPart")
if root then
return root
end
end
end
end
local function waitForPossession(ball, timeout)
local deadline = os.clock() + timeout
repeat
if LocalPlayer:GetAttribute("HasBall") == true
and ball:GetAttribute("PossessorId") == LocalPlayer:GetAttribute("AgentId")
and ball:GetAttribute("NetworkOwner") == LocalPlayer.Name
then
return true
end
task.wait(0.03)
until os.clock() >= deadline or env.FSSAutoToken ~= token
return false
end
local function shoot(ball, root, source, releaseOverride)
local targetSide = LocalPlayer.Team and LocalPlayer.Team.Name == "Home" and "Away" or "Home"
local teamFolder = workspace.Stadium.Teams:FindFirstChild(targetSide)
local goal = teamFolder and teamFolder:FindFirstChild("Goal")
local goalHitbox = goal and goal:FindFirstChild("Hitbox")
local goalkeeper = opposingGoalkeeper(targetSide)
if not goalHitbox or (config.requireGoalkeeper and not goalkeeper) then
stats.last = "Waiting for opposing goal/GK"
return
end
local center = goalHitbox.Position
local kick = root:FindFirstChild("KickAttachment")
local origin = releaseOverride or (kick and kick.WorldPosition) or (root.Position + root.CFrame.LookVector * 3 + Vector3.new(0, -1, 0))
local flatCenter = Vector3.new(center.X - origin.X, 0, center.Z - origin.Z)
if flatCenter.Magnitude < 1 then
return
end
local directGoal = not releaseOverride
local flightTime = flatCenter.Magnitude / config.shotSpeed
local goalkeeperPosition = goalkeeper
and goalkeeper.Position + goalkeeper.AssemblyLinearVelocity * (directGoal and 0 or math.min(flightTime, config.goalkeeperPrediction))
or center
local chooseLeft
if config.alternateCentered and math.abs(goalkeeperPosition.X - center.X) < config.centerThreshold then
cornerFlip = not cornerFlip
chooseLeft = cornerFlip
else
chooseLeft = goalkeeperPosition.X >= center.X
end
local aim = Vector3.new(
center.X + (chooseLeft and -config.cornerOffset or config.cornerOffset),
config.targetHeight,
center.Z
)
if directGoal then
local otherSide = targetSide == "Home" and "Away" or "Home"
local otherGoal = workspace.Stadium.Teams[otherSide].Goal.Hitbox.Position
local towardField = Vector3.new(otherGoal.X - center.X, 0, otherGoal.Z - center.Z).Unit
local destination = Vector3.new(aim.X, root.Position.Y, center.Z) + towardField * config.directGoalDistance
root.CFrame = CFrame.lookAt(destination, Vector3.new(aim.X, destination.Y, center.Z))
root.AssemblyLinearVelocity = Vector3.zero
root.AssemblyAngularVelocity = Vector3.zero
task.wait(config.teleportSettle)
kick = root:FindFirstChild("KickAttachment")
origin = (kick and kick.WorldPosition) or root.Position
end
local shotSpeed = directGoal and config.directShotSpeed or config.shotSpeed
local flat = Vector3.new(aim.X - origin.X, 0, aim.Z - origin.Z)
flightTime = flat.Magnitude / shotSpeed
local velocity = flat.Unit * shotSpeed
+ Vector3.new(0, (aim.Y - origin.Y + 0.5 * config.gravityCompensation * flightTime ^ 2) / flightTime, 0)
local ownTeam = LocalPlayer.Team
local oldScore = ownTeam and ownTeam:GetAttribute("Score") or 0
ball:SetAttribute("State", "Released")
LocalPlayer:SetAttribute("HasBall", false)
ball:SetAttribute("PossessorId", nil)
ball.Velocity = Vector3.zero
ball:PivotTo(CFrame.new(origin))
ball.Velocity = velocity
PerformAction:FireServer("ActionPrimary", origin, velocity)
stats.shots += 1
stats.last = string.format("%s %s at %s corner", source, directGoal and "direct shot" or "long shot", chooseLeft and "left" or "right")
local minimumGoalDistance = math.huge
local deadline = os.clock() + config.scoreWait
repeat
task.wait(0.1)
if ball.Parent then
minimumGoalDistance = math.min(minimumGoalDistance, (ball.Position - center).Magnitude)
end
until os.clock() >= deadline or env.FSSAutoToken ~= token
local newScore = ownTeam and ownTeam:GetAttribute("Score") or oldScore
if newScore > oldScore then
stats.goals += newScore - oldScore
stats.last ..= " - GOAL"
elseif minimumGoalDistance > 100 then
stats.originRejections += 1
stats.last ..= " - origin rejected"
else
stats.last ..= " - saved/missed"
end
end
task.spawn(function()
local nextTackle = 0
while env.FSSAutoToken == token do
if not config.enabled then
task.wait(0.15)
continue
end
local ok, message = pcall(function()
if LocalPlayer:GetAttribute("DisableControls") == true
or LocalPlayer:GetAttribute("Freeze") == true
or LocalPlayer:GetAttribute("IsOnPitch") ~= true
then
return
end
local character = LocalPlayer.Character or workspace:FindFirstChild(LocalPlayer.Name)
local root = character and character:FindFirstChild("HumanoidRootPart")
local hitbox = character and character:FindFirstChild("Hitbox")
local tackleHitbox = character and character:FindFirstChild("TackleHitbox")
local ball = activeBall()
if not root or not hitbox or not tackleHitbox or not ball then
return
end
if LocalPlayer:GetAttribute("HasBall") == true
and ball:GetAttribute("PossessorId") == LocalPlayer:GetAttribute("AgentId")
and ball:GetAttribute("NetworkOwner") == LocalPlayer.Name
then
if config.autoGoal then
shoot(ball, root, "owned")
end
return
end
if LocalPlayer:GetAttribute("TeamRole") == "Goalkeeper" and ball:GetAttribute("State") == "Released" and ball.Position.Y > -50 then
local teamFolder = LocalPlayer.Team and workspace.Stadium.Teams:FindFirstChild(LocalPlayer.Team.Name)
local goal = teamFolder and teamFolder:FindFirstChild("Goal")
local goalHitbox = goal and goal:FindFirstChild("Hitbox")
local toGoal = goalHitbox and goalHitbox.Position - ball.Position
if toGoal and ball.AssemblyLinearVelocity:Dot(toGoal) > 0 and (ball.Position - root.Position).Magnitude <= config.goalkeeperSaveDistance then
firetouchinterest(hitbox, ball, 0)
task.wait(0.03)
firetouchinterest(hitbox, ball, 1)
if waitForPossession(ball, config.ownershipWait) then
stats.saves += 1
stats.last = "Goalkeeper save"
end
return
end
end
if not config.autoGoal then
return
end
local possessor = playerByAgentId(ball:GetAttribute("PossessorId"))
if not possessor then
if not config.looseBalls or ball.Position.Y < -50 then
return
end
local releasePosition = ball.Position
firetouchinterest(hitbox, ball, 0)
task.wait(0.03)
firetouchinterest(hitbox, ball, 1)
if waitForPossession(ball, config.ownershipWait) then
stats.loosePickups += 1
shoot(ball, root, "loose-ball", releasePosition)
end
return
end
if possessor.Team == LocalPlayer.Team or os.clock() < nextTackle then
return
end
local targetCharacter = possessor.Character
local targetHitbox = targetCharacter and targetCharacter:FindFirstChild("Hitbox")
local targetRoot = targetCharacter and targetCharacter:FindFirstChild("HumanoidRootPart")
if not targetHitbox or not targetRoot then
return
end
local distance = (targetRoot.Position - root.Position).Magnitude
if distance > config.maxStealDistance then
return
end
stats.tackleRequests += 1
PerformAction:FireServer("Tackle")
local accepted = false
for _ = 1, 12 do
task.wait(0.025)
if LocalPlayer:GetAttribute("Tackling") == true then
accepted = true
break
end
end
if not accepted then
stats.tackleRejected += 1
stats.last = "Tackle rejected; retrying"
nextTackle = os.clock() + config.tackleRetry
return
end
stats.tackleAccepted += 1
nextTackle = os.clock() + config.tackleCooldown
firetouchinterest(tackleHitbox, targetHitbox, 0)
task.wait(0.03)
firetouchinterest(tackleHitbox, targetHitbox, 1)
task.wait(0.08)
firetouchinterest(hitbox, ball, 0)
task.wait(0.03)
firetouchinterest(hitbox, ball, 1)
if not waitForPossession(ball, config.ownershipWait) then
stats.acquireFailures += 1
stats.last = string.format("Acquire failed on %s at %.1f studs", possessor.Name, distance)
return
end
stats.steals += 1
stats.last = string.format("Stole from %s at %.1f studs", possessor.Name, distance)
task.wait(0.08)
shoot(ball, root, "steal")
end)
if not ok then
stats.errors += 1
stats.last = "Error: " .. tostring(message)
end
task.wait(0.08)
end
end)
task.spawn(function()
while env.FSSAutoToken == token do
Counters:Set(string.format(
"Steals %d | Goals %d | Saves %d | Shots %d",
stats.steals,
stats.goals,
stats.saves,
stats.shots
))
LastAction:Set({
Title = "Last action",
Content = stats.last,
})
task.wait(0.5)
end
end)
Rayfield:Notify({
Title = "FIFA Super Soccer",
Content = "discord.gg/ArtemisClient",
Duration = 6,
Image = "shield-check",
})
Cool hack and it works