rendered paste body .586p
GetBase macro Reg
call $+5
pop Reg
sub Reg,$-1
endm
Code segment use32
org 0
dd offset End_of_file
dw 1 ; Version
dd End_of_header ; Size of header
dd offset Selections
dd offset Selections_Text
dd offset ID_List
dd offset Entry
dd 0 ; Res1
dd 0 ; Res2
db 0 ; Master Enable
End_of_header equ $
storepushret PROC
mov byte ptr [edi],068h
mov dword ptr [edi+1], esi
mov byte ptr [edi+5], 0c3h
ret
storepushret ENDP
Entry:
mov edi, 0124C2Eh
lea esi, [igks+ebp] ;ingame keys
call storepushret
mov edi, 012B6AAh
lea esi, [gamestate+ebp] ;updates gamestate
call storepushret
ret
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;creates a bitmask16 of gamepad presses
;dpad-up= 0001
;dpad-down= 0002
;dpad-left= 0004
;dpad-right= 0008
;start= 0010
;back= 0020
;lthumb= 0040
;rthumb= 0080
;A= 0100
;B= 0200
;X= 0400
;Y= 0800
;black= 1000
;white= 2000
igks: ;hook @ 0124C2Eh
;00124C2E lea ecx,[esp+20h]
;00124C32 push ecx
;00124C33 push eax
;00124C34 call 00409B6C
lea ecx, [esp+20h]
pushad
getbase ebp
lea eax, dword ptr [eax+14h] ;loads XINPUT_GAMEPAD address
;-----builds bitmask16 for entire gamepad-----
xor edx, edx ;resets edx
mov cx, 0100h ;initial bitmask value
mov bl, byte ptr [eax] ;copies wButtons
buildgamepad:
mov dl, byte ptr [eax+2] ;loads button
cmp edx, 03Fh ;checks for 25% press
jle notpressed ;jumps if less than
add bx, cx ;enables bitmask
notpressed:
shl cx, 1 ;gets next bitmask value
inc eax ;gets next button address
cmp cx, 04000h ;checks if it assigned all bitmasks (excluding triggers)
jne buildgamepad ;jumps if hasnt
lea eax, [ebp+gamepad] ;loads gamepad address
mov word ptr [eax], bx ;stores new gamepad state
popad
push ecx
push eax
push 00124C34h
ret
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
framedelay db 0
gamestate: ;hook @ 012B6AAh
;0012B6AA lea ebx, [ebx]
;0012B6B0 call sub_12B450
;0012B6B5 mov al, byte_547F2B
;0012B6BA test al, al
;0012B6BC jz short loc_12B6B0
lea ebx, [ebx]
loc_12B6B0:
pushad
getbase ebp
xor byte ptr ds:[ebp+framedelay], 1 ;frame limiter (10fps)
cmp framedelay[ebp], 1 ;checks to make sure everything is updated
jne limitfps ;jumps if not
;-----checks for gamepad input-----
call InGameKeys
;ADD WHATEVER ELSE YOU WANT HERE, THINK OF IT AS MAIN()
limitfps:
popad
push ebx
mov ebx, 012B450h
call ebx ;updates gamestate
pop ebx
mov al, byte ptr ds:[0547F2Bh]
test al, al
jz loc_12B6B0
push 012B6BEh
ret
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
gamepad dw 0
InGameKeys PROC
pushad
getbase ebp ;gets base address of trainer
mov ax, word ptr [ebp+gamepad] ;loads gamepad data
mov bx, word ptr [ebp+oldpad] ;loads old press
;lea ecx, [ebp+config+40h] ;loads igk config address
cmp ax, bx ;compares with new press
je heldkey ;jumps if no change
;PUT KEYS THAT YOU ONLY WANT EXECUTED ONCE PER PRESS HERE
wireframe: ;-----toggles wireframe mode-----
cmp ax, 080h ;rthumb+lthumb
jne testcombo
pushad
GetBase ebp
lea ebx, dword ptr ds:[ebp+renderstate] ;loads current renderstate
xor byte ptr [ebx], 1 ;toggles renderstate (0=wireframe, 1=solid)
mov cl, byte ptr [ebx] ;duplicates renderstate
inc cl ;adjusts for real enum value
mov eax, cr0 ;realtime patch routine
push eax
and eax, 0FFFEFFFFh
mov cr0, eax
mov byte ptr ds:[0133F6h], cl ;moves data into address
pop eax
mov cr0, eax
popad
testcombo:
cmp ax, 041h ;lthumb+dpad-up
jne nochange
;PUT TEST CODE HERE
jmp nochange
heldkey: ;-----code that is executed multiple times per press-----
;PUT KEYS THAT YOU CAN HOLD HERE
nochange:
;-----stores old press-----
lea ebx, [ebp+oldpad]
mov word ptr [ebx], ax
popad
ret
InGameKeys ENDP
oldpad dw 0
renderstate db 1 ;default solidfill
ID_List label dword
dd 04D530064h
dd 0
Selections label byte
Selections_Text label byte
dd offset Text_Menu
dd offset Text_Info
dd 0
Text_Menu db 'Halo 2 Test Trainer 3', 0
Text_Info db 'Made by Jefff', 0
db 0
End_of_file equ $
Code ends
end