Добавлен Берги
Суть:
После загрузки игры система ищет на компьютере каждого игрока 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 часов
Но я всё таки надеюсь что причина лишь в том, что я тестирую сам с собой и локальный файл у меня 1 и тот же на компьютере и в одном и том же месте, поэтому игрока #2 выкидывает. С реальным человеком смогу проверить только через 20 часов
И карта прилагается, заранее спасибо
Принятый ответ
Закрываем вопрос, причина была в снятой галочке про "включение локальных данных"
Лучший вариант: Datamanager+EnableLocalFiles
Лучший вариант: Datamanager+EnableLocalFiles
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Хотя сейчас подумал, ведь действительно может быть десинх, когда один игрок получит переменную из своего файла больше 0, а у остальных будет 0.
8gabriel8, прелоад всегда происходит у всех, а асинхронные данные синхронизируется и собираются в массив
Ну нужен геймкешь и прелоад.
Ред. quq_CCCP
В кеше N ячеек, по 1 для каждой игрока, записывешь в каждую глобально 0 (любую одинаковую информацию), потом вызываешь прелоад - глобально, но путь к файлу разный, у всех игроков, при этом содержимое примерно одинаковое, кроме данных, при этом запись в кешь ты производишь прямо в pld файле, достаточно инициализировать кешь с тем же именем что в игре, ну а после синхронизация данных между игроками.
в прелоаде можно делать примерно так: