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

Why does power increase by more than 1 often in this script? Suggestion for fix?

Asked by
Songist 49
6 years ago

The sword script is meant to increase power by 1 each kill with the tool. However, it is often increasing by more. Why is this? Any suggestions to fix?

Tool = script.Parent
Handle = Tool:WaitForChild("Handle")

Players = game:GetService("Players")
Debris = game:GetService("Debris")
RunService = game:GetService("RunService")

Kills = Tool:WaitForChild("Kills")

Grips = {
    Up = CFrame.new(0, 0, -1.5, 0, 0, 1, 1, 0, 0, 0, 1, 0),
    Out = CFrame.new(0, 0, -1.5, 0, -1, -0, -1, 0, -0, 0, 0, -1),
}

DamageValues = {
    BaseDamage = 4,
    SlashDamage = 4,
    LungeDamage = 8,
    Upgrade = {
        Min = 4,
        Max = 6,
    },
}

Damage = DamageValues.BaseDamage

Sounds = {
    Slash = Handle:WaitForChild("Slash"),
    Lunge = Handle:WaitForChild("Lunge"),
    Unsheath = Handle:WaitForChild("Unsheath"),
}

LastAttack = 0

ToolEquipped = false

Kills.Value = 0

Tool.Enabled = true

function SwordUp()
    Tool.Grip = Grips.Up
end

function SwordOut()
    Tool.Grip = Grips.Out
end

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 = Instance.new("ObjectValue")
    Creator_Tag.Name = "creator"
    Creator_Tag.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 GetAllConnectedParts(Object)
    local Parts = {}
    local function GetConnectedParts(Object)
        for i, v in pairs(Object:GetConnectedParts()) do
            local Ignore = false
            for ii, vv in pairs(Parts) do
                if v == vv then
                    Ignore = true
                end
            end
            if not Ignore then
                table.insert(Parts, v)
                GetConnectedParts(v)
            end
        end
    end
    GetConnectedParts(Object)
    return Parts
end

function ManagePower()
    local Power = Kills.Value
    if (Power >= 0 and Power <= Kills.MaxValue) then
        Tool.ToolTip = ("Power: " .. Power .. "/8")
    end
    local DmgInc = (DamageValues.Upgrade.Min + (DamageValues.Upgrade.Max - DamageValues.Upgrade.Min) * (Power / Kills.MaxValue))
    DamageValues.BaseDamage = DmgInc
    DamageValues.SlashDamage = DmgInc
    DamageValues.LungeDamage = (2 * DmgInc)
    print(DamageValues.SlashDamage)
end

function Attack()
    Damage = DamageValues.SlashDamage
    Sounds.Slash:Play()
    local Anim = Instance.new("StringValue")
    Anim.Name = "toolanim"
    Anim.Value = "Slash"
    Anim.Parent = Tool
end

function Lunge()
    Damage = DamageValues.LungeDamage
    Sounds.Lunge:Play()
    local Anim = Instance.new("StringValue")
    Anim.Name = "toolanim"
    Anim.Value = "Lunge"
    Anim.Parent = Tool  
    local Force = Instance.new("BodyVelocity")
    Force.velocity = Vector3.new(0, 10, 0) 
    Force.maxForce = Vector3.new(0, 4000, 0)
    Debris:AddItem(Force, 0.5)
    Force.Parent = RootPart
    wait(0.25)
    SwordOut()
    wait(0.25)
    if Force and Force.Parent then
        Force:Destroy()
    end
    wait(0.5)
    SwordUp()
end

function Blow(Hit)
    if not Hit or not Hit.Parent or not CheckIfAlive() 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 ~= RightArm and RightGrip.Part1 ~= RightArm) or (RightGrip.Part0 ~= Handle and RightGrip.Part1 ~= Handle) then
        return
    end
    local character = Hit.Parent
    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
    UntagHumanoid(humanoid)
    TagHumanoid(humanoid, Player)
    humanoid:TakeDamage(Damage)
    print(Damage)
    if humanoid.Health <= 0 then
        Kills.Value = (Kills.Value + 1)
        ManagePower()
    end
end

function Activated()
    if not Tool.Enabled or not ToolEquipped or not CheckIfAlive() then
        return
    end
    Tool.Enabled = false
    local Tick = RunService.Stepped:wait()
    if (Tick - LastAttack) < 0.2 then
        Lunge()
    else
        Attack()
    end
    Damage = DamageValues.BaseDamage
    LastAttack = Tick
    Tool.Enabled = true
end

function CheckIfAlive()
    return (((Character and Character.Parent and Humanoid and Humanoid.Parent and Humanoid.Health > 0 and RootPart and RootPart.Parent and Player and Player.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
    ToolEquipped = true
    Sounds.Unsheath:Play()
end

function Unequipped()
    ToolEquipped = false
end

SwordUp()

Handle.Touched:connect(Blow)

Tool.Activated:connect(Activated)
Tool.Equipped:connect(Equipped)
Tool.Unequipped:connect(Unequipped)

Answer this question