Waiting for Events

In my turn based game the client decides a move order that is then given to the server. If the client does not give the server the move order, then the server will take the order by way of remote events.

But It seems that the timing is getting messed up somewhere so the code is running out of order.

Here is the relevant code:
Main game script:

--...
	game.ReplicatedStorage.NextTurn:FireAllClients()
	task.wait()
	task.wait()
	task.wait()
	local PlayerTurns = game.ServerStorage.GetActions:Invoke()
	print(PlayerTurns)

	local TurnNumber = 0
	repeat
		print("QA")
		TurnNumber += 1
		local nomovement = true
		local Items = {}
		local Moves = {}
		local Shoots = {}

		for Player,TurnOrder in pairs(PlayerTurns) do
			nomovement = false
			print(TurnOrder[TurnNumber].Type)
			if TurnOrder[TurnNumber].Type == "Items" then
				table.insert(Items,TurnOrder[TurnNumber])
			elseif TurnOrder[TurnNumber].Type == "Move" then
				table.insert(Moves,TurnOrder[TurnNumber])
			elseif TurnOrder[TurnNumber].Type == "Shoot" then
				table.insert(Shoots,TurnOrder[TurnNumber])
			end
		end
		print(Items,Moves,Shoots)
--...

Client Script:

game.ReplicatedStorage.NextTurn.OnClientEvent:Connect(function()
	print(Order)
	game.ReplicatedStorage.UpdatePlayerTurn:FireServer(Order)
	print("A")
	--...

Holder Script:

local PlayerActions = {}
game.ReplicatedStorage.UpdatePlayerTurn.OnServerEvent:Connect(function(Player,Table)
	print(Player,Table)
	PlayerActions[Player] = Table
	Player.TurnOver.Value = true
	print(PlayerActions)
end)

game.ServerStorage.GetActions.OnInvoke = function()
	local clone = table.clone(PlayerActions)
	table.clear(PlayerActions)
	print(clone)
	return clone
end

What should happen is this:
The main game script fires the nextTurn event, the client receives that and fires the UpdatePlayerTurn event, providing the Order. The Holder script receives that and puts that in the PlayerActions table. Then the main game script fires the GetActions event and gets the PlayerTurns.

However looking at this series of prints, we can tell that the code is out of order:
image
Mouser:251 is the client printing Order, meaning the event has fired correctly, then Mouser:253 prints A, showing the client has given the order to the holder script. But then we see Holder:12 and Game:94 printing nothing. Then after they print, Holder:3 and Holder:6 print.

I need Holder:3 and 6 to print (run) before the main game script gets the actions (Holder:12).

You can see me putting three task.wait() statements trying to wait for it to work, which worked before, but not now for some reason. I worry that lag and delay will mean I cant have a set amount of waits.

How can I make sure that the events fire in the correct order?