af56f7e

Branches > main > af56f7e > files / src / net / bowmap

Properly keep track of player list

Grahp, 2026-08-20

Commit: af56f7e510f7bfaf4a6aae7b41ddb4f5ce6235e1
Parent: 3059662

4 changed files:

src/net/bowmap/network/client.clj modified (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 modified (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-event

src/net/bowmap/network/server.clj modified (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 modified (view file)

@@ -1,4 +1,4 @@ (ns net.bowmap.server.server) -(defonce players (ref #{}))+(defonce players (ref {})) (def max-player-count 1000)