Need help with new ulx script

So I am trying to make it so that I can create a vote for a new gamemode on the side of the screen, and people can vote on it. And on completion based off of which one it will run the rcon command “gamemode {insert gamemode here}”. Obviously my first try didn’t work but the peculiar thing is, I didn’t get any script errors or anything.

I know I am new to lua coding, but I am getting better and just need a little help. Here is my code:


-- Gamemode voting
local votegamemode = ulx.command( CATEGORY_NAME, "ulx votegamemode", ulx.gamemode, "!gm")
 
function ulx.votegamemode(calling_ply, ... )
	local argv = { ... }

	if ulx.voteInProgress then
		ULib.tsayError( calling_ply, "There is already a vote in progress. Please wait for the current one to end.", true )
		return
	end

	for i=2, #argv do
	    if ULib.findInTable( argv, argv[ i ], 1, i-1 ) then
	        ULib.tsayError( calling_ply, "gamemode " .. argv[ i ] .. " was listed twice. Please try again" )
	        return
	    end
	end

	if #argv > 1 then
		ulx.doVote( "Change gamemode to..", argv, votegamemodeDone, _, _, _, argv, calling_ply )
		ulx.fancyLogAdmin( calling_ply, "#A started a votegamemode with options" .. string.rep( " #s", #argv ), ... )
	else
		ulx.doVote( "Change gamemode to " .. argv[ 1 ] .. "?", { "Yes", "No" }, votegamemodeDone, _, _, _, argv, calling_ply )
		ulx.fancyLogAdmin( calling_ply, "#A started a votegamemode for #s", argv[ 1 ] )
	end
end

local function voteGamemodeDone( t, changeTo, ply )
	local shouldChange = false

	if t.results[ 1 ] and t.results[ 1 ] > 0 then
		ulx.logServAct( ply, "#A approved the votemap" )
		shouldChange = true
	else
		ulx.logServAct( ply, "#A denied the votemap" )
	end

	if shouldChange then
		ulx.rcon("gamemode hideandseek")
	end
end

local function voteGamemodeDone( t, argv, ply )
	local results = t.results
	local winner
	local winnernum = 0
	for id, numvotes in pairs( results ) do
		if numvotes > winnernum then
			winner = id
			winnernum = numvotes
		end
	end

	local ratioNeeded = GetConVarNumber( "ulx_votemap2Successratio" )
	local minVotes = GetConVarNumber( "ulx_votemap2Minvotes" )
	local str
	local changeTo
	if (#argv < 2 and winner ~= 1) or not winner or winnernum < minVotes or winnernum / t.voters < ratioNeeded then
		str = "Vote results: Vote was unsuccessful."
	else
		str = "Vote results: Option '" .. t.options[ winner ] .. "' won, gamemode pending approval. (" .. winnernum .. "/" .. t.voters .. ")"

		-- Figure out the map to change to.
		if #argv > 1 then
			changeTo = t.options[ winner ]
		else
			changeTo = argv[ 1 ]
		end

		ulx.doVote( "Accept result and gamemode to " .. changeTo .. "?", { "Yes", "No" }, voteMapDone2, 30000, { ply }, true, changeTo, ply )
	end
	ULib.tsay( _, str ) -- TODO, color?
	ulx.logString( str )
	if game.IsDedicated() then Msg( str .. "
" ) end
end


[editline]30th April 2015[/editline]

Ok, so I did some editing and got it to work somewhat. I got the vote to appear on the screen and the command to work and appear in !menu. The issue is, after the vote is over, nothing happens. Here is my new code.


-- Gamemode voting

function ulx.votegm( calling_ply, title, ... )
	if ulx.voteInProgress then
		ULib.tsayError( calling_ply, "There is already a vote in progress. Please wait for the current one to end.", true )
		return
	end

	ulx.doVote( title, { ... }, voteDone )
	ulx.fancyLogAdmin( calling_ply, "#A started a vote (#s)", title )
end
local votegm = ulx.command( "GamemodeVote", "ulx votegm", ulx.votegm, "!gm" )
votegm:addParam{ type=ULib.cmds.StringArg, hint="title" }
votegm:addParam{ type=ULib.cmds.StringArg, hint="options", ULib.cmds.takeRestOfLine, repeat_min=2, repeat_max=10 }
votegm:defaultAccess( ULib.ACCESS_ADMIN )
votegm:help( "Starts a gamemode vote." )

local function votegmDone( t )
	local results = t.results
	local winner
	local winnernum = 0
	for id, numvotes in pairs( results ) do
		if numvotes > winnernum then
			winner = id
			winnernum = numvotes
		end
	end

	local str
	if (t.options[ winner ] == "prop_hunt") then
		ulx.rcon("gamemode prop_hunt")
	elseif (t.options[ winner ] == "hideandseek") then
		ulx.rcon("gamemode hideandseek")
	else
		str = "Vote results: No option won because no one voted!"
	end
end

I think need to reload the map after changing the gamemode.

Yeah, that would be the case, but I have reloaded the map numerous times and didn’t change. I feel like the votegmDone is not working in tandum with the orginal script because I am not getting any feedback at all.

[editline]30th April 2015[/editline]

Note* I did change this
ulx.doVote( title, { … }, voteDone )
to this
ulx.doVote( title, { … }, votegmDone )
to match the scripts together but that didn’t work either…

Thanks for the reply tho :smiley:

I solved it myself, if anyone wants the code this will work!


-- Gamemode voting
local function votegmDone( t )
	local results = t.results
	local winner
	local winnernum = 0
	for id, numvotes in pairs( results ) do
		if numvotes > winnernum then
			winner = id
			winnernum = numvotes
		end
	end

	local str
	if not winner then
		str = "Vote results: No option won because no one voted!"
	else
		str = "Vote results: Option '" .. t.options[ winner ] .. "' won. (" .. winnernum .. "/" .. t.voters .. ")"
		RunConsoleCommand("ulx","rcon", "gamemode " .. t.options[ winner ])
	end
	ULib.tsay( _, str ) -- TODO, color?
	ulx.logString( str )
	Msg( str .. "
" )
end

function ulx.votegm( calling_ply, title, ... )
	if ulx.voteInProgress then
		ULib.tsayError( calling_ply, "There is already a vote in progress. Please wait for the current one to end.", true )
		return
	end

	ulx.doVote( title, { ... }, votegmDone )
	ulx.fancyLogAdmin( calling_ply, "#A started a vote (#s)", title )
	
end
local votegm = ulx.command( "GamemodeVote", "ulx votegm", ulx.votegm, "!gm" )
votegm:addParam{ type=ULib.cmds.StringArg, hint="title" }
votegm:addParam{ type=ULib.cmds.StringArg, hint="options", ULib.cmds.takeRestOfLine, repeat_min=2, repeat_max=10 }
votegm:defaultAccess( ULib.ACCESS_ADMIN )
votegm:help( "Starts a gamemode vote." )

-- Make sure your title is "Choose the gamemode you want to play"
-- Make your options whatever gamemodes you have on the server

--[[
ex. Title: Choose the gamemode you want to play
option 1: prop_hunt
option 2: hideandseek
option 3: terrortown

**Note** the name of the option has to be the name of the folder of your gamemode.
]]