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

Help with Laser Gun destroying Humanoid?

Asked by 9 years ago
-----------------
--| Constants |--
-----------------

local SHOT_SPEED = 200
local SHOT_TIME = 1.5

local NOZZLE_OFFSET = Vector3.new(0, 0.4, -1.1)

-----------------
--| Variables |--
-----------------

local PlayersService = Game:GetService('Players')
local DebrisService = Game:GetService('Debris')

local Tool = script.Parent
local Handle = Tool:WaitForChild('Handle')

local FireSound = Handle:WaitForChild('Fire')
local ReloadSound = Handle:WaitForChild('Reload')
local HitFadeSound = script:WaitForChild('HitFade')

local Character = nil
local Humanoid = nil
local Player = nil

local BaseShot = nil

-----------------
--| Functions |--
-----------------

-- Returns a character ancestor and its Humanoid, or nil
local function FindCharacterAncestor(subject)
    if subject and subject ~= Workspace then
        local humanoid = subject:FindFirstChild('Humanoid')
        if humanoid then
            return subject, humanoid
        else
            return FindCharacterAncestor(subject.Parent)
        end
    end
    return nil
end

-- Removes any old creator tags and applies new ones to the specified target
local function ApplyTags(target)
    while target:FindFirstChild('creator') do
        target.creator:Destroy()
    end

    local creatorTag = Instance.new('ObjectValue')
    creatorTag.Value = Player
    creatorTag.Name = 'creator' --NOTE: Must be called 'creator' for website stats

    local iconTag = Instance.new('StringValue')
    iconTag.Value = Tool.TextureId
    iconTag.Name = 'icon'

    iconTag.Parent = creatorTag
    creatorTag.Parent = target
    DebrisService:AddItem(creatorTag, 4)
end

-- Returns all objects under instance with Transparency
local function GetTransparentsRecursive(instance, partsTable)
    local partsTable = partsTable or {}
    for _, child in pairs(instance:GetChildren()) do
        if child:IsA('BasePart') or child:IsA('Decal') then
            table.insert(partsTable, child)
        end
        GetTransparentsRecursive(child, partsTable)
    end
    return partsTable
end

local function SelectionBoxify(instance)
    for _, player in pairs(game.Players:GetPlayers()) do
        local selectionBox = Instance.new('SelectionBox')
        selectionBox.Adornee = instance
        selectionBox.Color = player.TeamColor
        selectionBox.Parent = instance
        return selectionBox
    end
end


local function FadeOutObjects(objectsWithTransparency, fadeIncrement)
    repeat
        local lastObject = nil
        for _, object in pairs(objectsWithTransparency) do
            object.Transparency = object.Transparency + fadeIncrement
            lastObject = object
        end
        wait()
    until lastObject.Transparency >= 1 or not lastObject
end

local function Dematerialize(character, humanoid, firstPart)
    humanoid.WalkSpeed = 0

    local parts = {}
    for _, child in pairs(character:GetChildren()) do
        if child:IsA('BasePart') then
            child.Anchored = true
            table.insert(parts, child)
        elseif child:IsA('LocalScript') or child:IsA('Script') then
            child:Destroy()
        end
    end

    local selectionBoxes = {}

    local firstSelectionBox = SelectionBoxify(firstPart)
    wait(0.05)

    for _, part in pairs(parts) do
        if part ~= firstPart then
            table.insert(selectionBoxes, SelectionBoxify(part))
        end
    end

    local objectsWithTransparency = GetTransparentsRecursive(character)
    FadeOutObjects(objectsWithTransparency, 0.1)

    wait(0.5)

    humanoid.Health = 0
    DebrisService:AddItem(character, 2)

    local fadeIncrement = 0.05
    Delay(0.2, function()
        FadeOutObjects({firstSelectionBox}, fadeIncrement)
        if character then
            character:Destroy()
        end
    end)
    FadeOutObjects(selectionBoxes, fadeIncrement)
end

local function OnTouched(shot, otherPart)
    local character, humanoid = FindCharacterAncestor(otherPart)
    if otherPart.ClassName == "Part" and otherPart.Name ~= "Handle" then
        shot:Destroy()
    end
    if character and humanoid and character ~= Character then
        ApplyTags(humanoid)
        if shot then
            local hitFadeSound = shot:FindFirstChild(HitFadeSound.Name)
            if hitFadeSound then
                hitFadeSound.Parent = humanoid.Torso
                hitFadeSound:Play()
            end
            shot:Destroy()
        end
        Dematerialize(character, humanoid, otherPart)
    end
end

local function OnEquipped()
    Character = Tool.Parent
    Humanoid = Character:WaitForChild('Humanoid')
    Player = PlayersService:GetPlayerFromCharacter(Character)
end

local function OnActivated()
    if Tool.Enabled and Humanoid.Health > 0 then
        Tool.Enabled = false

        FireSound:Play()

        local handleCFrame = Handle.CFrame
        local firingPoint = handleCFrame.p + handleCFrame:vectorToWorldSpace(NOZZLE_OFFSET)
        local shotCFrame = CFrame.new(firingPoint, Humanoid.TargetPoint)

        local laserShotClone = BaseShot:Clone()
        laserShotClone.Touched:connect(function(part)
            if part.ClassName == "Part" and part.Name ~= "Handle" then
                laserShotClone:Destroy()
            end
        end)
        laserShotClone.CFrame = shotCFrame + (shotCFrame.lookVector * (BaseShot.Size.Z / 2))
        local bodyVelocity = Instance.new('BodyVelocity')
        bodyVelocity.velocity = shotCFrame.lookVector * SHOT_SPEED
        bodyVelocity.Parent = laserShotClone
        laserShotClone.Touched:connect(function(otherPart)
            OnTouched(laserShotClone, otherPart)
        end)
        DebrisService:AddItem(laserShotClone, SHOT_TIME)
        laserShotClone.Parent = Tool

        wait(0.6) -- FireSound length

        ReloadSound:Play()
        wait(0.75) -- ReloadSound length

        Tool.Enabled = true
    end
end

local function OnUnequipped()

end

--------------------
--| Script Logic |--
--------------------

for _, player in pairs(game.Players:GetPlayers()) do
    BaseShot = Instance.new('Part')
    BaseShot.Name = 'Effect'
    BaseShot.FormFactor = Enum.FormFactor.Custom
    BaseShot.Size = Vector3.new(0.2, 0.2, 3)
    BaseShot.CanCollide = false
    BaseShot.BrickColor = player.TeamColor
    SelectionBoxify(BaseShot)
    HitFadeSound:Clone().Parent = BaseShot
end

BaseShot.Touched:connect(function(part)
    if part.ClassName == "Part" then
        BaseShot:Destroy()
    end
end)

Tool.Equipped:connect(OnEquipped)
Tool.Unequipped:connect(OnUnequipped)
Tool.Activated:connect(OnActivated)

I am just using roblox's hyperlaser, but there is a problem. I am making a tycoon and it destroys the humanoid. Can anyone tell how I can fix this. I am trying to find where it destroys the player, so I can change it so it only kills the PLAYER and not models with a humanoid in them. I put a BoolValue inside all the models with Humanoids in them so I could try and destroy the bullet if it touches a block with a BoolValue, so it dosent destory the whole tycoon.

0
Just change the name of the Humanoid that is inside the models. parkderp1 105 — 9y

Answer this question