Advertisement
NickG

Untitled

Nov 9th, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.42 KB | None | 0 0
  1. import struct
  2. import zlib
  3. from spock.mcp import mcdata
  4. from spock.mcp import datautils
  5.  
  6. extensions = tuple(tuple({} for i in j) for j in mcdata.packet_structs)
  7. def extension(ident):
  8.     def inner(cl):
  9.         extensions[ident[0]][ident[1]][ident[2]] = cl
  10.         return cl
  11.     return inner
  12.  
  13. #Login SERVER_TO_CLIENT 0x01 Encryption Request
  14. @extension((mcdata.LOGIN_STATE, mcdata.SERVER_TO_CLIENT, 0x01))
  15. class ExtensionLSTC01:
  16.     def decode_extra(packet, bbuff):
  17.         length = mcdata.unpack('short', bbuff)
  18.         packet.data['public_key'] = bbuff.recv(length)
  19.         length = mcdata.unpack('short', bbuff)
  20.         packet.data['verify_token'] = bbuff.recv(length)
  21.         return packet
  22.    
  23.     def encode_extra(packet):
  24.         o  = pack('short', len(packet.data['public_key']))
  25.         o += packet.data['public_key']
  26.         o += pack('short', len(packet.data['verify_token']))
  27.         o += packet.data['verify_token']
  28.         return o
  29.  
  30. #Play  SERVER_TO_CLIENT 0x0E Spawn Object
  31. @extension((mcdata.PLAY_STATE, mcdata.SERVER_TO_CLIENT, 0x0E))
  32. class ExtensionPSTC0E:
  33.     def decode_extra(packet, bbuff):
  34.         if packet.data['obj_data']:
  35.             packet['speed_x'] = mcdata.unpack('short', bbuff)
  36.             packet['speed_y'] = mcdata.unpack('short', bbuff)
  37.             packet['speed_z'] = mcdata.unpack('short', bbuff)
  38.         return packet
  39.  
  40.     def encode_extra(packet):
  41.         if packet.data['obj_data']:
  42.             o  = mcdata.pack('short', packet['speed_x'])
  43.             o += mcdata.pack('short', packet['speed_y'])
  44.             o += mcdata.pack('short', packet['speed_z'])
  45.         return o
  46.  
  47. #Play  SERVER_TO_CLIENT 0x13 Destroy Entities
  48. @extension((mcdata.PLAY_STATE, mcdata.SERVER_TO_CLIENT, 0x13))
  49. class ExtensionPSTC13:
  50.     def decode_extra(packet, bbuff):
  51.         count = mcdata.unpack('byte', bbuff)
  52.         packet['eids'] = [
  53.             mcdata.unpack('int', bbuff) for i in range(count)
  54.         ]
  55.         return packet
  56.  
  57.     def encode_extra(packet):
  58.         o = mcdata.pack('int', len(packet.data['eids']))
  59.         for eid in packet.data['eids']:
  60.             o += mcdata.pack('int', eid)
  61.  
  62. #Play  SERVER_TO_CLIENT 0x20 Entity Properties
  63. @extension((mcdata.PLAY_STATE, mcdata.SERVER_TO_CLIENT, 0x20))
  64. class ExtensionPSTC20:
  65.     def decode_extra(packet, bbuff):
  66.         packet.data['properties'] = []
  67.         for i in range(mcdata.unpack('int', bbuff)):
  68.             prop = {
  69.                 'key': mcdata.unpack('string', bbuff),
  70.                 'value': mcdata.unpack('double', bbuff),
  71.                 'modifiers': []
  72.             }
  73.             for j in range(mcdata.unpack('short', bbuff)):
  74.                 a, b = struct.unpack('>QQ', bbuff.recv(16))
  75.                 prop['modifiers'].append({
  76.                     'uuid': (a<<64)|b,
  77.                     'amount': mcdata.unpack('double', bbuff),
  78.                     'operation': mcdata.unpack('byte', bbuff),
  79.                 })
  80.             packet.data['properties'].append(prop)
  81.         return packet
  82.  
  83.     def encode_extra(packet):
  84.         o = mcdata.pack('int', len(packet.data['properties']))
  85.         for prop in packet.data['properties']:
  86.             o += mcdata.pack('string', prop['key'])
  87.             o += mcdata.pack('double', prop['value'])
  88.             o += mcdata.pack('short', len(prop['modifiers']))
  89.             for modifier in prop['modifiers']:
  90.                 o += struct.pack('>QQ',
  91.                     (modifier['uuid']>>64)&((1<<64)-1),
  92.                     modifier['uuid']&((1<<64)-1)
  93.                 )
  94.                 o += mcdata.pack('double', modifier['amount'])
  95.                 o += mcdata.pack('byte', modifier['operation'])
  96.         return o
  97.  
  98. #Play  SERVER_TO_CLIENT 0x21 Chunk Data
  99. @extension((mcdata.PLAY_STATE, mcdata.SERVER_TO_CLIENT, 0x21))
  100. class ExtensionPSTC21:
  101.     def decode_extra(packet, bbuff):
  102.         packet.data['byte_array'] = zlib.decompress(
  103.             bbuff.recv(mcdata.unpack('int', bbuff))
  104.         )
  105.         return packet
  106.  
  107.     def encode_extra(packet):
  108.         data = zlib.compress(packet.data['byte_array'])
  109.         o = mcdata.pack('int', len(data))
  110.         o += data
  111.         return o
  112.  
  113. #Play  SERVER_TO_CLIENT 0x22 Multi Block Change
  114. @extension((mcdata.PLAY_STATE, mcdata.SERVER_TO_CLIENT, 0x21))
  115. class ExtensionPSTC22:
  116.     def decode_extra(packet, bbuff):
  117.         count = mcdata.unpack('short', bbuff)
  118.         packet.data['blocks'] = []
  119.         assert(count == mcdata.unpack('int', bbuff))
  120.         for i in range(count):
  121.             data = unpack('uint', bbuff)
  122.             packet.data['blocks'].append({
  123.                 'metadata': (data    )&0xF,
  124.                 'type':     (data>> 4)&0xFFF,
  125.                 'y':        (data>>16)&0xFF,
  126.                 'z':        (data>>24)&0xF,
  127.                 'x':        (data>>28)&0xF,
  128.             })
  129.         return packet
  130.  
  131.     def encode_extra(packet):
  132.         o  = mcdata.pack('short', len(packet.data['blocks']))
  133.         o += mcdata.pack('int', 4*len(packet.data['blocks']))
  134.         for block in packet.data['blocks']:
  135.             o += mcdata.pack('uint',
  136.                 block['metadata']  +
  137.                 (block['type']<<4) +
  138.                 (block['y'] << 16) +
  139.                 (block['z'] << 24) +
  140.                 (block['x'] << 28)
  141.             )
  142.         return o
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement