• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.
  • It's time for the first HD Modeling Contest of 2025. Join the theme discussion for Hive's HD Modeling Contest #7! Click here to post your idea!

[Solved] Save system is not working

Level 24
Joined
Jun 26, 2020
Messages
1,921
Hello, I was using the save system part from Codeless Save and Load (Multiplayer) - v3.0.1 to encrypt a string, but for some reason it refuses to load, and I don't know why:

Lua:
local MAX_STRING_ENCODED_LENGHT = 2^16

---@param p player
---@param s string
---@return string
function EncodeString(p, s)
    local savecode = Savecode.create()

    local len = s:len()
    for i = 1, len do
        savecode:Encode(s:byte(i), 255)
    end
    savecode:Encode(len, MAX_STRING_ENCODED_LENGHT)

    local code = savecode:Save(p, 1)
    savecode:destroy()
    print(s)
    print("\n")
    print(code)
    print("\n")

    return code
end

---@param p player
---@param s string
---@return string?
function DecodeString(p, s)
    local savecode = Savecode.create()
    print(s)
    print("\n")

    if not savecode:Load(p, s, 1) then -- Here always happens the error
        savecode:destroy()
        return nil
    end

    local len = savecode:Decode(MAX_STRING_ENCODED_LENGHT)
    local decode = ""
    for _ = 1, len do
        decode = string.char(savecode:Decode(255)) .. decode
    end
    savecode:destroy()
    print(decode)
    print("\n")

    return decode
end
 
Last edited:
Level 24
Joined
Jun 26, 2020
Messages
1,921
At the end I solved it by splicing the code:

Lua:
local CHUNK_SIZE = 150

---@param p player
---@param s string
---@return string
function EncodeString(p, s)
    local len = s:len()
    local iter = math.floor(len/CHUNK_SIZE)
    local code = ""

    for j = 1, iter do
        local savecode = Savecode.create()

        for i = 1, CHUNK_SIZE do
            savecode:Encode(s:byte((j-1)*CHUNK_SIZE+i), 255)
        end

        code = code .. savecode:Save(p, 1) .. "~"
        savecode:destroy()
    end

    local rest = len - iter*CHUNK_SIZE
    local savecode = Savecode.create()

    for i = 1, rest do
        savecode:Encode(s:byte(iter*CHUNK_SIZE+i), 255)
    end
    savecode:Encode(rest, CHUNK_SIZE)

    code = code .. savecode:Save(p, 1)
    savecode:destroy()

    return code
end

---@param p player
---@param s string
---@return string?
function DecodeString(p, s)
    local decode = ""
    local prevBuffer = 1
    local buffer = s:find("~")

    while buffer do
        local sub = s:sub(prevBuffer, buffer - 1)

        local savecode = Savecode.create()
        if not savecode:Load(p, sub, 1) then
            savecode:destroy()
            return nil
        end
        local decode2 = ""
        for _ = 1, CHUNK_SIZE do
            decode2 = string.char(savecode:Decode(255)) .. decode2
        end
        savecode:destroy()
        decode = decode .. decode2

        prevBuffer = buffer + 1
        buffer = s:find("~", buffer + 1)
    end

    local sub = s:sub(prevBuffer)
    local savecode = Savecode.create()
    if not savecode:Load(p, sub, 1) then
        savecode:destroy()
        return nil
    end
    local len = savecode:Decode(CHUNK_SIZE)
    local decode2 = ""
    for _ = 1, len do
        decode2 = string.char(savecode:Decode(255)) .. decode2
    end
    savecode:destroy()
    decode = decode .. decode2

    return decode
end
 
Top