# HG changeset patch # User Steve Losh # Date 1314400304 14400 # Node ID 5e3e3e14ea5c53890e77d95e83f0a84877d076d4 # Parent 4c1055d7237745fd9f581c5a88218086912271d5 Change actions to return maps, and add a perform function. diff -r 4c1055d72377 -r 5e3e3e14ea5c src/clojurecraft/actions.clj --- a/src/clojurecraft/actions.clj Fri Aug 26 18:40:45 2011 -0400 +++ b/src/clojurecraft/actions.clj Fri Aug 26 19:11:44 2011 -0400 @@ -9,72 +9,98 @@ (queue-action-group action-group))) +; Performers ----------------------------------------------------------------------- +(defn- move! [bot x-change y-change z-change] + (let [player (:player bot)] + (when (:loc @player) + (dosync + (let [location (:loc @player) + new-location (merge location + {:x (+ x-change (:x location)) + :y (+ y-change (:y location)) + :z (+ z-change (:z location)) + :stance (+ y-change (:stance location))})] + (alter player merge {:loc new-location})))))) + +(defn- jump! [bot] + (let [player (:player bot)] + (when (:loc @player) + (dosync + (let [location (:loc @player)] + (alter player assoc-in [:loc :onground] false) + (alter player assoc :velocity physics/JUMP-VELOCITY)))))) + +(defn- chat! [bot message] + (write-packet bot :chat {:message message})) + +(defn- turn-to! [bot yaw] + (let [player (:player bot)] + (dosync + (let [location (:loc @player) + new-location (assoc location :yaw yaw)] + (alter player assoc :loc new-location))))) + +(defn- look-to! [bot pitch] + (let [player (:player bot)] + (dosync + (let [location (:loc @player) + new-location (assoc location :pitch pitch)] + (alter player assoc :loc new-location))))) + +(defn- respawn! [bot] + (write-packet bot :respawn {:world 0})) ; Always respawn in the normal (non-Nether) world for now. + + +(defn perform [action] + (let [performer ({:move move! + :jump jump! + :chat chat! + :turn-to turn-to! + :look-to look-to! + :respawn respawn!} (:action action))] + (apply performer (:bot action) (:args action)))) + + +; Public Actions ------------------------------------------------------------------- (defn move [bot x-change y-change z-change] - (delay - (let [player (:player bot)] - (when (:loc @player) - (dosync - (let [location (:loc @player) - new-location (merge location - {:x (+ x-change (:x location)) - :y (+ y-change (:y location)) - :z (+ z-change (:z location)) - :stance (+ y-change (:stance location))})] - (alter player merge {:loc new-location}))))))) + {:bot bot :action :move :args [x-change y-change z-change]}) (defn jump [bot] - (delay - (let [player (:player bot)] - (when (:loc @player) - (dosync - (let [location (:loc @player)] - (alter player assoc-in [:loc :onground] false) - (alter player assoc :velocity physics/JUMP-VELOCITY))))))) + {:bot bot :action :jump :args []}) (defn chat [bot message] - (delay - (write-packet bot :chat {:message message}))) + {:bot bot :action :chat :args [message]}) (defn turn-to [bot yaw] - (delay - (let [player (:player bot)] - (dosync - (let [location (:loc @player) - new-location (assoc location :yaw yaw)] - (alter player assoc :loc new-location)))))) + {:bot bot :action :turn-to :args [yaw]}) (defn turn-north [bot] - (turn-to bot 90.0)) + {:bot bot :action :turn-to :args [90.0]}) (defn turn-south [bot] - (turn-to bot 270.0)) + {:bot bot :action :turn-to :args [270.0]}) (defn turn-east [bot] - (turn-to bot 180.0)) + {:bot bot :action :turn-to :args [180.0]}) (defn turn-west [bot] - (turn-to bot 0.0)) + {:bot bot :action :turn-to :args [0.0]}) (defn look-to [bot pitch] - (delay - (let [player (:player bot)] - (dosync - (let [location (:loc @player) - new-location (assoc location :pitch pitch)] - (alter player assoc :loc new-location)))))) + {:bot bot :action :look-to :args [pitch]}) (defn look-up [bot] - (look-to bot -90.0)) + {:bot bot :action :look-to :args [-90.0]}) -(defn look-down[bot] - (look-to bot 90.0)) +(defn look-down [bot] + {:bot bot :action :look-to :args [-90.0]}) (defn look-straight [bot] - (look-to bot 0.0)) + {:bot bot :action :look-to :args [-0.0]}) (defn respawn [bot] - (delay - (write-packet bot :respawn {:world 0}))) ; Always respawn in the normal (non-Nether) world for now. + {:bot bot :action :respawn :args []}) + diff -r 4c1055d72377 -r 5e3e3e14ea5c src/clojurecraft/core.clj --- a/src/clojurecraft/core.clj Fri Aug 26 18:40:45 2011 -0400 +++ b/src/clojurecraft/core.clj Fri Aug 26 19:11:44 2011 -0400 @@ -6,7 +6,7 @@ (:use [clojure.contrib.pprint :only (pprint)]) (:require [clojurecraft.chunks :as chunks]) (:require [clojurecraft.physics :as physics]) - (:require [clojurecraft.actions :as act]) + (:require [clojurecraft.actions :as actions]) (:require (clojurecraft.data)) (:import [clojurecraft.data Location Entity Block Chunk World Bot]) (:import (java.net Socket) @@ -100,7 +100,7 @@ (while (nil? (:exit @conn)) (let [action (.poll actionqueue 1 TimeUnit/SECONDS)] (when action - (force action))))) + (actions/perform action))))) (println "done - action handler") (println "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"))