src/clojurecraft/out.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.out
  (:use [clojurecraft.mappings]))

; Writing Data ---------------------------------------------------------------------
(defn- -write-byte [conn i]
  (doto (:out @conn)
    (.writeByte (int i))))

(defn- -write-bytearray [conn ba]
  (doto (:out @conn)
    (.write ba 0 (count ba))))

(defn- -write-short [conn i]
  (doto (:out @conn)
    (.writeShort (int i))))

(defn- -write-shortarray [conn sa]
  (map #(-write-short %) sa))

(defn- -write-int [conn i]
  (doto (:out @conn)
    (.writeInt (int i))))

(defn- -write-long [conn i]
  (doto (:out @conn)
    (.writeLong (int i))))

(defn- -write-double [conn i]
  (doto (:out @conn)
    (.writeDouble (int i))))

(defn- -write-float [conn i]
  (doto (:out @conn)
    (.writeFloat (int i))))

(defn- -write-string-utf8 [conn s]
  (doto (:out @conn)
    (.writeUTF s)))

(defn- -write-string-ucs2 [conn s]
  (-write-short conn (count s))
  (doto (:out @conn)
    (.writeChars s)))

(defn- -write-bool [conn 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 (:keepalive packet-ids)))

(defn- write-packet-handshake [conn {username :username}]
  (-write-byte conn (:handshake packet-ids))

  (-write-string-ucs2 conn username))

(defn- write-packet-login [conn {version :version, username :username}]
  (-write-byte conn (:login packet-ids))

  (-write-int conn version)
  (-write-string-ucs2 conn username)
  (-write-long conn 0)
  (-write-byte conn 0))

(defn- write-packet-chat [conn {message :message}]
  (-write-byte conn (:chat packet-ids))

  (-write-string-ucs2 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-string-ucs2 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-string-utf8 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-string-ucs2 conn text1)
  (-write-string-ucs2 conn text2)
  (-write-string-ucs2 conn text3)
  (-write-string-ucs2 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-string-ucs2 conn reason))


; Writing Wrappers -----------------------------------------------------------------
(defn- flushc [conn]
  (doto (:out @conn) (.flush)))

(defn write-packet [bot packet-type payload]
  (println (str "<--WRITING-- " packet-type))
  (println payload)
  (let [conn (:connection bot)]
    (case packet-type
      :keepalive            (write-packet-keepalive 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))
  (println "written\n\n"))