Добавлен Берги
Суть:
После загрузки игры система ищет на компьютере каждого игрока 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 файле, достаточно инициализировать кешь с тем же именем что в игре, ну а после синхронизация данных между игроками.
в прелоаде можно делать примерно так:
Что за pld файл? час пойду гуглить первый раз слышу
Мемхак есть да толку, уровень ctrc+c ctrl+v
Отредактирован quq_CCCP
pld - preload data file, генерируется preload gen end
Ищешь в памяти адресс строк которые должны попасть в pld скрипт и меняешь их, если необходимо.
Ну а так строчку с сохранением в кешь пожалуйста.
bifurcated:
Но ты прелоад по лакал плеера засунул, я тоже изначально так думал сделать, но это же как то странно... щас буду проверять,99% десинхрон
и ещё нет синхронизации через гейм кеш....
quq_CCCP, Всё очень сложно, я вчитываюсь в твои сообщения по 20 раз и совершенно не могу понять что мне делать, но звучит так что должно запуститься
bifurcated, Проверил, второго игрока не выкинуло! почему? как? ничего не понимаю....
Поставил вар на ноут теперь могу адекватно проверять, у меня ничего не синхронизируется, как будто функция
quq_CCCP:
Что вообще делает эта строка? call StoreString(cache, , , val) - помещает локальное значение переменной VAL в кеш, в ячейку empty empty?
Вот я уже весь сайт перерыл, инфы 1% и он в статье про локалплеер
Помогите....
потом локально ты записываешь в ячеку кеша нужные тебе данные:
Далее нам нужно выполнить синхронизацию.
Записать в кешь данные с машины игрока можно прямо в pld файле, не юзая никакие имена игроков и прочее говно.
Важно чтобы имя кеша в карте и pld файле и карте было одинаковым, в данном случаи "data.w3v", но само название разумеется никакой роли не играет.
globals
integer array cgame
gamecache gc = InitGameCache("cache")
endglobals
call StoreInteger( gc, "GamesCount", "P0", 0 ) ячейка 1
call StoreInteger( gc, "GamesCount", "P1", 0 ) ячейка 2
call StoreInteger( gc, "GamesCount", "P2", 0 ) ячейка 3
call StoreInteger( gc, "GamesCount", "P3", 0 ) ячейка 4
call StoreInteger( gc, "GamesCount", "P4", 0 ) ячейка 5
call StoreInteger( gc, "GamesCount", "P5", 0 ) ячейка 6
endfunction
(GetStoredInteger(gc, "GamesCount", "P"+I2S(GetPlayerId(GetLocalPlayer()))) - надо подставлять айди конкретного игрока а не локально... едем дальше...
как сохранять данные в файл? А очень просто:
Проверить наличие файла на машине юзера можно с помощью нативки GetSoundFileDuration, но у файла должно быть звуковое расширение, остальное неважно. Preloader'у же пофиг на расширение файла.
Лучший вариант: Datamanager+EnableLocalFiles