Hi so I'm currently working on a basic fist combat system, I've gotten pretty far to the point where the player can swing and damage with their fists, however, there's an issue within my server script.
I used two variables in my serverscript to detect when the arms should deal damage.
leftDamage = false rightDamage = false
However, when a player swings with their left arm for example, yes their left arm will deal damage, but so will everybody in the games.
I'm just going to include all the code here, sorry if what I've included is unnecessary
local repStorage = game:GetService("ReplicatedStorage") local remoteEvent = repStorage:WaitForChild("Swing") Players = game:GetService("Players") leftDamage = false rightDamage = false char = script.Parent.Parent char:WaitForChild("Humanoid") leftarm = char:WaitForChild("Left Arm") rightarm = char:WaitForChild("Right Arm") remoteEvent.OnServerEvent:connect(function(player, passthrough) local char = player.Character if passthrough == "L" then leftDamage = true elseif passthrough == "R" then rightDamage = true else end end) leftarm.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") then if leftDamage == true then hit.Parent.Humanoid:TakeDamage(10) leftDamage = false script.Parent.Sound:Play() else end end end) rightarm.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") then if rightDamage == true then hit.Parent.Humanoid:TakeDamage(10) rightDamage = false script.Parent.Sound:Play() else end end end)
If I am able to interpret this correctly, you have a server script in each character.
When the remote event is fired, your script doesn't check if the player who is firing it owns the character model. As a result, when it is fired, all server scripts with this code will set rightDamage or leftDamage to true, indiscriminate of who fired the event originally.
By adding something like if player.Character == char
to the remote event's associated function, then you could prevent this from happening.
The solution is that the script checks if the name of the player who was hit was equivalent to the player attacking
local repStorage = game:GetService("ReplicatedStorage") local remoteEvent = repStorage:WaitForChild("Swing") Players = game:GetService("Players") leftDamage = false rightDamage = false char = script.Parent.Parent char:WaitForChild("Humanoid") leftarm = char:WaitForChild("Left Arm") rightarm = char:WaitForChild("Right Arm") remoteEvent.OnServerEvent:connect(function(player, passthrough) local char = player.Character if passthrough == "L" then leftDamage = true elseif passthrough == "R" then rightDamage = true else end end) leftarm.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") then if hit.Parent.Name ~= player.name then and leftDamage == true then hit.Parent.Humanoid:TakeDamage(10) leftDamage = false script.Parent.Sound:Play() else end end end) rightarm.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") then if hit.Parent.Name ~= player.name then and rightDamage == true then hit.Parent.Humanoid:TakeDamage(10) rightDamage = false script.Parent.Sound:Play() else end end end)
New script, Put this in the tool directly and not in handles or parts.
local repStorage = game:GetService("ReplicatedStorage") local remoteEvent = repStorage:WaitForChild("Swing") Players = game:GetService("Players") leftDamage = false rightDamage = false char = script.Parent.Parent char:WaitForChild("Humanoid") leftarm = char:WaitForChild("Left Arm") rightarm = char:WaitForChild("Right Arm") remoteEvent.OnServerEvent:connect(function(player, passthrough) local char = player.Character if passthrough == "L" then leftDamage = true elseif passthrough == "R" then rightDamage = true else end end) leftarm.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") and hit.Parent ~= script.Parent.Parent then if leftDamage == true then hit.Parent.Humanoid:TakeDamage(10) leftDamage = false script.Parent.Sound:Play() else end end end) rightarm.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") and hit.Parent ~= script.Parent.Parent then if rightDamage == true then hit.Parent.Humanoid:TakeDamage(10) rightDamage = false script.Parent.Sound:Play() else end end end)