Jump to content

convert seconds to mins


Recommended Posts

hello i have time as data, like:

setElementData(source,"time",129) -- 129 are 2:15 mins

i want to turn them into minutes at the score(a script up in the screen it shows time left) how can i do that?

you shouldn't worry of i do it i just want to convert it.

Edited by Avagard
Link to comment

Try that , i'm not sure because i'm in phone right now

local seconds = 129
local min = math.floor ( ( seconds % 3600 ) /60 )
local sec =  ( seconds %60 /60*100 )

setElementData(source,"time",""..min.." : "..sec.."")

if you wanna test it try that

seconds = 129

addCommandHandler('1',
function()
local min = math.floor ( ( seconds % 3600 ) /60 )
local sec =  ( seconds %60 /60*100 )
outputChatBox(""..min.." : "..sec.."")
end)

 

Link to comment

error

attempt to perform arithmetic on a string value 

my code:

local seconds = 129
local min = math.floor ( ( seconds % 3600 ) /60 )
local sec =  ( seconds %60 /60*100 )
RoundTime1 = createObject ( 964, 174.30078125, -58.458984375 +0, 1.578125 -1, 0, 0, 0 )
setElementData(RoundTime1,"RoundTime1",""..min.." : "..sec.."")

setTimer ( function()
if getElementData(RoundTime1,"RoundTime1") == 0 then
setElementData(RoundTime1,"RoundTime1",""..min.." : "..sec.."")
else
setElementData (RoundTime1,"RoundTime1",getElementData (RoundTime1,"RoundTime1") - 1)
local timeObject = getElementData (RoundTime1,"RoundTime1")
triggerClientEvent ( "getTimeBRO1",resourceRoot,timeObject)
end
end, 1000, 0 )

 

client isnt important

Link to comment
  • MTA Team
setElementData (RoundTime1,"RoundTime1",getElementData (RoundTime1,"RoundTime1") - 1)

You can't do minus one on a string, thus you got attempt to perform arithmetic on a string value

Link to comment
  • Administrators

RoundTime1 is a string value. On line 8 in your example you're trying to compare a string with 0.

You could use something like this to split the RoundTime1 string by a certain character, in this case a colon.

function split_string(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end

However, given the current logic of your script I can see a few problems with doing this. As I understand you're trying to make a timer which goes from 129 seconds, counts down to 0, then resets back to 129 and restarts.

Something like this would be better.

local timer_start = 129 --timer default starting value in seconds
local min_tick = 0

function split_string(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end

RoundTime1 = createObject ( 964, 174.30078125, -58.458984375 +0, 1.578125 -1, 0, 0, 0 )

setTimer ( function()
	local time = split_string(getElementData (RoundTime1,"RoundTime1"), ":")
	if tonumber(time[2]) == 0 then --if seconds 0 or not created
		local min = math.floor ( ( timer_start % 3600 ) /60 )
		local sec =  ( timer_start %60 /60*100 )
		setElementData(RoundTime1,"RoundTime1",min..":"..sec)		
	else
		min_tick = min_tick + 1
		
		
		local min = tonumber(time[1])
		local sec = tonumber(time[2]) - 1 --take a second off
		
		if min_tick == 60 then --if 60 seconds past, take 1 from minute
			min_tick = 0
			min = min - 1
		end
		setElementData (RoundTime1,"RoundTime1",min..":"..sec)
		local timeObject = getElementData (RoundTime1,"RoundTime1")
		triggerClientEvent ( "getTimeBRO1",resourceRoot,timeObject)
	end
end, 1000, 0 )

It's not pretty, but it should do the job. You should think about handling this on the clientside rather than using a triggerClientEvent every second. You could sync the timers onPlayerJoin for each client

Edited by LopSided_
Link to comment
6 minutes ago, LopSided_ said:

It's not pretty, but it should do the job. You should think about handling this on the clientside rather than using a triggerClientEvent every second. You could sync the timers onPlayerJoin for each client

i want every one in the server to have the exact same time so that is why i put it in serverside

thank you very much

btw how do i reset it(i want it to go back to 2 mins when all players dies)?

Edited by Avagard
Link to comment
  • Administrators
local timer_start = 129 --timer default starting value in seconds

function split_string(inputstr, sep)
  	if not inputstr then return false end
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end

function resetTime()
	local min = math.floor ( ( timer_start % 3600 ) /60 )
	local sec =  ( timer_start %60 /60*100 ) - (min * 60)
	setElementData(RoundTime1,"RoundTime1",min..":"..sec)		
end
addCommandHandler("timereset", resetTime)

RoundTime1 = createObject ( 964, 174.30078125, -58.458984375 +0, 1.578125 -1, 0, 0, 0 )

setTimer ( function()
	local time = split_string(getElementData (RoundTime1,"RoundTime1"), ":")
	if not time then --if seconds 0 or not created
		local min = math.floor ( ( timer_start % 3600 ) /60 )
		local sec =  ( timer_start %60 /60*100 ) - (min * 60)
		setElementData(RoundTime1,"RoundTime1",min..":"..sec)		
	else
		
		
		local min = tonumber(time[1])
		local sec = tonumber(time[2]) - 1 --take a second off
      
		if sec == -1 then
			sec = 59
		end	
      
		if sec == 0 then --if 60 seconds past, take 1 from minute
			min = min - 1
		end
		setElementData (RoundTime1,"RoundTime1",min..":"..sec)
		local timeObject = getElementData (RoundTime1,"RoundTime1")
		triggerClientEvent ( "getTimeBRO1",resourceRoot,timeObject)
	end
end, 1000, 0 )

I added a function for you, resetTime. Maybe you can figure out how to use this function once all players have died.

I also cleaned up the logic of the timers too.

Good luck!

Edited by LopSided_
Link to comment
  • Administrators
local timer_start = 129 --timer default starting value in seconds

function split_string(inputstr, sep)
  	if not inputstr then return false end
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end

function resetTime()
	local min = math.floor( timer_start / 60 )
	local sec =   timer_start - (min * 60)
	setElementData(RoundTime1,"RoundTime1",min..":"..sec)			
end
addCommandHandler("timereset", resetTime)

RoundTime1 = createObject ( 964, 174.30078125, -58.458984375 +0, 1.578125 -1, 0, 0, 0 )

setTimer ( function()
	local time = split_string(getElementData (RoundTime1,"RoundTime1"), ":")
	if not time then --if seconds 0 or not created
		local min = math.floor( timer_start / 60 )
		local sec =   timer_start - (min * 60)
		setElementData(RoundTime1,"RoundTime1",min..":"..sec)		
	else
		
		
		local min = tonumber(time[1])
		local sec = tonumber(time[2]) - 1 --take a second off
      
		if sec == -1 then
			sec = 59
		end	
      
		if sec == 0 then --if 60 seconds past, take 1 from minute
			min = min - 1
		end
		setElementData (RoundTime1,"RoundTime1",min..":"..sec)
		local timeObject = getElementData (RoundTime1,"RoundTime1")
		triggerClientEvent ( "getTimeBRO1",resourceRoot,timeObject)
	end
end, 1000, 0 )

Try this, I noticed a problem with the original mins/secs maths which I copied from BrosS

Edited by LopSided_
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...