Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

Why does the npc lag a ton when i clone it?

my npc is usually fine, but when it dies and respawns, it increasingly gets more laggy every time it dies.

the ai:

if script.Parent.HumanoidRootPart:CanSetNetworkOwnership() then
    script.Parent.HumanoidRootPart:SetNetworkOwner(nil) -- setting the owner to the server
end

local myHuman = script.Parent:WaitForChild("Humanoid")
local myRoot = script.Parent:WaitForChild("HumanoidRootPart")
local head = script.Parent:WaitForChild("Head")
local lowerTorso = script.Parent:WaitForChild("LowerTorso")
local grab = script.Parent:WaitForChild("grabanim")
local grabAnim = script.Parent.Humanoid:LoadAnimation(grab)
grabAnim.Priority = Enum.AnimationPriority.Action



local clone = script.Parent:Clone()

function walkRandomly()
	local xRand = math.random(-50,50)
	local zRand = math.random(-50,50)
	local goal = myRoot.Position + Vector3.new(xRand,0,zRand)
	
	local path = game:GetService("PathfindingService"):CreatePath()
	path:ComputeAsync(myRoot.Position, goal)
	local waypoints = path:GetWaypoints()
	
	if path.Status == Enum.PathStatus.Success then
		for _, waypoint in ipairs(waypoints) do
			if waypoint.Action == Enum.PathWaypointAction.Jump then
				myHuman.Jump = true
			end
			myHuman:MoveTo(waypoint.Position)
			local timeOut = myHuman.MoveToFinished:Wait(0.1)
			if not timeOut then
				print("Got stuck")
				myHuman.Jump = true
				walkRandomly()
			end
		end
	else
		print("Path failed")
		wait(0.1)
		walkRandomly()
	end
end

function findPath(target)
	local path = game:GetService("PathfindingService"):CreatePath()
	path:ComputeAsync(myRoot.Position,target.Position)
	local waypoints = path:GetWaypoints()
	
	if path.Status == Enum.PathStatus.Success then
		for _, waypoint in ipairs(waypoints) do
			if waypoint.Action == Enum.PathWaypointAction.Jump then
				myHuman.Jump = true
			end
			myHuman:MoveTo(waypoint.Position)
			local timeOut = myHuman.MoveToFinished:Wait(0.1)
			if not timeOut then
				myHuman.Jump = true
				print("Path too long!")
				findPath(target)
				break
			end
			if checkSight(target) then
				repeat
					print("Moving directly to the target")
					myHuman:MoveTo(target.Position)
					attack(target)
					wait(0.1)
					if target == nil then
						break
					elseif target.Parent == nil then
						break
					end
				until checkSight(target) == false or myHuman.Health < 1 or target.Parent.Humanoid.Health < 1
				break
			end
			if (myRoot.Position - waypoints[1].Position).magnitude > 20 then
				print("Target has moved, generating new path")
				findPath(target)
				break
			end
		end
	end
end

function checkSight(target)
    local ray = Ray.new(myRoot.Position, (target.Position - myRoot.Position).Unit * 40)
    local hit,position = workspace:FindPartOnRayWithIgnoreList(ray, {script.Parent})
    if hit then
        if hit:IsDescendantOf(target.Parent) and math.abs(hit.Position.Y - myRoot.Position.Y) < 3 then
            print("I can see the target")
            return true
        end
    end
    return false
end

function findTarget()
	local dist = 200
	local target = nil
	local potentialTargets = {}
	local seeTargets = {}
	for i,v in ipairs(workspace:GetChildren()) do
		local human = v:FindFirstChild("Humanoid")
		local torso = v:FindFirstChild("Torso") or v:FindFirstChild("HumanoidRootPart")
		if human and torso and v.Name ~= script.Parent.Parent.Name then
			if (myRoot.Position - torso.Position).magnitude < dist and human.Health > 0 then
				table.insert(potentialTargets,torso)
			end
		end
	end
	if #potentialTargets > 0 then
		for i,v in ipairs(potentialTargets) do
			if checkSight(v) then
				table.insert(seeTargets, v)
			elseif #seeTargets == 0 and (myRoot.Position - v.Position).magnitude < dist then
				target = v
				dist = (myRoot.Position - v.Position).magnitude
			end
		end
	end
	if #seeTargets > 0 then
		dist = 200
		for i,v in ipairs(seeTargets) do
			if (myRoot.Position - v.Position).magnitude < dist then
				target = v
				dist = (myRoot.Position - v.Position).magnitude
			end
		end
	end
	if target then
		end
	return target
end

function attack(target)
    if (myRoot.Position - target.Position).magnitude < 2.8 then
        grabAnim:Play()
        if target.Parent ~= nil then
            target.Parent.Humanoid:TakeDamage(20)
        end
        wait(.5)
    end
end

function died()
	wait(5)
	game:GetService("Debris"):AddItem(script.Parent,0.1)
end

myHuman.Died:Connect(died)

lowerTorso.Touched:Connect(function(obj)
	if not obj.Parent:FindFirstChild("Humanoid") then
		myHuman.Jump = true
	end
end)

function main()
	local target = findTarget()
	if target then
		myHuman.WalkSpeed = 20
		findPath(target)
	else
		myHuman.WalkSpeed = 8
		walkRandomly()
	end
end

while wait(0.1) do
	if myHuman.Health < 1 then
		break
	end
	main()
end

respawn script:

db = false
local clone = script.Parent:Clone()
script.Parent.Humanoid.Died:Connect(function()
	if db == false then
		db = true
		wait(5)
		clone.Parent = workspace.MANSOLDIERS
		script.Parent:Destroy()
		db = false
	end
end)

2 comments

0

Have the scripts in the clone disabled by default, and enable the scripts when it respawns with a for I,v loop

0

its fine when you start the game but it gets worse when it dies, what would enabling it when it respawns do

1 answer

if you enable the scripts when it respawns it will make it as if when it respawns that it is using those scripts for the first time, and will save on resources

what you can do to make this is as simple as:

db = false
local clone = script.Parent:Clone()
script.Parent.Humanoid.Died:Connect(function()
    if db == false then
        db = true
        wait(5)
		clone.Parent = workspace.MANSOLDIERS
		for i,v in pairs(clone) do
			if v:IsA("Script") or v:IsA("LocalScript") then
				v.Disabled = false
			end
		end
        script.Parent:Destroy()
        db = false
    end
end)

2 comments

0

what about when the game starts

0

Are you not cloning them from a alive model in replicated? If not make the npc in replicated, and when the game starts just have them all spawn in

This discussion is preserved as it was. New answers, comments, and votes are closed.