Unity Authoritative matches via lua server

Hi Everyone!

I am trying to write a Lua dedicated server in which players register their name and cards deck id and try to start the match passing these data aside with a random seed and a Boolean to determine which player goes first in the match.

I decided to send the name and deck id in the meta data to the server

I noticed that meta data gets passed in join attempt function while I need the data in match join function so I cached the data. the problem is if the name and deck id are the same in both clients, the match starts, however if I changed any of them the match does not start.
also number of presences is always 1 not 2

here is my code to look into

local matchMetadata = {}

function M.match_join_attempt(context, dispatcher, tick, state, presence, metadata)
	local acceptuser = true
	if (state.host == nil) then
		state.host = presence.user_id
	end

	if	(matchMetadata.metadata == nil) then
		matchMetadata.metadata = {}
	end

	matchMetadata.metadata[presence.user_id] = metadata;
	nk.logger_error("metadata: " .. nk.json_encode(metadata))

	return state, acceptuser
end

function M.match_join(context, dispatcher, tick, state, presences)
	for _, presence in ipairs(presences) do
		state.presences[presence.session_id] = presence
		nk.logger_error("passed: " .. presence.session_id)
		
	end

	for _, presence in ipairs(state.presences) do
		nk.logger_error("cached: " .. presence.session_id)

	end

	-- Broadcast if number of presense > 1
	nk.logger_error("pres: " .. pres)
	nk.logger_error("Number of presences: " .. #presences)
	nk.logger_error("Number of cached presences: " .. #state.presences)


	pres = pres + 1
	if (pres> 1) then
		for _, presence in ipairs(presences) do
			nk.logger_error("Presence: " .. nk.json_encode(presence))
			nk.logger_error("State: " .. nk.json_encode(state))
			nk.logger_error("context: " .. nk.json_encode(context))

			local metadata = {}
			for _, other_presence in pairs(state.presences) do
				if other_presence.session_id ~= presence.session_id then
					metadata = matchMetadata.metadata[other_presence.user_id]
					nk.logger_error("metadata: " .. nk.json_encode(metadata))
					break
				end
			end

			dispatcher.broadcast_message(OP_STARTGAME, nk.json_encode({
				["IsMyTurn"] = state.presences[presence.session_id] == presence,
				["RandomSeed"] =  math.random(1, 1000000), -- generate random int
				["OtherPlayerName"] = metadata["PlayerName"] ,-- I want to access meta data player name filed
				["OtherPlayerImage"] = metadata["PlayerImage"] -- I want to access meta data player name filed
			
			}))

		end
	end

	return state
end

Hello @Mahmoud,

I think you should set this data in MatchInit, when the match is created you should know which players are going to join, before they do you can decide who goes first, their deck ids and etc.

The one that joins first will be in an idle loop while it waits for the other player, and once he joins the match can start.

Have a look at your project template, the more complete examples are in Go and TS but it should be easy to map to Lua. It’s not quite the same logic but it should help you get started.

Best.