src/clojurecraft/in.clj @ 6799868ce43d
Refactor ALL the things!!
author |
Steve Losh <steve@stevelosh.com> |
date |
Sun, 26 Jun 2011 18:47:29 -0400 |
parents |
fc293cb5f83e |
children |
b9f9991e6175 |
(ns clojurecraft.in
(:use [clojurecraft.mappings]))
; Reading Data ---------------------------------------------------------------------
(defn- -read-byte [conn]
(let [b (.readByte (:in @conn))]
b))
(defn- -read-bytearray [conn size]
(let [ba (byte-array size)]
(.read (:in @conn) ba 0 size)
ba))
(defn- -read-int [conn]
(let [i (.readInt (:in @conn))]
i))
(defn- -read-long [conn]
(let [i (.readLong (:in @conn))]
i))
(defn- -read-short [conn]
(let [i (.readShort (:in @conn))]
i))
(defn- -read-shortarray [conn size]
(repeatedly size (-read-short conn)))
(defn- -read-bool [conn]
(let [b (.readBoolean (:in @conn))]
b))
(defn- -read-double [conn]
(let [i (.readDouble (:in @conn))]
i))
(defn- -read-float [conn]
(let [i (.readFloat (:in @conn))]
i))
(defn- -read-string-utf8 [conn]
(let [s (.readUTF (:in @conn))]
s))
(defn- -read-string-ucs2 [conn]
(let [str-len (.readShort (:in @conn))
s (apply str (repeatedly str-len #(.readChar (:in @conn))))]
s))
(defn- -read-metadata [conn]
(loop [data []]
(let [x (-read-byte conn)]
(if (= x 127)
nil
(case (bit-shift-right x 5)
0 (recur (conj data (-read-byte conn)))
1 (recur (conj data (-read-short conn)))
2 (recur (conj data (-read-int conn)))
3 (recur (conj data (-read-float conn)))
4 (recur (conj data (-read-string-ucs2 conn)))
5 (recur (conj data [(-read-short conn)
(-read-byte conn)
(-read-short conn)]))
6 (recur (conj data [(-read-int conn)
(-read-int conn)
(-read-int conn)])))))))
; Reading Packets ------------------------------------------------------------------
(defn- read-packet-keepalive [bot]
{})
(defn- read-packet-handshake [bot]
(let [conn (:connection bot)
payload (assoc {}
:hash (-read-string-ucs2 conn))]
payload))
(defn- read-packet-login [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:unknown (-read-string-ucs2 conn)
:seed (-read-long conn)
:dimension (-read-byte conn))]
payload))
(defn- read-packet-chat [bot]
(let [conn (:connection bot)
payload (assoc {}
:message (-read-string-ucs2 conn))]
payload))
(defn- read-packet-timeupdate [bot]
(let [conn (:connection bot)
payload (assoc {}
:time (-read-long conn))]
payload))
(defn- read-packet-equipment [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:slot (-read-short conn)
:itemid (-read-short conn)
:unknown (-read-short conn))]
payload))
(defn- read-packet-spawnposition [bot]
(let [conn (:connection bot)
payload (assoc {}
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn))]
payload))
(defn- read-packet-useentity [bot]
(let [conn (:connection bot)
payload (assoc {}
:user (-read-int conn)
:target (-read-int conn)
:leftclick (-read-bool conn))]
payload))
(defn- read-packet-updatehealth [bot]
(let [conn (:connection bot)
payload (assoc {}
:health (-read-short conn))]
payload))
(defn- read-packet-respawn [bot]
(let [conn (:connection bot)
payload (assoc {}
:world (-read-byte conn))]
payload))
(defn- read-packet-playerpositionlook [bot]
(let [conn (:connection bot)
payload (assoc {}
:x (-read-double conn)
:stance (-read-double conn)
:y (-read-double conn)
:z (-read-double conn)
:yaw (-read-float conn)
:pitch (-read-float conn)
:onground (-read-bool conn))]
(dosync (alter (:player bot) merge {:location payload}))
payload))
(defn- read-packet-playerdigging [bot]
(let [conn (:connection bot)
payload (assoc {}
:status (-read-byte conn)
:x (-read-int conn)
:y (-read-byte conn)
:z (-read-int conn)
:face (-read-byte conn))]
payload))
(defn- read-packet-playerblockplacement [bot]
(let [conn (:connection bot)
payload (assoc {}
:x (-read-int conn)
:y (-read-byte conn)
:z (-read-int conn)
:direction (-read-byte conn)
:id (-read-short conn)
:amount (-read-byte conn)
:damage (-read-short conn))]
payload))
(defn- read-packet-holdingchange [bot]
(let [conn (:connection bot)
payload (assoc {}
:slot (-read-short conn))]
payload))
(defn- read-packet-usebed [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:inbed (-read-byte conn)
:x (-read-int conn)
:y (-read-byte conn)
:z (-read-int conn))]
payload))
(defn- read-packet-animate [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:animate (-read-byte conn))]
payload))
(defn- read-packet-entityaction [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:action (-read-byte conn))]
payload))
(defn- read-packet-namedentityspawn [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:playername (-read-string-ucs2 conn)
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn)
:rotation (-read-byte conn)
:pitch (-read-byte conn)
:currentitem (-read-short conn))]
payload))
(defn- read-packet-pickupspawn [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:item (-read-short conn)
:count (-read-byte conn)
:damagedata (-read-short conn)
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn)
:rotation (-read-byte conn)
:pitch (-read-byte conn)
:roll (-read-byte conn))]
payload))
(defn- read-packet-collectitem [bot]
(let [conn (:connection bot)
payload (assoc {}
:collectedeid (-read-int conn)
:collectoreid (-read-int conn))]
payload))
(defn- read-packet-addobjectvehicle [bot]
(let [conn (:connection bot)
payload (let [basepacket (assoc {}
:eid (-read-int conn)
:type (-read-byte conn)
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn)
:moar (-read-int conn))]
(if (< 0 (:moar basepacket))
basepacket
(assoc basepacket
:unknownx (-read-int conn)
:unknowny (-read-int conn)
:unknownz (-read-int conn))))]
payload))
(defn- read-packet-mobspawn [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:type (-read-byte conn)
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn)
:yaw (-read-byte conn)
:pitch (-read-byte conn)
:datastream (-read-metadata conn))]
payload))
(defn- read-packet-entitypainting [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:type (-read-string-ucs2 conn)
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn)
:direction (-read-int conn))]
payload))
(defn- read-packet-stanceupdate [bot]
(let [conn (:connection bot)
payload (assoc {}
:unknown1 (-read-float conn)
:unknown2 (-read-float conn)
:unknown3 (-read-bool conn)
:unknown4 (-read-bool conn)
:unknown5 (-read-float conn)
:unknown6 (-read-float conn))]
payload))
(defn- read-packet-entityvelocity [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:velocityx (-read-short conn)
:velocityy (-read-short conn)
:velocityz (-read-short conn))]
payload))
(defn- read-packet-entitydestroy [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn))]
payload))
(defn- read-packet-entity [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn))]
payload))
(defn- read-packet-entityrelativemove [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:dx (-read-byte conn)
:dy (-read-byte conn)
:dz (-read-byte conn))]
payload))
(defn- read-packet-entitylook [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:yaw (-read-byte conn)
:pitch (-read-byte conn))]
payload))
(defn- read-packet-entitylookandrelativemove [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:dx (-read-byte conn)
:dy (-read-byte conn)
:dz (-read-byte conn)
:yaw (-read-byte conn)
:pitch (-read-byte conn))]
payload))
(defn- read-packet-entityteleport [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn)
:yaw (-read-byte conn)
:pitch (-read-byte conn))]
payload))
(defn- read-packet-entitystatus [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:entitystatus (-read-byte conn))]
payload))
(defn- read-packet-attachentity [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:vehicleid (-read-int conn))]
payload))
(defn- read-packet-entitymetadata [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:metadata (-read-metadata conn))]
payload))
(defn- read-packet-prechunk [bot]
(let [conn (:connection bot)
payload (assoc {}
:x (-read-int conn)
:z (-read-int conn)
:mode (-read-bool conn))]
payload))
(defn- read-packet-mapchunk [bot]
(let [conn (:connection bot)
payload (let [predata (assoc {}
:x (-read-int conn)
:y (-read-short conn)
:z (-read-int conn)
:sizex (-read-byte conn)
:sizey (-read-byte conn)
:sizez (-read-byte conn)
:compressedsize (-read-int conn))]
(assoc predata
:compresseddata
(-read-bytearray conn
(:compressedsize predata))))]
payload))
(defn- read-packet-multiblockchange [bot]
(let [conn (:connection bot)
payload (assoc {}
:chunkx (-read-int conn)
:chunkz (-read-int conn)
:arraysize (-read-short conn)
:coordinatearray (-read-shortarray conn arraysize)
:typearray (-read-bytearray conn arraysize)
:metadataarray (-read-bytearray conn arraysize))]
payload))
(defn- read-packet-blockchange [bot]
(let [conn (:connection bot)
payload (assoc {}
:x (-read-int conn)
:y (-read-byte conn)
:z (-read-int conn)
:blocktype (-read-byte conn)
:blockmetadata (-read-byte conn))]
payload))
(defn- read-packet-playnoteblock [bot]
(let [conn (:connection bot)
payload (assoc {}
:x (-read-int conn)
:y (-read-short conn)
:z (-read-int conn)
:instrumenttype (-read-byte conn)
:pitch (-read-byte conn))]
payload))
(defn- read-packet-explosion [bot]
(let [conn (:connection bot)
payload (let [prerecords (assoc {}
:x (-read-int conn)
:y (-read-short conn)
:z (-read-int conn)
:unknownradius (-read-byte conn)
:recordcount (-read-byte conn))]
(assoc prerecords
:records (-read-bytearray conn
(* 3 (:recordcount prerecords)))))]
payload))
(defn- read-packet-soundeffect [bot]
(let [conn (:connection bot)
payload (assoc {}
:effectid (-read-int conn)
:x (-read-int conn)
:y (-read-byte conn)
:z (-read-int conn)
:sounddata (-read-int conn))]
payload))
(defn- read-packet-newinvalidstate [bot]
(let [conn (:connection bot)
payload (assoc {}
:reason (-read-byte conn))]
payload))
(defn- read-packet-thunderbolt [bot]
(let [conn (:connection bot)
payload (assoc {}
:eid (-read-int conn)
:unknown (-read-bool conn)
:x (-read-int conn)
:y (-read-int conn)
:z (-read-int conn))]
payload))
(defn- read-packet-openwindow [bot]
(let [conn (:connection bot)
payload (assoc {}
:windowid (-read-byte conn)
:inventorytype (-read-byte conn)
:windowtitle (-read-string-utf8 conn)
:numberofslots (-read-byte conn))]
payload))
(defn- read-packet-closewindow [bot]
(let [conn (:connection bot)
payload (assoc {}
:windowid (-read-byte conn))]
payload))
(defn- read-packet-setslot [bot]
(let [conn (:connection bot)
payload (assoc {}
:windowid (-read-byte conn)
:slot (-read-short conn)
:itemid (-read-short conn)
:itemcount (-read-byte conn)
:itemuses (-read-short conn))]
payload))
(defn- read-packet-windowitems [bot]
(let [conn (:connection bot)
payload (letfn [(-read-payload-item []
(let [payload (assoc {} :itemid (-read-short conn))]
(if (= (:itemid payload) -1)
payload
(assoc payload
:count (-read-byte conn)
:uses (-read-short conn)))))]
(let [prepay (assoc {}
:windowid (-read-byte conn)
:count (-read-short conn))
pay (repeatedly (:count prepay) -read-payload-item)]
(assoc prepay :payload pay)))]
payload))
(defn- read-packet-updateprogressbar [bot]
(let [conn (:connection bot)
payload (assoc {}
:windowid (-read-byte conn)
:progressbar (-read-short conn)
:value (-read-short conn))]
payload))
(defn- read-packet-transaction [bot]
(let [conn (:connection bot)
payload (assoc {}
:windowid (-read-byte conn)
:actionnumber (-read-short conn)
:accepted (-read-short conn))]
payload))
(defn- read-packet-updatesign [bot]
(let [conn (:connection bot)
payload (assoc {}
:x (-read-int conn)
:y (-read-short conn)
:z (-read-int conn)
:text1 (-read-string-ucs2 conn)
:text2 (-read-string-ucs2 conn)
:text3 (-read-string-ucs2 conn)
:text4 (-read-string-ucs2 conn))]
payload))
(defn- read-packet-mapdata [bot]
(let [conn (:connection bot)
payload (let [pretext (assoc {}
:unknown1 (-read-int conn)
:unknown2 (-read-short conn)
:textlength (-read-int conn))]
(assoc pretext :text (-read-bytearray (:textlength pretext))))]
payload))
(defn- read-packet-incrementstatistic [bot]
(let [conn (:connection bot)
payload (assoc {}
:statisticid (-read-int conn)
:amount (-read-byte conn))]
payload))
(defn- read-packet-disconnectkick [bot]
(let [conn (:connection bot)
payload (assoc {}
:reason (-read-string-ucs2 conn))]
payload))
; Reading Wrappers -----------------------------------------------------------------
(defn read-packet [bot]
(let [conn (:connection bot)
packet-id (int (-read-byte conn))
packet-type (packet-types packet-id)]
(if (= nil packet-type)
(do
(println (str "UNKNOWN PACKET TYPE: " (Integer/toHexString packet-id)))
(/ 1 0))
(do
(identity (str "\n--PACKET--> " packet-type))
(identity
(case packet-type
:keepalive (read-packet-keepalive bot)
:handshake (read-packet-handshake bot)
:login (read-packet-login bot)
:chat (read-packet-chat bot)
:timeupdate (read-packet-timeupdate bot)
:equipment (read-packet-equipment bot)
:spawnposition (read-packet-spawnposition bot)
:useentity (read-packet-useentity bot)
:updatehealth (read-packet-updatehealth bot)
:respawn (read-packet-respawn bot)
:playerpositionlook (read-packet-playerpositionlook bot)
:playerdigging (read-packet-playerdigging bot)
:playerblockplacement (read-packet-playerblockplacement bot)
:holdingchange (read-packet-holdingchange bot)
:usebed (read-packet-usebed bot)
:animate (read-packet-animate bot)
:entityaction (read-packet-entityaction bot)
:namedentityspawn (read-packet-namedentityspawn bot)
:pickupspawn (read-packet-pickupspawn bot)
:collectitem (read-packet-collectitem bot)
:addobjectvehicle (read-packet-addobjectvehicle bot)
:mobspawn (read-packet-mobspawn bot)
:entitypainting (read-packet-entitypainting bot)
:stanceupdate (read-packet-stanceupdate bot)
:entityvelocity (read-packet-entityvelocity bot)
:entitydestroy (read-packet-entitydestroy bot)
:entity (read-packet-entity bot)
:entityrelativemove (read-packet-entityrelativemove bot)
:entitylook (read-packet-entitylook bot)
:entitylookandrelativemove (read-packet-entitylookandrelativemove bot)
:entityteleport (read-packet-entityteleport bot)
:entitystatus (read-packet-entitystatus bot)
:attachentity (read-packet-attachentity bot)
:entitymetadata (read-packet-entitymetadata bot)
:prechunk (read-packet-prechunk bot)
:mapchunk (read-packet-mapchunk bot)
:multiblockchange (read-packet-multiblockchange bot)
:blockchange (read-packet-blockchange bot)
:playnoteblock (read-packet-playnoteblock bot)
:explosion (read-packet-explosion bot)
:soundeffect (read-packet-soundeffect bot)
:newinvalidstate (read-packet-newinvalidstate bot)
:thunderbolt (read-packet-thunderbolt bot)
:openwindow (read-packet-openwindow bot)
:closewindow (read-packet-closewindow bot)
:setslot (read-packet-setslot bot)
:windowitems (read-packet-windowitems bot)
:updateprogressbar (read-packet-updateprogressbar bot)
:transaction (read-packet-transaction bot)
:updatesign (read-packet-updatesign bot)
:mapdata (read-packet-mapdata bot)
:incrementstatistic (read-packet-incrementstatistic bot)
:disconnectkick (read-packet-disconnectkick bot)))))
(identity "\n\n\n")))