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

Why won't this throwing knife damage players? [closed]

Asked by
lunatic5 409 Moderation Voter
5 years ago
Edited 5 years ago

This throwing knife script is from an actual tool on the Roblox catalog. The knife works perfectly fine except for the fact that it doesn't damage the players. Does anyone have any idea why it doesn't damage the player?

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

local FriendlyFire = false

local AttackPower = 1
local AttackDamage = 35
local AtackRechargeTime = 3
local AttackRecharge = 1/AtackRechargeTime
local AttackSpeed = 300

local Equipped = false
local Heartbeat = game:GetService("RunService").Heartbeat

local Knives = {}

--returns the wielding player of this tool
function getPlayer()
    local char = Tool.Parent
    return game:GetService("Players"):GetPlayerFromCharacter(char)
end

--helpfully checks a table for a specific value
function contains(t, v)
    for _, val in pairs(t) do
        if val == v then
            return true
        end
    end
    return false
end

--tags a human for the ROBLOX KO system
function tagHuman(human)
    local tag = Instance.new("ObjectValue")
    tag.Value = getPlayer()
    tag.Name = "creator"
    tag.Parent = human
    game:GetService("Debris"):AddItem(tag)
end

--used by checkTeams
function sameTeam(otherHuman)
    local player = getPlayer()
    local otherPlayer = game:GetService("Players"):GetPlayerFromCharacter(otherHuman.Parent)
    if player and otherPlayer then
        return player.TeamColor == otherPlayer.TeamColor
    end
    return false
end

--use this to determine if you want this human to be harmed or not, returns boolean
function checkTeams(otherHuman)
    return not (sameTeam(otherHuman) and not FriendlyFire)
end

function getKnife()
    local knife = Handle:clone()
    knife.Transparency = 0
    knife.Hit.Pitch = math.random(90, 110)/100

    local lift = Instance.new("BodyForce")
    lift.force = Vector3.new(0, 196.2, 0) * knife:GetMass() * 0.8
    lift.Parent = knife

    local proj = Tool.Projectile:Clone()
    proj.Disabled = false
    proj.Parent = knife

    return knife
end

function equippedLoop()
    while Equipped do
        local dt = Heartbeat:wait()

        if AttackPower < 1 then
            AttackPower = AttackPower + dt * AttackRecharge
            if AttackPower > 1 then
                AttackPower = 1
            end
        end

        Handle.Transparency = 1 - AttackPower
    end
end

function onLeftDown(mousePos)
    local knife = getKnife()
    knife.CFrame = CFrame.new(Handle.Position, mousePos)
    knife.Velocity = knife.CFrame.lookVector * AttackSpeed * AttackPower
    local damage = AttackDamage * AttackPower
    local touched
    touched = knife.Touched:connect(function(part)
        if part:IsDescendantOf(Tool.Parent) then return end
        if contains(Knives, part) then return end

        if part.Parent and part.Parent:FindFirstChild("Humanoid") then
            local human = part.Parent.Humanoid
            if checkTeams(human) then
                tagHuman(human)
                human:TakeDamage(damage)
                knife.Hit:Play()
            end
        end

        knife.Projectile:Destroy()

        local w = Instance.new("Weld")
        w.Part0 = part
        w.Part1 = knife
        w.C0 = part.CFrame:toObjectSpace(knife.CFrame)
        w.Parent = w.Part0

        touched:disconnect()
    end)
    table.insert(Knives, knife)
    knife.Parent = workspace

    game:GetService("Debris"):AddItem(knife, 3.5)
    delay(2, function()
        knife.Transparency = 1
    end)

    Remote:FireClient(getPlayer(), "PlayAnimation", "Throw")    

    Handle.Throw.Pitch = 0.8 + 0.4 * AttackPower
    Handle.Throw:Play()

    AttackPower = 0
end

function onRemote(player, func, ...)
    if player ~= getPlayer() then return end

    if func == "LeftDown" then
        onLeftDown(...)
    end
end

function onEquip()
    Equipped = true
    equippedLoop()
end

function onUnequip()
    Equipped = false
end

Remote.OnServerEvent:connect(onRemote)
Tool.Equipped:connect(onEquip)
Tool.Unequipped:connect(onUnequip)

Please help! Thanks!

Closed as Not Constructive by User#19524

This question has been closed because it is not constructive to others or the asker. Most commonly, questions that are requests with no attempt from the asker to solve their problem will fall into this category.

Why was this question closed?

1 answer

Log in to vote
0
Answered by 5 years ago
Edited 5 years ago

the script doesn't have a function to tell if it even hit anything, that's why. insert this, and everything should be a go:

local function onTouch(otherPart)
    if otherPart.Parent:FindFirstChild("Humanoid") ~= nil then
        otherPart.Parent:FindFirstChild("Humanoid").Health = otherPart.Parent:FindFirstChild("Humanoid").Health - AttackDamage
    end
end
Handle.Touched:Connect(onTouch)

i didn't really implement the friendlyfire thing, since i dont really have much time / experience with teams and whatnot, but, hopefully this helps!

edit: didn't see 'see more lines' and i feel like an idiot

0
I believe the damaging part of the script is supposed to be within the "onLeftDown()" function in the script. I think it starts on line 99. I'm not sure though. lunatic5 409 — 5y
Ad