Задача следующая, в реплее нужно отобразить ряд дополнительной инфы, которая в самой игре может, как отображаться, так и нет. (от предпочтений игрока)
Остались ли какие-то рабочие варианты детекта на то, что просматривается реплэй?

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

Вот рабочая система с хайва. Различает реплей, одиночную и сетевую игру.
Инициализируется на стадии загрузки карты, поэтому не придется ждать 2.9 сек.
Нет ложного срабатывания на свернутую игру.

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
7 лет назад
0
awesomesk1ll, ты можешь синкнуть между всеми значение InGame, кстати там вроде все игроки проверяются, в мультиплеере кто-нить тестил?
0
21
7 лет назад
0
quq_CCCP:
awesomesk1ll, ты можешь синкнуть между всеми значение InGame, кстати там вроде все игроки проверяются, в мультиплеере кто-нить тестил?
та на это не смотри особо) эта либа корявая же..
GetCameraTargetPositionX() возвращает локальное X же?) нафига там цикл вообще.
0
32
7 лет назад
0
Там локал плауер для всех 12 игроков
Смотри код внимательнее
0
21
7 лет назад
0
ловким движением руки из кода выкидываются циклы, а смысл не меняется.
private function IsInGame takes nothing returns boolean
local integer counter = 1
local real camerax
local real cameray
local real x
local real y
local boolean output
loop
    exitwhen counter > 12
    if GetLocalPlayer() == Player(counter-1) then
        set camerax = GetCameraTargetPositionX()
        set cameray = GetCameraTargetPositionY()
    endif
    set counter = counter + 1
endloop
set counter = 1
call PauseGame(true)
call TriggerSleepAction(0)
loop
    exitwhen counter > 12
    if GetLocalPlayer() == Player(counter-1) then
        call SetCameraPosition(camerax + 1,cameray + 1)
    endif
    set counter = counter + 1
endloop
call TriggerSleepAction(0)
call PauseGame(false)
set counter = 1
loop
    exitwhen counter > 12
    if GetLocalPlayer() == Player(counter-1) then
        set x = GetCameraTargetPositionX()
        if x == camerax + 1 then
            set output = true
        else
            set output = false
        endif
        call SetCameraPosition(camerax,cameray)
    endif
    set counter = counter + 1
endloop
return output
endfunction 
private function IsInGame takes nothing returns boolean
local integer counter = 1
local real camerax
local real cameray
local real x
local real y
local boolean output
        set camerax = GetCameraTargetPositionX()
        set cameray = GetCameraTargetPositionY()

call PauseGame(true)
call TriggerSleepAction(0)

        call SetCameraPosition(camerax + 1,cameray + 1) 

call TriggerSleepAction(0)
call PauseGame(false)

        set x = GetCameraTargetPositionX()
            set output = (x == camerax)
        call SetCameraPosition(camerax,cameray)

return output
endfunction 
Смотри код внимательнее
0
29
7 лет назад
0
awesomesk1ll,
ты на дисинхрон тестил? Я когда юзал этот код у меня дисинхронизация в самой игре была.
0
21
7 лет назад
0
ну просто GetCameraTargetPositionX() SetCameraPosition() это локальные функции, их можно одновременно для всех игроков запустить спокойно, поправьте если не так)).
0
32
7 лет назад
0
16GB, тестанул код, но делал разделения только на визуальные действия, т.е камеру не перемещал при телепортах и перерождениях героев в реплее, всё норм. Но вот без цилков, рили может десинхать, ты же не для каждого игрока записываешь проверку, а для всех.
Нужно тестить в муи, судя по тому что похожий антихак засунули в доту ниче не дисинхало и ниче не делало вред, правда читеры очень быстро научились обходить прозрачность юнитов и всякие туманы, затеняющие карту...
В доте вроде юзается какая то фишка с кинематиком, хз в чем различие киниматике в игре и в реплее?
Код лень колупать...
0
21
7 лет назад
Отредактирован awesomesk1ll
0
ты на дисинхрон тестил?
Дак нет, я имею ввиду, что дальше то, только то использовать с такой булей, что может локально без десинков работать, это основное правило работы с асинк данными.
В общем это бОльше от нужд зависит, ну вверху я писал, что мне только с отображением поиграться, так что достаточно).
Основные приёмы как не ловить десинк в примерах по getlocalplayer() описаны
В общем пока такие результаты:
Реплей проигрывается с 5-6 игровой секунды, соответственно если двигать и проверять камеру до 5 секунды, в реплее движения камеры не будет.
Но если игрок долго "залипает" в альтабе, то движения камеры так же может и не быть. Вопрос в том каким образом отловить alt+tab или паузу (isPausedGame).
0
32
7 лет назад
0
awesomesk1ll, а что если в кешь записать могут ли двигать камеру все игроки, если все нет - то реплей, если большинство да, то синхронизируем с ними данные и записываем в переменную.
0
14
7 лет назад
0
Попробуй мемхак (код подходит только для патча 1.26a)
Адреса и смещения не делены на 4!
int ptr1 = Read(GameDll + $AB4F80)
int ptr2 = Read(ptr1 + $3C8)
int ptr3 = Read(ptr2 + $15C)
bool IsReplay = (ptr3 != 0)
0
32
7 лет назад
0
IceFog, проверил в сингле - отличает репу от игры
    private function IsRaplay takes nothing returns boolean
        local integer ptr1 = RMem(GameDLL + $AB4F80)
        local integer ptr2 = RMem(ptr1 + $3C8)
        local integer ptr3 = RMem(ptr2 + $15C)
        return (ptr3 != 0)
    endfunction
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.