Ad
Log in to vote
1

Why is Humanoid.Died not working on anchored characters?

Asked by 16 days 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 15 days 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 16 days ago
Edited 16 days 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 49 — 16d
0
you dont need remote events to get health Hi_People1133 168 — 16d
0
Rlly. Why VAnkata20 49 — 16d
0
@VAnkata20 The tool and the respawn script are both server-sided T3_MasterGamer 242 — 16d
View all comments (2 more)
0
Thank you @Hi_People1133 I'll try it later. T3_MasterGamer 242 — 16d
0
Didn't worked sadly. :'( T3_MasterGamer 242 — 16d

Answer this question