Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
1

How can I fix this error in my map voting system?

Asked by 5 years ago
Edited 5 years ago

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
0
try mName.Value.. Idk mixgingengerina10 223 — 5y
0
Your problem is that you're not returning anything in the function getMap(). Try returning randomMap.Name after the loop. saenae 318 — 5y
0
On line 69 return b and not getMap Impacthills 223 — 5y
0
Ew. Do NOT use wait() as your condition. User#19524 175 — 5y
View all comments (4 more)
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(). thebattlepiggy 5 — 5y
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. saenae 318 — 5y
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. saenae 318 — 5y
0
I have tried several of versions of this reply and it seems I still can't fix the problem :c thebattlepiggy 5 — 5y

Answer this question