Ayuto

binutils type reconstructing

Dec 22nd, 2013
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.49 KB | None | 0 0
  1. # CCSPlayer.ini
  2. '''
  3. [functions]
  4.    [[PlayerRunCommand]]
  5.    binary        = cstrike/bin/server
  6.    identifier_nt = 55 8B EC 83 EC 58 56 89 4D A8
  7.    identifier    = _ZN9CCSPlayer16PlayerRunCommandEP8CUserCmdP11IMoveHelper
  8.    parameters    = ppp)v
  9. '''
  10.  
  11. # CUserCmd.ini
  12. '''
  13. type_size = 68
  14.  
  15. [attributes]
  16.    [[vtable]]
  17.    identifier = 0
  18.    converter  = ptr
  19.  
  20.    [[command_number]]
  21.    identifier = 4
  22.    converter  = int
  23.  
  24.    [[tick_count]]
  25.    identifier = 8
  26.    converter  = int
  27.  
  28.    [[viewangles]]
  29.    identifier = 12
  30.    converter  = QAngle
  31.    aligned    = True
  32.  
  33.    [[forwardmove]]
  34.    identifier = 24
  35.    converter  = float
  36.  
  37.    [[sidemove]]
  38.    identifier = 28
  39.    converter  = float
  40.  
  41.    [[upmove]]
  42.    identifier = 32
  43.    converter  = float
  44.  
  45.    [[buttons]]
  46.    identifier = 36
  47.    converter  = int
  48.  
  49.    [[impulse]]
  50.    identifier = 40
  51.    converter  = uchar
  52.  
  53.    [[weaponselect]]
  54.    identifier = 44
  55.    converter  = int
  56.  
  57.    [[weaponsubtype]]
  58.    identifier = 48
  59.    converter  = int
  60.  
  61.    [[random_seed]]
  62.    identifier = 52
  63.    converter  = int
  64.  
  65.    [[mousedx]]
  66.    identifier = 56
  67.    converter  = short
  68.  
  69.    [[mousedy]]
  70.    identifier = 60
  71.    converter  = short
  72.  
  73.    [[hasbeenpredicted]]
  74.    identifier = 64
  75.    converter  = bool
  76. '''
  77.  
  78. # =============================================================================
  79. # >> IMPORTS
  80. # =============================================================================
  81. # Python
  82. from path import path
  83.  
  84. # EventScripts
  85. import es
  86.  
  87. # binutils
  88. import binutils
  89.  
  90.  
  91. # =============================================================================
  92. # >> CONSTANTS
  93. # =============================================================================
  94. ADDON_PATH = path(__file__).parent
  95.  
  96.  
  97. # =============================================================================
  98. # >> GLOBAL VARIABLES
  99. # =============================================================================
  100. # Create a new TypeManager object
  101. manager = binutils.TypeManager()
  102.  
  103. # Create type CCSPlayer from a file
  104. CCSPlayer = manager.create_type_from_file(
  105.     'CCSPlayer', ADDON_PATH.joinpath('CCSPlayer.ini')
  106. )
  107.  
  108. # Create type CUserCmd from a file
  109. CUserCmd = manager.create_type_from_file(
  110.     'CUserCmd', ADDON_PATH.joinpath('CUserCmd.ini')
  111. )
  112.  
  113. # Create type QAngle
  114. QAngle = manager.create_type(
  115.     'QAngle',
  116.     {
  117.         'x': manager.attribute('float', 0),
  118.         'y': manager.attribute('float', 4),
  119.         'z': manager.attribute('float', 8)
  120.     },
  121.     12
  122. )
  123.  
  124.  
  125. # =============================================================================
  126. # >> LOAD & UNLOAD
  127. # =============================================================================
  128. def load():
  129.     CCSPlayer.PlayerRunCommand.add_pre_hook(PrePlayerRunCommand)
  130.  
  131. def unload():
  132.     CCSPlayer.PlayerRunCommand.remove_pre_hook(PrePlayerRunCommand)
  133.  
  134.  
  135. # =============================================================================
  136. # >> CALLBACKS
  137. # =============================================================================
  138. def PrePlayerRunCommand(args):
  139.     # Wrap the CUserCmd pointer
  140.     ucmd = CUserCmd(args[1])
  141.  
  142.     # Print selected weapon
  143.     if ucmd.weaponselect:
  144.         classname = es.entitygetvalue(ucmd.weaponselect, 'classname')
  145.         es.msg('Weapon selected: %s'% classname)
  146.  
  147.     # Print fired impulse
  148.     if ucmd.impulse:
  149.         es.msg('Impulse fired: %s'% ucmd.impulse)
  150.  
  151.     # Block back move
  152.     if ucmd.forwardmove < 0:
  153.         ucmd.forwardmove = 0
Advertisement
Add Comment
Please, Sign In to add comment