Search code examples
luatimerminecraft

Lua script sometimes doesn't save values in the file


I made a Timer script for Minecraft that should display the time spent in the game. You can pause resume and reset the time. My next step was to make it able to save the time in a file called timesave.txt but sometimes it isn't saving the time and its just empty... If it saves the time it reads and uses it to restore the old time. This is the code:

name = "Timer"
description = "Just a normal Timer."
positionX = 0
positionY = 0
sizeX = 24
sizeY = 10
scale = 1

START_STOP_KEY = 0x55 --or 'U'
RESET_KEY = 0x4A --or 'J'
 --
--[[
    Timer Module Script by SebyGHG original script by Onix64(Stopwatch)


    if you wish to change the key you can take the key code from here
    https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
]] -------------script-code-------------
timesaved = 0
stopTime = 0
startTime = 0
f = io.input("timesave.txt")
resultstop  = f :read("*line")
resultstart  = f :read("*line")
f :close()
startTime = resultstop
stopTime = resultstart
timesaved = resultstart - resultstop
state = 2

function keyboard(key, isDown)
    if (isDown == true) then
        if (key == RESET_KEY) then
            f = io.input("timesave.txt")
            resultstart  = f :read("*line")
            resultstop  = f :read("*line")
            f :close()
            startTime = resultstop
            stopTime = resultstart
            timesaved = resultstart - resultstop
            state = 0
        elseif (key == START_STOP_KEY) then
            if (state == 0) then
                state = 1
                startTime = os.time() - timesaved
                io.output("timesave.txt")
                timesave= (io.open("timesave.txt","w"))
                io.write(startTime,'\n',stopTime)
                io.close(timesave)
            elseif (state == 1) then
                state = 2
                stopTime = os.time()
            elseif (state == 2) then
        state = 1
        startTime =startTime  + os.time() - stopTime
            end
        end
    end
end

TimerText = "00:00"
TextColor = {r = 30, g = 255, b = 30, a = 255}
function doubleDigit(number)
    if (number < 10) then
        return "0" .. math.floor(number)
    else
        return math.floor(number)
    end
end

function timeText(time)
    local result = ""
    local days = 0
    while (time > 86399) do
        days = days + 1
        time = time - 86400
    end

    local hours = 0
    while (time > 3599) do
        hours = hours + 1
        time = time - 3600
    end

    local minutes = 0
    while (time > 59) do
        minutes = minutes + 1
        time = time - 60
    end

    if (days == 0) then
        if (hours == 0) then
            return doubleDigit(minutes) .. ":" .. doubleDigit(time)
        else
            return math.floor(hours) .. " : " .. doubleDigit(minutes) .. ":" .. doubleDigit(time)
        end
    else
        return math.floor(days) ..
            " : " .. doubleDigit(hours) .. " : " .. doubleDigit(minutes) .. ":" .. doubleDigit(time)
    end
end

function update()
    if (state == 0) then
        TextColor = {r = 255, g = 0, b = 0, a = 255}
        TimerText = "00:00"
    elseif (state == 1) then
        TimerText = timeText(os.time() - startTime)
        TextColor = {r = 0, g = 255, b = 255, a = 255}
    elseif (state == 2) then
        TimerText = timeText(stopTime - startTime)
        TextColor = {r = 255, g = 255, b = 0, a = 255}
    end
end

function render()
    local font = gui.font()
    local tw = font.width(TimerText)

    gfx.color(0, 0, 0, 0)
    gfx.rect(0, 0, tw + 4, 10)

    gfx.color(TextColor.r, TextColor.g, TextColor.b, TextColor.a)
    gfx.text(2, 1, TimerText)
end

Solution

  • Add io.flush() or timesave:flush() after your write operation to save the written data to the file.

    See https://www.lua.org/manual/5.3/manual.html#pdf-file:flush