У меня есть временные структуры, которые в начале при работе с ней, подзагружают вершины многоугольника, молнии и прочее, если она была записана. достаточно в переменную loaded_unit записать, и по хэндлу загрузить.
код загрузки
function LoadData takes nothing returns nothing
local integer id = GetHandleId(loaded_unit)
call DisplayDebugLauncherToPlayer("Загружаем данные по зэндлу: " + I2S(id)) 

//загружаем счетчики вершин и молнии
set CountVertex_1 = LoadInteger(Hash,id, 1000)
set CountLighting_1 = LoadInteger(Hash,id, 1001)
//загружаем размер площади
set S_Area = LoadReal(Hash,id, 1002)

//ЗАГРУЖАЕМ В СТРУКТУРУ-1 КООРДИНАТЫ ВЕРШИН
    set E1 = 0
    set E2 = CountVertex_1-1
    call DisplayDebugTextToPlayer("Загружаем точки: " + I2S(E2+1))
    loop
        exitwhen E1>E2
        set Vx1[E1] = LoadReal(Hash,id, key_vertex_x+E1)
        set Vy1[E1] = LoadReal(Hash,id, key_vertex_y+E1)
        call DisplayDebugTextToPlayer(I2S(E1)+ " точка XY - " + R2S(Vx1[E1]) + "," + R2S(Vy1[E1]))
        set E1 = E1 + 1
    endloop
//ЗАГРУЖАЕМ В СТРУКТУРУ МОЛНИИ-1 МОЛНИИ
    set E1 = 0
    set E2 = CountLighting_1-1
    loop
        exitwhen E1>E2
        set lightning_1[E1] = LoadLightningHandle(Hash,id, key_lighting+E1)
        set E1 = E1 + 1
    endloop
//дебаги
//call ExecuteFunc(String_NameFunc[4]) //дебаг: вершины многоугольника и счетчика вершин, функция Debug_structure_1
//call ExecuteFunc(String_NameFunc[7]) //дебаг: молнии - созданы ли молнии, кол-во молнии и пр, функция Debug_structure_of_lightnings_1
endfunction
Аналогично и с сохранением. Только перед этим вычищаем ячейки. Записываем в глобалку saved_unit, и сохраняем.
код сохранения
function SaveData takes nothing returns nothing
local integer id = GetHandleId(saved_unit)
call DisplayDebugTextToPlayer("Сохраняем данные в хэш-таблицу, по хэндлу: " + I2S(id)) 


//очищаем точки
    set E1 = 0
    set E2 = LoadInteger(Hash,id, 1000)-1
    call DisplayDebugTextToPlayer("Чистим точки: " + I2S(E2+1)) 
    loop
        exitwhen E1>E2
        if HaveSavedReal(Hash,id, key_vertex_x+E1) then
            call RemoveSavedReal(Hash,id, key_vertex_x+E1)
        endif
        if HaveSavedReal(Hash,id, key_vertex_y+E1) then
            call RemoveSavedReal(Hash,id, key_vertex_y+E1)
        endif
        
        set E1 = E1 + 1
    endloop
//очищаем молнии
    set E1 = 0
    set E2 = LoadInteger(Hash,id, 1001)-1
    call DisplayDebugTextToPlayer("Чистим молнии: " + I2S(E2+1))
    loop
        exitwhen E1>E2
        if HaveSavedHandle(Hash,id, key_lighting+E1) then
            call RemoveSavedHandle(Hash,id, key_lighting+E1)
        endif
        set E1 = E1 + 1
    endloop
//сохраняем координаты вершин многоугольника
    set E1 = 0
    set E2 = CountVertex_1-1
    call DisplayDebugTextToPlayer("Сохраняем точки: " + I2S(E2+1))
    loop
        exitwhen E1>E2
        call SaveReal(Hash,id, key_vertex_x+E1,Vx1[E1])
        call SaveReal(Hash,id, key_vertex_y+E1,Vy1[E1])
        call DisplayDebugTextToPlayer(I2S(E1)+ " точка XY - " + R2S(Vx1[E1]) + "," + R2S(Vy1[E1]))
        set E1 = E1 + 1
    endloop
//сохраняем молнии
    set E1 = 0
    set E2 = CountLighting_1-1
    call DisplayDebugTextToPlayer("Сохраняем молнии: " + I2S(E2+1))
    loop
        exitwhen E1>E2
        call SaveLightningHandle(Hash,id, key_lighting+E1,lightning_1[E1])
        set lightning_1[E1] = null
        set E1 = E1 + 1
    endloop
//сохраняем счетчики вершин и молнии
call SaveInteger(Hash,id, 1000, CountVertex_1)
call SaveInteger(Hash,id, 1001, CountLighting_1)
//созраняем размер площади
call SaveReal(Hash,id, 1002, S_Area)

call DisplayDebugTextToPlayer(DebugText[11]+I2S(CountLighting_1)) //сохранение... число молнии
//дебаги
//call ExecuteFunc(String_NameFunc[4]) //дебаг: вершины многоугольника и счетчика вершин, функция Debug_structure_1
//call ExecuteFunc(String_NameFunc[7]) //дебаг: молнии - созданы ли молнии, кол-во молнии и пр, функция Debug_structure_of_lightnings_1
endfunction
Проблема: переписал код, и система перестала работать. Вернее, когда работаешь с одним главным зданием, работает норм. Как только создаем второе, то тут же почему то ломается. В оригинале работало норм. Дебагом выяснил, что причина возможна с сохранением или погрузкой инфы хэша. Возможно дело и не в сохранении/загрузки, а в чем то другом. Пока ищу, пока не знаю где искать

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

ладно. заработало.
не рабочий вариант
call SaveInteger(Hash,GetHandleId(GetTriggerUnit()),5555, CurrentNumberOfSettlement) в одном триггере сохраняем
set CurrentNumberOfSettlement = LoadInteger(Hash,GetHandleId(GetTriggerUnit()),5555) в другом триггере для проверки выгружаем
рабочий вариант
local integer id = GetHandleId(GetTriggerUnit())
call SaveInteger(Hash,id,5555, CurrentNumberOfSettlement) в одном триггере сохраняем
set CurrentNumberOfSettlement = LoadInteger(Hash,id,5555) в другом триггере для проверки выгружаем
Короче вернул обратно локалки, и все заработало. И почему первый вариант не работал. Ладно будут искать подводные камни. Наверное после чистой оптимизации что-то перестало работать. эх... придеться посравнивать. похоже старый код где то мб лучше. только времени потратил на методы тыка.
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
27
3 года назад
Отредактирован MpW
1
ладно. заработало.
не рабочий вариант
call SaveInteger(Hash,GetHandleId(GetTriggerUnit()),5555, CurrentNumberOfSettlement) в одном триггере сохраняем
set CurrentNumberOfSettlement = LoadInteger(Hash,GetHandleId(GetTriggerUnit()),5555) в другом триггере для проверки выгружаем
рабочий вариант
local integer id = GetHandleId(GetTriggerUnit())
call SaveInteger(Hash,id,5555, CurrentNumberOfSettlement) в одном триггере сохраняем
set CurrentNumberOfSettlement = LoadInteger(Hash,id,5555) в другом триггере для проверки выгружаем
Короче вернул обратно локалки, и все заработало. И почему первый вариант не работал. Ладно будут искать подводные камни. Наверное после чистой оптимизации что-то перестало работать. эх... придеться посравнивать. похоже старый код где то мб лучше. только времени потратил на методы тыка.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.