To help alleviate some server strain, I decided to have my random npcs spawn locally on the client instead of the server. This script is a starter player script that randomly chooses an npc and randomly spawns it at one of my set spawn spots. It spawns 30 npcs total. Everything works fine... except when the player jumps, the player character is thrown backwards several yards. Here is the full script:
local npcSpawnEvent = game.ReplicatedStorage:WaitForChild("NpcSpawnEvent") local player = game.Players.LocalPlayer local character = player.Character or player.CharacterAdded:wait() --Setup bin local bin = Instance.new("Message") bin.Name = 'LocalNPCBin' bin.Parent = character --Set Spawn Points for i = 1, 44 do local spawnPart = game.ReplicatedStorage:WaitForChild("SpawnPart"..i):Clone() spawnPart.Parent = bin spawnPart.Name = "SpawnPart"..i end function onNpcSpawnEvent() for i = 1, 30 do --randomize around the spawning spot so multiple npcs aren't ontop of each other local pos1 = math.random(-10,10) local pos2 = math.random(-10,10) --choose random spawn spot local rndSpawn = math.random(1,44) --choose random direction for npc to face local rndTurn = math.random(-360,360) local rndTurn2 = math.random(-360,360) --choose random npc local rndNum = math.random(1,70) if rndNum <= 10 then local newNPC = game.ReplicatedStorage.NPC1:Clone() newNPC:MakeJoints() newNPC.Parent = bin newNPC.UpperTorso.CFrame = CFrame.new(bin["SpawnPart" .. rndSpawn].Position + Vector3.new(pos1,0,pos2),Vector3.new(0,rndTurn,rndTurn2)) --CFrame.new(Vector3.new(pos1,10,pos2)) newNPC.Name = "NPC" elseif rndNum >=11 and rndNum <=20 then local newNPC = game.ReplicatedStorage.NPC2:Clone() newNPC:MakeJoints() newNPC.Parent = bin newNPC.UpperTorso.CFrame = CFrame.new(bin["SpawnPart" .. rndSpawn].Position + Vector3.new(pos1,0,pos2),Vector3.new(0,rndTurn,rndTurn2)) --CFrame.new(Vector3.new(pos1,10,pos2)) newNPC.Name = "NPC" elseif rndNum >=21 and rndNum <= 30 then local newNPC = game.ReplicatedStorage.NPC3:Clone() newNPC:MakeJoints() newNPC.Parent = bin newNPC.UpperTorso.CFrame = CFrame.new(bin["SpawnPart" .. rndSpawn].Position + Vector3.new(pos1,0,pos2),Vector3.new(0,rndTurn,rndTurn2)) --CFrame.new(Vector3.new(pos1,10,pos2)) newNPC.Name = "NPC" elseif rndNum >=31 and rndNum <= 40 then local newNPC = game.ReplicatedStorage.NPC4:Clone() newNPC:MakeJoints() newNPC.Parent = bin newNPC.UpperTorso.CFrame = CFrame.new(bin["SpawnPart" .. rndSpawn].Position + Vector3.new(pos1,0,pos2),Vector3.new(0,rndTurn,rndTurn2)) --CFrame.new(Vector3.new(pos1,10,pos2)) newNPC.Name = "NPC" elseif rndNum >=41 and rndNum <= 50 then local newNPC = game.ReplicatedStorage.NPC5:Clone() newNPC:MakeJoints() newNPC.Parent = bin newNPC.UpperTorso.CFrame = CFrame.new(bin["SpawnPart" .. rndSpawn].Position + Vector3.new(pos1,0,pos2),Vector3.new(0,rndTurn,rndTurn2)) --CFrame.new(Vector3.new(pos1,10,pos2)) newNPC.Name = "NPC" elseif rndNum >=51 and rndNum <= 60 then local newNPC = game.ReplicatedStorage.NPC6:Clone() newNPC:MakeJoints() newNPC.Parent = bin newNPC.UpperTorso.CFrame = CFrame.new(bin["SpawnPart" .. rndSpawn].Position + Vector3.new(pos1,0,pos2),Vector3.new(0,rndTurn,rndTurn2)) --CFrame.new(Vector3.new(pos1,10,pos2)) newNPC.Name = "NPC" elseif rndNum >=61 and rndNum <= 70 then local newNPC = game.ReplicatedStorage.NPC7:Clone() newNPC:MakeJoints() newNPC.Parent = bin newNPC.UpperTorso.CFrame = CFrame.new(bin["SpawnPart" .. rndSpawn].Position + Vector3.new(pos1,0,pos2),Vector3.new(0,rndTurn,rndTurn2)) --CFrame.new(Vector3.new(pos1,10,pos2)) newNPC.Name = "NPC" end end end npcSpawnEvent.OnClientEvent:Connect(onNpcSpawnEvent)
The issue must be within the function onNpcSpawnEvent, but I can't figure out what exactly is going on.