Credit: Linblow
Code:
void ::native_antiPlayerKnifeGrabber( Player *knifer, Anim *anim, Anim *animCopy, int unknown )
{
addiu sp , sp , -128
sw ra , 0(sp)
sw s0 , 4(sp) # Player *knifer
sw s1 , 8(sp) # Config start addr
sw s2 , 12(sp) # Is the player being knifed?
sw s3 , 16(sp) # Victim's struct Player
# sp + 20 <=> text buffer (100 bytes)
or s0 , a0 , zero
lui s1 , $0974
lw t0 , 0(a2) # Loads the current animation
xori t1 , t0 , $001B
xori s2 , t0 , $001C
sltiu t1 , t1 , 1
sltiu s2 , s2 , 1
or t0 , t1 , s2
beq t0 , zero , $__END # No player's being grabbed/knifed?
nop
jal $088FCD54 # ::getPlayerBySealObjectIndex( int sealObjectIndex )
lhu a0 , 8(a2)
beq v0 , zero , $__END
or s3 , v0 , zero # Victim's struct Player
-- IS_USER
lui t0 , $08D0
lw t0 , $5858(t0)
bne s3 , t0 , $__NORMAL_PLAYER # The victim isn't the user?
/* We format the notification message for the user */
addiu a2 , s1 , $0730 # MSG_USERGRABBED
bnel s2 , zero , $__CONTINUE
addiu a2 , s1 , $06E0 # MSG_USERKNIFED
-- CONTINUE
lw a3 , $0010(s0) # Cheater's nickname
ori a1 , zero , 100
jal $08C13480 # libc::snprintf( char *buff, int size, char *fmt, .. )
addiu a0 , sp , 20 # Text buffer
beq zero , zero , $__ALERT_USER
-- NORMAL_PLAYER
lw t0 , $0014(s1) # CHEAT->detectPlayerKnifeGrab
beq t0 , zero , $__END # The detector is disabled?
addiu a2 , s1 , $0690 # MSG_BEINGGRABBED
bnel s2 , zero , $__CONTINUE_2
addiu a2 , s1 , $0640 # MSG_BEINGKNIFED
-- CONTINUE_2
lw t0 , $0010(s3) # Victim's nickname
lw a3 , $0010(s0) # Cheater's nickname
ori a1 , zero , 100
jal $08C13480 # libc::snprintf( char *buff, int size, char *fmt, .. )
addiu a0 , sp , 20 # Text buffer
-- ALERT_USER
ori a2 , zero , 1 # Yellow
addiu a1 , sp , 20 # Text buffer
jal $09730700 # lpl::alertCheaterDetected( int cheaterPID, char* msg, int color )
lw a0 , $09CC(s0) # Cheater's PID
-- END
lw ra , 0(sp)
lw s0 , 4(sp)
lw s1 , 8(sp)
lw s2 , 12(sp)
lw s3 , 16(sp)
jr ra
addiu sp , sp , 128
}