It could be the hats, and probably the tools (as you’re moving the model which includes every thing inside of it.). I suggest to use a dummy and remodel it but leave the HumanoidRootPart. And position the Humanoid Root Part not the whole model)
I meant don’t move it by the model. Just position the humanoid root part and everything in the model will follow it, it won’t change because theres no differential height in humanoid root parts.
It’s possible that the tool is adding some extra height to the character, causing the models to spawn a little higher than expected. One solution would be to adjust the Y offset in the PivotTo function to compensate for the extra height.
For example, if you know that the tool adds 1 stud of height to the character, you could adjust the Y offset like this:
local modelSize = model:GetBoundingBox()
local yOffset = spawn.Size.Y + modelSize.Y + 1 -- add 1 stud for the tool height
model:PivotTo(spawn.CFrame + Vector3.new(0, yOffset, 0))
This should ensure that the models always spawn at the correct height, regardless of any extra height added by the tool.
Do what i said in my other post, trial and error. position by humanoid root part and either increase the Y height or decrease. Y + 23 or what ever you like