# HG changeset patch # User Steve Losh # Date 1312851667 14400 # Node ID 4d4fca0a37f937e24c6569125f356db15407ae1e # Parent 669045aca6f9ca750f65a669760117180783a3cb Refactor. It's pretty, but not for long. :( diff -r 669045aca6f9 -r 4d4fca0a37f9 src/clojurecraft/chunks.clj --- a/src/clojurecraft/chunks.clj Sat Aug 06 15:38:58 2011 -0400 +++ b/src/clojurecraft/chunks.clj Mon Aug 08 21:01:07 2011 -0400 @@ -23,7 +23,7 @@ block-light (get (:light @chunk) i) block-sky-light (get (:sky-light @chunk) i)] (Block. [x y z] - (block-types (int block-type)) + (block-types block-type) block-meta block-light block-sky-light))) diff -r 669045aca6f9 -r 4d4fca0a37f9 src/clojurecraft/core.clj --- a/src/clojurecraft/core.clj Sat Aug 06 15:38:58 2011 -0400 +++ b/src/clojurecraft/core.clj Mon Aug 08 21:01:07 2011 -0400 @@ -10,7 +10,7 @@ (:import [clojurecraft.data Location Entity Block Chunk World Bot]) (:import (java.net Socket) (java.io DataOutputStream DataInputStream) - (java.util.concurrent LinkedBlockingQueue))) + (java.util.concurrent LinkedBlockingQueue TimeUnit))) (def STARTING-LOC (Location. 0 0 0 0 0 0 false)) @@ -50,7 +50,7 @@ (let [conn (:connection bot)] (while (nil? (:exit @conn)) (read-packet bot))) - (println "done")) + (println "done - input handler")) ; TODO: Investigate this. I'm not convinced. @@ -94,14 +94,18 @@ (when (not (nil? location)) (.put outqueue [:playerpositionlook location]) (update-location bot)) - (Thread/sleep 50))))) + (Thread/sleep 50)))) + (println "done - location handler")) (defn output-handler [bot] (let [conn (:connection bot) outqueue (:outqueue bot)] (while (nil? (:exit @conn)) - (let [[packet-type, payload] (.take outqueue)] - (write-packet bot packet-type payload))))) + (let [packet (.poll outqueue 1 TimeUnit/SECONDS)] + (when packet + (let [[packet-type, payload] packet] + (write-packet bot packet-type payload)))))) + (println "done - output handler")) (defn connect [server username] diff -r 669045aca6f9 -r 4d4fca0a37f9 src/clojurecraft/data.clj --- a/src/clojurecraft/data.clj Sat Aug 06 15:38:58 2011 -0400 +++ b/src/clojurecraft/data.clj Mon Aug 08 21:01:07 2011 -0400 @@ -4,20 +4,20 @@ ; ; The location of an entity in the world. ; -; x -> double -; y -> double -; z -> double -; pitch -> double -; yaw -> double -; stance -> double -; onground -> boolean +; x -> Double +; y -> Double +; z -> Double +; pitch -> Double +; yaw -> Double +; stance -> Double +; onground -> Boolean (defrecord Location [x y z pitch yaw stance onground]) ; Entity ; ; A single entity in the world. ; -; eid -> integer +; eid -> Integer ; loc -> Location ; ; despawned -> boolean diff -r 669045aca6f9 -r 4d4fca0a37f9 src/clojurecraft/in.clj --- a/src/clojurecraft/in.clj Sat Aug 06 15:38:58 2011 -0400 +++ b/src/clojurecraft/in.clj Mon Aug 08 21:01:07 2011 -0400 @@ -14,40 +14,44 @@ (reverse s)))) (defn top [b] - (byte (bit-shift-right (bit-and b 0xf0) 4))) + (Integer. (bit-shift-right (bit-and b 0xf0) 4))) (defn bottom [b] - (byte (bit-and b 0x0f))) + (Integer. (bit-and b 0x0f))) (defn to-unsigned [b] (bit-and b 0xff)) + ; Reading Data --------------------------------------------------------------------- (defn- -read-byte [conn] (io! (let [b (.readByte (:in @conn))] - (byte b)))) + (Integer. (int b))))) -(defn- -read-bytearray [conn size] +(defn- -read-bytearray-bare [conn size] (io! (let [ba (byte-array size)] (.read (:in @conn) ba 0 size) ba))) +(defn- -read-bytearray [conn size] + (vec (-read-bytearray-bare conn size))) + (defn- -read-int [conn] (io! (let [i (.readInt (:in @conn))] - i))) + (Integer. i)))) (defn- -read-long [conn] (io! - (let [i (.readLong (:in @conn))] - i))) + (let [l (.readLong (:in @conn))] + (Long. l)))) (defn- -read-short [conn] (io! - (let [i (.readShort (:in @conn))] - i))) + (let [s (.readShort (:in @conn))] + (Short. s)))) (defn- -read-shortarray [conn size] (doall (repeatedly size #(-read-short conn)))) @@ -55,17 +59,17 @@ (defn- -read-bool [conn] (io! (let [b (.readBoolean (:in @conn))] - b))) + (Boolean. b)))) (defn- -read-double [conn] (io! - (let [i (.readDouble (:in @conn))] - i))) + (let [d (.readDouble (:in @conn))] + (Double. d)))) (defn- -read-float [conn] (io! - (let [i (.readFloat (:in @conn))] - i))) + (let [f (.readFloat (:in @conn))] + (Float. f)))) (defn- -read-string-utf8 [conn] (io! @@ -360,7 +364,7 @@ nibbles [] data data] (if (= i len) - [(byte-array nibbles) data] + [nibbles data] (let [next-byte (get data 0) top-byte (top next-byte) bottom-byte (bottom next-byte)] @@ -371,7 +375,7 @@ (defn- -read-packet-mapchunk-decode [predata data-ba] (let [len (* (:sizex predata) (:sizey predata) (:sizez predata)) data (into [] data-ba) - block-types (byte-array (map byte (subvec data 0 len))) + block-types (vec (map int (subvec data 0 len))) data (subvec data len)] (let [[block-metadata data] (-parse-nibbles len data) [block-light data] (-parse-nibbles len data) @@ -379,7 +383,7 @@ [block-types block-metadata block-light sky-light]))) (defn- -read-packet-mapchunk-chunkdata [conn predata] - (let [raw-data (-read-bytearray conn (:compressedsize predata)) + (let [raw-data (-read-bytearray-bare conn (:compressedsize predata)) buffer (byte-array (/ (* 5 (:sizex predata) (:sizey predata) @@ -390,40 +394,37 @@ (.end decompressor) buffer)) -(defn- -update-chunk-data-array [arr new-data start-index] - (println "Updating chunk data array of size " (alength arr) " with new data of size " (count new-data) " beginning at " start-index) - (let [update-slot #(aset arr %1 (get new-data %2))] - (dorun (map update-slot - (range start-index (count new-data)) - (range (count new-data)))))) - +(def FULL-CHUNK (* 16 16 28)) +(def BLANK-CHUNK-ARRAY (vec (repeatedly FULL-CHUNK #(identity nil)))) (defn- -get-or-make-chunk [chunks coords] - (let [CHUNK-ARRAY-LEN (* 16 16 128)] - (or (@chunks coords) - (let [chunk (ref (Chunk. (byte-array CHUNK-ARRAY-LEN) - (byte-array CHUNK-ARRAY-LEN) - (byte-array CHUNK-ARRAY-LEN) - (byte-array CHUNK-ARRAY-LEN)))] - (alter chunks assoc coords chunk) - chunk)))) + (or (@chunks coords) + (let [chunk (ref (Chunk. BLANK-CHUNK-ARRAY + BLANK-CHUNK-ARRAY + BLANK-CHUNK-ARRAY + BLANK-CHUNK-ARRAY))] + (alter chunks assoc coords chunk) + chunk))) (defn- -update-world-with-data [{{chunks :chunks} :world} x y z types meta light sky] (dosync (let [chunk-coords (coords-of-chunk-containing x z) chunk (-get-or-make-chunk chunks chunk-coords) - new-types (byte-array (:types @chunk)) - new-meta (byte-array (:metadata @chunk)) - new-light (byte-array (:light @chunk)) - new-sky (byte-array (:sky-light @chunk)) start-index (block-index-in-chunk x y z)] - (-update-chunk-data-array new-types types start-index) - (-update-chunk-data-array new-meta meta start-index) - (-update-chunk-data-array new-light light start-index) - (-update-chunk-data-array new-sky sky start-index) - (alter chunk assoc :types new-types) - (alter chunk assoc :metadata new-meta) - (alter chunk assoc :light new-light) - (alter chunk assoc :skylight new-sky)))) + (println "Updating chunk data array with new data of size" + (count types) + "beginning at" + start-index) + (if (= (count types) FULL-CHUNK) + (alter chunk assoc + :types types + :metadata meta + :light light + :skylight sky) + (alter chunk assoc + :types (replace-slice (:types @chunk) start-index types) + :metadata (replace-slice (:metadata @chunk) start-index meta) + :light (replace-slice (:light @chunk) start-index light) + :skylight (replace-slice (:sky-light @chunk) start-index sky)))))) (defn- read-packet-mapchunk [bot conn] (let [predata (assoc {} @@ -437,23 +438,19 @@ (let [decompressed-data (-read-packet-mapchunk-chunkdata conn predata) decoded-data (-read-packet-mapchunk-decode predata decompressed-data) [types meta light sky] decoded-data] - (-update-world-with-data bot + (time (-update-world-with-data bot (:x predata) (:y predata) (:z predata) - types meta light sky) + types meta light sky)) (assoc predata :data decompressed-data)))) (defn -update-single-block [bot x y z type meta] - (println "Altering block " x y z " to be " (block-types (int type))) + (println "Altering block " x y z " to be " (block-types type)) (dosync (let [chunk (chunk-containing x z (:chunks (:world bot))) - new-types (byte-array (:types @chunk)) - new-meta (byte-array (:metadata @chunk)) idx (block-index-in-chunk x y z)] (when chunk - (aset new-types idx (byte type)) - (aset new-meta idx (byte meta)) - (alter chunk assoc :types new-types) - (alter chunk assoc :meta new-meta))))) + (alter chunk assoc-in [:types idx] type) + (alter chunk assoc-in [:metadata idx] meta))))) (defn- read-packet-multiblockchange [bot conn] (let [prearrays (assoc {} @@ -653,7 +650,7 @@ (let [conn (:connection bot) packet-id-byte (-read-byte conn)] (let [packet-id (when (not (nil? packet-id-byte)) - (int packet-id-byte)) + packet-id-byte) packet-type (packet-types packet-id)] ; Record the packet type diff -r 669045aca6f9 -r 4d4fca0a37f9 src/clojurecraft/out.clj --- a/src/clojurecraft/out.clj Sat Aug 06 15:38:58 2011 -0400 +++ b/src/clojurecraft/out.clj Mon Aug 08 21:01:07 2011 -0400 @@ -7,7 +7,7 @@ (io! (.writeByte (:out @conn) (int i)))) (defn- -write-bytearray [conn ba] - (io! (.write (:out @conn) ba 0 (count ba)))) + (io! (.write (:out @conn) (byte-array (map byte ba)) 0 (count ba)))) (defn- -write-short [conn i] (io! (.writeShort (:out @conn) (short i)))) diff -r 669045aca6f9 -r 4d4fca0a37f9 src/clojurecraft/util.clj --- a/src/clojurecraft/util.clj Sat Aug 06 15:38:58 2011 -0400 +++ b/src/clojurecraft/util.clj Mon Aug 08 21:01:07 2011 -0400 @@ -13,3 +13,10 @@ (defn invert [m] (apply assoc {} (mapcat reverse m))) + +(defn replace-slice [v start items] + (if (empty? items) + v + (recur (assoc v start (first items)) + (+ 1 start) + (rest items))))