For some reason the code for my sword is very buggy and I can’t understand why?
Here’s the video that shows how buggy it is: 2022-12-17 17-28-16
and here’s the server script in serverscriptservice:
--Services
local rs = game:GetService("ReplicatedStorage")
local ds = game:GetService("Debris")
local mps = game:GetService("MarketplaceService")
local swordswingRE = rs:WaitForChild("SwordEvents"):WaitForChild("SwordSwingRE")
local sworddamageRE = rs:WaitForChild("SwordEvents"):WaitForChild("SwordDamageRE")
--Configuration
local deadcheck = false
function SwordSwing(player, sound)
sound:Play()
end
function SwordDamage(player, hit, effect, tool, strength, damage, hitsound, CanDamage)
if hit.Parent:FindFirstChild("Humanoid") then
local Humanoid = hit.Parent:FindFirstChild("Humanoid")
local char = hit.Parent
if CanDamage == true and hit.Parent:FindFirstChild("Humanoid").Health >= 0 then
local HumanoidRP = hit.Parent:FindFirstChild("HumanoidRootPart")
local UpperTorso = hit.Parent:FindFirstChild("UpperTorso")
--gamepass x2 money
local userId = player.UserId
local gamepass = 85869838
--Clone effects
local effectsclone = effect:Clone()
local bloodeffectclone = rs:WaitForChild("SwordEffects"):WaitForChild("BloodParticles"):Clone()
local sparkeffectclone = rs:WaitForChild("SwordEffects"):WaitForChild("SparksParticles"):Clone()
effectsclone.Parent = UpperTorso
local weldeffects1 = Instance.new("Weld", effectsclone)
weldeffects1.Part0 = UpperTorso
weldeffects1.Part1 = effectsclone
bloodeffectclone.Parent = UpperTorso
local weldeffects2 = Instance.new("Weld", bloodeffectclone)
weldeffects2.Part0 = UpperTorso
weldeffects2.Part1 = bloodeffectclone
sparkeffectclone.Parent = UpperTorso
local weldeffects3 = Instance.new("Weld", sparkeffectclone)
weldeffects3.Part0 = UpperTorso
weldeffects3.Part1 = sparkeffectclone
--knockback
local bv = Instance.new("BodyVelocity")
bv.P = 2500
bv.MaxForce = Vector3.new(100000,100000,100000)
bv.Velocity = CFrame.new(tool.Parent:FindFirstChild("HumanoidRootPart").Position, HumanoidRP.Position).lookVector * (strength/2)
bv.Parent = char:FindFirstChild("HumanoidRootPart")
ds:AddItem(bv, 0.2)
Humanoid:TakeDamage(damage)
local findcombogui = player.PlayerGui:FindFirstChild('ComboGui')
if findcombogui then
if mps:UserOwnsGamePassAsync(userId, gamepass) then
player.PrivateStats.Money.Value += 2
else
player.PrivateStats.Money.Value += 1
end
Humanoid.Died:Connect(function()
if deadcheck == false then
deadcheck = true
player.leaderstats.Kills.Value += 1
if mps:UserOwnsGamePassAsync(userId, gamepass) then
player.PrivateStats.Money.Value += 10
else
player.PrivateStats.Money.Value += 5
end
end
end)
findcombogui.Combo.Value = findcombogui.Combo.Value + 1
findcombogui.ShowCombo.Despawn.Disabled = true
findcombogui.ShowCombo.Despawn.Disabled = false
else
local comboGui = game:GetService("ServerStorage").ComboGui:Clone()
comboGui.Parent = player.PlayerGui
end
hitsound:Play()
CanDamage = false
else
return
end
else
return
end
deadcheck = false
end
sworddamageRE.OnServerEvent:Connect(SwordDamage)
swordswingRE.OnServerEvent:Connect(SwordSwing)
and here’s the local script in the sword:
--Services
local rs = game:GetService("ReplicatedStorage")
local swingswordRE = rs:WaitForChild("SwordEvents"):WaitForChild("SwordSwingRE")
local sworddamageRE = rs:WaitForChild("SwordEvents"):WaitForChild("SwordDamageRE")
--Configuration
local player = game:GetService("Players").LocalPlayer
local tool = script.Parent
local CanDamage = tool.CanDamage.Value
local CoolDown = tool.Cooldown.Value
local dmg = tool.dmg.Value
local strength = tool.knockbackstrength.Value
local turn = 1
local SecondsCoolDown = 0.03
local hiteffect = rs:WaitForChild("SwordEffects"):WaitForChild("HitEffects")
local track
--Sounds
local hitsound = tool.Handle.HitSound
local swing1 = tool.Handle.Swing1Sound
local swing2 = tool.Handle.Swing2Sound
--Animations
local attack1 = tool.Attack1
local attack2 = tool.Attack2
local idle = tool.Idle
--Functions
tool.Equipped:Connect(function()
track = tool.Parent.Humanoid:LoadAnimation(idle)
track.Priority = Enum.AnimationPriority.Action
track:Play()
end)
tool.Unequipped:Connect(function()
if track then
track:Stop()
end
end)
tool.Destroying:Connect(function()
if track then
track:Stop()
end
end)
tool.Activated:Connect(function()
if CoolDown == false then
CoolDown = true
local Humanoid = tool.Parent.Humanoid
local Anim1 = Humanoid:LoadAnimation(attack1)
local Anim2 = Humanoid:LoadAnimation(attack2)
if track then
track:Stop()
end
if turn == 1 then
Anim1:Play()
wait(0.1)
CanDamage = true
swingswordRE:FireServer(swing1)
turn = 2
Anim1.Stopped:wait(SecondsCoolDown)
CanDamage = false
CoolDown = false
elseif turn == 2 then
Anim2:Play()
wait(0.1)
CanDamage = true
swingswordRE:FireServer(swing2)
turn = 1
Anim2.Stopped:Wait(SecondsCoolDown)
CanDamage = false
CoolDown = false
end
wait()
track:Play()
else
return
end
end)
tool.Handle.Touched:Connect(function(Hit)
sworddamageRE:FireServer(Hit, hiteffect, tool, strength, dmg, hitsound, CanDamage)
end)
If you guys also have any tips on how I could optimize these scripts I would be very glad!