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

Is this problem fixable,i have problems with NPCS?

Asked by
ipi119 -2
3 years ago

I found some script on roblox ,which many models use but this one is a bit complicated me to understand.How i can make that npc killer doesnt kill other npcs and to kill a players instead of only one that newly joined the game?

local SearchDistance =  10000   -- How far a player can be before it detects you

local ZombieDamage =    25      -- How much damage the Zombie inficts towards the player
local DamageWait =      2       -- How many seconds to wait before it can damage the player again

local WanderX, WanderZ = 30, 30
--  How many studs the zombie can wander on the x and z axis in studs ; 0, 0 to stay still

function getHumanoid(model)
    for _, v in pairs(model:GetChildren())do
        if v:IsA'Humanoid' then
            return v
        end
    end
end


local zombie = script.Parent
local human = getHumanoid(zombie)
local hroot = zombie.HumanoidRootPart
local zspeed = hroot.Velocity.magnitude
local head = zombie:FindFirstChild'Head'
local vars = script.vars

local pfs = game:GetService("PathfindingService")
local players = game:GetService('Players')

local path
local waypoint

local chaseName = nil

function GetTorso(part)
    local chars = game.Workspace:GetChildren()
    local chaseRoot = nil
    local chaseTorso = nil
    local chasePlr = nil
    local chaseHuman = nil
    local mag = SearchDistance
    for i = 1, #chars do
        chasePlr = chars[i]
        if chasePlr:IsA'Model' and chasePlr ~= zombie then
            chaseHuman = getHumanoid(chasePlr)
            chaseRoot = chasePlr:FindFirstChild'HumanoidRootPart'
            if chaseRoot ~= nil and chaseHuman ~= nil and chaseHuman.Health > 0 and chaseHuman.Name ~= "Zombie" then
                if (chaseRoot.Position - part).magnitude < mag then
                    chaseName = chasePlr.Name
                    chaseTorso = chaseRoot
                    mag = (chaseRoot.Position - part).magnitude
                end
            end
        end
    end
    return chaseTorso
end

function GetPlayersBodyParts(t)
    local torso = t
    if torso then
        local figure = torso.Parent
        for _, v in pairs(figure:GetChildren())do
            if v:IsA'Part' then
                return v.Name
            end
        end
    else
        return "HumanoidRootPart"
    end
end

local damagetime
local damagedb = false

for _, zambieparts in pairs(zombie:GetChildren())do
    if zambieparts:IsA'Part' and human.Health > 0 then
        zambieparts.Touched:connect(function(p)
            if p.Parent.Name == chaseName and p.Parent.Name ~= zombie.Name and not damagedb then -- damage
                damagedb = true
                damagetime = time()
                local enemy = p.Parent
                local enemyhuman = getHumanoid(enemy)
                vars.Attacking.Value = true
                enemyhuman:TakeDamage(ZombieDamage)
                vars.Attacking.Value = false
                while wait() do
                    if damagetime ~= nil and time() >= (damagetime + DamageWait) then
                        damagedb = false
                        damagetime = nil
                    end
                end
            end
        end)
    end
end

-- wandering 
spawn(function()
    while vars.Wandering.Value == false and human.Health > 0 do 
        vars.Chasing.Value = false  
        vars.Wandering.Value = true
        local desgx, desgz = hroot.Position.x+math.random(-WanderX,WanderX), hroot.Position.z+math.random(-WanderZ,WanderZ)
        local function checkw(t)
            local ci = 3
            if ci > #t then
                ci = 3
            end
            if t[ci] == nil and ci < #t then
                repeat ci = ci + 1 wait() until t[ci] ~= nil
                return Vector3.new(1,0,0) + t[ci]
            else
                ci = 3
                return t[ci]
            end
        end

        path = pfs:FindPathAsync(hroot.Position, Vector3.new(desgx, 0, desgz))
        waypoint = path:GetWaypoints()
        local connection;

        local direct = Vector3.FromNormalId(Enum.NormalId.Front)
        local ncf = hroot.CFrame * CFrame.new(direct)
        direct = ncf.p.unit
        local rootr = Ray.new(hroot.Position, direct)
        local phit, ppos = game.Workspace:FindPartOnRay(rootr, hroot)

        if path and waypoint or checkw(waypoint) then
            if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Walk then
                human:MoveTo( checkw(waypoint).Position )
                human.Jump = false
            end

            if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Jump then
                connection = human.Changed:connect(function()
                    human.Jump = true
                end)
                human:MoveTo( waypoint[4].Position )
            else
                human.Jump = false
            end

            if connection then
                connection:Disconnect()
            end

        else
            for i = 3, #waypoint do
                human:MoveTo( waypoint[i].Position )    
            end
        end
        wait(math.random(4,6))
        vars.Wandering.Value = false
    end
end)

while wait() do
    local nrstt = GetTorso(hroot.Position)
    if nrstt ~= nil and human.Health > 0 then -- if player detected 
        vars.Wandering.Value = false
        vars.Chasing.Value = true
        local function checkw(t)
            local ci = 3
            if ci > #t then
                ci = 3
            end
            if t[ci] == nil and ci < #t then
                repeat ci = ci + 1 wait() until t[ci] ~= nil
                return Vector3.new(1,0,0) + t[ci]
            else
                ci = 3
                return t[ci]
            end
        end

        path = pfs:FindPathAsync(hroot.Position, nrstt.Position)
        waypoint = path:GetWaypoints()
        local connection;

        local direct = Vector3.FromNormalId(Enum.NormalId.Front)
        local ncf = hroot.CFrame * CFrame.new(direct)
        direct = ncf.p.unit
        local rootr = Ray.new(hroot.Position, direct)
        local phit, ppos = game.Workspace:FindPartOnRay(rootr, hroot)

        if path and waypoint or checkw(waypoint) then
            if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Walk then
                human:MoveTo( checkw(waypoint).Position )
                human.Jump = false
            end

            if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Jump then
                connection = human.Changed:connect(function()
                    human.Jump = true
                end)
                human:MoveTo( waypoint[4].Position )
            else
                human.Jump = false
            end

            hroot.Touched:connect(function(p)
                local bodypartnames = GetPlayersBodyParts(nrstt)
                if p:IsA'Part' and not p.Name == bodypartnames and phit and phit.Name ~= bodypartnames and phit:IsA'Part' and rootr:Distance(phit.Position) < 5 then
                    connection = human.Changed:connect(function()
                        human.Jump = true
                    end)
                else
                    human.Jump = false
                end
            end)

            if connection then
                connection:Disconnect()
            end

        else
            for i = 3, #waypoint do
                human:MoveTo( waypoint[i].Position )    
            end
        end
        path = nil
        waypoint = nil
    elseif nrstt == nil then -- if player not detected
        vars.Wandering.Value = false
        vars.Chasing.Value = false
        CchaseName = nil
        path = nil
        waypoint = nil
        human.MoveToFinished:Wait()
    end
end

Answer this question