У меня в карте есть проверка на файл, за это отвечает переменная типа bool. Проверка :
while(i<n) {
	if GetLocalPlayer()==Player(i) {
		if FileExists("config.ini") { b[i] = true }
		 else { b[i] = false }
	}
	i++
}
Для игроков с этим файлом дается доступ к командам, но при их вызове вылетает диссинхрон, как можно синхронизировать эти переменные у всех игроков.
P.s. смотрел другие вопросы на эту тему, нашел пару функций типа TriggerSyncStart() , но как она работает и зачем нужна нигде

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

MKDimon, здесь вообще не надо проверять в локал плеере и синхронизировать
я конкретно про то, когда ты проверяешь наличие файла
globals
bolean IHaveConfig=false // булевае данные можно держать асинхронными
endfglobals

-твоя функция начало
if FileExists("config.ini") then
set IHaveConfig=true
else // это можно и не писать
set IHaveConfig=false // хотя он и так false
endif
-конец
И у каждого игрока переменная примет своё значение и это не вызовет никакого десинхрона, каждый игрок будет знать если ли у него конф или нет
Синхронизация нужна, если нужно чтобы игрока Красный, узнал о наличии конфига у игрока Синего
Синхронизировать нужно непостредственно ,то что считывает ReadString, я тебе писал функцию как строковый тип синхронить
синхронизатор целого переделай под стринг или ищи я писал ранее
function SyncInteger takes player p, integer val returns integer
if (GetLocalPlayer() == p) then
call StoreInteger(SyncCache, "", "", val)
endif
call TriggerSyncStart()
if (GetLocalPlayer() == p) then
call SyncStoredInteger(SyncCache, "", "")
endif
call TriggerSleepAction(2)// меньшнее значение вызывает десинх
call TriggerSyncReady()
return GetStoredInteger(SyncCache, "", "")
endfunction
а вообще там 131 патч завезли, в котором есть быстрый синх, а на луа скорее все свои плюшки, мб можно вернуться к прелоаду и не юзать мемхак
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
19
5 лет назад
2
Похожие вопросы:

ответ
Разработчики игры не доделали синхронизацию строк. Тебе придется искать обходные пути.

0
32
5 лет назад
0
MKDimon, здесь вообще не надо проверять в локал плеере и синхронизировать
я конкретно про то, когда ты проверяешь наличие файла
globals
bolean IHaveConfig=false // булевае данные можно держать асинхронными
endfglobals

-твоя функция начало
if FileExists("config.ini") then
set IHaveConfig=true
else // это можно и не писать
set IHaveConfig=false // хотя он и так false
endif
-конец
И у каждого игрока переменная примет своё значение и это не вызовет никакого десинхрона, каждый игрок будет знать если ли у него конф или нет
Синхронизация нужна, если нужно чтобы игрока Красный, узнал о наличии конфига у игрока Синего
Синхронизировать нужно непостредственно ,то что считывает ReadString, я тебе писал функцию как строковый тип синхронить
синхронизатор целого переделай под стринг или ищи я писал ранее
function SyncInteger takes player p, integer val returns integer
if (GetLocalPlayer() == p) then
call StoreInteger(SyncCache, "", "", val)
endif
call TriggerSyncStart()
if (GetLocalPlayer() == p) then
call SyncStoredInteger(SyncCache, "", "")
endif
call TriggerSleepAction(2)// меньшнее значение вызывает десинх
call TriggerSyncReady()
return GetStoredInteger(SyncCache, "", "")
endfunction
а вообще там 131 патч завезли, в котором есть быстрый синх, а на луа скорее все свои плюшки, мб можно вернуться к прелоаду и не юзать мемхак
Принятый ответ
0
7
5 лет назад
0
Bergi_Bear, дисенхрон есть, когда проверяется доступ к команде.
Можно описать что в данной функции происходит?
0
32
5 лет назад
0
десинхронит скорее всего другой кусок кода, пока всё на уровне переменных, варику по барабану на асинхронность, покажи мне в дискорде всё что у тебя есть
то что выложил ты запишет асинхронный массив из булевых, он сам по себе не будет десинхать, а будет десинхать, что используется дальше
2
28
5 лет назад
Отредактирован PT153
2
Кек.
globals
    boolean IHaveConfig
endfglobals
...
function SomeFunc takes something returns something
    ...
    set HaveConfig = FileExists("config.ini")
    ...
endfunction
0
32
5 лет назад
0
PT153, да так ещё проще кек
2
28
5 лет назад
Отредактирован PT153
2
А ещё можно вместо постоянного вызова GetLocalPlayer() и его сравнения сделать переменные.
library MainLib initilizer init
globals
    player LocalPlayer
    boolean array IsLocalPlayer
endglobals

function PlayerIsLocal takes player p returns boolean
    return IsLocalPlayer[GetPlayerId(p)]
endfunction

private function init takes nothing returns nothing
    local integer a = 0
    set LocalPlayer = GetLocalPlayer()
    loop
        set IsLocalPlayer[a] = LocalPlayer == Player(a)
        set a = a + 1
        exitwhen a == bj_MAX_PLAYERS
    endloop
endlibrary
Но лично у меня IsLocalPlayer находится в структуре, что отвечает за игрока.
struct CustomPlayer
    readonly player user
    ...
    readonly boolean isLocalPlayer
    ...

    static method create takes player p, integer i returns thistype
        local thistype this = allocate()
        // Common
        set user = p
        set isLocalPlayer = p == LocalPlayer
        ...
        return this
    endmethod
endstruct
Чтобы оставить комментарий, пожалуйста, войдите на сайт.