How would I go about making balls/birdies for a sports game

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve? Keep it simple and clear!
    I created a badminton game, but the hitboxes are super janky and stuff. I used overlap params but they don’t work when the birdie is going slightly fast. It’s even worst when you try to smash/spike

  2. What is the issue? Include screenshots / videos if possible!
    The part is the hitbox fyi
    Badminton 4 2 Roblox Studio 2023 06 20 19 09 02 - YouTube

  3. What solutions have you tried so far? Did you look for solutions on the Developer Hub?
    I’ve looked into client rendering and that stuff, but I have no clue what I’m doing, so if that’s the option it would be great if you would simplify it for me.

After that, you should include more details if you have any. Try to make your topic as descriptive as possible, so that it’s easier for people to help you!

Underhand Serve

game.ReplicatedStorage.RemoteEvents.Serves.Underhand.OnServerEvent:Connect(function(plr)
	local ogchar = plr.Character
	local oghum = ogchar.Humanoid
	local oghrp = ogchar.HumanoidRootPart
	local leftarm = ogchar:FindFirstChild("Left Arm")
	local birdie = game.ServerStorage.Birdie:Clone()
	birdie.Parent = workspace
	birdie.CFrame = leftarm.CFrame * CFrame.new(0,-1,0)
	birdie:SetNetworkOwner(plr)
	local vectorforce = Instance.new("LinearVelocity",birdie)
	vectorforce.Name = "GlobalVector"
	local attachment = Instance.new("Attachment",birdie)
	vectorforce.Attachment0 = attachment
	vectorforce.MaxForce = math.huge
	vectorforce.LineVelocity = 1000
	wait(0.2)
	vectorforce.VectorVelocity = ogchar.HumanoidRootPart.CFrame.LookVector * (10 * plr.Power.Value/2) + ogchar.HumanoidRootPart.CFrame.UpVector * (10 * plr.Power.Value)
	delay(0.2,function()
		vectorforce.Enabled = false
	end)
end)

Clear Script

game.ReplicatedStorage.RemoteEvents.Clear.Underhand.OnServerEvent:Connect(function(plr)
	local char = plr.Character
	local hum = char.Humanoid
	local hrp = char.HumanoidRootPart
	local part = Instance.new("Part",workspace)

	part.Anchored = false
	part.CanCollide = false
	part.CanTouch = false
	part.CanQuery = false
	part.Massless = true
	part.Transparency = 0.8
	part.Parent = workspace    
	part.CFrame = char.HumanoidRootPart.CFrame
	part.Size = Vector3.new(15,7,15)
	part.CollisionGroup = "Net"
	
	local weld = Instance.new("WeldConstraint",part)

	weld.Part0 = part
	weld.Part1 = hrp

local hitlist = {}

for t = 1,1 do
	wait(0.1)

	local overlapparams = OverlapParams.new()
	overlapparams.CollisionGroup = "Net"
	local hitcontent = workspace:GetPartsInPart(part, overlapparams)



	for i,v in pairs(hitcontent) do
		if  v.Name == "Birdie" then
			if not hitlist[v] then
				hitlist[v] = true
				--[[for y,x in pairs(v:GetChildren()) do
					if x.Name == "VectorDelete" or x.Name == "AttachmentDelete" then
						x:Destroy()
					end
				end]]--
				v:SetNetworkOwner(plr)
				local vectorforce = v.GlobalVector
				vectorforce.Enabled = true
				vectorforce.MaxForce = math.huge
				vectorforce.LineVelocity = 1000
				vectorforce.VectorVelocity = char.HumanoidRootPart.CFrame.LookVector * (10 * plr.Power.Value) + char.HumanoidRootPart.CFrame.UpVector * (10 * plr.Power.Value)
				delay(0.2,function()
					vectorforce.Enabled = false
				end)
			end
		end
	end
	end
delay(1.5,function()
		part:Destroy()
	end)
end)

Spike Script

game.ReplicatedStorage.RemoteEvents.Spike.Spike.OnServerEvent:Connect(function(plr,mousepos)
	local char = plr.Character
	local hum = char.Humanoid
	local hrp = char.HumanoidRootPart
	local part = Instance.new("Part",workspace)    
	local module = require(game.ReplicatedStorage.TweenModule)
	local goals = module.goals
	local info = module.Info1

	local target = game.ReplicatedStorage.Target:Clone()
	target.Parent = workspace
	target.CFrame = mousepos
	target.Orientation = Vector3.new(0,0,90)
	game.TweenService:Create(target,info,goals):Play()
	
	part.Anchored = false
	part.CanCollide = false
	part.CanTouch = false
	part.CanQuery = false
	part.Massless = true
	part.Transparency = 0.5
	part.Parent = workspace    
	part.CFrame = char.HumanoidRootPart.CFrame
	part.Size = Vector3.new(15,15,15)
	part.CollisionGroup = "Net"
	
	local weld = Instance.new("WeldConstraint",part)

	weld.Part0 = part
	weld.Part1 = hrp
local hitlist = {}

for t = 1,1 do
	wait(0.1)

	local overlapparams = OverlapParams.new()
	local hitcontent = workspace:GetPartsInPart(part, overlapparams)



for i,v in pairs(hitcontent) do
	if  v.Name == "Birdie" then
		print("Hit Birdie")
		if not hitlist[v] then
			hitlist[v] = true
		--[[	for y,x in pairs(v:GetChildren()) do
				if x.Name == "VectorDelete" or x.Name == "AttachmentDelete" then
					x:Destroy()
				end
			end]]--
			v:SetNetworkOwner(plr)
 			v.CFrame = CFrame.lookAt(part.Position,mousepos.Position)
			local vectorforce = v.GlobalVector
			vectorforce.Enabled = true
			vectorforce.MaxForce = math.huge
			vectorforce.LineVelocity = 1000
			vectorforce.VectorVelocity = v.CFrame.LookVector * (10 * plr.Power.Value)
			delay(0.2,function()
				vectorforce.Enabled = false
			end)
			end
		end
		end
	end	
	delay(1.5,function()
		part:Destroy()
		target:Destroy()
	end)
end)

Please do not ask people to write entire scripts or design entire systems for you. If you can’t answer the three questions above, you should probably pick a different category.