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

[SOLVED] Why is Humanoid.Died not working on anchored characters?

Asked by 2 years ago
Edited 1 year ago

When I kill an anchored character with a sword, Humanoid.Died works. However, when I shoot it with a Hyperlaser Gun, it doesn't work.

I tried editing the tool script, I tried unanchoring, I tried SetNetworkOwner(nil), I tried changing the HumanoidState, I tried using Humanoid:TakeDamage(), and I tried using Humanoid.ChildAdded since the tool script tags the Humanoid, nothing works. I tried possible answers and solutions, still nothing works.

If you know a way, please leave your solutions and I will try them all. Thank you! ^^

Respawn Script: (the script that the Humanoid.Died event is used)

local zombie = script.Parent
local hum = zombie:FindFirstChildOfClass("Humanoid")

hum.Died:Connect(function()
    local mrclone = game.ServerStorage:FindFirstChild(zombie.Name):Clone()
    mrclone.Parent = workspace.Monsters
    mrclone:SetPrimaryPartCFrame(workspace.JennaSpawn.CFrame)
    zombie:Destroy()
end)

Tool Script:

--Rescripted by Luckymaxer

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

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

Speed = 100
Duration = 1

NozzleOffset = Vector3.new(0, 0.4, -1.1)

Sounds = {
    Fire = Handle:WaitForChild("Fire"),
    Reload = Handle:WaitForChild("Reload"),
    HitFade = Handle:WaitForChild("HitFade")
}

PointLight = Handle:WaitForChild("PointLight")

ServerControl = (Tool:FindFirstChild("ServerControl") or Instance.new("RemoteFunction"))
ServerControl.Name = "ServerControl"
ServerControl.Parent = Tool

ClientControl = (Tool:FindFirstChild("ClientControl") or Instance.new("RemoteFunction"))
ClientControl.Name = "ClientControl"
ClientControl.Parent = Tool

ServerControl.OnServerInvoke = (function(player, Mode, Value, arg)
    if player ~= Player or Humanoid.Health == 0 or not Tool.Enabled then
        return
    end
    if Mode == "Click" and Value then
        Activated(arg)
    end
end)

function InvokeClient(Mode, Value)
    pcall(function()
        ClientControl:InvokeClient(Player, Mode, Value)
    end)
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 FindCharacterAncestor(Parent)
    if Parent and Parent ~= game:GetService("Workspace") then
        local humanoid = Parent:FindFirstChildOfClass("Humanoid")
        if humanoid then
            return Parent, humanoid
        else
            return FindCharacterAncestor(Parent.Parent)
        end
    end
    return nil
end

function GetTransparentsRecursive(Parent, PartsTable)
    local PartsTable = (PartsTable or {})
    for i, v in pairs(Parent:GetChildren()) do
        local TransparencyExists = false
        pcall(function()
            local Transparency = v["Transparency"]
            if Transparency then
                TransparencyExists = true
            end
        end)
        if TransparencyExists then
            table.insert(PartsTable, v)
        end
        GetTransparentsRecursive(v, PartsTable)
    end
    return PartsTable
end

function SelectionBoxify(Object)
    local SelectionBox = Instance.new("SelectionBox")
    SelectionBox.Adornee = Object
    SelectionBox.Color = BrickColor.new("Toothpaste")
    SelectionBox.Parent = Object
    return SelectionBox
end

local function Light(Object)
    local Light = PointLight:Clone()
    Light.Range = (Light.Range + 2)
    Light.Parent = Object
end

function FadeOutObjects(Objects, FadeIncrement)
    repeat
        local LastObject = nil
        for i, v in pairs(Objects) do
            v.Transparency = (v.Transparency + FadeIncrement)
            LastObject = v
        end
        wait()
    until LastObject.Transparency >= 1 or not LastObject
end

function Dematerialize(character, humanoid, FirstPart)
    if not character or not humanoid then
        return
    end

    humanoid.WalkSpeed = 0

    local Parts = {}

    for i, v in pairs(character:GetChildren()) do
        if v:IsA("BasePart") then
            v.Anchored = true
            table.insert(Parts, v)
        elseif v:IsA("LocalScript") or v:IsA("Script") then
            v:Destroy()
        end
    end

    local SelectionBoxes = {}

    local FirstSelectionBox = SelectionBoxify(FirstPart)
    Light(FirstPart)
    wait(0.05)

    for i, v in pairs(Parts) do
        if v ~= FirstPart then
            table.insert(SelectionBoxes, SelectionBoxify(v))
            Light(v)
        end
    end

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

    wait(0.5)

    character:BreakJoints()
    humanoid.Health = 0

    Debris:AddItem(character, 2)

    local FadeIncrement = 0.05
    delay(0.2, function()
        FadeOutObjects({FirstSelectionBox}, FadeIncrement)
        if character and character.Parent then
            character:Destroy()
        end
    end)
    FadeOutObjects(SelectionBoxes, FadeIncrement)
end

function Touched(Projectile, Hit)
    if not Hit or not Hit.Parent then
        return
    end
    local character, humanoid = FindCharacterAncestor(Hit)
    if character and humanoid and character ~= Character then
        local ForceFieldExists = false
        for i, v in pairs(character:GetChildren()) do
            if v:IsA("ForceField") then
                ForceFieldExists = true
            end
        end
        if not ForceFieldExists then
            if Projectile then
                local HitFadeSound = Projectile:FindFirstChild(Sounds.HitFade.Name)
                local torso = humanoid.Torso
                if HitFadeSound and torso then
                    HitFadeSound.Parent = torso
                    HitFadeSound:Play()
                end
            end
            Dematerialize(character, humanoid, Hit)
        end
        if Projectile and Projectile.Parent then
            Projectile:Destroy()
        end
    end
end

function Equipped()
    Character = Tool.Parent
    Player = Players:GetPlayerFromCharacter(Character)
    Humanoid = Character:FindFirstChildOfClass("Humanoid")
    if not Player or not Humanoid or Humanoid.Health == 0 then
        return
    end
end

function Activated(target)
    if Tool.Enabled and Humanoid.Health > 0 then
        Tool.Enabled = false

        InvokeClient("PlaySound", Sounds.Fire)

        local HandleCFrame = Handle.CFrame
        local FiringPoint = HandleCFrame.p + HandleCFrame:vectorToWorldSpace(NozzleOffset)
        local ShotCFrame = CFrame.new(FiringPoint, target)

        local LaserShotClone = BaseShot:Clone()
        LaserShotClone.CFrame = ShotCFrame + (ShotCFrame.lookVector * (BaseShot.Size.Z / 2))
        local BodyVelocity = Instance.new("BodyVelocity")
        BodyVelocity.velocity = ShotCFrame.lookVector * Speed
        BodyVelocity.Parent = LaserShotClone
        LaserShotClone.Touched:connect(function(Hit)
            if not Hit or not Hit.Parent then
                return
            end
            Touched(LaserShotClone, Hit)
        end)
        Debris:AddItem(LaserShotClone, Duration)
        LaserShotClone.Parent = game:GetService("Workspace")

        wait(0.6) -- FireSound length

        InvokeClient("PlaySound", Sounds.Reload)

        wait(0.75) -- ReloadSound length

        Tool.Enabled = true
    end
end

function Unequipped()

end

BaseShot = Instance.new("Part")
BaseShot.Name = "Effect"
BaseShot.BrickColor = BrickColor.new("Toothpaste")
BaseShot.Material = Enum.Material.Plastic
BaseShot.Shape = Enum.PartType.Block
BaseShot.TopSurface = Enum.SurfaceType.Smooth
BaseShot.BottomSurface = Enum.SurfaceType.Smooth
BaseShot.FormFactor = Enum.FormFactor.Custom
BaseShot.Size = Vector3.new(0.2, 0.2, 3)
BaseShot.CanCollide = false
BaseShot.Locked = true
SelectionBoxify(BaseShot)
Light(BaseShot)
BaseShotSound = Sounds.HitFade:Clone()
BaseShotSound.Parent = BaseShot

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

2 answers

Log in to vote
0
Answered by 2 years ago

I finally found the solution! I actually don't have to change the Respawn Script, instead, it was the Tool Script. In lines 129-130, it removes any LocalScript and Script inside the character, including the Respawn Script.

elseif v:IsA("LocalScript") or v:IsA("Script") then
    v:Destroy()
end

What I did was I made an "if" statement to tell if the script name is "Respawn" or not.

elseif v:IsA("LocalScript") or v:IsA("Script") then
    if v.Name ~= "Respawn" then
        v:Destroy()
    end
end

I tried it and it now works! Thank you to the other person who answered this, but your script didn't work.

Ad
Log in to vote
-1
Answered by 2 years ago
Edited 2 years ago

Hello,

Instead of Humanoid.Died use Humanoid.HealthChanged, you can check if the new Humanoid Health Value is less or equal to 0. That will be like,

Tip: Humanoid.HealthChanged has first Parameter of Newhealth

local Zombie = script.Parent
local Humanoid = zombie:FindFirstChild("Humanoid")

Humanoid.HealthChanged:Connect(function(NewHealth)
    if NewHealth <= 0 then
        -- Do stuff
    end
end)
0
That could be it but my guess is that the server isn't picking up the health locally. That's why he needs to make a remote event to pass things to a server script VAnkata20 135 — 2y
0
you dont need remote events to get health Hi_People1133 218 — 2y
0
Rlly. Why VAnkata20 135 — 2y
0
@VAnkata20 The tool and the respawn script are both server-sided T3_MasterGamer 2189 — 2y
View all comments (2 more)
0
Thank you @Hi_People1133 I'll try it later. T3_MasterGamer 2189 — 2y
0
Didn't worked sadly. :'( T3_MasterGamer 2189 — 2y

Answer this question