9000abb

Branches > facts > 9000abb > files / src / net / bowmap / stormbow

Move player count tracking to fact handling

Grahp, 2026-08-21

Commit: 9000abbe1b4e1e75958e016fdf6cedff3a8b184f
Parent: 6934025

3 changed files:

src/net/bowmap/network/handle.clj modified (view file)

@@ -12,6 +12,7 @@    [net.bowmap.server.entity :as entity]    [net.bowmap.server.gamemode :as gamemode]    [net.bowmap.server.logic :as logic]+   [net.bowmap.server.player :as player]    [net.bowmap.server.server :as server]    [net.bowmap.stormbow.fact :as fact]    [net.bowmap.stormbow.responses :refer [handle-responses!]]))@@ -58,6 +59,7 @@ ; Yield facts from this as well and send 'em in! ; Or well, this can be retried so just use the dosync (defmethod handle-packet ::serverbound/known-packs [client _]+  ; TODO move these tags to the registries namespace   {:packets (conj (vec (registry/registry-packets))                   {::pk/id ::clientbound/update-tags                    :tagged-registries [{:registry "minecraft:block"@@ -89,6 +91,7 @@                   {::pk/id ::clientbound/finish-config})})  +; May want this "world" elsewhere, or have some programmatic code to generate it, or implement anvil and go from there? (defn- build-chunk-packets []   (let [pk {::pk/id ::clientbound/chunk-data-and-update-light             :chunk-data@@ -121,12 +124,9 @@                       ::client/playing? true)         player {::entity/id entity-id                 ::entity/uuid uuid}]-    ; Bad state here, yield a fact instead, but that's later ofc-    (dosync-      (if (@server/players uuid)-        (throw (Exception. "Player tried to join with an existing UUID"))-        (commute server/players assoc uuid player)))     {:client client+     :facts [{::fact/id ::fact/player-joined+              ::player/player player}]      :packets (-> [{::pk/id ::clientbound/login                     :entity-id entity-id                     :hardcore? false

src/net/bowmap/server/logic.clj modified (view file)

@@ -1,25 +1,34 @@ (ns net.bowmap.server.logic   (:require-    [net.bowmap.network.client :as client]-    [net.bowmap.server.server :as server]-    [net.bowmap.stormbow.fact :as fact]-    [net.bowmap.stormbow.response :as response]))+   [net.bowmap.network.client :as client]+   [net.bowmap.server.entity :as entity]+   [net.bowmap.server.player :as player]+   [net.bowmap.server.server :as server]+   [net.bowmap.stormbow.fact :as fact]+   [net.bowmap.stormbow.response :as response]))  (defmulti handler   (fn [fact]     (::fact/id fact))) -(defmethod handler ::fact/server-list-requested [fact]-  (let [{:keys! [::client/client]} fact]-    [{::response/id ::response/send-server-list-      ::client/client client-      :server-list-response {:version {:name "26.2"-                                       :protocol 776}-                             :players {:online (count @server/players)-                                       :max server/max-player-count}-                             ; Is this a text component? Could make that interface-                             :description {:text "Bowmap!"}-                             :enforcesSecureChat false}}]))+(defmethod handler ::fact/server-list-requested [{:keys! [::client/client]}]+  [{::response/id ::response/send-server-list+    ::client/client client+    :server-list-response {:version {:name "26.2"+                                     :protocol 776}+                           :players {:online (count @server/players)+                                     :max server/max-player-count}+                           :description {:text "Bowmap!"}+                           :enforcesSecureChat false}}])++::entity/uuid ::player/player++(defmethod handler ::fact/player-joined [{:keys! [::player/player]}]+  (let [{:keys! [::entity/uuid]} player]+    (if (@server/players uuid)+      (throw (Exception. "Player tried to join with an existing UUID"))+      (commute server/players assoc uuid player))+    []))  ; Returns a seq of responses ; And document that this is not called synchronously (hence the transactions as well)

src/net/bowmap/server/player.clj added (view file)

@@ -0,0 +1 @@+(ns net.bowmap.server.player)