11a29fd36b15

Refactor into a few files.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Fri, 24 Jun 2011 19:24:44 -0400
parents 14a4d006ee84
children 4d24dfe2cab1
branches/tags (none)
files src/clojurecraft/core.clj src/clojurecraft/in.clj src/clojurecraft/mappings.clj src/clojurecraft/out.clj

Changes

--- a/src/clojurecraft/core.clj	Fri Jun 24 19:10:34 2011 -0400
+++ b/src/clojurecraft/core.clj	Fri Jun 24 19:24:44 2011 -0400
@@ -1,71 +1,12 @@
 (ns clojurecraft.core
+  (:use [clojurecraft.mappings])
+  (:use [clojurecraft.in])
+  (:use [clojurecraft.out])
   (:import (java.net Socket)
            (java.io DataOutputStream DataInputStream)))
 
 (def minecraft-local {:name "localhost" :port 25565})
 
-; Packet Type Maps -----------------------------------------------------------------
-(def packet-types {
-  0x00 :keepalive
-  0x01 :login
-  0x02 :handshake
-  0x03 :chat
-  0x04 :timeupdate
-  0x05 :equipment
-  0x06 :spawnposition
-  0x07 :useentity
-  0x08 :updatehealth
-  0x09 :respawn
-  0x0A :player
-  0x0B :playerposition
-  0x0C :playerlook
-  0x0D :playerpositionlook
-  0x0E :playerdigging
-  0x0F :playerblockplacement
-  0x10 :holdingchange
-  0x11 :usebed
-  0x12 :animation
-  0x13 :entityaction
-  0x14 :namedentityspawn
-  0x15 :pickupspawn
-  0x16 :collectitem
-  0x17 :addobjectvehicle
-  0x18 :mobspawn
-  0x19 :entitypainting
-  0x1B :stanceupdate
-  0x1C :entityvelocity
-  0x1D :entitydestroy
-  0x1E :entity
-  0x1F :entityrelativemove
-  0x20 :entitylook
-  0x21 :entitylookandrelativemove
-  0x22 :entityteleport
-  0x26 :entitystatus
-  0x27 :attachentity
-  0x28 :entitymetadata
-  0x32 :prechunk
-  0x33 :mapchunk
-  0x34 :multiblockchange
-  0x35 :blockchange
-  0x36 :playnoteblock
-  0x3C :explosion
-  0x3D :soundeffect
-  0x46 :newinvalidstate
-  0x47 :thunderbolt
-  0x64 :openwindow
-  0x65 :closewindow
-  0x66 :windowclick
-  0x67 :setslot
-  0x68 :windowitems
-  0x69 :updateprogressbar
-  0x6A :transaction
-  0x82 :updatesign
-  0x83 :mapdata
-  0xC8 :incrementstatistic
-  0xFF :disconnectkick
-})
-(def packet-ids (apply assoc {} (mapcat reverse packet-types)))
-
 (declare conn-handler)
 
 ; Connection Wrappers --------------------------------------------------------------
@@ -81,887 +22,29 @@
   (dosync (alter conn merge {:exit true})))
 
 
-; Writing Data ---------------------------------------------------------------------
-(defn -write-byte [conn i]
-  (println (str "-> PACKET ID: " (Integer/toHexString i)))
-  (doto (:out @conn)
-    (.writeByte (int i))))
-
-(defn -write-bytearray [conn ba]
-  ; TODO: Implement this.
-  nil)
-
-(defn -write-short [conn i]
-  (println (str "-> SHORT: " i))
-  (doto (:out @conn)
-    (.writeShort (int i))))
-
-(defn -write-shortarray [conn sa]
-  ; TODO: Implement this.
-  nil)
-
-(defn -write-int [conn i]
-  (println (str "-> INT: " i))
-  (doto (:out @conn)
-    (.writeInt (int i))))
-
-(defn -write-long [conn i]
-  (println (str "-> LONG: " i))
-  (doto (:out @conn)
-    (.writeLong (int i))))
-
-(defn -write-double [conn i]
-  (println (str "-> DOUBLE: " i))
-  (doto (:out @conn)
-    (.writeDouble (int i))))
-
-(defn -write-float [conn i]
-  (println (str "-> FLOAT: " i))
-  (doto (:out @conn)
-    (.writeFloat (int i))))
-
-(defn -write-string8 [conn s]
-  ; TODO: Implement this.
-  nil)
-
-(defn -write-string16 [conn s]
-  (-write-short conn (count s))
-  (println (str "-> STRING: " s))
-  (doto (:out @conn)
-    (.writeChars s)))
-
-(defn -write-bool [conn b]
-  (println (str "-> BOOL: " b))
-  (doto (:out @conn)
-    (.writeBoolean b)))
-
-(defn -write-metadata [conn m]
-  ; TODO: Implement this.
-  nil)
-
-
-; Writing Packets ------------------------------------------------------------------
-(defn write-packet-keepalive [conn _]
-  (-write-byte conn (:handshake packet-ids)))
-
-(defn write-packet-handshake [conn {username :username}]
-  (-write-byte conn (:handshake packet-ids))
-
-  (-write-string16 conn username))
-
-(defn write-packet-login [conn {version :version, username :username}]
-  (-write-byte conn (:login packet-ids))
-
-  (-write-int conn version)
-  (-write-string16 conn username)
-  (-write-long conn 0)
-  (-write-byte conn 0))
-
-(defn write-packet-chat [conn {message :message}]
-  (-write-byte conn (:chat packet-ids))
-
-  (-write-string16 conn message))
-
-(defn write-packet-respawn [conn {world :world}]
-  (-write-byte conn (:respawn packet-ids))
-
-  (-write-bool conn world))
-
-(defn write-packet-player [conn {onground :onground}]
-  (-write-byte conn (:player packet-ids))
-
-  (-write-bool conn onground))
-
-(defn write-packet-playerposition [conn {x :x y :y stance :stance z :z onground :onground}]
-  (-write-byte conn (:playerposition packet-ids))
-
-  (-write-double conn x)
-  (-write-double conn y)
-  (-write-double conn stance)
-  (-write-double conn z)
-  (-write-bool conn onground))
-
-(defn write-packet-playerlook [conn {yaw :yaw pitch :pitch onground :onground}]
-  (-write-byte conn (:playerlook packet-ids))
-
-  (-write-float conn yaw)
-  (-write-float conn pitch)
-  (-write-bool conn onground))
-
-(defn write-packet-playerpositionlook [conn {x :x y :y stance :stance z :z yaw :yaw pitch :pitch onground :onground}]
-  (-write-byte conn (:playerpositionlook packet-ids))
-
-  (-write-double conn x)
-  (-write-double conn y)
-  (-write-double conn stance)
-  (-write-double conn z)
-  (-write-float conn yaw)
-  (-write-float conn pitch)
-  (-write-bool conn onground))
-
-(defn write-packet-playerdigging [conn {status :status x :x y :y z :z face :face}]
-  (-write-byte conn (:playerdigging packet-ids))
-
-  (-write-byte conn status)
-  (-write-int conn x)
-  (-write-byte conn y)
-  (-write-int conn z)
-  (-write-byte conn face))
-
-(defn write-packet-playerblockplacement [conn {x :x y :y z :z direction :direction id :id amount :amount damage :damage}]
-  (-write-byte conn (:playerblockplacement packet-ids))
-
-  (-write-int conn x)
-  (-write-byte conn y)
-  (-write-int conn z)
-  (-write-byte conn direction)
-  (-write-short conn id)
-  (-write-byte conn amount)
-  (-write-short conn damage))
-
-(defn write-packet-holdingchange [conn {slot :slot}]
-  (-write-byte conn (:holdingchange packet-ids))
-
-  (-write-short conn slot))
-
-(defn write-packet-usebed [conn {eid :eid inbed :inbed x :x y :y z :z}]
-  (-write-byte conn (:usebed packet-ids))
-
-  (-write-int conn eid)
-  (-write-byte conn inbed)
-  (-write-int conn x)
-  (-write-byte conn y)
-  (-write-int conn z))
-
-(defn write-packet-animation [conn {eid :eid animate :animate}]
-  (-write-byte conn (:animation packet-ids))
-
-  (-write-int conn eid)
-  (-write-byte conn animate))
-
-(defn write-packet-entityaction [conn {eid :eid action :action}]
-  (-write-byte conn (:entityaction packet-ids))
-
-  (-write-int conn eid)
-  (-write-byte conn action))
-
-(defn write-packet-pickupspawn [conn {eid :eid item :item count :count damagedata :damagedata x :x y :y z :z rotation :rotation pitch :pitch roll :roll}]
-  (-write-byte conn (:pickupspawn packet-ids))
-
-  (-write-int conn eid)
-  (-write-short conn item)
-  (-write-byte conn count)
-  (-write-short conn damagedata)
-  (-write-int conn x)
-  (-write-int conn y)
-  (-write-int conn x)
-  (-write-byte conn rotation)
-  (-write-byte int conn pitch)
-  (-write-byte int conn roll))
-
-(defn write-packet-entitypainting [conn {eid :eid title :title x :x y :y z :z direction :direction}]
-  (-write-byte conn (:entitypainting packet-ids))
-
-  (-write-int conn eid)
-  (-write-string16 conn title)
-  (-write-int conn x)
-  (-write-int conn y)
-  (-write-int conn x)
-  (-write-int conn direction))
-
-(defn write-packet-stanceupdate [conn {unknown1 :unknown1 unknown2 :unknown2 unknown3 :unknown3 unknown4 :unknown4 unknown5 :unknown5 unknown6 :unknown6 }]
-  (-write-byte conn (:stanceupdate packet-ids))
-
-  (-write-float conn unknown1)
-  (-write-float conn unknown2)
-  (-write-bool conn unknown3)
-  (-write-bool conn unknown4)
-  (-write-float conn unknown5)
-  (-write-float conn unknown6))
-
-(defn write-packet-entityvelocity [conn {eid :eid velocityx :velocityx velocityy :velocityy velocityz :velocityz}]
-  (-write-byte conn (:entityvelocity packet-ids))
-
-  (-write-int conn eid)
-  (-write-short conn velocityx)
-  (-write-short conn velocityy)
-  (-write-short conn velocityz))
-
-(defn write-packet-attachentity [conn {eid :eid vehicleid :vehicleid}]
-  (-write-byte conn (:attachentity packet-ids))
-
-  (-write-int conn eid)
-  (-write-int conn vehicleid))
-
-(defn write-packet-entitymetadata [conn {eid :eid metadata :metadata}]
-  (-write-byte conn (:attachentity packet-ids))
-
-  (-write-int conn eid)
-  (-write-metadata conn metadata))
-
-(defn write-packet-multiblockchange [conn {chunkx :chunkx chunkz :chunkz arraysize :arraysize coordinatearray :coordinatearray typearray :typearray metadataarray :metadataarray}]
-  (-write-byte conn (:multiblockchange packet-ids))
-
-  (-write-int conn chunkx)
-  (-write-int conn chunkz)
-  (-write-short conn arraysize)
-  (-write-shortarray conn coordinatearray)
-  (-write-bytearray conn typearray)
-  (-write-bytearray conn metadataarray))
-
-(defn write-packet-blockchange [conn {x :x y :y z :z blocktype :blocktype blockmetadata :blockmetadata}]
-  (-write-byte conn (:blockchange packet-ids))
-
-  (-write-int conn x)
-  (-write-byte conn y)
-  (-write-int conn z)
-  (-write-byte conn blocktype)
-  (-write-byte conn blockmetadata))
-
-(defn write-packet-explosion [conn {x :x y :y z :z unknownradius :unknownradius recordcount :recordcount records :records}]
-  ; TODO: Implement this.
-  nil)
-
-(defn write-packet-soundeffect [conn {effectid :effectid x :x y :y z :z sounddata :sounddata}]
-  (-write-byte conn (:soundeffect packet-ids))
-
-  (-write-int conn effectid)
-  (-write-int conn x)
-  (-write-byte conn y)
-  (-write-int conn z)
-  (-write-int conn sounddata))
-
-(defn write-packet-newinvalidstate [conn {reason :reason}]
-  (-write-byte conn (:newinvalidstate packet-ids))
-
-  (-write-byte conn reason))
-
-(defn write-packet-openwindow [conn {windowid :windowid inventorytype :inventorytype windowtitle :windowtitle numberofslots :numberofslots}]
-  (-write-byte conn (:openwindow packet-ids))
-
-  (-write-byte conn windowid)
-  (-write-byte conn inventorytype)
-  (-write-string8 conn windowtitle)
-  (-write-byte conn numberofslots))
-
-(defn write-packet-closewindow [conn {windowid :windowid}]
-  (-write-byte conn (:closewindow packet-ids))
-
-  (-write-byte conn windowid))
-
-(defn write-packet-windowclick [conn {windowid :windowid slot :slot rightclick :rightclick actionnumber :actionnumber shift :shift itemid :itemid itemcount :itemcount itemuses :itemuses}]
-  (-write-byte conn (:windowclick packet-ids))
-
-  (-write-byte conn windowid)
-  (-write-short conn slot)
-  (-write-byte conn rightclick)
-  (-write-short conn actionnumber)
-  (-write-bool conn shift)
-  (-write-short conn itemid)
-  (-write-byte conn itemcount)
-  (-write-short conn itemuses))
-
-(defn write-packet-transaction [conn {windowid :windowid actionnumber :actionnumber accepted :accepted}]
-  (-write-byte conn (:transaction packet-ids))
-
-  (-write-byte conn windowid)
-  (-write-short conn actionnumber)
-  (-write-bool conn accepted))
-
-(defn write-packet-updatesign [conn {x :x y :y z :z text1 :text1 text2 :text2 text3 :text3 text4 :text4}]
-  (-write-byte conn (:transaction packet-ids))
-
-  (-write-int conn x)
-  (-write-short conn y)
-  (-write-int conn z)
-  (-write-string16 conn text1)
-  (-write-string16 conn text2)
-  (-write-string16 conn text3)
-  (-write-string16 conn text4))
-
-(defn write-packet-incrementstatistic [conn {statisticid :statisticid amount :amount}]
-  (-write-byte conn (:incrementstatistic packet-ids))
-
-  (-write-int conn statisticid)
-  (-write-byte conn amount))
-
-(defn write-packet-disconnectkick [conn {reason :reason}]
-  (-write-byte conn (:disconnectkick packet-ids))
-
-  (-write-string16 conn reason))
-
-
-; Writing Wrappers -----------------------------------------------------------------
-(defn flushc [conn]
-  (doto (:out @conn) (.flush)))
-
-(defn write-packet [conn packet-type payload]
-  (case packet-type
-    :keepalive            (write-packet-handshake conn payload)
-    :handshake            (write-packet-handshake conn payload)
-    :login                (write-packet-login conn payload)
-    :chat                 (write-packet-chat conn payload)
-    :respawn              (write-packet-respawn conn payload)
-    :player               (write-packet-player conn payload)
-    :playerposition       (write-packet-playerposition conn payload)
-    :playerlook           (write-packet-playerlook conn payload)
-    :playerpositionlook   (write-packet-playerpositionlook conn payload)
-    :playerdigging        (write-packet-playerdigging conn payload)
-    :playerblockplacement (write-packet-playerblockplacement conn payload)
-    :holdingchange        (write-packet-holdingchange conn payload)
-    :usebed               (write-packet-usebed conn payload)
-    :animation            (write-packet-animation conn payload)
-    :entityaction         (write-packet-entityaction conn payload)
-    :pickupspawn          (write-packet-pickupspawn conn payload)
-    :entitypainting       (write-packet-entitypainting conn payload)
-    :stanceupdate         (write-packet-stanceupdate conn payload)
-    :entityvelocity       (write-packet-entityvelocity conn payload)
-    :attachentity         (write-packet-attachentity conn payload)
-    :entitymetadata       (write-packet-entitymetadata conn payload)
-    :multiblockchange     (write-packet-multiblockchange conn payload)
-    :blockchange          (write-packet-blockchange conn payload)
-    :explosion            (write-packet-explosion conn payload)
-    :soundeffect          (write-packet-soundeffect conn payload)
-    :newinvalidstate      (write-packet-newinvalidstate conn payload)
-    :openwindow           (write-packet-openwindow conn payload)
-    :closewindow          (write-packet-closewindow conn payload)
-    :windowclick          (write-packet-windowclick conn payload)
-    :transaction          (write-packet-transaction conn payload)
-    :updatesign           (write-packet-updatesign conn payload)
-    :incrementstatistic   (write-packet-incrementstatistic conn payload)
-    :disconnectkick       (write-packet-disconnectkick conn payload)
-
-    )
-  (flushc conn))
-
-
-; Reading Data ---------------------------------------------------------------------
-(defn -read-byte [conn]
-  (let [b (.readByte (:in @conn))]
-    b))
-
-(defn -read-bytearray [conn size]
-  ; TODO: Implement this.
-  nil)
-
-(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]
-  ; TODO: Implement this.
-  nil)
-
-(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-string8 [conn]
-  ; TODO: Implement this.
-  nil)
-
-(defn -read-string16 [conn]
-  (let [str-len (.readShort (:in @conn))
-                s (apply str (repeatedly str-len #(.readChar (:in @conn))))]
-    s))
-
-(defn -read-metadata [conn]
-  ; TODO: Implement this.
-  nil)
-
-
-; Reading Packets ------------------------------------------------------------------
-(defn read-packet-keepalive [conn]
-  nil)
-
-(defn read-packet-handshake [conn]
-  (assoc {}
-    :hash (-read-string16 conn)))
-
-(defn read-packet-login [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :unknown (-read-string16 conn)
-    :seed (-read-long conn)
-    :dimension (-read-byte conn)))
-
-(defn read-packet-chat [conn]
-  (assoc {}
-    :message (-read-string16 conn)))
-
-(defn read-packet-timeupdate [conn]
-  (assoc {}
-    :time (-read-long conn)))
-
-(defn read-packet-equipment [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :slot (-read-short conn)
-    :itemid (-read-short conn)
-    :unknown (-read-short conn)))
-
-(defn read-packet-spawnposition [conn]
-  (assoc {}
-    :x (-read-int conn)
-    :y (-read-int conn)
-    :z (-read-int conn)))
-
-(defn read-packet-useentity [conn]
-  (assoc {}
-    :user (-read-int conn)
-    :target (-read-int conn)
-    :leftclick (-read-bool conn)))
-
-(defn read-packet-updatehealth [conn]
-  (assoc {}
-    :health (-read-short conn)))
-
-(defn read-packet-respawn [conn]
-  (assoc {}
-    :world (-read-byte conn)))
-
-(defn read-packet-playerpositionlook [conn]
-  (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)))
-
-(defn read-packet-playerdigging [conn]
-  (assoc {}
-    :status (-read-byte conn)
-    :x (-read-int conn)
-    :y (-read-byte conn)
-    :z (-read-int conn)
-    :face (-read-byte conn)))
-
-(defn read-packet-playerblockplacement [conn]
-  (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)))
-
-(defn read-packet-holdingchange [conn]
-  (assoc {}
-    :slot (-read-short conn)))
-
-(defn read-packet-usebed [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :inbed (-read-byte conn)
-    :x (-read-int conn)
-    :y (-read-byte conn)
-    :z (-read-int conn)))
-
-(defn read-packet-animate [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :animate (-read-byte conn)))
-
-(defn read-packet-entityaction [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :action (-read-byte conn)))
-
-(defn read-packet-namedentityspawn [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :playername (-read-string16 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)))
-
-(defn read-packet-pickupspawn [conn]
-  (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)))
-
-(defn read-packet-collectitem [conn]
-  (assoc {}
-    :collectedeid (-read-int conn)
-    :collectoreid (-read-int conn)))
-
-(defn read-packet-addobjectvehicle [conn]
-  (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)))))
-
-(defn read-packet-mobspawn [conn]
-  (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)))
-
-(defn read-packet-entitypainting [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :type (-read-string16 conn)
-    :x (-read-int conn)
-    :y (-read-int conn)
-    :z (-read-int conn)
-    :direction (-read-int conn)))
-
-(defn read-packet-stanceupdate [conn]
-  (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)))
-
-(defn read-packet-entityvelocity [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :velocityx (-read-short conn)
-    :velocityy (-read-short conn)
-    :velocityz (-read-short conn)))
-
-(defn read-packet-entitydestroy [conn]
-  (assoc {}
-    :eid (-read-int conn)))
-
-(defn read-packet-entity [conn]
-  (assoc {}
-    :eid (-read-int conn)))
-
-(defn read-packet-entityrelativemove [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :dx (-read-byte conn)
-    :dy (-read-byte conn)
-    :dz (-read-byte conn)))
-
-(defn read-packet-entitylook [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :yaw (-read-byte conn)
-    :pitch (-read-byte conn)))
-
-(defn read-packet-entitylookandrelativemove [conn]
-  (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)))
-
-(defn read-packet-entityteleport [conn]
-  (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)))
-
-(defn read-packet-entitystatus [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :entitystatus (-read-byte conn)))
-
-(defn read-packet-attachentity [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :vehicleid (-read-int conn)))
-
-(defn read-packet-entitymetadata [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :metadata (-read-metadata conn)))
-
-(defn read-packet-prechunk [conn]
-  (assoc {}
-    :x (-read-int conn)
-    :z (-read-int conn)
-    :mode (-read-bool conn)))
-
-(defn read-packet-mapchunk [conn]
-  (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)))))
-
-(defn read-packet-multiblockchange [conn]
-  (assoc {}
-    :chunkx (-read-int conn)
-    :chunkz (-read-int conn)
-    :arraysize (-read-short conn)
-    :coordinatearray (-read-shortarray conn)
-    :typearray (-read-bytearray conn)
-    :metadataarray (-read-bytearray conn)))
-
-(defn read-packet-blockchange [conn]
-  (assoc {}
-    :x (-read-int conn)
-    :y (-read-byte conn)
-    :z (-read-int conn)
-    :blocktype (-read-byte conn)
-    :blockmetadata (-read-byte conn)))
-
-(defn read-packet-playnoteblock [conn]
-  (assoc {}
-    :x (-read-int conn)
-    :y (-read-short conn)
-    :z (-read-int conn)
-    :instrumenttype (-read-byte conn)
-    :pitch (-read-byte conn)))
-
-(defn read-packet-explosion [conn]
-  (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))))))
-
-(defn read-packet-soundeffect [conn]
-  (assoc {}
-    :effectid (-read-int conn)
-    :x (-read-int conn)
-    :y (-read-byte conn)
-    :z (-read-int conn)
-    :sounddata (-read-int conn)))
-
-(defn read-packet-newinvalidstate [conn]
-  (assoc {}
-    :reason (-read-byte conn)))
-
-(defn read-packet-thunderbolt [conn]
-  (assoc {}
-    :eid (-read-int conn)
-    :unknown (-read-bool conn)
-    :x (-read-int conn)
-    :y (-read-int conn)
-    :z (-read-int conn)))
-
-(defn read-packet-openwindow [conn]
-  (assoc {}
-    :windowid (-read-byte conn)
-    :inventorytype (-read-byte conn)
-    :windowtitle (-read-string8 conn)
-    :numberofslots (-read-byte conn)))
-
-(defn read-packet-closewindow [conn]
-  (assoc {}
-    :windowid (-read-byte conn)))
-
-(defn read-packet-setslot [conn]
-  (assoc {}
-    :windowid (-read-byte conn)
-    :slot (-read-short conn)
-    :itemid (-read-short conn)
-    :itemcount (-read-byte conn)
-    :itemuses (-read-short conn)))
-
-(defn read-packet-windowitems [conn]
-  (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 [prepayload (assoc {}
-                            :windowid (-read-byte conn)
-                            :count (-read-short conn))
-          payload (repeatedly (:count prepayload) -read-payload-item)]
-      (assoc prepayload :payload payload))))
-
-(defn read-packet-updateprogressbar [conn]
-  (assoc {}
-    :windowid (-read-byte conn)
-    :progressbar (-read-short conn)
-    :value (-read-short conn)))
-
-(defn read-packet-transaction [conn]
-  (assoc {}
-    :windowid (-read-byte conn)
-    :actionnumber (-read-short conn)
-    :accepted (-read-short conn)))
-
-(defn read-packet-updatesign [conn]
-  (assoc {}
-    :x (-read-int conn)
-    :y (-read-short conn)
-    :z (-read-int conn)
-    :text1 (-read-string16 conn)
-    :text2 (-read-string16 conn)
-    :text3 (-read-string16 conn)
-    :text4 (-read-string16 conn)))
-
-(defn read-packet-mapdata [conn]
-  (let [pretext (assoc {}
-                       :unknown1 (-read-int conn)
-                       :unknown2 (-read-short conn)
-                       :textlength (-read-int conn))]
-    (assoc pretext :text (-read-bytearray (:textlength pretext)))))
-
-(defn read-packet-incrementstatistic [conn]
-  (assoc {}
-    :statisticid (-read-int conn)
-    :amount (-read-byte conn)))
-
-(defn read-packet-disconnectkick [conn]
-  (assoc {}
-    :reason (-read-string16 conn)))
-
-
-; Reading Wrappers -----------------------------------------------------------------
-(defn read-packet [conn packet-id]
-  (let [packet-id (int packet-id)
-                  packet-type (packet-types packet-id)]
-    (println "\n----->")
-    (println
-      (case packet-type
-        :keepalive                 (read-packet-keepalive conn)
-        :handshake                 (read-packet-handshake conn)
-        :login                     (read-packet-login conn)
-        :chat                      (read-packet-chat conn)
-        :timeupdate                (read-packet-timeupdate conn)
-        :equipment                 (read-packet-equipment conn)
-        :spawnposition             (read-packet-spawnposition conn)
-        :useentity                 (read-packet-useentity conn)
-        :updatehealth              (read-packet-updatehealth conn)
-        :respawn                   (read-packet-respawn conn)
-        :playerpositionlook        (read-packet-playerpositionlook conn)
-        :playerdigging             (read-packet-playerdigging conn)
-        :playerblockplacement      (read-packet-playerblockplacement conn)
-        :holdingchange             (read-packet-holdingchange conn)
-        :usebed                    (read-packet-usebed conn)
-        :animate                   (read-packet-animate conn)
-        :entityaction              (read-packet-entityaction conn)
-        :namedentityspawn          (read-packet-namedentityspawn conn)
-        :pickupspawn               (read-packet-pickupspawn conn)
-        :collectitem               (read-packet-collectitem conn)
-        :addobjectvehicle          (read-packet-addobjectvehicle conn)
-        :mobspawn                  (read-packet-mobspawn conn)
-        :entitypainting            (read-packet-entitypainting conn)
-        :stanceupdate              (read-packet-stanceupdate conn)
-        :entityvelocity            (read-packet-entityvelocity conn)
-        :entitydestroy             (read-packet-entitydestroy conn)
-        :entity                    (read-packet-entity conn)
-        :entityrelativemove        (read-packet-entityrelativemove conn)
-        :entitylook                (read-packet-entitylook conn)
-        :entitylookandrelativemove (read-packet-entitylookandrelativemove conn)
-        :entityteleport            (read-packet-entityteleport conn)
-        :entitystatus              (read-packet-entitystatus conn)
-        :attachentity              (read-packet-attachentity conn)
-        :entitymetadata            (read-packet-entitymetadata conn)
-        :prechunk                  (read-packet-prechunk conn)
-        :mapchunk                  (read-packet-mapchunk conn)
-        :multiblockchange          (read-packet-multiblockchange conn)
-        :blockchange               (read-packet-blockchange conn)
-        :playnoteblock             (read-packet-playnoteblock conn)
-        :explosion                 (read-packet-explosion conn)
-        :soundeffect               (read-packet-soundeffect conn)
-        :newinvalidstate           (read-packet-newinvalidstate conn)
-        :thunderbolt               (read-packet-thunderbolt conn)
-        :openwindow                (read-packet-openwindow conn)
-        :closewindow               (read-packet-closewindow conn)
-        :setslot                   (read-packet-setslot conn)
-        :windowitems               (read-packet-windowitems conn)
-        :updateprogressbar         (read-packet-updateprogressbar conn)
-        :transaction               (read-packet-transaction conn)
-        :updatesign                (read-packet-updatesign conn)
-        :mapdata                   (read-packet-mapdata conn)
-        :incrementstatistic        (read-packet-incrementstatistic conn)
-        :disconnectkick            (read-packet-disconnectkick conn)
-
-        :else (str "UNKNOWN PACKET TYPE: " packet-id)
-        ))
-    (println "\n\n\n")))
-
-
 ; Connection Handling --------------------------------------------------------------
 (defn login [conn]
   ; Send handshake
   (write-packet conn :handshake {:username "timmy"})
 
   ; Get handshake
-  (let [packet-id (-read-byte conn)]
-    (read-packet conn packet-id))
+  (read-packet conn)
 
   ; Send login
   (write-packet conn :login {:version 13 :username "timmy"})
 
   ; Get login
-  (let [packet-id (-read-byte conn)]
-    (read-packet conn packet-id)))
+  (read-packet conn))
 
 (defn conn-handler [conn]
   (println "connecting")
   (login conn)
   (while (nil? (:exit @conn))
-    (let [packet-id (.readByte (:in @conn))]
-      (read-packet conn packet-id)
-      ))
+    (read-packet conn))
   (println "done"))
 
 
 
-
 ; Scratch --------------------------------------------------------------------------
 ;(def server (connect minecraft-local))
 ;(disconnect server)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/clojurecraft/in.clj	Fri Jun 24 19:24:44 2011 -0400
@@ -0,0 +1,501 @@
+(ns clojurecraft.in
+  (:use [clojurecraft.mappings]))
+
+; Reading Data ---------------------------------------------------------------------
+(defn- -read-byte [conn]
+  (let [b (.readByte (:in @conn))]
+    b))
+
+(defn- -read-bytearray [conn size]
+  ; TODO: Implement this.
+  nil)
+
+(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]
+  ; TODO: Implement this.
+  nil)
+
+(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-string8 [conn]
+  ; TODO: Implement this.
+  nil)
+
+(defn- -read-string16 [conn]
+  (let [str-len (.readShort (:in @conn))
+                s (apply str (repeatedly str-len #(.readChar (:in @conn))))]
+    s))
+
+(defn- -read-metadata [conn]
+  ; TODO: Implement this.
+  nil)
+
+
+; Reading Packets ------------------------------------------------------------------
+(defn- read-packet-keepalive [conn]
+  nil)
+
+(defn- read-packet-handshake [conn]
+  (assoc {}
+    :hash (-read-string16 conn)))
+
+(defn- read-packet-login [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :unknown (-read-string16 conn)
+    :seed (-read-long conn)
+    :dimension (-read-byte conn)))
+
+(defn- read-packet-chat [conn]
+  (assoc {}
+    :message (-read-string16 conn)))
+
+(defn- read-packet-timeupdate [conn]
+  (assoc {}
+    :time (-read-long conn)))
+
+(defn- read-packet-equipment [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :slot (-read-short conn)
+    :itemid (-read-short conn)
+    :unknown (-read-short conn)))
+
+(defn- read-packet-spawnposition [conn]
+  (assoc {}
+    :x (-read-int conn)
+    :y (-read-int conn)
+    :z (-read-int conn)))
+
+(defn- read-packet-useentity [conn]
+  (assoc {}
+    :user (-read-int conn)
+    :target (-read-int conn)
+    :leftclick (-read-bool conn)))
+
+(defn- read-packet-updatehealth [conn]
+  (assoc {}
+    :health (-read-short conn)))
+
+(defn- read-packet-respawn [conn]
+  (assoc {}
+    :world (-read-byte conn)))
+
+(defn- read-packet-playerpositionlook [conn]
+  (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)))
+
+(defn- read-packet-playerdigging [conn]
+  (assoc {}
+    :status (-read-byte conn)
+    :x (-read-int conn)
+    :y (-read-byte conn)
+    :z (-read-int conn)
+    :face (-read-byte conn)))
+
+(defn- read-packet-playerblockplacement [conn]
+  (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)))
+
+(defn- read-packet-holdingchange [conn]
+  (assoc {}
+    :slot (-read-short conn)))
+
+(defn- read-packet-usebed [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :inbed (-read-byte conn)
+    :x (-read-int conn)
+    :y (-read-byte conn)
+    :z (-read-int conn)))
+
+(defn- read-packet-animate [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :animate (-read-byte conn)))
+
+(defn- read-packet-entityaction [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :action (-read-byte conn)))
+
+(defn- read-packet-namedentityspawn [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :playername (-read-string16 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)))
+
+(defn- read-packet-pickupspawn [conn]
+  (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)))
+
+(defn- read-packet-collectitem [conn]
+  (assoc {}
+    :collectedeid (-read-int conn)
+    :collectoreid (-read-int conn)))
+
+(defn- read-packet-addobjectvehicle [conn]
+  (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)))))
+
+(defn- read-packet-mobspawn [conn]
+  (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)))
+
+(defn- read-packet-entitypainting [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :type (-read-string16 conn)
+    :x (-read-int conn)
+    :y (-read-int conn)
+    :z (-read-int conn)
+    :direction (-read-int conn)))
+
+(defn- read-packet-stanceupdate [conn]
+  (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)))
+
+(defn- read-packet-entityvelocity [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :velocityx (-read-short conn)
+    :velocityy (-read-short conn)
+    :velocityz (-read-short conn)))
+
+(defn- read-packet-entitydestroy [conn]
+  (assoc {}
+    :eid (-read-int conn)))
+
+(defn- read-packet-entity [conn]
+  (assoc {}
+    :eid (-read-int conn)))
+
+(defn- read-packet-entityrelativemove [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :dx (-read-byte conn)
+    :dy (-read-byte conn)
+    :dz (-read-byte conn)))
+
+(defn- read-packet-entitylook [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :yaw (-read-byte conn)
+    :pitch (-read-byte conn)))
+
+(defn- read-packet-entitylookandrelativemove [conn]
+  (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)))
+
+(defn- read-packet-entityteleport [conn]
+  (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)))
+
+(defn- read-packet-entitystatus [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :entitystatus (-read-byte conn)))
+
+(defn- read-packet-attachentity [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :vehicleid (-read-int conn)))
+
+(defn- read-packet-entitymetadata [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :metadata (-read-metadata conn)))
+
+(defn- read-packet-prechunk [conn]
+  (assoc {}
+    :x (-read-int conn)
+    :z (-read-int conn)
+    :mode (-read-bool conn)))
+
+(defn- read-packet-mapchunk [conn]
+  (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)))))
+
+(defn- read-packet-multiblockchange [conn]
+  (assoc {}
+    :chunkx (-read-int conn)
+    :chunkz (-read-int conn)
+    :arraysize (-read-short conn)
+    :coordinatearray (-read-shortarray conn)
+    :typearray (-read-bytearray conn)
+    :metadataarray (-read-bytearray conn)))
+
+(defn- read-packet-blockchange [conn]
+  (assoc {}
+    :x (-read-int conn)
+    :y (-read-byte conn)
+    :z (-read-int conn)
+    :blocktype (-read-byte conn)
+    :blockmetadata (-read-byte conn)))
+
+(defn- read-packet-playnoteblock [conn]
+  (assoc {}
+    :x (-read-int conn)
+    :y (-read-short conn)
+    :z (-read-int conn)
+    :instrumenttype (-read-byte conn)
+    :pitch (-read-byte conn)))
+
+(defn- read-packet-explosion [conn]
+  (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))))))
+
+(defn- read-packet-soundeffect [conn]
+  (assoc {}
+    :effectid (-read-int conn)
+    :x (-read-int conn)
+    :y (-read-byte conn)
+    :z (-read-int conn)
+    :sounddata (-read-int conn)))
+
+(defn- read-packet-newinvalidstate [conn]
+  (assoc {}
+    :reason (-read-byte conn)))
+
+(defn- read-packet-thunderbolt [conn]
+  (assoc {}
+    :eid (-read-int conn)
+    :unknown (-read-bool conn)
+    :x (-read-int conn)
+    :y (-read-int conn)
+    :z (-read-int conn)))
+
+(defn- read-packet-openwindow [conn]
+  (assoc {}
+    :windowid (-read-byte conn)
+    :inventorytype (-read-byte conn)
+    :windowtitle (-read-string8 conn)
+    :numberofslots (-read-byte conn)))
+
+(defn- read-packet-closewindow [conn]
+  (assoc {}
+    :windowid (-read-byte conn)))
+
+(defn- read-packet-setslot [conn]
+  (assoc {}
+    :windowid (-read-byte conn)
+    :slot (-read-short conn)
+    :itemid (-read-short conn)
+    :itemcount (-read-byte conn)
+    :itemuses (-read-short conn)))
+
+(defn- read-packet-windowitems [conn]
+  (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 [prepayload (assoc {}
+                            :windowid (-read-byte conn)
+                            :count (-read-short conn))
+          payload (repeatedly (:count prepayload) -read-payload-item)]
+      (assoc prepayload :payload payload))))
+
+(defn- read-packet-updateprogressbar [conn]
+  (assoc {}
+    :windowid (-read-byte conn)
+    :progressbar (-read-short conn)
+    :value (-read-short conn)))
+
+(defn- read-packet-transaction [conn]
+  (assoc {}
+    :windowid (-read-byte conn)
+    :actionnumber (-read-short conn)
+    :accepted (-read-short conn)))
+
+(defn- read-packet-updatesign [conn]
+  (assoc {}
+    :x (-read-int conn)
+    :y (-read-short conn)
+    :z (-read-int conn)
+    :text1 (-read-string16 conn)
+    :text2 (-read-string16 conn)
+    :text3 (-read-string16 conn)
+    :text4 (-read-string16 conn)))
+
+(defn- read-packet-mapdata [conn]
+  (let [pretext (assoc {}
+                       :unknown1 (-read-int conn)
+                       :unknown2 (-read-short conn)
+                       :textlength (-read-int conn))]
+    (assoc pretext :text (-read-bytearray (:textlength pretext)))))
+
+(defn- read-packet-incrementstatistic [conn]
+  (assoc {}
+    :statisticid (-read-int conn)
+    :amount (-read-byte conn)))
+
+(defn- read-packet-disconnectkick [conn]
+  (assoc {}
+    :reason (-read-string16 conn)))
+
+
+; Reading Wrappers -----------------------------------------------------------------
+(defn read-packet [conn]
+  (let [packet-id (int (-read-byte conn))
+        packet-type (packet-types packet-id)]
+    (println "\n----->")
+    (println
+      (case packet-type
+        :keepalive                 (read-packet-keepalive conn)
+        :handshake                 (read-packet-handshake conn)
+        :login                     (read-packet-login conn)
+        :chat                      (read-packet-chat conn)
+        :timeupdate                (read-packet-timeupdate conn)
+        :equipment                 (read-packet-equipment conn)
+        :spawnposition             (read-packet-spawnposition conn)
+        :useentity                 (read-packet-useentity conn)
+        :updatehealth              (read-packet-updatehealth conn)
+        :respawn                   (read-packet-respawn conn)
+        :playerpositionlook        (read-packet-playerpositionlook conn)
+        :playerdigging             (read-packet-playerdigging conn)
+        :playerblockplacement      (read-packet-playerblockplacement conn)
+        :holdingchange             (read-packet-holdingchange conn)
+        :usebed                    (read-packet-usebed conn)
+        :animate                   (read-packet-animate conn)
+        :entityaction              (read-packet-entityaction conn)
+        :namedentityspawn          (read-packet-namedentityspawn conn)
+        :pickupspawn               (read-packet-pickupspawn conn)
+        :collectitem               (read-packet-collectitem conn)
+        :addobjectvehicle          (read-packet-addobjectvehicle conn)
+        :mobspawn                  (read-packet-mobspawn conn)
+        :entitypainting            (read-packet-entitypainting conn)
+        :stanceupdate              (read-packet-stanceupdate conn)
+        :entityvelocity            (read-packet-entityvelocity conn)
+        :entitydestroy             (read-packet-entitydestroy conn)
+        :entity                    (read-packet-entity conn)
+        :entityrelativemove        (read-packet-entityrelativemove conn)
+        :entitylook                (read-packet-entitylook conn)
+        :entitylookandrelativemove (read-packet-entitylookandrelativemove conn)
+        :entityteleport            (read-packet-entityteleport conn)
+        :entitystatus              (read-packet-entitystatus conn)
+        :attachentity              (read-packet-attachentity conn)
+        :entitymetadata            (read-packet-entitymetadata conn)
+        :prechunk                  (read-packet-prechunk conn)
+        :mapchunk                  (read-packet-mapchunk conn)
+        :multiblockchange          (read-packet-multiblockchange conn)
+        :blockchange               (read-packet-blockchange conn)
+        :playnoteblock             (read-packet-playnoteblock conn)
+        :explosion                 (read-packet-explosion conn)
+        :soundeffect               (read-packet-soundeffect conn)
+        :newinvalidstate           (read-packet-newinvalidstate conn)
+        :thunderbolt               (read-packet-thunderbolt conn)
+        :openwindow                (read-packet-openwindow conn)
+        :closewindow               (read-packet-closewindow conn)
+        :setslot                   (read-packet-setslot conn)
+        :windowitems               (read-packet-windowitems conn)
+        :updateprogressbar         (read-packet-updateprogressbar conn)
+        :transaction               (read-packet-transaction conn)
+        :updatesign                (read-packet-updatesign conn)
+        :mapdata                   (read-packet-mapdata conn)
+        :incrementstatistic        (read-packet-incrementstatistic conn)
+        :disconnectkick            (read-packet-disconnectkick conn)
+
+        :else (str "UNKNOWN PACKET TYPE: " packet-id)
+        ))
+    (println "\n\n\n")))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/clojurecraft/mappings.clj	Fri Jun 24 19:24:44 2011 -0400
@@ -0,0 +1,63 @@
+(ns clojurecraft.mappings)
+
+(def packet-types {
+  0x00 :keepalive
+  0x01 :login
+  0x02 :handshake
+  0x03 :chat
+  0x04 :timeupdate
+  0x05 :equipment
+  0x06 :spawnposition
+  0x07 :useentity
+  0x08 :updatehealth
+  0x09 :respawn
+  0x0A :player
+  0x0B :playerposition
+  0x0C :playerlook
+  0x0D :playerpositionlook
+  0x0E :playerdigging
+  0x0F :playerblockplacement
+  0x10 :holdingchange
+  0x11 :usebed
+  0x12 :animation
+  0x13 :entityaction
+  0x14 :namedentityspawn
+  0x15 :pickupspawn
+  0x16 :collectitem
+  0x17 :addobjectvehicle
+  0x18 :mobspawn
+  0x19 :entitypainting
+  0x1B :stanceupdate
+  0x1C :entityvelocity
+  0x1D :entitydestroy
+  0x1E :entity
+  0x1F :entityrelativemove
+  0x20 :entitylook
+  0x21 :entitylookandrelativemove
+  0x22 :entityteleport
+  0x26 :entitystatus
+  0x27 :attachentity
+  0x28 :entitymetadata
+  0x32 :prechunk
+  0x33 :mapchunk
+  0x34 :multiblockchange
+  0x35 :blockchange
+  0x36 :playnoteblock
+  0x3C :explosion
+  0x3D :soundeffect
+  0x46 :newinvalidstate
+  0x47 :thunderbolt
+  0x64 :openwindow
+  0x65 :closewindow
+  0x66 :windowclick
+  0x67 :setslot
+  0x68 :windowitems
+  0x69 :updateprogressbar
+  0x6A :transaction
+  0x82 :updatesign
+  0x83 :mapdata
+  0xC8 :incrementstatistic
+  0xFF :disconnectkick
+})
+
+(def packet-ids (apply assoc {} (mapcat reverse packet-types)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/clojurecraft/out.clj	Fri Jun 24 19:24:44 2011 -0400
@@ -0,0 +1,356 @@
+(ns clojurecraft.out
+  (:use [clojurecraft.mappings]))
+
+; Writing Data ---------------------------------------------------------------------
+(defn- -write-byte [conn i]
+  (println (str "-> PACKET ID: " (Integer/toHexString i)))
+  (doto (:out @conn)
+    (.writeByte (int i))))
+
+(defn- -write-bytearray [conn ba]
+  ; TODO: Implement this.
+  nil)
+
+(defn- -write-short [conn i]
+  (println (str "-> SHORT: " i))
+  (doto (:out @conn)
+    (.writeShort (int i))))
+
+(defn- -write-shortarray [conn sa]
+  ; TODO: Implement this.
+  nil)
+
+(defn- -write-int [conn i]
+  (println (str "-> INT: " i))
+  (doto (:out @conn)
+    (.writeInt (int i))))
+
+(defn- -write-long [conn i]
+  (println (str "-> LONG: " i))
+  (doto (:out @conn)
+    (.writeLong (int i))))
+
+(defn- -write-double [conn i]
+  (println (str "-> DOUBLE: " i))
+  (doto (:out @conn)
+    (.writeDouble (int i))))
+
+(defn- -write-float [conn i]
+  (println (str "-> FLOAT: " i))
+  (doto (:out @conn)
+    (.writeFloat (int i))))
+
+(defn- -write-string8 [conn s]
+  ; TODO: Implement this.
+  nil)
+
+(defn- -write-string16 [conn s]
+  (-write-short conn (count s))
+  (println (str "-> STRING: " s))
+  (doto (:out @conn)
+    (.writeChars s)))
+
+(defn- -write-bool [conn b]
+  (println (str "-> BOOL: " b))
+  (doto (:out @conn)
+    (.writeBoolean b)))
+
+(defn- -write-metadata [conn m]
+  ; TODO: Implement this.
+  nil)
+
+
+; Writing Packets ------------------------------------------------------------------
+(defn- write-packet-keepalive [conn _]
+  (-write-byte conn (:handshake packet-ids)))
+
+(defn- write-packet-handshake [conn {username :username}]
+  (-write-byte conn (:handshake packet-ids))
+
+  (-write-string16 conn username))
+
+(defn- write-packet-login [conn {version :version, username :username}]
+  (-write-byte conn (:login packet-ids))
+
+  (-write-int conn version)
+  (-write-string16 conn username)
+  (-write-long conn 0)
+  (-write-byte conn 0))
+
+(defn- write-packet-chat [conn {message :message}]
+  (-write-byte conn (:chat packet-ids))
+
+  (-write-string16 conn message))
+
+(defn- write-packet-respawn [conn {world :world}]
+  (-write-byte conn (:respawn packet-ids))
+
+  (-write-bool conn world))
+
+(defn- write-packet-player [conn {onground :onground}]
+  (-write-byte conn (:player packet-ids))
+
+  (-write-bool conn onground))
+
+(defn- write-packet-playerposition [conn {x :x y :y stance :stance z :z onground :onground}]
+  (-write-byte conn (:playerposition packet-ids))
+
+  (-write-double conn x)
+  (-write-double conn y)
+  (-write-double conn stance)
+  (-write-double conn z)
+  (-write-bool conn onground))
+
+(defn- write-packet-playerlook [conn {yaw :yaw pitch :pitch onground :onground}]
+  (-write-byte conn (:playerlook packet-ids))
+
+  (-write-float conn yaw)
+  (-write-float conn pitch)
+  (-write-bool conn onground))
+
+(defn- write-packet-playerpositionlook [conn {x :x y :y stance :stance z :z yaw :yaw pitch :pitch onground :onground}]
+  (-write-byte conn (:playerpositionlook packet-ids))
+
+  (-write-double conn x)
+  (-write-double conn y)
+  (-write-double conn stance)
+  (-write-double conn z)
+  (-write-float conn yaw)
+  (-write-float conn pitch)
+  (-write-bool conn onground))
+
+(defn- write-packet-playerdigging [conn {status :status x :x y :y z :z face :face}]
+  (-write-byte conn (:playerdigging packet-ids))
+
+  (-write-byte conn status)
+  (-write-int conn x)
+  (-write-byte conn y)
+  (-write-int conn z)
+  (-write-byte conn face))
+
+(defn- write-packet-playerblockplacement [conn {x :x y :y z :z direction :direction id :id amount :amount damage :damage}]
+  (-write-byte conn (:playerblockplacement packet-ids))
+
+  (-write-int conn x)
+  (-write-byte conn y)
+  (-write-int conn z)
+  (-write-byte conn direction)
+  (-write-short conn id)
+  (-write-byte conn amount)
+  (-write-short conn damage))
+
+(defn- write-packet-holdingchange [conn {slot :slot}]
+  (-write-byte conn (:holdingchange packet-ids))
+
+  (-write-short conn slot))
+
+(defn- write-packet-usebed [conn {eid :eid inbed :inbed x :x y :y z :z}]
+  (-write-byte conn (:usebed packet-ids))
+
+  (-write-int conn eid)
+  (-write-byte conn inbed)
+  (-write-int conn x)
+  (-write-byte conn y)
+  (-write-int conn z))
+
+(defn- write-packet-animation [conn {eid :eid animate :animate}]
+  (-write-byte conn (:animation packet-ids))
+
+  (-write-int conn eid)
+  (-write-byte conn animate))
+
+(defn- write-packet-entityaction [conn {eid :eid action :action}]
+  (-write-byte conn (:entityaction packet-ids))
+
+  (-write-int conn eid)
+  (-write-byte conn action))
+
+(defn- write-packet-pickupspawn [conn {eid :eid item :item count :count damagedata :damagedata x :x y :y z :z rotation :rotation pitch :pitch roll :roll}]
+  (-write-byte conn (:pickupspawn packet-ids))
+
+  (-write-int conn eid)
+  (-write-short conn item)
+  (-write-byte conn count)
+  (-write-short conn damagedata)
+  (-write-int conn x)
+  (-write-int conn y)
+  (-write-int conn x)
+  (-write-byte conn rotation)
+  (-write-byte int conn pitch)
+  (-write-byte int conn roll))
+
+(defn- write-packet-entitypainting [conn {eid :eid title :title x :x y :y z :z direction :direction}]
+  (-write-byte conn (:entitypainting packet-ids))
+
+  (-write-int conn eid)
+  (-write-string16 conn title)
+  (-write-int conn x)
+  (-write-int conn y)
+  (-write-int conn x)
+  (-write-int conn direction))
+
+(defn- write-packet-stanceupdate [conn {unknown1 :unknown1 unknown2 :unknown2 unknown3 :unknown3 unknown4 :unknown4 unknown5 :unknown5 unknown6 :unknown6 }]
+  (-write-byte conn (:stanceupdate packet-ids))
+
+  (-write-float conn unknown1)
+  (-write-float conn unknown2)
+  (-write-bool conn unknown3)
+  (-write-bool conn unknown4)
+  (-write-float conn unknown5)
+  (-write-float conn unknown6))
+
+(defn- write-packet-entityvelocity [conn {eid :eid velocityx :velocityx velocityy :velocityy velocityz :velocityz}]
+  (-write-byte conn (:entityvelocity packet-ids))
+
+  (-write-int conn eid)
+  (-write-short conn velocityx)
+  (-write-short conn velocityy)
+  (-write-short conn velocityz))
+
+(defn- write-packet-attachentity [conn {eid :eid vehicleid :vehicleid}]
+  (-write-byte conn (:attachentity packet-ids))
+
+  (-write-int conn eid)
+  (-write-int conn vehicleid))
+
+(defn- write-packet-entitymetadata [conn {eid :eid metadata :metadata}]
+  (-write-byte conn (:attachentity packet-ids))
+
+  (-write-int conn eid)
+  (-write-metadata conn metadata))
+
+(defn- write-packet-multiblockchange [conn {chunkx :chunkx chunkz :chunkz arraysize :arraysize coordinatearray :coordinatearray typearray :typearray metadataarray :metadataarray}]
+  (-write-byte conn (:multiblockchange packet-ids))
+
+  (-write-int conn chunkx)
+  (-write-int conn chunkz)
+  (-write-short conn arraysize)
+  (-write-shortarray conn coordinatearray)
+  (-write-bytearray conn typearray)
+  (-write-bytearray conn metadataarray))
+
+(defn- write-packet-blockchange [conn {x :x y :y z :z blocktype :blocktype blockmetadata :blockmetadata}]
+  (-write-byte conn (:blockchange packet-ids))
+
+  (-write-int conn x)
+  (-write-byte conn y)
+  (-write-int conn z)
+  (-write-byte conn blocktype)
+  (-write-byte conn blockmetadata))
+
+(defn- write-packet-explosion [conn {x :x y :y z :z unknownradius :unknownradius recordcount :recordcount records :records}]
+  ; TODO: Implement this.
+  nil)
+
+(defn- write-packet-soundeffect [conn {effectid :effectid x :x y :y z :z sounddata :sounddata}]
+  (-write-byte conn (:soundeffect packet-ids))
+
+  (-write-int conn effectid)
+  (-write-int conn x)
+  (-write-byte conn y)
+  (-write-int conn z)
+  (-write-int conn sounddata))
+
+(defn- write-packet-newinvalidstate [conn {reason :reason}]
+  (-write-byte conn (:newinvalidstate packet-ids))
+
+  (-write-byte conn reason))
+
+(defn- write-packet-openwindow [conn {windowid :windowid inventorytype :inventorytype windowtitle :windowtitle numberofslots :numberofslots}]
+  (-write-byte conn (:openwindow packet-ids))
+
+  (-write-byte conn windowid)
+  (-write-byte conn inventorytype)
+  (-write-string8 conn windowtitle)
+  (-write-byte conn numberofslots))
+
+(defn- write-packet-closewindow [conn {windowid :windowid}]
+  (-write-byte conn (:closewindow packet-ids))
+
+  (-write-byte conn windowid))
+
+(defn- write-packet-windowclick [conn {windowid :windowid slot :slot rightclick :rightclick actionnumber :actionnumber shift :shift itemid :itemid itemcount :itemcount itemuses :itemuses}]
+  (-write-byte conn (:windowclick packet-ids))
+
+  (-write-byte conn windowid)
+  (-write-short conn slot)
+  (-write-byte conn rightclick)
+  (-write-short conn actionnumber)
+  (-write-bool conn shift)
+  (-write-short conn itemid)
+  (-write-byte conn itemcount)
+  (-write-short conn itemuses))
+
+(defn- write-packet-transaction [conn {windowid :windowid actionnumber :actionnumber accepted :accepted}]
+  (-write-byte conn (:transaction packet-ids))
+
+  (-write-byte conn windowid)
+  (-write-short conn actionnumber)
+  (-write-bool conn accepted))
+
+(defn- write-packet-updatesign [conn {x :x y :y z :z text1 :text1 text2 :text2 text3 :text3 text4 :text4}]
+  (-write-byte conn (:transaction packet-ids))
+
+  (-write-int conn x)
+  (-write-short conn y)
+  (-write-int conn z)
+  (-write-string16 conn text1)
+  (-write-string16 conn text2)
+  (-write-string16 conn text3)
+  (-write-string16 conn text4))
+
+(defn- write-packet-incrementstatistic [conn {statisticid :statisticid amount :amount}]
+  (-write-byte conn (:incrementstatistic packet-ids))
+
+  (-write-int conn statisticid)
+  (-write-byte conn amount))
+
+(defn- write-packet-disconnectkick [conn {reason :reason}]
+  (-write-byte conn (:disconnectkick packet-ids))
+
+  (-write-string16 conn reason))
+
+
+; Writing Wrappers -----------------------------------------------------------------
+(defn- flushc [conn]
+  (doto (:out @conn) (.flush)))
+
+(defn write-packet [conn packet-type payload]
+  (case packet-type
+    :keepalive            (write-packet-handshake conn payload)
+    :handshake            (write-packet-handshake conn payload)
+    :login                (write-packet-login conn payload)
+    :chat                 (write-packet-chat conn payload)
+    :respawn              (write-packet-respawn conn payload)
+    :player               (write-packet-player conn payload)
+    :playerposition       (write-packet-playerposition conn payload)
+    :playerlook           (write-packet-playerlook conn payload)
+    :playerpositionlook   (write-packet-playerpositionlook conn payload)
+    :playerdigging        (write-packet-playerdigging conn payload)
+    :playerblockplacement (write-packet-playerblockplacement conn payload)
+    :holdingchange        (write-packet-holdingchange conn payload)
+    :usebed               (write-packet-usebed conn payload)
+    :animation            (write-packet-animation conn payload)
+    :entityaction         (write-packet-entityaction conn payload)
+    :pickupspawn          (write-packet-pickupspawn conn payload)
+    :entitypainting       (write-packet-entitypainting conn payload)
+    :stanceupdate         (write-packet-stanceupdate conn payload)
+    :entityvelocity       (write-packet-entityvelocity conn payload)
+    :attachentity         (write-packet-attachentity conn payload)
+    :entitymetadata       (write-packet-entitymetadata conn payload)
+    :multiblockchange     (write-packet-multiblockchange conn payload)
+    :blockchange          (write-packet-blockchange conn payload)
+    :explosion            (write-packet-explosion conn payload)
+    :soundeffect          (write-packet-soundeffect conn payload)
+    :newinvalidstate      (write-packet-newinvalidstate conn payload)
+    :openwindow           (write-packet-openwindow conn payload)
+    :closewindow          (write-packet-closewindow conn payload)
+    :windowclick          (write-packet-windowclick conn payload)
+    :transaction          (write-packet-transaction conn payload)
+    :updatesign           (write-packet-updatesign conn payload)
+    :incrementstatistic   (write-packet-incrementstatistic conn payload)
+    :disconnectkick       (write-packet-disconnectkick conn payload)
+
+    )
+  (flushc conn))
+