Недавно была проблема, в сэйв\лоад системе, обрывался цикл сэйва вещей курьера если у героя и курьера было больше 8 предметов (всего) в инвентаре, всё равно у кого сколько, может быть у героя 1 и у курьера 7, без разницы, просто не выдавало код сэйва. Попробовал добавить небольшой вэйт 0,5 сек.(пробовал так же его уменьшать и увеличивать), проблема исчезла, сэйвит даже с 12 занятыми слотами инвентаря. Но тупо не сэйвит курьера. Хотя код даётся, при загрузке нет курьера.
Попробовал вынести отдельно сэйв вещей курьера, в отдельный триггер, который выолняется после сэйва вещей героя, теперь лимит вещей 10, если берёшь 11 вещей, то код высвечивается при сэйве, но при загрузке не грузит ни чего, даже ошибку не выдаёт, просто ни чего. Если берёшь 12 вещей, то не сэйвит, даже код не выдаёт. Ну а с 10 нормально всё сэйвит и грузит.
Во код из шапки, может тут где стоит ограничение на количество символов, или даже не знаю что уже подумать
код
function CreateTextFile takes string saveCode returns nothing
    local integer p = GetPlayerId(GetTriggerPlayer())+1
    local string heroName = GetUnitName(udg_TempUnit)
    local integer heroLevel = GetHeroLevel(udg_TempUnit)
    
    call PreloadGenClear()
    call PreloadGenStart()
    
    // The line below creates the log
    // Right now, this is:
    //      Hero: (hero name)
    //      Level: (hero level)
    //      Code: -load XXXX
	if(Player(p-1)==GetLocalPlayer()){
	
		call Preload("\r\n\t\t\t\tHero: " + heroName + "\r\n\t\t\t\t" + "Level: " + I2S(heroLevel) + "\t\t\r\n\t\t\t\t" + "Code: -load " + saveCode + "\r\n\n\t\t    ")
		
		// The line below creates the file at the specified location
		// Right now, this is:
		//      "Warcraft III\MapName\(hero name) - (hero level)"
		call PreloadGenEnd("SantaraORPG\\" + heroName + " - " + I2S(heroLevel) + ".txt")
	}
endfunction
    
function SaveLoad_InitialSetup takes nothing returns nothing
    local integer i = 0
    local integer j = 0

    loop
        set udg_SaveLoad_Compress[i + 48] = j
        set udg_SaveLoad_Uncompress[i] = i + 48
        set j = j + 1
        set i = i + 1
        exitwhen i >= 10
    endloop
    set i = 0
    loop
        set udg_SaveLoad_Compress[i + 97] = j
        set udg_SaveLoad_Compress[i + 65] = j + 26
        set udg_SaveLoad_Uncompress[i + 10] = i + 97
        set udg_SaveLoad_Uncompress[i + 26 + 10] = i + 65
        set j = j + 1
        set i = i + 1
        exitwhen i >= 26
    endloop
endfunction

function SaveLoad_Id2CId takes integer n returns integer
    local integer i = n / (256 * 256 * 256)
    local integer r
    set n = n - i * (256 * 256 * 256)
    set r = udg_SaveLoad_Compress[i]
    set i = n / (256 * 256)
    set n = n - i * (256 * 256)
    set r = r * 64 + udg_SaveLoad_Compress[i]
    set i = n / 256
    set r = r * 64 + udg_SaveLoad_Compress[i]
    return r * 64 + udg_SaveLoad_Compress[n - i * 256]
endfunction

function SaveLoad_CId2Id takes integer n returns integer
    local integer i = n / (64 * 64 * 64)
    local integer r
    set n = n - i * (64 * 64 * 64)
    set r = udg_SaveLoad_Uncompress[i]
    set i = n / (64 * 64)
    set n = n - i * (64 * 64)
    set r = r * 256 + udg_SaveLoad_Uncompress[i]
    set i = n / 64
    set r = r * 256 + udg_SaveLoad_Uncompress[i]
    return r * 256 + udg_SaveLoad_Uncompress[n - i * 64]
endfunction

function SaveLoad_Unit2Integer takes unit u returns integer
    local integer i = 0
    local integer n = GetUnitTypeId(u)
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    loop
        set i = i + 1
        exitwhen i > udg_SaveLoad_Heroes_LastIndex
        if udg_SaveLoad_Heroes[i] == n then
            return i
        endif
    endloop
    return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Unit takes integer i returns integer
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    if i <= udg_SaveLoad_Heroes_LastIndex then
        return udg_SaveLoad_Heroes[i]
    endif
    return SaveLoad_CId2Id(i)
endfunction

function SaveLoad_Item2Integer takes item t returns integer
    local integer i = 0
    local integer n = GetItemTypeId(t)
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    loop
        set i = i + 1
        exitwhen i > udg_SaveLoad_Items_LastIndex
        if udg_SaveLoad_Items[i] == n then
            return i
        endif
    endloop
    return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Item takes integer i returns integer
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    if i <= udg_SaveLoad_Items_LastIndex then
        return udg_SaveLoad_Items[i]
    endif
    return SaveLoad_CId2Id(i)
endfunction

function SaveLoad_Ability2Integer takes integer a returns integer
    local integer i = 0
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    loop
        set i = i + 1
        exitwhen i > udg_SaveLoad_Abilities_LastIndex
        if udg_SaveLoad_Abilities[i] == a then
            return i
        endif
    endloop
    return SaveLoad_Id2CId(a)
endfunction
function SaveLoad_Integer2Ability takes integer i returns integer
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    if i <= udg_SaveLoad_Abilities_LastIndex then
        return udg_SaveLoad_Abilities[i]
    endif
    return SaveLoad_CId2Id(i)
endfunction

function SaveLoad_Color takes string s returns string
    local integer i = StringLength(s)
    local string c
    local string r = ""

    loop
        set i = i - 1
        set c = SubString(s,i,i + 1)
        if c == "0" or c == "1" or c == "2" or c == "3" or c == "4" or c == "5" or c == "6" or c == "7" or c == "8" or c == "9" then
            set r = "|cffffcc00" + c + "|r" + r
        elseif c == "-" then
            set r = "|cffdddddd-|r" + r
        else
            set r = c + r
        endif
        exitwhen i <= 0
    endloop
    return r
endfunction

function SaveLoad_EncodeChar takes string n returns integer
    local integer i = 0
    local string s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    local string s2 = "abcdefghijklmnopqrstuvwxyz"
    local string s3 = "0123456789"

    loop
        if SubString(s1,i,i + 1) == n then
            return i
        endif
        if SubString(s2,i,i + 1) == n then
            return i
        endif
        set i = i + 1
        exitwhen i >= 26
    endloop
    set i = 0
    loop
        if SubString(s3,i,i + 1) == n then
            return i
        endif
        set i = i + 1
        exitwhen i >= 10
    endloop
    return 0
endfunction

function SaveLoad_EncodeVerify takes string buffer returns integer
    local integer i = 0
    local integer j = 0
    local string name = GetPlayerName(GetTriggerPlayer())
    if udg_SaveLoad_UsePlayername == true then
        loop
            set j = j + SaveLoad_EncodeChar(SubString(name,i,i + 1))
            set i = i + 1
            exitwhen i >= StringLength(name)
        endloop
    endif
    set i = 0
    loop
        set j = j + SaveLoad_EncodeChar(SubString(buffer,i,i + 1))
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop
    return j
endfunction

function SaveLoad_EncodeValues takes nothing returns string
    local integer i
    local integer j
    local integer k
    local integer l
    local integer m
    local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
    local integer array a
    local string buffer = ""
    local string c = ""
    local integer skip = 0
    local integer CONST = 1000000
    local string abc = "0123456789"

    set i = 0
    loop
        set i = i + 1
        exitwhen i > udg_SaveCount
        set buffer = buffer + I2S(udg_Save[i]) + "-"
    endloop
    set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
    if udg_Save[1] == 0 then
        set buffer = "-" + buffer
    endif

    set i = 0
    loop
        set a[i] = 0
        set i = i + 1
        exitwhen i >= 100
    endloop

    set m = 0
    set i = 0
    loop
        set j = 0
        loop
            set a[j] = a[j] * 11
            set j = j + 1
            exitwhen j > m
        endloop

        set l = 0
        set c = SubString(buffer,i,i + 1)
        loop
            exitwhen SubString(abc,l,l + 1) == c
            set l = l + 1
            exitwhen l > 9
        endloop
        set a[0] = a[0] + l

        set j = 0
        loop
            set k = a[j] / CONST
            set a[j] = a[j] - k * CONST
            set a[j + 1] = a[j + 1] + k
            set j = j + 1
            exitwhen j > m
        endloop
        if k > 0 then
            set m = m + 1
        endif
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop

    set buffer = ""
    loop
        exitwhen m < 0
        set j = m
        loop
            exitwhen j <= 0
            set k = a[j] / CodeLength
            set a[j - 1] = a[j - 1] + (a[j] - k * CodeLength) * CONST
            set a[j] = k
            set j = j - 1
        endloop
        set k = a[j] / CodeLength
        set i = a[j] - k * CodeLength
        set buffer = buffer + SubString(udg_SaveLoad_Alphabet,i,i + 1)
        set a[j] = k
        if a[m] == 0 then
            set m = m - 1
        endif
    endloop

    set i = StringLength(buffer)
    set skip = 0
    set c = ""
    loop
        set i = i - 1
        set c = c + SubString(buffer,i,i + 1)
        set skip = skip + 1
        if skip == 4 and i > 0 then
            set c = c + "-"
            set skip = 0
        endif
        exitwhen i <= 0
    endloop
    call CreateTextFile(c)
    return c
endfunction

function SaveLoad_DecodeValues takes string s returns boolean
    local integer i
    local integer j
    local integer k
    local integer l
    local integer SaveCode = 0
    local integer m
    local integer array a
    local string buffer = ""
    local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
    local integer skip = -1
    local integer CONST = 1000000
    local string abc = "0123456789-"
    local string c

    set i = 0
    loop
        set a[i] = 0
        set i = i + 1
        exitwhen i >= 100
    endloop

    set m = 0

    set i = 0
    loop
        set j = 0
        loop
            set a[j] = a[j] * CodeLength
            set j = j + 1
            exitwhen j > m
        endloop

        set skip = skip + 1
        if skip == 4 then
            set skip = 0
            set i = i + 1
        endif

        set l = CodeLength
        set c = SubString(s,i,i + 1)
        loop
            set l = l - 1
            exitwhen l < 1
            exitwhen SubString(udg_SaveLoad_Alphabet,l,l + 1) == c
        endloop
        set a[0] = a[0] + l

        set j = 0
        loop
            set k = a[j] / CONST
            set a[j] = a[j] - k * CONST
            set a[j + 1] = a[j + 1] + k
            set j = j + 1
            exitwhen j > m
        endloop
        if k > 0 then
            set m = m + 1
        endif
        set i = i + 1
        exitwhen i >= StringLength(s)
    endloop

    loop
        exitwhen m < 0
        set j = m
        loop
            exitwhen j <= 0
            set k = a[j] / 11
            set a[j - 1] = a[j - 1] + (a[j] - k * 11) * CONST
            set a[j] = k
            set j = j - 1
        endloop
        set k = a[j] / 11
        set i = a[j] - k * 11
        set buffer = SubString(abc,i,i + 1) + buffer
        set a[j] = k
        if a[m] == 0 then
            set m = m - 1
        endif
    endloop

    set i = 0
    set j = 0
    loop
        loop
            exitwhen i >= StringLength(buffer)
            exitwhen i > 0 and SubString(buffer,i,i + 1) == "-" and SubString(buffer,i - 1,i) != "-"
            set i = i + 1
        endloop
        if i < StringLength(buffer) then
            set k = i
        endif
        set SaveCode = SaveCode + 1
        set udg_Save[SaveCode] = S2I(SubString(buffer,j,i))
        set j = i + 1
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop

    set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
    set udg_SaveCount = SaveCode - 1
    if j == udg_Save[SaveCode] then
        return true
    endif
    return false
endfunction

function SaveLoad_Encode takes nothing returns string
    if udg_SaveLoad_CaseSensitive == false then
        set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
    endif
    return SaveLoad_Color(SaveLoad_EncodeValues())
endfunction

function SaveLoad_Decode takes string s returns boolean
    if udg_SaveLoad_CaseSensitive == false then
        set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
        set s = StringCase(s,true)
    endif
    if SaveLoad_DecodeValues(s) then
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"Герой загружен успешно")
        return true
    endif
    call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"Ошибка загрузки")
    return false
endfunction

Принятый ответ

Проблема в функции SaveLoad_EncodeVerify.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
20
7 лет назад
Отредактирован Karp
0
Про ограничение длинны кода задумался, потому что код действительно длинный получается (когда 11 итемов и ни чего не происходит при загрузке)
Теперь получилось вот так, после сэйва итемов героя, действие - выполнить триггер (проверив условия) по сохранению вещей курьера, тут добавил вэйт 1.0 сек. и дальше по триггеру заносится код и выводится на экран.
НЕ работает сэйв при 12 занятых слотах, при сэйве ни чего не происходит.
Если взять 11 вещй, то нормально сэйвит и грузит.
Такое ощущение что и вправду ограничена строка кода загрузки.
При сэйве с 11 занятыми слотами выдаёт код из 92 символов
-load M30M-K0XN-0Q3G-OL0C-94GX-AR3T-BN3L-R7FU-YOY1-OXQ7-V3P0-V6E3-SH4N-BADM-5Q8C-7FW1-YFIP-R
решил поставить вэйт 1,5 сек, вместо 1.0, может просто не успевает зашифровать итемы, потому что их много в инициализации системы сэйва (305 на данный момент).
увеличение вэйта не помогло
0
23
7 лет назад
0
А ты дели код если символ превышает длину, у мя вот если много данные о героя то делит на части 1 код и 2 код... пример можеш ты уже видел в игре во многих!!!!
0
20
7 лет назад
0
pro100master:
А ты дели код если символ превышает длину, у мя вот если много данные о героя то делит на части 1 код и 2 код... пример можеш ты уже видел в игре во многих!!!!
каким образом его делить? я не знаток Jass, делать отдельный сэйв на курьера и отдельный на героя?
или подскажите каким образом удалить из кода символ "-" каждые 4 буквы, или изменить промежуток для него, не каждые 4 символа, а каждые 6 к примеру, может поможет)
как сделать "-" каждые 6 символов нашёл) но стало писать ошибку при загрузке) видать где-то ещё не поменял, добавил в словарь ещё символы в нижнем регистре ,по идее тоже должно сократить длину кода, щас узнаю.
Да теперь я точно уверен что проблемы в длине кода) теперь стабильно сэйвит и загружает когда 11 вещей, каким образом можно ещё сократить длину?
без разделения на 2 кода
НЕТ
===
Стабильно сэйвит и загружает так же только 10 итемов когда
0
23
7 лет назад
0
так байтов символов считай а не длину
2
6
7 лет назад
2
Проблема в функции SaveLoad_EncodeVerify.
Принятый ответ
0
20
7 лет назад
0
BaHeK:
Проблема в функции SaveLoad_EncodeVerify.
ммм, что с ней не так?
function SaveLoad_EncodeVerify takes string buffer returns integer
    local integer i = 0
    local integer j = 0
    local string name = GetPlayerName(GetTriggerPlayer())
    if udg_SaveLoad_UsePlayername == true then
        loop
            set j = j + SaveLoad_EncodeChar(SubString(name,i,i + 1))
            set i = i + 1
            exitwhen i >= StringLength(name)
        endloop
    endif
    set i = 0
    loop
        set j = j + SaveLoad_EncodeChar(SubString(buffer,i,i + 1))
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop
    return j
endfunction
использовать local string name = GetPlayerName(GetLocalPlayer()) , вместо GetTriggerPlayer() ???
типа вот так вот?
function SaveLoad_EncodeVerify takes string buffer returns integer
    local integer i = 0
    local integer j = 0
    local string name = GetPlayerName(GetLocalPlayer())
    if udg_SaveLoad_UsePlayername == true then
        loop
            set j = j + SaveLoad_EncodeChar(SubString(name,i,i + 1))
            set i = i + 1
            exitwhen i >= StringLength(name)
        endloop
    endif
    set i = 0
    loop
        set j = j + SaveLoad_EncodeChar(SubString(buffer,i,i + 1))
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop
    return j
endfunction
2
6
7 лет назад
2
Там слишком много итераций. Убери вызов этой функции и проверь как будет работать.
0
20
7 лет назад
0
BaHeK:
Там слишком много итераций. Убери вызов этой функции и проверь как будет работать.
я конечно попробую, но что-то мне подсказывает, что без этой функции будет всё наперекосяк)
2
6
7 лет назад
2
Karp:
BaHeK:
Там слишком много итераций. Убери вызов этой функции и проверь как будет работать.
я конечно попробую, но что-то мне подсказывает, что без этой функции будет всё наперекосяк)
Конечно не будет. Поэтому это функцию надо будет переделать.
0
20
7 лет назад
0
BaHeK:
Karp:
BaHeK:
Там слишком много итераций. Убери вызов этой функции и проверь как будет работать.
я конечно попробую, но что-то мне подсказывает, что без этой функции будет всё наперекосяк)
Конечно не будет. Поэтому это функцию надо будет переделать.
Можешь изменить в правильном направлении? я не знаток вообще Jass
2
6
7 лет назад
2
Karp:
BaHeK:
Karp:
BaHeK:
Там слишком много итераций. Убери вызов этой функции и проверь как будет работать.
я конечно попробую, но что-то мне подсказывает, что без этой функции будет всё наперекосяк)
Конечно не будет. Поэтому это функцию надо будет переделать.
Можешь изменить в правильном направлении? я не знаток вообще Jass
Есть встроенная функция StringHash, поробуй использовать её вместо SaveLoad_EncodeVerify.
0
20
7 лет назад
0
И как же её использовать? Спасибо конечно за наводку, но для меня она особо ни чего не говорит)
2
6
7 лет назад
2
Karp:
И как же её использовать? Спасибо конечно за наводку, но для меня она особо ни чего не говорит)
Просто замени в коде SaveLoad_EncodeVerify на StringHash в функция сохранения и загрузки кода.
0
20
7 лет назад
0
BaHeK:
Karp:
И как же её использовать? Спасибо конечно за наводку, но для меня она особо ни чего не говорит)
Просто замени в коде SaveLoad_EncodeVerify на StringHash в функция сохранения и загрузки кода.
Ошибка:
symbol String Hash multiply defined
как я понял, функция StringHash уже обявлена
2
6
7 лет назад
2
Надо было менять только в этих строчках
set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
0
20
7 лет назад
0
BaHeK:
Надо было менять только в этих строчках
set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
это помогло, теперь хотя бы выдаёт код когда сэйвишь и у героя 12 итемов, но при загрузке пишет "неправильный код", при любом лоаде, даже если пытаешься загрузить только что созданного и сохранённого героя
при сэйве выполняется script: set udg_Code = SaveLoad_Encode()
при загрузке выполняется script: set udg_Validate = SaveLoad_Decode( udg_Code )
2
6
7 лет назад
2
Тогда исправь
set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
на
set j = StringHash(SubString(buffer,0,k + 1)
0
20
7 лет назад
0
BaHeK:
Тогда исправь
set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
на
set j = StringHash(SubString(buffer,0,k + 1))
Тоже самое
2
6
7 лет назад
2
Исправлял в обе строки и вторую с учетом того что я написал? Если так, то простому сделать не получится и нужно будет многое переделать.
0
20
7 лет назад
0
BaHeK:
Исправлял в обе строки и вторую с учетом того что я написал? Если так, то простому сделать не получится и нужно будет многое переделать.
да, сначала я сделал из
set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
вот так
set buffer = buffer + I2S(StringHashy(buffer))
set j = StringHash(SubString(buffer,0,k))
потом добавил +1 в ласт строку, теперь там так
set j = StringHash(SubString(buffer,0,k+1))
2
6
7 лет назад
Отредактирован BaHeK
2
Попробуй переставить строку следующим образом
    set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
    if udg_Save[1] == 0 then
        set buffer = "-" + buffer
    endif
чтобы получилось
    if udg_Save[1] == 0 then
        set buffer = "-" + buffer
    endif
    set buffer = buffer + I2S(StringHash(buffer))
Чтобы оставить комментарий, пожалуйста, войдите на сайт.