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

Вот рабочая система с хайва. Различает реплей, одиночную и сетевую игру.
Инициализируется на стадии загрузки карты, поэтому не придется ждать 2.9 сек.
Нет ложного срабатывания на свернутую игру.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
awesomesk1ll, а что если в кешь записать могут ли двигать камеру все игроки, если все нет - то реплей, если большинство да, то синхронизируем с ними данные и записываем в переменную.
19
Попробуй мемхак (код подходит только для патча 1.26a)
Адреса и смещения не делены на 4!
int ptr1 = Read(GameDll + $AB4F80)
int ptr2 = Read(ptr1 + $3C8)
int ptr3 = Read(ptr2 + $15C)
bool IsReplay = (ptr3 != 0)
32
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
19
Нашел смещение для новой версии:
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)
На афкашеров пофигу, что им лишнее что то показалось, чаще всего такие вовсе не приходят или ливают.
Я часто сворачиваю игру, мало ли сколько народ набираться будет.
А после загрузки игры я получаю уведомление от программы.
19
quq_CCCP, ты имеешь ввиду смещения для прочих версий?
у меня есть game.dll только для 1.26a, 1.27a, 1.27b (тут мемхак уже не пашет?)
21
Вроде более менее разобрались.
В начале игры происходит лаг, который не дает двигать камеру. Его продолжительность меняется от случая к случаю.
Так же если происходят лаги вызванные происходящим в самой игре (зависит от конкретных решений внутри карты) могут так же появляться
лаги, препятствующие передвижению камеры.
В самом лучшем случае, при просмотре реплея, игра начинается примерно с 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
Загруженные файлы
19
Вот рабочая система с хайва. Различает реплей, одиночную и сетевую игру.
Инициализируется на стадии загрузки карты, поэтому не придется ждать 2.9 сек.
Нет ложного срабатывания на свернутую игру.
Принятый ответ
21
IceFog,
Спасибо чувак! будем тестить, это всё упрощает).
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.