Guest User

Untitled

a guest
Jul 16th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.93 KB | None | 0 0
  1. module Minecraft
  2. ( ClientToServerPacket
  3. , ServerToClientPacket
  4. , MCInventoryItem
  5. , MCInventory
  6. ) where
  7.  
  8. import Data.Int
  9. import Data.Binary.IEEE754
  10. import Data.Binary
  11. import Control.Monad
  12.  
  13. {- Client to Server packets -}
  14.  
  15. data ClientToServerPacket
  16. = CTSKeepAlive
  17. | CTSLoginRequest Int32 String String Int64 Int8
  18. | CTSHandshake String
  19. | CTSChatMessage String
  20. | CTSPlayerInventory MCInventory
  21. | CTSUseEntity Int32 Int32 Bool
  22. | CTSRespawn
  23. | CTSPlayerState Bool
  24. | CTSPlayerPosition Double Double Double Double Bool
  25. | CTSPlayerLook Float Float Bool
  26. | CTSPlayerPositionAndLook Double Double Double Double Float Float Bool
  27. | CTSPlayerDigging Int8 Int32 Int8 Int32 Int8
  28. | CTSPlayerBlockPlacement Int16 Int32 Int8 Int32 Int8
  29. | CTSHoldingChange Int32 Int16
  30. | CTSArmAnimation Int32 Int8
  31. | CTSPickupSpawn Int32 Int16 Int8 Int32 Int32 Int32 Int8 Int8 Int8
  32. | CTSDisconnect String
  33. deriving Show
  34.  
  35. instance Binary ClientToServerPacket where
  36. put pkt = case pkt of
  37. CTSKeepAlive -> putInt8 0x00
  38. CTSLoginRequest a b c d e -> putInt8 0x01 >> put a >> putMCStr b >> putMCStr c >> put d >> put e
  39. CTSHandshake a -> putInt8 0x02 >> put a
  40. CTSChatMessage a -> putInt8 0x03 >> put a
  41. CTSPlayerInventory a -> put a
  42. CTSUseEntity a b c -> put a >> put b >> put c
  43. CTSRespawn -> putInt8 0x09
  44. CTSPlayerState a -> putInt8 0x0A >> put a
  45. CTSPlayerPosition a b c d e -> putInt8 0x0B >> putFloat64be a >> putFloat64be b >> putFloat64be c >> putFloat64be d >> put e
  46. CTSPlayerLook a b c -> putInt8 0x0C >> putFloat32be a >> putFloat32be b >> put c
  47. CTSPlayerPositionAndLook a b c d e f g -> putInt8 0x0D >> putFloat64be a >> putFloat64be b >> putFloat64be c >> putFloat64be d >> putFloat32be e >> putFloat32be f >> put g
  48. CTSPlayerDigging a b c d e -> putInt8 0x0E >> put a >> put b >> put c >> put d >> put e
  49. CTSPlayerBlockPlacement a b c d e -> putInt8 0x0F >> put a >> put b >> put c >> put d >> put e
  50. CTSHoldingChange a b -> putInt8 0x10 >> put a >> put b
  51. CTSArmAnimation a b -> putInt8 0x12 >> put a >> put b
  52. CTSPickupSpawn a b c d e f g h i -> putInt8 0x15 >> put a >> put b >> put c >> put d >> put e >> put f >> put g >> put h >> put i
  53. CTSDisconnect a -> putInt8 0xFF >> put a
  54. get = do
  55. tag <- getInt8
  56. case tag of
  57. 0x00 -> return CTSKeepAlive
  58. 0x01 -> liftM5 CTSLoginRequest get getMCStr getMCStr get get
  59. 0x02 -> liftM CTSHandshake getMCStr
  60. 0x03 -> liftM CTSChatMessage getMCStr
  61. 0x05 -> liftM CTSPlayerInventory get
  62. 0x07 -> liftM3 CTSUseEntity get get get
  63. 0x09 -> return CTSRespawn
  64. 0x0A -> liftM CTSPlayerState get
  65. 0x0B -> liftM5 CTSPlayerPosition getFloat64be getFloat64be getFloat64be getFloat64be get
  66. 0x0C -> liftM3 CTSPlayerLook getFloat32be getFloat32be get
  67. 0x0D -> liftM7 CTSPlayerPositionAndLook getFloat64be getFloat64be getFloat64be getFloat64be getFloat32be getFloat32be get
  68. 0x0E -> liftM5 CTSPlayerDigging get get get get get
  69. 0x0F -> liftM5 CTSPlayerBlockPlacement get get get get get
  70. 0x10 -> liftM2 CTSHoldingChange get get
  71. 0x12 -> liftM2 CTSArmAnimation get get
  72. 0x15 -> liftM9 CTSPickupSpawn get get get get get get get get get
  73. 0xFF -> liftM CTSDisconnect getMCStr
  74. otherwise -> error $ "Invalid packet tag: " ++ show tag
  75.  
  76. {- Server to Client packets -}
  77.  
  78. data ServerToClientPacket
  79. = STCKeepAlive
  80. | STCLoginResponse Int32 String String Int64 Int8
  81. | STCHandshake String
  82. | STCChatMessage String
  83. | STCTimeUpdate Int64
  84. | STCPlayerInventory MCInventory
  85. | STCSpawnPosition Int32 Int32 Int32
  86. deriving Show
  87.  
  88. instance Binary ServerToClientPacket where
  89. put pkt = case pkt of
  90. STCKeepAlive -> putInt8 0x00
  91. STCLoginResponse a b c d e -> putInt8 0x01 >> put a >> putMCStr b >> putMCStr c >> put d >> put e
  92. STCHandshake a -> putInt8 0x02 >> put a
  93. STCChatMessage a -> putInt8 0x03 >> put a
  94. STCTimeUpdate a -> putInt8 0x04 >> put a
  95. STCPlayerInventory a -> put a
  96. STCSpawnPosition a b c -> put a >> put b >> put c
  97. get = do
  98. tag <- getInt8
  99. case tag of
  100. 0x00 -> return STCKeepAlive
  101. 0x01 -> liftM5 STCLoginResponse get getMCStr getMCStr get get
  102. 0x02 -> liftM STCHandshake getMCStr
  103. 0x03 -> liftM STCChatMessage getMCStr
  104. 0x04 -> liftM STCTimeUpdate get
  105. 0x05 -> liftM STCPlayerInventory get
  106. 0x06 -> liftM3 STCSpawnPosition get get get
  107. otherwise -> error $ "Invalid packet tag: " ++ show tag
  108.  
  109. {- Data Types -}
  110.  
  111. type MCInventoryItem = (Int16, Int8, Int16)
  112. data MCInventory = MCInventory Int32 Int16 [MCInventoryItem] deriving Show
  113.  
  114. instance Binary MCInventory where
  115. put (MCInventory sec cnt inv) = do
  116. put sec
  117. put cnt
  118. forM_ inv $ \itm@(iid, cnt, hlh) -> case iid of
  119. -1 -> put (-1 :: Int16)
  120. otherwise -> put itm
  121. get = do
  122. t <- get
  123. c <- get
  124. items <- replicateM (fromIntegral c) $ do
  125. iid <- get :: Get Int16
  126. case iid of
  127. -1 -> return (-1, 0, 0)
  128. otherwise -> do
  129. cnt <- get
  130. hlh <- get
  131. return (iid, cnt, hlh)
  132. return (MCInventory t c items)
  133.  
  134.  
  135. {- Utility stuff -}
  136.  
  137. putInt8 :: Int -> Put
  138. putInt8 i = put (fromIntegral i :: Int8)
  139.  
  140. getInt8 :: Get Int8
  141. getInt8 = get :: Get Int8
  142.  
  143. putMCStr :: String -> Put
  144. putMCStr s = do
  145. put (fromIntegral (length s) :: Int16)
  146. mapM_ put s
  147.  
  148. getMCStr :: Get String
  149. getMCStr = do
  150. len <- get :: Get Int16
  151. replicateM (fromIntegral len :: Int) (get :: Get Char)
  152.  
  153. liftM6 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m a6 -> m r
  154. liftM6 f m1 m2 m3 m4 m5 m6 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; x6 <- m6; return (f x1 x2 x3 x4 x5 x6) }
  155.  
  156. liftM7 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m a6 -> m a7 -> m r
  157. liftM7 f m1 m2 m3 m4 m5 m6 m7 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; x6 <- m6; x7 <- m7; return (f x1 x2 x3 x4 x5 x6 x7) }
  158.  
  159. liftM8 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m a6 -> m a7 -> m a8 -> m r
  160. liftM8 f m1 m2 m3 m4 m5 m6 m7 m8 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; x6 <- m6; x7 <- m7; x8 <- m8; return (f x1 x2 x3 x4 x5 x6 x7 x8) }
  161.  
  162. liftM9 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m a6 -> m a7 -> m a8 -> m a9 -> m r
  163. liftM9 f m1 m2 m3 m4 m5 m6 m7 m8 m9 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; x6 <- m6; x7 <- m7; x8 <- m8; x9 <- m9; return (f x1 x2 x3 x4 x5 x6 x7 x8 x9) }
Add Comment
Please, Sign In to add comment