Log in to vote
0

Keeping NPC's from attacking eachother?

Asked by 7 years ago

I have two NPC's down on the level and they attack eachother as soon as I run it.

local larm = script.Parent:FindFirstChild("Left Arm")
local rarm = script.Parent:FindFirstChild("Right Arm")

function findNearestTorso(pos)
    local list = game.Workspace:children()
    local torso = nil
    local dist = 20
    local temp = nil
    local human = nil
    local temp2 = nil
    for x = 1, #list do
        temp2 = list[x]
        if (temp2.className == "Model") and (temp2 ~= script.Parent) then
            temp = temp2:findFirstChild("Torso")
            human = temp2:findFirstChild("Humanoid")
            if (temp ~= nil) and (human ~= nil) and (human.Health > 0) then
                if (temp.Position - pos).magnitude < dist then
                    torso = temp
                    dist = (temp.Position - pos).magnitude
                end
            end
        end
    end
    return torso
end

while true do
    wait(0.1)
    local target = findNearestTorso(script.Parent.Torso.Position)
    if target ~= nil then
        script.Parent.Humanoid:MoveTo(target.Position, target)
    end
end

I have found the problem, in the scripting I said "findnearesttorso" but I don't know any other way of doing this.

Is there any way I can keep NPC's from attacking eachother but attack players?

2 answers

Log in to vote
0
Answered by 7 years ago

Okay. I modified the script. All you have to do is change the name of the Humanoid to NPC (Including caps). This will probably break your other scripts. But they can be fixed by changing one word.

local larm = script.Parent:FindFirstChild("Left Arm")
local rarm = script.Parent:FindFirstChild("Right Arm")

function findNearestTorso(pos)
    local list = game.Workspace:children()
    local torso = nil
    local dist = 20
    local temp = nil
    local human = nil
    local temp2 = nil
    for x = 1, #list do
        temp2 = list[x]
        if (temp2.className == "Model") and (temp2 ~= script.Parent) then
            temp = temp2:findFirstChild("Torso")
            human = temp2:findFirstChild("Humanoid")
            if (temp ~= nil) and (human ~= nil) and (human.Health > 0) then
                if (temp.Position - pos).magnitude < dist then
                    torso = temp
                    dist = (temp.Position - pos).magnitude
                end
            end
        end
    end
    return torso
end

while true do
    wait(0.1)
    local target = findNearestTorso(script.Parent.Torso.Position)
    if target ~= nil then
        script.Parent.NPC:MoveTo(target.Position, target)
    end
end

0
It worked. Appreciated! But they don't attack the player anymore. firedum 5 — 7y
0
Perhaps I should put it into more detail; When the player comes in range, it will sit there and attack with its sword. It will not move from its position at all though firedum 5 — 7y
Ad
Log in to vote
0
Answered by 1 year ago

Not entirely sure of what the NPCs do to the player or each other. I need some more information like: Do the NPCs hurt when touching each other? Do NPCs battle other NPCs? Etc. Anyways, changing the humanoid is recommended, but if you have a variety of NPCs which it seems that you do, have another if statement at line 13. For example, within the NPC you can change something that distinguishes it like a string value, or a body color, or a script name. Ex): if (temp2.className == "Model") and (temp2 ~= script.Parent) and FindFirstChild:("Scriptname/BodyColor/StringValue").Value/Name/BrickColor == "Name/Value/Color" then

Answer this question