So this is a script from SpooksHD's video of a map voting system and I have rewritten the script several times with help of the video but the error seems to not fix. The error it gives me is: ServerScriptService.Server:103: attempt to concatenate local 'mName' (a nil value) And if you want to check if I have written everything correct here is the link to spooksHD's video: [https://www.youtube.com/watch?v=1eUCfvC7F1A]. Please do try to find a solution quickly because I have nothing to do but work on my game and I can't go on without a fix for this. Here is the part of the script I think the problem is in:

local start = tick()
		while wait() do
			if tick()-start >= settings.mapVoteTime then break end
			local secondsLeft = math.floor(settings.mapVoteTime-(tick()-start))
			stats.Status.Value = secondsLeft.." "..((secondsLeft==1 and "Second")or "Seconds").." Left To Vote!"
			for a,b in pairs(Game.Special.VotingPads:GetChildren()) do
				local playersVoting, mName
				for d,c in pairs(mapVotes) do
					if c.id == tonumber(b.Name:match("%d+")) then
						playersVoting=#c.players
						mName=c.mapName
						break
					end
				end
				b.sGui.Title.Text = mName.." - "..playersVoting.." "..((playersVoting==1 and "Voter") or  "Voters")
			end
		end

Here is the full script:

--Assets--
local rep = game.ReplicatedStorage
local assets = rep.Assets

--Maps--
local maps = assets.Maps

--Signals--
local signals = assets.Signals
local event = signals.Event
local fevent = signals.FEvent

--Static Variables--
local mapVotes = {}

--Game Variables--
local Game = workspace.Game
local stats = Game.Stats
local settings = {
	mapVoteTime=15;
	mapVoteDelay=3;
	playersRequired=1;
} 

--Primary Events--

--[[
	ARRAY = mapVotes
		MapArray
			Id
			mapName
			players
				player=userId
--]]

event.OnServerEvent:connect(function(player, variables)
	if variables.reason == "voteOnMap" then
		--First check if a player already voted on a map, if so change vote.
		for a,b in pairs(mapVotes) do
			for d,c in pairs(b.players) do
				if c.player == player.UserId then
					table.remove(b.players, d)
					break
				end
			end
		end
		--Add player to mapVotes
		for a,b in pairs(mapVotes) do
			if b.id == variables.ItemNum then
				table.insert(b.players, {player=player.UserId})
			end
		end
	elseif variables.reason == "removeFromVote" then
				for a,b in pairs(mapVotes) do
			for d,c in pairs(b.players) do
				if c.player == player.UserId then
					table.remove(b.players, d)
					break
				end
			end
		end
	end
end)

function getMap()
	local randomMap = maps:GetChildren()[math.random(1,#maps:GetChildren())]
	for a,b in pairs(mapVotes) do
		if b.mapName == randomMap.Name then
			return getMap()
		end
	end
end

while wait() do
	if #game.Players:GetPlayers() < settings.playersRequired then 
		local playersNeeded = settings.playersRequired-#game.Players:GetPlayers()
		stats.Status.Value = playersNeeded.." "..((playersNeeded==1 and "Player")or "Players").." needed to play!"
	else
		--Assign maps
		mapVotes={}
		for a,b in pairs(Game.Special.VotingPads:GetChildren()) do
			table.insert(mapVotes, {id=tonumber(b.Name:match("%d+")); mapName=getMap(); players={};})
		end
		
		--Fire Clients, start sending in votes.
		event:FireAllClients({reason="StartVoting"})
		
		--Do main loop
		local start = tick()
		while wait() do
			if tick()-start >= settings.mapVoteTime then break end
			local secondsLeft = math.floor(settings.mapVoteTime-(tick()-start))
			stats.Status.Value = secondsLeft.." "..((secondsLeft==1 and "Second")or "Seconds").." Left To Vote!"
			for a,b in pairs(Game.Special.VotingPads:GetChildren()) do
				local playersVoting, mName
				for d,c in pairs(mapVotes) do
					if c.id == tonumber(b.Name:match("%d+")) then
						playersVoting=#c.players
						mName=c.mapName
						break
					end
				end
				b.sGui.Title.Text = mName.." - "..playersVoting.." "..((playersVoting==1 and "Voter") or  "Voters")
			end
		end
		
		--Get winner
		table.sort(mapVotes, function(a,b) return #a.players>#b.players end)
		
		for a,b in pairs(Game.Special.VotingPads:GetChildren()) do
			if tonumber(b.Name:match("%d+")) == mapVotes[1].id then
				b.sGui.Title.Text = "Winner!"
				stats.Status.Value = mapVotes[1].mapName.." was chosen!"
			else
				b.sGui.Title.Text = "Lost Vote!"
			end
		end
		
		wait(settings.mapVoteDelay) 
	end	
end

8 comments

0

try mName.Value.. Idk

0

Your problem is that you're not returning anything in the function getMap(). Try returning randomMap.Name after the loop.

0

On line 69 return b and not getMap

0

Ew. Do NOT use wait() as your condition.

0

I've tried out all of your advices apart from incapaz's and I do need some more detail for where exactly I put the return randomMap.Name, And It would be helpful to know what I use as a condition instead of wait().

0

You can use true and move the wait() into the body of your loop, or you can just continue to use wait() as your condition. It really doesn't matter that much, it's just clearer to readers that 'true' is true, than that 'wait()' yields true. Place randomMap.Name after the 'end' on line 71.

0

Ah, and I'm basing my answer on the video he mentioned. I would go with Impacthill's answer (except, using b.Name instead), but the guy in the video did otherwise. I'm not really sure the exact behavior he was going for.

0

I have tried several of versions of this reply and it seems I still can't fix the problem :c