9000abb
Branches > main > 9000abb > files / src / net / bowmap / stormbow
Move player count tracking to fact handling
Commit: 9000abbe1b4e1e75958e016fdf6cedff3a8b184f
Parent: 6934025
3 changed files:
src/net/bowmap/network/handle.clj 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? falsesrc/net/bowmap/server/logic.clj 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 view file
@@ -0,0 +1 @@+(ns net.bowmap.server.player)