af56f7e
Branches > facts > af56f7e > files / deps.edn
Properly keep track of player list
Commit: af56f7e510f7bfaf4a6aae7b41ddb4f5ce6235e1
Parent: 3059662
4 changed files:
src/net/bowmap/network/client.clj view file
@@ -2,19 +2,31 @@ (:require [net.bowmap.network.packets.clientbound :refer [encode-packet!]] [net.bowmap.network.state :as state]- [net.bowmap.network.streams :as streams])+ [net.bowmap.network.streams :as streams]+ [net.bowmap.server.entity :as entity]+ [net.bowmap.server.server :as server]) (:import [java.net Socket])) (defn send-clientbound-packet [client packet]- (println "sending packet out: " packet)+ #_(println "sending packet out: " packet) (streams/write-frame!! (encode-packet! packet (req! client ::state/connection-state)) (Socket/.getOutputStream (req! client ::socket))) client) +(defn leave! [client-agent]+ (try+ (dosync+ (when-let [uuid (::entity/uuid @client-agent)]+ (commute server/players dissoc uuid)))+ (finally+ (Socket/.close (req! @client-agent ::socket)))))+ (defn client [socket] (agent {::socket socket ::state/connection-state ::state/handshaking} :error-handler (fn [a ex]- (Throwable/.printStackTrace ex *err*)- (Socket/.close socket))))+ (try+ (Throwable/.printStackTrace ex *err*)+ (finally+ (leave! a))))))src/net/bowmap/network/handle.clj view file
@@ -19,7 +19,7 @@ (::pk/id packet))) (defmethod handler :default [client pk]- (prn "Unhandled packet:" pk)+ #_(prn "Unhandled packet:" pk) client) (defmethod handler ::serverbound/handshaking [client pk]@@ -123,11 +123,12 @@ (defmethod handler ::serverbound/finish-config [client _] (let [entity-id (entity/next-entity-id!)+ uuid (req! client ::entity/uuid) client (assoc client ::state/connection-state ::state/play ::entity/id entity-id) player {::entity/id entity-id- ::entity/uuid (req! client ::entity/uuid)}]+ ::entity/uuid uuid}] (client/send-clientbound-packet client {::pk/id ::clientbound/login :entity-id entity-id@@ -153,7 +154,7 @@ :enforce-secure-chat? true}) (dosync- (commute server/players conj player))+ (commute server/players assoc uuid player)) (client/send-clientbound-packet client {::pk/id ::clientbound/game-eventsrc/net/bowmap/network/server.clj view file
@@ -1,7 +1,7 @@ (ns net.bowmap.network.server (:require [clojure.core.async :refer [io-thread]]- [net.bowmap.network.client :as client]+ [net.bowmap.network.client :as client :refer [leave!]] [net.bowmap.network.handle :as handle] [net.bowmap.network.streams :as streams]) (:import@@ -17,11 +17,12 @@ (io-thread (try (loop []+ ; TODO this is another way the client can leave! (let [frame (streams/read-frame!! input-stream)] (send client-agent handle/process-serverbound-frame frame)) (recur)) (catch EOFException _) (catch SocketException _) (finally- (Socket/.close socket)))))+ (leave! client-agent))))) (recur))))src/net/bowmap/server/server.clj view file
@@ -1,4 +1,4 @@ (ns net.bowmap.server.server) -(defonce players (ref #{}))+(defonce players (ref {})) (def max-player-count 1000)