Hi, I wanted to make a level system for my upcoming zombie game, and somewhy my damage script doesn't work with it, I think the damage script is the problem here. And as I tested it, every other weapon work with it. But I don't know how to fix it.
Bullet damage script
local bullet = script.Parent local damaged = {} local function onTouch(partOther) local humanOther = partOther.Parent:FindFirstChild("Humanoid") if not humanOther then return end if humanOther.Parent == bullet then return end if game.Players:GetPlayerFromCharacter(partOther.Parent) then return end if table.find(damaged, humanOther) then return end table.insert(damaged, humanOther) humanOther:TakeDamage(25) end script.Parent.Touched:Connect(onTouch)
Exp give, when zombie dies script:
local Humanoid = script.Parent.Humanoid function Dead() local tag = Humanoid:FindFirstChild("creator") if tag ~= nil then local leaderstats = tag.Value:FindFirstChild("leaderstats") if leaderstats ~= nil then leaderstats.Exp.Value = leaderstats.Exp.Value + 10 wait(0.1) script:Remove() end end end Humanoid.Died:Connect(Dead)
And the leaderstat script, if it helps to help me:
game.Players.PlayerAdded:Connect(function(plr) local stats = Instance.new("Folder",plr) stats.Name = "leaderstats" local leavels = Instance.new("IntValue",stats) leavels.Name = "Levels" leavels.Value = 0 local exp = Instance.new("IntValue",stats) exp.Name = "Exp" exp.Value = 0 end) game.ReplicatedStorage.AddExpEvent.OnServerEvent:Connect(function(plr) plr.leaderstats.Exp.Value = plr.leaderstats.Exp.Value + 10 end) game.Players.PlayerAdded:Connect(function(plr) wait(.1) local exp = plr.leaderstats.Exp local levels = plr.leaderstats.Levels while wait() do if exp.Value >= (100 * (levels.Value + 1)) then levels.Value = levels.Value + 1 exp.Value = 0 game.ReplicatedStorage.LevlUpGui:FireClient(plr) end end end)
I couldn't find an issue with your code, are you getting any errors?
You don't need to read this all, but it helps me understand it.
What your script does:
When the bullet object touches another object in the game, the onTouch() function is called. The function first checks if the touched object has a Humanoid child, which indicates that it is a character in the game.
If the touched object is a character, the function checks if the parent of the bullet is the same as the parent of the character. If this is the case, then the function returns early and does not apply damage. This is likely to prevent the bullet from damaging the character that fired it.
Next, the function calls the game.Players:GetPlayerFromCharacter() method to get the Player instance associated with the touched character. If the method returns nil, then the function returns early and does not apply damage. This is likely to prevent the bullet from damaging non-player characters in the game.
Finally, the function checks if the damaged table contains the Humanoid instance of the touched character. If it does, then the function returns early and does not apply damage. This is likely to prevent the bullet from damaging the same character multiple times.
If the function passes all these checks, it applies 25 points of damage to the touched character by calling the humanOther:TakeDamage() method.
Bullet Damage Script:
I added a check to ensure that game.Players:GetPlayerFromCharacter() returns a Player instance before using it. If it returns nil, then the script will return early and not apply damage to the character.
local bullet = script.Parent local damaged = {} local function onTouch(partOther) local humanOther = partOther.Parent:FindFirstChild("Humanoid") if not humanOther then return end if humanOther.Parent == bullet then return end local player = game.Players:GetPlayerFromCharacter(partOther.Parent) if not player then return end if table.find(damaged, humanOther) then return end table.insert(damaged, humanOther) humanOther:TakeDamage(25) end script.Parent.Touched:Connect(onTouch)
Exp give, when zombie dies script:
local humanoid = script.Parent.Humanoid function onDied() local creatorTag = humanoid:FindFirstChild("creator") if creatorTag == nil then return end local leaderstats = creatorTag.Value:FindFirstChild("leaderstats") if leaderstats == nil then return end leaderstats.Exp.Value = leaderstats.Exp.Value + 10 wait(0.1) script:Remove() end humanoid.Died:Connect(onDied)
In this code, I made a few changes:
I renamed the Humanoid variable to humanoid to follow the convention of using lowercase letters for variable names.
I replaced the Dead() function with the onDied() function, which is a more descriptive name.
I added checks to ensure that humanoid:FindFirstChild() and creatorTag.Value:FindFirstChild() return non-nil values before using them. This will prevent errors if the creator tag or leaderstats object are not found.
I hope this helps! Let me know if you have any other questions.
And the leaderstat script, if it helps to help me:
game.Players.PlayerAdded:Connect(function(player) local stats = Instance.new("Folder", player) stats.Name = "leaderstats" local levels = Instance.new("IntValue", stats) levels.Name = "Levels" levels.Value = 0 local exp = Instance.new("IntValue", stats) exp.Name = "Exp" exp.Value = 0 end) game.ReplicatedStorage.AddExpEvent.OnServerEvent:Connect(function(player) player.leaderstats.Exp.Value = player.leaderstats.Exp.Value + 10 end) game.Players.PlayerAdded:Connect(function(player) wait(0.1) local exp = player.leaderstats.Exp local levels = player.leaderstats.Levels while wait() do if exp.Value >= (100 * (levels.Value + 1)) then levels.Value = levels.Value + 1 exp.Value = 0 game.ReplicatedStorage.LevlUpGui:FireClient(player) end end end)
In this code, I made a few changes:
I renamed the plr variable to player to follow the convention of using lowercase letters for variable names.
I added checks to ensure that the AddExpEvent object and LevlUpGui object exist in game.ReplicatedStorage before using them. This will prevent errors if these objects are not found.
I hope this helps! Let me know if you have any other questions.