EVERYTHING WORKS, i just need help on how i would go about interpolating the heightmap is the biome changes, because whenever the biome changes, the height multiplyer does too, but not smoothly, so when i reach a more bumpy biome, there is a huge wall of terrain in the way instead of a slope that gradients

Full code in server script service:

-- code snippet taken and modified from http://bit.ly/2D2lF3O
math.randomseed(os.time())
local baseHeight 		= 50				-- The main height factor for the terrain.
local chunkScale 		= 1				-- The grid scale for terrain generation. Should be kept relatively low if used in real-time.
local renderDist 		= 320/4 			-- The length/width of chunks in voxels that should be around the player at all times
local xScale 			= 90/4				-- How much we should strech the X scale of the generation noise
local zScale 			= 90/4				-- How much we should strech the Z scale of the generation noise
local generationSeed	= math.random() 	-- Seed for determining the main height map of the terrain.
local biomes = require(script.Biomes)
local biome = 1
local spawnbiome = 1
------------------------------------------------------------------------------------------------------------------------------------------------
 
biome = spawnbiome

local chunks = {}
 
function chunkExists(chunkX,chunkZ)
	if not chunks[chunkX] then
		chunks[chunkX] = {}
	end
	return chunks[chunkX][chunkZ]
end
 
function mountLayer(x,heightY,z)
	local begY = -baseHeight
	local endY = heightY
	--workspace.Terrain:FillBlock(CFrame.new(x*4+2, (begY+endY)*4/2, z*4+2), Vector3.new(4, (endY-begY)*4, 4), material)	
	if endY > 5 then
		workspace.Terrain:FillBlock(CFrame.new(x*4+2, 0, z*4+2), Vector3.new(4, biomes[biome].WallSize*2, 4), biomes[biome].WallMaterial)	
	else
		workspace.Terrain:FillBlock(CFrame.new(x*4+2, 0, z*4+2), Vector3.new(4, (endY-begY)*biomes[biome].HeightMultiplyer+biomes[biome].FloorThickness, 4), biomes[biome].FloorMaterial)	
	end
	
	if biomes[biome].Caves then
		workspace.Terrain:FillBlock(CFrame.new(x*4+2, biomes[biome].WallSize, z*4+2), Vector3.new(4, (endY-begY)*biomes[biome].HeightMultiplyer, 4), biomes[biome].CaveMaterial)
	end
	
	workspace.Terrain:FillBlock(CFrame.new(x*4+2, -(biomes[biome].WallSize), z*4+2), Vector3.new(4, 4, 4), biomes[biome].UnderMaterial)	

end
 
function determineBiome(magnitude)
	local biomechosen
	for i=1,#biomes do
		if biomes[i].Level >= magnitude then
			biomechosen = i
		end
		if magnitude < biomes[i].Level then
			return biomechosen-1
		end
	end
end

function makeChunk(chunkX,chunkZ,magnitude)
	local rootPos = Vector3.new(chunkX*chunkScale,0,chunkZ*chunkScale)
	chunks[chunkX][chunkZ] = true -- Acknowledge the chunk's existance.
	for x = 0,chunkScale-1 do
		for z = 0,chunkScale-1 do
			local cx = (chunkX*chunkScale) + x
			local cz = (chunkZ*chunkScale) + z
			local noise = math.noise(generationSeed,cx/xScale,cz/zScale)
			local cy = noise*baseHeight
			biome = determineBiome(magnitude)
			mountLayer(cx,cy,cz)
		end
	end
end
 
function checkSurroundings(location)
	local chunkX,chunkZ = math.floor(location.X/4/chunkScale),math.floor(location.Z/4/chunkScale)
	local range = math.max(1,renderDist/chunkScale)
	for x = -range,range do
		for z = -range,range do
			local cx,cz = chunkX + x,chunkZ + z
			if not chunkExists(cx,cz) then
				makeChunk(cx,cz,math.floor(location.magnitude/100))
			end
		end
	end
end
 
while true do
	for _,player in pairs(game.Players:GetPlayers()) do
		if player.Character then
			local torso = player.Character:FindFirstChild("Head")
			if torso then
				checkSurroundings(torso.Position)
			end
		end
	end
	wait(0.2)
end

there is a module script in the main script called "Biomes" as referenced above:

local m = {
	{
	Name = "Plains",
	HeightMultiplyer = 1,
	WallMaterial = Enum.Material.Rock,
	FloorMaterial = Enum.Material.Grass,
	Level = 0,
	Caves = false,
	CaveMaterial = nil,
	WallSize = 250,
	FloorThickness = 4,
	UnderMaterial = Enum.Material.Air
	},
	{
	Name = "Land Of Dead",
	HeightMultiplyer = 3,
	WallMaterial = Enum.Material.Rock,
	FloorMaterial = Enum.Material.Ground,
	Level = 20,
	Caves = false,
	CaveMaterial = nil,
	WallSize = 250,
	FloorThickness = 4,
	UnderMaterial = Enum.Material.Air
	},
	{
	Name = "Desert",
	HeightMultiplyer = 0.5,
	WallMaterial = Enum.Material.Limestone,
	FloorMaterial = Enum.Material.Sand,
	Level = 25,
	Caves = false,
	CaveMaterial = nil,
	WallSize = 15,
	FloorThickness = 4,
	UnderMaterial = Enum.Material.Air
	},
	{
	Name = "Blizzard",
	HeightMultiplyer = 2,
	WallMaterial = Enum.Material.Glacier,
	FloorMaterial = Enum.Material.Ice,
	Level = 35,
	Caves = false,
	CaveMaterial = nil,
	WallSize = 250,
	FloorThickness = 4,
	UnderMaterial = Enum.Material.Air
	},
	{
	Name = "Ogre Caves",
	HeightMultiplyer = 4,
	WallMaterial = Enum.Material.Basalt,
	FloorMaterial = Enum.Material.Rock,
	Level = 50,
	Caves = true,
	CaveMaterial = Enum.Material.Basalt,
	WallSize = 250,
	FloorThickness = 4,
	UnderMaterial = Enum.Material.Air
	},
	{
	Name = "Ice Caves",
	HeightMultiplyer = 1,
	WallMaterial = Enum.Material.Glacier,
	FloorMaterial = Enum.Material.Glacier,
	Level = 60,
	Caves = true,
	CaveMaterial = Enum.Material.Ice,
	WallSize = 500,
	FloorThickness = 4,
	UnderMaterial = Enum.Material.Air
	},
	{
	Name = "Mountains",
	HeightMultiplyer = 4,
	WallMaterial = Enum.Material.Rock,
	FloorMaterial = Enum.Material.Grass,
	Level = 65,
	Caves = false,
	CaveMaterial = nil,
	WallSize = 250,
	FloorThickness = 4,
	UnderMaterial = Enum.Material.Air
	},
	{
	Name = "Ocean",
	HeightMultiplyer = 0.1,
	WallMaterial = Enum.Material.Water,
	FloorMaterial = Enum.Material.Water,
	Level = 80,
	Caves = false,
	CaveMaterial = nil,
	WallSize = 6.5,
	FloorThickness = 7,
	UnderMaterial = Enum.Material.Sand
	}
}

return m