For the past week or so, I have been attempting to fix this issue. For some reason, there is a part of my code that takes around ~0.7 seconds to load. I don’t know WHY it does this, or what causes it, especially since all the delays I could think of (that aren’t lag caused) are waits that are in a task.spawn().
runService.Heartbeat:Connect(function() if humanoid.Health <= 0 then return end local closestEntity = mobModule.FindClosestEnemy(unit.HumanoidRootPart.Position, unit.Team) if closestEntity then hrp.BodyGyro.CFrame = CFrame.lookAt(hrp.Position, Vector3.new(closestEntity.PrimaryPart.Position.X, hrp.Position.Y, closestEntity.PrimaryPart.Position.Z)) if not jumpCooldown then if humanoid.FloorMaterial ~= Enum.Material.Air then task.spawn(function() jump(closestEntity) end) end else if not shockwaveCooldown and humanoid.FloorMaterial ~= Enum.Material.Air then shockwaveCooldown = true humanoid:MoveTo(hrp.Position, hrp) tweenSize(0.3, 1, 1, 1) local shockwave = replicatedStorage.Assets.Miscellanous.SlimeShockwave:Clone() shockwave.Color = unit.Head.Color shockwave.Position = unit.Head.Position - (Vector3.new(0, unit.Head.Position.Y, 0)) shockwave.Parent = workspace.Miscellanous replicatedTweening:Create(shockwave, TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = Vector3.new(15, 0.15, 15), Transparency = 1}):Play() debris:AddItem(shockwave, 0.7) end end if not unit.HumanoidRootPart.Anchored and players:GetPlayerFromCharacter(closestEntity) then if unit.HumanoidRootPart:GetNetworkOwner() ~= players:GetPlayerFromCharacter(closestEntity) then unit.HumanoidRootPart:SetNetworkOwner(players:GetPlayerFromCharacter(closestEntity)) end end end end)
As you can see in the video, the crash onto the ground (shockwave, enemy getting shorter but thicker, and the enemy stopping in their tracks). If anybody needs more context to understand or help, I can give it!
This is a tricky one, i’ve tried to cut down the code to only things that could be causing waits
runService.Heartbeat:Connect(function() if humanoid.Health <= 0 then -- no waits here end local closestEntity = mobModule.FindClosestEnemy(unit.HumanoidRootPart.Position, unit.Team) if closestEntity then if not jumpCooldown then -- no waits here else if not shockwaveCooldown and humanoid.FloorMaterial ~= Enum.Material.Air then tweenSize(0.3, 1, 1, 1) debris:AddItem(shockwave, 0.7) -- Not a wait but this is probably related end end if not unit.HumanoidRootPart.Anchored and players:GetPlayerFromCharacter(closestEntity) then -- Maybe?? -- This could be causing the slime to freeze midair and not land properly. if unit.HumanoidRootPart:GetNetworkOwner() ~= players:GetPlayerFromCharacter(closestEntity) then unit.HumanoidRootPart:SetNetworkOwner(players:GetPlayerFromCharacter(closestEntity)) end end end end)
My only guess is that setnetworkownership part is causing the slime to ‘freeze’ in midair due to strange replication bugs. (for example: i’ve noticed that dead players with setnetworkowner(nil) applied to them will freeze entirely client side while inside any part, even if it’s non tangible)
Try tinkering with not spawning a shockwave or removing setnetworkowner from the code.
Hmm, I think I’ll try the SetNetworkOwner thing soon. I had another issue with an enemy using SetNetworkOwner where it just repeatedly bounced up and down when it belonged to a player.
I wouldn’t touch setnetworkowner (for this case), as roblox handles it automatically for you when an unanchored part is near a player. Changing it manually disables the automatic handling for that part, and causes the odd behavior you just mentioned.
This is what it looked like when I made the SetNetworkOwner part a comment. The same thing happens. I think I’ll keep attempting to mess around with the script until I find a solution.
Alright, try setting the despawn time for the shockwave to 0 or a much higher value like 5 or something. If that doesn’t reveal anything it’s probably one of the functions not included in the code snippet
I was thinking it might be in the jump() function, but that is only used when the shockwave isn’t being used.
local shockwaveCooldown = true local jumpCooldown = false function jump(entity) shockwaveCooldown = false jumpCooldown = true -- // Code tweenSize(0.5, 1.15, 0.85, 1.15) task.wait(0.5) tweenSize(0.5, 0.8, 1.25, 0.8) if not entity then return end -- // Jumping humanoid.Jump = true local raycast = workspace:Raycast(unit.PrimaryPart.Position, CFrame.lookAt(unit.PrimaryPart.Position, entity.PrimaryPart.Position).LookVector * 1500, mobModule.raycastParams) if raycast and raycast.Instance and raycast.Instance.Parent:IsDescendantOf(entity) then unit.Humanoid:MoveTo(entity.PrimaryPart.Position + Vector3.new(math.random(-3.5, 3.5), 0, math.random(-3.5, 3.5))) else local path = ezPathfinding.new(unit, entity.PrimaryPart.Position + Vector3.new(math.random(-3.5, 3.5), 0, math.random(-3.5, 3.5))) local waypoints = path:ReturnWaypoints() if waypoints[1] then task.wait(0.1) end end task.wait(math.random(10, 14) / 10) if jumpCooldown then jumpCooldown = false end end
Regardless, I think I’ll keep trying to fix this for now.
I’ve also tried to determine how long it takes for the shockwave part to run. It almost always says around 0.1s, but it visually takes longer than that.
Oh, sorry It’s time to pull out the big guns then put this code whereever it seems fit (preferably outside an infinite loop so studio doesn’t crash), and it should output a constant stream of data that’ll help you narrow the cause down
task.spawn(function() while true do print("Floormaterial: "..humanoid.FloorMaterial)) -- whatever else you want task.wait() end end)
The delay between the object when it hits (for the FloorMaterial) seems to be almost zero. It also doesn’t seem like its being caused by anything in the shockwave script itself-- considering that the effects of the object falling occur at the same time.
I mean the shockwave is intended to start exactly when the NPC hits the ground, but it is delayed for a bit and I have no idea why. Unless I’m just dumb, the cause seems to be unapparent.
Ah, i have an idea. Try reducing the jump cooldown or removing it entirely. I believe the slime is jumping, waiting for the jump cooldown, THEN doing the shockwave.
Oh, if you watched your video, you’d see that when you spawn the NPC, the shockwave immediately gets activated, but that’s just because you set the debounce to false when the jump function is started.
else local path = ezPathfinding.new(unit, entity.PrimaryPart.Position + Vector3.new(math.random(-3.5, 3.5), 0, math.random(-3.5, 3.5))) local waypoints = path:ReturnWaypoints() if waypoints[1] then task.wait(0.1) end end shockwaveCooldown = false -- < HERE task.wait(math.random(10, 14) / 10) if jumpCooldown then jumpCooldown = false end end
Why don’t you benchmark certain code sections to see which takes longer? Also, you should probably probably run your code under while task.wait do and also use Humanoid.MoveToFinished:Wait()