Is there a better way to check what area a player is in?

currently I have a system that will make changes to lighting to set the mood of a biome a player is in.

the current system uses several region3s in each biome.
first the client tells the server to check all regions for the player then returns the result through a remote function, then the client makes changes to lighting based on the result.

server sided math:

--load biome regions--
local biomes = game.Workspace.BiomeRegions

function glowshroomcavesetup()
local center = biomes.GlowShroomCave.Center.Value
local size = biomes.GlowShroomCave.Size.Value
local min = center - (0.5 * size)
local max = center + (0.5 * size)
local region = Region3.new(min,max)
return region
end


function densejunglesetup()
local center = biomes.DenseJungle.Center.Value
local size = biomes.DenseJungle.Size.Value
local min = center - (0.5 * size)
local max = center + (0.5 * size)
local region = Region3.new(min,max)
return region
end


function icetundrasetup()
local center = biomes.IceTundra.Center.Value
local size = biomes.IceTundra.Size.Value
local min = center - (0.5 * size)
local max = center + (0.5 * size)
local region = Region3.new(min,max)
return region
end


---------------






--------------
--biome list--
local glowshroombiome = glowshroomcavesetup()
local densejunglebiome = densejunglesetup()
local icetundrabiome = icetundrasetup()
--------------
--------------






--check all biomes for player--
function searchbiomes(plr)
local char = plr and plr.Character
local filter = char:GetDescendants()


for _, p in pairs(game.Workspace:FindPartsInRegion3WithWhiteList(glowshroombiome,filter,1)) do
if p.Parent.Name == plr.Name then
return "GlowShroomCave"
end
end

for _, p in pairs(game.Workspace:FindPartsInRegion3WithWhiteList(densejunglebiome,filter,1)) do
if p.Parent.Name == plr.Name then
return "DenseJungle"
end
end

for _, p in pairs(game.Workspace:FindPartsInRegion3WithWhiteList(icetundrabiome,filter,1)) do
if p.Parent.Name == plr.Name then
return "IceTundra"
end
end

return nil

end
------------------------------



script.Parent.RequestUpdate.OnServerInvoke = searchbiomes

relivant code from client script:

local previousbiome = "DefaultBiome"
while true do
wait(1)
if script.Parent and plr.Character and plr.Character.PrimaryPart then
local checkall = script.Parent.RequestUpdate:InvokeServer()
local charpos = plr.Character.PrimaryPart.Position 
local currentcolorstate = game.Lighting.ColorCorrection.TintColor
if checkall ~= previousbiome then

if checkall == "GlowShroomCave" then
game.Lighting.ColorCorrection.Contrast = 0
newsky(game.ReplicatedStorage.SkyTypes.GlowShroomCave)
worldtinttransition(Color3.new(currentcolorstate.R,currentcolorstate.G,currentcolorstate.B),Color3.new(0,1,1))
previousbiome = checkall


elseif checkall == "DenseJungle" then
game.Lighting.ColorCorrection.Contrast = 0
newsky(game.ReplicatedStorage.SkyTypes.DenseJungle)
worldtinttransition(Color3.new(currentcolorstate.R,currentcolorstate.G,currentcolorstate.B),Color3.new(0.6, 0.8, 0.6))
previousbiome = checkall


elseif checkall == "IceTundra" then
game.Lighting.ColorCorrection.Contrast = 0
newsky(game.ReplicatedStorage.SkyTypes.IceTundra)
worldtinttransition(Color3.new(currentcolorstate.R,currentcolorstate.G,currentcolorstate.B),Color3.new(0.572549, 0.87451, 0.87451))
previousbiome = checkall

elseif checkall == nil and charpos.Y <= 533.823 and charpos.X > 200 and charpos.Z < 200 then
game.Lighting.ColorCorrection.Contrast = -0.3
newsky(game.ReplicatedStorage.SkyTypes.LavaChambers)
worldtinttransition(Color3.new(currentcolorstate.R,currentcolorstate.G,currentcolorstate.B),Color3.new(1, 0.466667, 0))
previousbiome = "LavaChambers"

elseif checkall == nil and charpos.Y > 533.823 then
game.Lighting.ColorCorrection.Contrast = 0
worldtinttransition(Color3.new(currentcolorstate.R,currentcolorstate.G,currentcolorstate.B),Color3.new(1,1,1))
newsky(game.ReplicatedStorage.SkyTypes.DefaultSky)
previousbiome = "DefaultBiome"

end


end
end
end

so whats the problem Im having? initially I noticed that when the client does all the work, massive lag spikes occur whenever the loop runs. after switching the heavy stuff over to the server everything seemed to be doing ok.

it wasn’t until around 5 players joined the game were I noticed server lag. for example a model that would slowly make itself transparent overtime, did so at a much slower rate. after looking at the scripts in the dev panel I noticed that these scripts were the culprit.

is this a good way to do what I need to do or is there a better more performance friendly way this can be done?