Суть:

После загрузки игры система ищет на компьютере каждого игрока txt файл, в котором записано некое число, если файла нет, то число=0, потом найденной число синхронизируется через игровой кеш и заполняется массив, после этого мы уже может просуммировать все полученные данные и установить уровень сложности.
Функция Load
globals
integer gk=0
endglobals


function Trig_Evenload_Actions takes nothing returns nothing
local string s=""
local string data=""

call Preloader("save\\PreExp.txt")//меняет всем имя игрока 16 на индивидульное значение или не?  что будет если с фаила игрока 1
////// выгружается 1, а из игрока 2 - 50? а у игрока у кого нет фаилла вызвается "игрок 16"


if GetLocalPlayer()==Player(gk)  then
set s=GetPlayerName(Player(15)) // S примет индвидуальные значения от каждого игрока
endif

if GetPlayerController(Player(gk)) == MAP_CONTROL_USER then
call BJDebugMsg("Загрузка результатов для " +GetPlayerName(Player(gk)))
set data = SyncString(Player(gk), s)//пауза 2 сек
set cgame[gk]=S2I(data)

if cgame[gk]==0 then
call BJDebugMsg(GetPlayerName(Player(gk))+" играет первый раз")
else
call BJDebugMsg(GetPlayerName(Player(gk))+": сыграно игр - "+I2S(cgame[gk]))
endif

endif
set gk=gk+1

if gk==10 then
call BJDebugMsg("Загрузка результатов завершена")
endif

endfunction

//===========================================================================
function InitTrig_EvetLoadPeriud takes nothing returns nothing
    set gg_trg_EvetLoadPeriud = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_EvetLoadPeriud, 4 )//более частые вызовы всё ломают
    call TriggerAddAction( gg_trg_EvetLoadPeriud, function Trig_Evenload_Actions )
endfunction
Я совершенно не уверен в ее работоспособности, где я сомневаюсь написал комментарии.
Далее идёт игра, бла бла бла, допустим на самом лёгком уровне сложности игра завершена и происходит сохранение, а вот тут тоже всё ужасно:
Функция Save
function Trig_EventSave_Actions takes nothing returns nothing
local string s=""
local integer k=0

loop 
exitwhen k==10
if GetLocalPlayer()==Player(k) then
set s=I2S(cgame[k]+1)// запишем в переменную индивидуальные значения от каждого игрока
endif
set k=k+1
endloop

call Preload("\")\ncall SetPlayerName(Player(15),\""+s+"\")\ncall ExecuteFunc(\"Test\")\n//") // сохраним на каждый комп файл с уникальным значением
call BJDebugMsg(" ")
call Preload("\")\nendfunction\nfunction Other takes nothing returns nothing\n//")
call BJDebugMsg("2")
call PreloadGenEnd("save\\PreExp.txt")//!!!!!!!!!!!!!!!!!!!!!!!
////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
call BJDebugMsg("Автосохранение прошло успешно, можно перезапускать тестовую карту") // и после этого десинхронизация!!!!!!!!!!!!!!!!!!!!!

endfunction

//===========================================================================
function InitTrig_EventSave takes nothing returns nothing
    set gg_trg_EventSave = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_EventSave, 20 )// функция должна вызываться в конце игры
    call TriggerAddAction( gg_trg_EventSave, function Trig_EventSave_Actions )
endfunction

А теперь что у меня не так:

Разумеется функция сохранения вызывает десинхрон в том месте где я указал, потому что там где getlocalplayer, там я и вешаюсь, возможно в коде всё правильно и опытному взгляду сразу всё будет понятно.
Но я всё таки надеюсь что причина лишь в том, что я тестирую сам с собой и локальный файл у меня 1 и тот же на компьютере и в одном и том же месте, поэтому игрока #2 выкидывает. С реальным человеком смогу проверить только через 20 часов
И карта прилагается, заранее спасибо

Закрываем вопрос, причина была в снятой галочке про "включение локальных данных"
Лучший вариант: Datamanager+EnableLocalFiles
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
33
Вообще локально всё работает и я готов передавать больший объём данных из игры в игру, но в этом нет смысла ибо по сети код не работает даже на такой элементарщине! =(
22
а зачем такое изврашение? сделай скрытный рейтинг для сейв а не просто указывать число который могут подменить
26
А нужен ли ЛокалПлеер? Разве чтение из PreExp.txt будет происходить только у хоста, а не у каждого игрока отдельно?
Хотя сейчас подумал, ведь действительно может быть десинх, когда один игрок получит переменную из своего файла больше 0, а у остальных будет 0.
33
pro100master, извращение это вводить или копировать гигантский код в чат игры, а суть в том чтобы игрок ничего не вводил и + кому надо в 2019 лезть в блокнот и что то редактировать, как тем темболее лезть в карт, темболее наличие каких либо данных в файле будет только усложнят игру.
8gabriel8, прелоад всегда происходит у всех, а асинхронные данные синхронизируется и собираются в массив
32
Прелоад нельзя юзать в гетлокал плеере. Эх как бы все обьяснить?
33
quq_CCCP, так заметь у меня не прелоад в локал плеере, а содержимое ячейки
32
Bergi_Bear, Я делал уже, давно..
Ну нужен геймкешь и прелоад.
33
так у меня и гейм кеш и прелоад тут, но что-то не так на этапе save я не проверял но возможно load исправно работает, можешь строки кода хоть посмотреть
32
В карте создаем и инициализируем кешь, как его назвать неважно.
В кеше N ячеек, по 1 для каждой игрока, записывешь в каждую глобально 0 (любую одинаковую информацию), потом вызываешь прелоад - глобально, но путь к файлу разный, у всех игроков, при этом содержимое примерно одинаковое, кроме данных, при этом запись в кешь ты производишь прямо в pld файле, достаточно инициализировать кешь с тем же именем что в игре, ну а после синхронизация данных между игроками.
в прелоаде можно делать примерно так:
код
function PreloadFiles takes nothing returns nothing
    local gamecache gc = InitGameCache( "MMD.Dat" )
    local string st = "Runner"
    
    //===========================================================================
    //  preload runner id data 
    //===========================================================================
    call StoreInteger(gc,st,"0",'E000')     //1 - A
    call StoreInteger(gc,st,"1",'E001')     //2 - B
    call StoreInteger(gc,st,"2",'E002')     //3 - C
    call StoreInteger(gc,st,"3",'E003')     //4 - D
    call StoreInteger(gc,st,"4",'E004')     //5 - E
    call StoreInteger(gc,st,"5",'E005')     //6 - F
    call StoreInteger(gc,st,"6",'E006')     //7 - G
    call StoreInteger(gc,st,"7",'E007')     //8 - H
    call StoreInteger(gc,st,"8",'E008')     //9 - I
    call StoreInteger(gc,st,"9",'E009')     //10 - K
    call StoreInteger(gc,st,"10",'E00A')    //11 - J
    call StoreInteger(gc,st,"11",'E00B')    //12 - K
    call StoreInteger(gc,st,"12",'E00C')    //13 - L
    call StoreInteger(gc,st,"13",'E00D')    //14 - M
    call StoreInteger(gc,st,"14",'E00E')    //15 - N
    call StoreInteger(gc,st,"15",'E00F')    //16 - O
    call StoreInteger(gc,st,"16",'E00G')    //17 - P
    call StoreInteger(gc,st,"17",'E00H')    //18 - R
    call StoreInteger(gc,st,"18",'E00I')    //19 - S
    call StoreInteger(gc,st,"19",'E00J')    //20 - T
    call StoreInteger(gc,st,"20",'E00K')    //21 - U
    call StoreInteger(gc,st,"21",'E00L')    //22 - V
    call StoreInteger(gc,st,"22",'E00M')    //23 - W	

    call StoreInteger(gc,st,"Max",22)    //Максимум эльфиек
    set st = null
    set gc = null
endfunction
Кстати у тебя же есть мемхак, ты можешь модифицировать все что пишется в pld файл по своему хотению.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.