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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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
0
14
7 лет назад
Отредактирован IceFog
0
Нашел смещение для новой версии:
code
int offset

// Не знаю как вы там версии сравниваете
if (VERSION == 1.26a) then
	offset = $AB4F80
elseif (VERSION == 1.27a)
	offset = $BE6350
endif

int ptr1 = Read(GameDll + offset)
int ptr2 = Read(ptr1 + $3C8)
int ptr3 = Read(ptr2 + $15C)
bool IsReplay = (ptr3 != 0)
На афкашеров пофигу, что им лишнее что то показалось, чаще всего такие вовсе не приходят или ливают.
Я часто сворачиваю игру, мало ли сколько народ набираться будет.
А после загрузки игры я получаю уведомление от программы.
0
32
7 лет назад
0
IceFog, Прочие фишки реплеев не найдено?
0
14
7 лет назад
Отредактирован IceFog
0
quq_CCCP, ты имеешь ввиду смещения для прочих версий?
у меня есть game.dll только для 1.26a, 1.27a, 1.27b (тут мемхак уже не пашет?)
0
21
7 лет назад
Отредактирован awesomesk1ll
0
Вроде более менее разобрались.
В начале игры происходит лаг, который не дает двигать камеру. Его продолжительность меняется от случая к случаю.
Так же если происходят лаги вызванные происходящим в самой игре (зависит от конкретных решений внутри карты) могут так же появляться
лаги, препятствующие передвижению камеры.
В самом лучшем случае, при просмотре реплея, игра начинается примерно с 2.9 сек (проверялось на пустой melee карте)
Таким образом между концом вступительного игрового лага и началом игры в реплее, есть окно, внутри которого можно расположить проверку. (как уже писал выше, передвижение камеры в реплее не работает, если оно вызывалось до старта реплея, 2.9~)
На 0.101 можно не смотреть (т.к выполняется при инициализации карты, в реплее в том числе)
Немного про SetCameraBounds, проверяет текущее положение камеры и двигает её в установленные границы, но не делает этого, если игра свёрнута, в реплее работает так же, как и в обычной игре.
код на котором остановились
library ReplayLib

struct ReplayLib extends array
    readonly static boolean wasPaused = false
    readonly static boolean wasReplay = false
    readonly static boolean wasMeasured = false
    
    private static real x = 0
    private static real y = 0
    
    private static real tx1 = 0
    private static real tx2 = 0
    
    private static real newx1 = 0
    private static real newx2 = 0
    
    private static real minX = 0
    private static real minY = 0
    private static real maxX = 0
    private static real maxY = 0
    
    private static method onReplayTest2 takes nothing returns nothing
        call DestroyTimer(GetExpiredTimer())
        
        set newx2 = GetCameraTargetPositionX()
        
        set wasReplay = (((tx1 != newx1) and (tx2 != newx2)) and (not wasPaused))
        set wasMeasured = true
        
        call SetCameraBounds(minX, minY, minX, maxY, maxX, maxY, maxX, minY)
        call SetCameraPosition(x, y)
        
        call EnableUserControl(true)
    endmethod
    
    // Tests if we are running in a replay
    private static method onReplayTest1 takes nothing returns nothing
        set newx1 = GetCameraTargetPositionX()
        
        call SetCameraPosition(tx2, y) // Pan camera (doesn't occur near start of replays)
        
        call TimerStart(GetExpiredTimer(), 0.2, false, function thistype.onReplayTest2)
    endmethod
    
    private static method onPausedTest takes nothing returns nothing
        set wasPaused = (x == GetCameraTargetPositionX())
        
        call SetCameraPosition(tx1, y) // Pan camera (doesn't occur near start of replays)
        
        call TimerStart(GetExpiredTimer(), 0.5, false, function thistype.onReplayTest1)
    endmethod
    
    // Schedules the replay test as soon as possible
    private static method onInit takes nothing returns nothing
        call EnableUserControl(false) // Block users from manually moving the screen
        
        set x = GetCameraTargetPositionX()
        set y = GetCameraTargetPositionY()
        
        set tx1 = x + 2
        set tx2 = x + 3
        
        set minX = GetCameraBoundMinX()
        set minY = GetCameraBoundMinY()
        set maxX = GetCameraBoundMaxX()
        set maxY = GetCameraBoundMaxY()
        
        call SetCameraBounds(x + 1, y, x + 1, y, tx2, y, tx2, y)
        
        call TimerStart(CreateTimer(), 1.1, false, function thistype.onPausedTest)
    endmethod
endstruct

// Returns the outcome of the replay test
function IsReplay takes nothing returns boolean
    if (not ReplayLib.wasMeasured) then
        call BJDebugMsg("[ReplayLib] Error: used IsReplay() before value was ready.")
    endif
    return ReplayLib.wasReplay
endfunction

endlibrary
Загруженные файлы
0
14
7 лет назад
0
Вот рабочая система с хайва. Различает реплей, одиночную и сетевую игру.
Инициализируется на стадии загрузки карты, поэтому не придется ждать 2.9 сек.
Нет ложного срабатывания на свернутую игру.
Принятый ответ
0
21
7 лет назад
0
IceFog,
Спасибо чувак! будем тестить, это всё упрощает).
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.