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

how do I handle functions the right way?

Asked by 4 years ago
local raypart = script.Parent.Parent.Turret 
local model = script.Parent.Parent
local numRays = 100
local searchDistance = 50 -- studs
local debounce = false
local peacelist = {}
local partlist

local mode = false --false = exploring, true = attacking
local debounce1 = false
local debounce2 = false
local debounce3 = false




function randomwarp()
    spawn(function()
    if mode == false and not debounce1 then
        debounce1 = true
        script.Parent.GoTo.Value = script.Parent.Parent.HumanoidRootPart.Position
    math.randomseed(tick()%1*1e6)
    local choose = math.random(1,4)
if choose == 1 then
    script.Parent.Warp.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(500,0,0)
elseif choose == 2 then
    script.Parent.Warp.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(-500,0,0)
elseif choose == 3 then
    script.Parent.Warp.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(0,0,500)
elseif choose == 4 then
    script.Parent.Warp.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(0,0,-500)
end
    end
    end)
    wait(50)
    debounce1 = false
end






function randommove()
    spawn(function()
    if mode == false and not debounce3 then
        debounce3 = true
    math.randomseed(tick()%1*1e6)
    local choose = math.random(1,4)
if choose == 1 then
    script.Parent.GoTo.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(500,0,0)
elseif choose == 2 then
    script.Parent.GoTo.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(-500,0,0)
elseif choose == 3 then
    script.Parent.GoTo.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(0,0,500)
elseif choose == 4 then
    script.Parent.GoTo.Value = script.Parent.Parent.HumanoidRootPart.Position + Vector3.new(0,0,-500)
end
    end
    end)
    wait(15)
    debounce3 = false
end










function getRayAtAngle( part, degrees, distance )--process rays
    local ray = Ray.new( part.CFrame.p, ( part.CFrame * CFrame.Angles( 0, math.rad( degrees ), 0 ) ).lookVector * distance )
    return ray
end




function startscan()--scan for a target
    spawn(function()
        if not debounce2 then
            debounce2 = true
    partlist = {}
local frac = 360 / numRays
for angle = frac, 360, frac do
    local ray = getRayAtAngle(raypart,angle,searchDistance)
    local part = game.Workspace:FindPartOnRay(ray,model)
table.insert(partlist,part)
end
compareradiustable()
wait(0.1)
debounce2 = false
end
end)
end





function compareradiustable()
for _, p in next, partlist do
        if p and p.Parent and p.Parent:FindFirstChild("Humanoid") then
            if p:IsA("BasePart") and p.Parent:FindFirstChild("Core") and p.Parent.Core.Owner.Value ~= script.Parent.Parent.Core.Owner.Value and
                p.Parent.Core.Owner.Value ~= "none" then
                gototarget(p)
                mode = true
            return
            end 
end
end
wait(0.2)
mode = false
end






function gototarget(p)
    if mode == true then
    script.Parent.GoTo.Value = p.Position + p.CFrame.LookVector * 10
    end
end





while true do
    wait()
    startscan()
    randommove()
    randomwarp()
    end

here I have an npc script, but Im always having trouble having them all fire properly. I tried using spawn() so that the while loop wont wait for functions but it seems that this does not work. I want some functions to wait different amount of times so I added some debounces but it looks like a mess.

can I get some tips and corrections on how I should handle functions in this situation?

Answer this question