Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How do I base the sword's damage on a player's leaderstat?

Asked by
4d0z 4
4 years ago

Hello!

I'm trying to script a sword where it deals more damage based on a player's leaderstat. For example. I have a Power Value of 500. I want to divide that number by 100 and set it as damage.

Here's the script of the sword:


Tool = script.Parent Handle = Tool:WaitForChild("Handle") Players = game:GetService("Players") Debris = game:GetService("Debris") RunService = game:GetService("RunService") RbxUtility = LoadLibrary("RbxUtility") Create = RbxUtility.Create DamageValues = { BaseDamage = game.Players.LocalPlayer.leaderstats.Power.Value / 12 , SlashDamage = game.Players.LocalPlayer.leaderstats.Power.Value / 10, } Damage = DamageValues.BaseDamage BaseUrl = "http://www.roblox.com/asset/?id=" BasePart = Instance.new("Part") BasePart.Shape = Enum.PartType.Block BasePart.Material = Enum.Material.Plastic BasePart.TopSurface = Enum.SurfaceType.Smooth BasePart.BottomSurface = Enum.SurfaceType.Smooth BasePart.FormFactor = Enum.FormFactor.Custom BasePart.Size = Vector3.new(0.2, 0.2, 0.2) BasePart.CanCollide = true BasePart.Locked = true BasePart.Anchored = false Rate = (1 / 60) AnimationsBin = Tool:WaitForChild("Animations") R6Anims = AnimationsBin:WaitForChild("R6") R15Anims = AnimationsBin:WaitForChild("R15") Animations = { R6LeftSlash = {Animation = R6Anims:WaitForChild("LeftSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5}, R6RightSlash = {Animation = R6Anims:WaitForChild("RightSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5}, R6SideSwipe = {Animation = R6Anims:WaitForChild("SideSwipe"), FadeTime = nil, Weight = nil, Speed = 0.8, Duration = 0.5}, R15LeftSlash = {Animation = R15Anims:WaitForChild("LeftSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5}, R15RightSlash = {Animation = R15Anims:WaitForChild("RightSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5}, R15SideSwipe = {Animation = R15Anims:WaitForChild("SideSwipe"), FadeTime = nil, Weight = nil, Speed = 0.8, Duration = 0.5}, } Sounds = { Unsheath = Handle:WaitForChild("Unsheath"), Slash = Handle:WaitForChild("Slash"), Lunge = Handle:WaitForChild("Lunge"), } ToolEquipped = false Remotes = (Tool:FindFirstChild("Remotes") or Create("Folder"){ Name = "Remotes", Parent = Tool, }) ServerControl = (Remotes:FindFirstChild("ServerControl") or Create("RemoteFunction"){ Name = "ServerControl", Parent = Remotes, }) ClientControl = (Remotes:FindFirstChild("ClientControl") or Create("RemoteFunction"){ Name = "ClientControl", Parent = Remotes, }) Handle.Transparency = 0 Tool.Enabled = true function IsTeamMate(Player1, Player2) return (Player1 and Player2 and not Player1.Neutral and not Player2.Neutral and Player1.TeamColor == Player2.TeamColor) end function TagHumanoid(humanoid, player) local Creator_Tag = Create("ObjectValue"){ Name = "creator", Value = player, } Debris:AddItem(Creator_Tag, 2) Creator_Tag.Parent = humanoid end function UntagHumanoid(humanoid) for i, v in pairs(humanoid:GetChildren()) do if v:IsA("ObjectValue") and v.Name == "creator" then v:Destroy() end end end function CheckTableForInstance(Table, Instance) for i, v in pairs(Table) do if v == Instance then return true end end return false end function DealDamage(character, damage) if not CheckIfAlive() or not character then return end local damage = (damage or 0) local humanoid = character:FindFirstChild("Humanoid") local rootpart = character:FindFirstChild("HumanoidRootPart") or character:FindFirstChild("Torso") if not humanoid or humanoid.Health == 0 or not rootpart then return end UntagHumanoid(humanoid) TagHumanoid(humanoid, Player) humanoid:TakeDamage(damage) end function CheckIfAlive() return (((Character and Character.Parent and Humanoid and Humanoid.Parent and Humanoid.Health > 0) and true) or false) end function Blow(Part) local PartTouched local HitDelay = false PartTouched = Part.Touched:connect(function(Hit) if not Hit or not Hit.Parent or not CheckIfAlive() or not ToolEquipped or HitDelay then return end local RightArm = (Character:FindFirstChild("Right Arm") or Character:FindFirstChild("RightHand")) if not RightArm then return end local RightGrip = RightArm:FindFirstChild("RightGrip") if not RightGrip or (RightGrip.Part0 ~= Handle and RightGrip.Part1 ~= Handle) then return end local character = Hit.Parent if character == Character then return end local humanoid = character:FindFirstChild("Humanoid") if not humanoid or humanoid.Health == 0 then return end local player = Players:GetPlayerFromCharacter(character) if player and (player == Player or IsTeamMate(Player, player)) then return end HitDelay = true local TotalDamage = Damage DealDamage(character, TotalDamage) local Now = tick() wait(0.05) HitDelay = false end) end function Attack() Damage = DamageValues.SlashDamage Sounds.Slash:Play() --[[local Anim = Create("StringValue"){ Name = "toolanim", Value = "Slash", } Debris:AddItem(Anim, 2) Anim.Parent = Tool]] local SwingAnimations = ((Humanoid.RigType == Enum.HumanoidRigType.R6 and {Animations.R6LeftSlash, Animations.R6RightSlash, Animations.R6SideSwipe}) or (Humanoid.RigType == Enum.HumanoidRigType.R15 and {Animations.R15LeftSlash, --[[Animations.R15RightSlash,]] Animations.R15SideSwipe})) local Animation = SwingAnimations[math.random(1, #SwingAnimations)] Spawn(function() InvokeClient("PlayAnimation", Animation) end) wait(Animation.Duration) end function Activated() if not Tool.Enabled or not ToolEquipped or not CheckIfAlive() then return end Tool.Enabled = false Attack() Damage = DamageValues.BaseDamage Tool.Enabled = true end function CheckIfAlive() return (((Player and Player.Parent and Character and Character.Parent and Humanoid and Humanoid.Parent and Humanoid.Health > 0 and RootPart and RootPart.Parent) and true) or false) end function Equipped() Character = Tool.Parent Player = Players:GetPlayerFromCharacter(Character) Humanoid = Character:FindFirstChild("Humanoid") RootPart = Character:FindFirstChild("HumanoidRootPart") if not CheckIfAlive() then return end Humanoid.WalkSpeed = (16 * 1) --PUT HERE 1.1, 1.2, 1.... IF YOU WANT TO MAKE WALKSPEED FASTER WHILE HOLDING THE SWORD Sounds.Unsheath:Play() ToolEquipped = true end function Unequipped() if CheckIfAlive() then Humanoid.WalkSpeed = 16 end ToolEquipped = false end function OnServerInvoke(player, mode, value) if player ~= Player or not ToolEquipped or not value or not CheckIfAlive() then return end end function InvokeClient(Mode, Value) local ClientReturn = nil pcall(function() ClientReturn = ClientControl:InvokeClient(Player, Mode, Value) end) return ClientReturn end ServerControl.OnServerInvoke = OnServerInvoke Tool.Activated:connect(Activated) Tool.Equipped:connect(Equipped) Tool.Unequipped:connect(Unequipped) Blow(Handle)

This is all in a regular script. The only error it gives me is this:

Players.4d0z.Backpack.Sword.Script:14: attempt to index field 'LocalPlayer' (a nil value)

0
If your script is ` serverscript` then that's why it can't get LocalPlayer TheePBHST 154 — 4y
0
Should I turn this into a localscript? 4d0z 4 — 4y

Answer this question