invoke server yields until you actually return something, that could be the issue
it returns no matter what and it would print “invoke server” if it was that
you might try doing like I do on some of my server script creating the remote at runtime keeps replicated clean and makes sure the server reference is there
something like below
-- in server script --
local TowerRemote = Instance.new('RemoteFunction')
TowerRemote.Name = 'TowerRemote'
TowerRemote.Parent = game.ReplicatedStorage -- change this for subfolder if needed
-- in client script --
local TowerRemote = game.ReplicatedStorage:FindFirstChild('TowerRemote') -- can use recursive if its in a subfolder like you have with remotes
just make sure to remove the old tower remote
can work but using :WaitForChild in the client script would be more safe as findfirstchild can return nil
yeah totally fine the server script should run first so remote should be there as long as you are creating and parenting that at the top of the script