From 8f90633b1611c8f967d13c33e994210fe2986e8c Mon Sep 17 00:00:00 2001 From: steev Date: Sun, 7 Jan 2024 22:27:43 +0100 Subject: [PATCH] moved game management into own class serverside --- Game Server/Classes/Game/Player.py | 10 +- .../Game/__pycache__/Player.cpython-311.pyc | Bin 0 -> 2807 bytes Game Server/Classes/System/GameManager.py | 89 ++++++++++++++++++ .../Classes/System/Network/EventHandler.py | 8 +- .../Classes/System/Network/NetworkManger.py | 64 ++++++++----- .../__pycache__/EventHandler.cpython-311.pyc | Bin 1953 -> 2374 bytes .../__pycache__/NetworkManger.cpython-311.pyc | Bin 9508 -> 10078 bytes Game Server/Classes/System/PlayerManager.py | 15 +-- Game Server/Classes/System/Server.py | 15 ++- Game Server/Classes/System/World.py | 20 ++++ .../__pycache__/GameManager.cpython-311.pyc | Bin 0 -> 3243 bytes .../__pycache__/PlayerManager.cpython-311.pyc | Bin 0 -> 1987 bytes .../System/__pycache__/Server.cpython-311.pyc | Bin 1412 -> 1900 bytes .../System/__pycache__/World.cpython-311.pyc | Bin 0 -> 1183 bytes 14 files changed, 176 insertions(+), 45 deletions(-) create mode 100644 Game Server/Classes/Game/__pycache__/Player.cpython-311.pyc create mode 100644 Game Server/Classes/System/GameManager.py create mode 100644 Game Server/Classes/System/World.py create mode 100644 Game Server/Classes/System/__pycache__/GameManager.cpython-311.pyc create mode 100644 Game Server/Classes/System/__pycache__/PlayerManager.cpython-311.pyc create mode 100644 Game Server/Classes/System/__pycache__/World.cpython-311.pyc diff --git a/Game Server/Classes/Game/Player.py b/Game Server/Classes/Game/Player.py index 8682682..bb9044b 100644 --- a/Game Server/Classes/Game/Player.py +++ b/Game Server/Classes/Game/Player.py @@ -4,10 +4,11 @@ import random class Player: __id:int __hp:int + __mana:int __name:str __handCards:list - def __init__(self, name:str, hp:int=1000): + def __init__(self, name:str, hp:int=1000, mana:int=0): self.__hp = hp self.__name = name self.__handCards = [] @@ -28,6 +29,13 @@ class Player: def getHand(self) -> list: return self.__handCards + def getMana(self) -> int: + return self.__mana + + def addMana(self, amount) -> int: + self.__mana + amount + return self.__mana + def AddToHand(self, card) -> list: self.__handCards.append(card) return self.__handCards diff --git a/Game Server/Classes/Game/__pycache__/Player.cpython-311.pyc b/Game Server/Classes/Game/__pycache__/Player.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83afbc8278b702f1c52d9c347973ebd40bec6551 GIT binary patch literal 2807 zcmcgu%TF6e7@vLEEZ7DEhVV#=TR^SV^rhU|sA>f&5UDN_$pu+jt(YM(wbyjkAVE1e z5~?_GNTo=iUg}d?luQ4R9!!N)v{FyKgc}t-R5|tc&90rbL#mcT$M!eB?=kz$_n2A# zkV^G1jLpBk6KRvN--&4s@M>JVh3SBC#e9do;5h91fs>(p05}!mLEzrdCIj5Z zhv1Xen0y#~nqNb-qkep`Fa)T9pa1 zOA<+ec;q&V@qBjX!@@mJNUz{kh1e|23h&EmWxeo)TPnK3zB@Blm_wejOG0i6S(qs~ zo+msdD+C#TcYVvZkao9Nwe9V`P}mfZU++DT8avGl@0t7Er^92I5~t%g_RJG&cUu!Ld~)eY&cv@!`HVU_nZ0P@b(Fb89a9clTTrjl}`$pJ_` zGSA9EP`~TGsOAyOc5k@Jkne}`f(|0~*f+TUb;BByLty{CTR8%AcvK}B1&+Fn!Oi^Q zcJhVO`Na%uA}+TY)=1#8)g>?>tRkHPXpeM9+lDOKanvDd8}bG;IbB7sD(=y9vSAJ^ zhp%mTw4Y|Bnu2Sv@+ePKsgcJEb^Y6Xvl>@P2kJl_C@)LL!fZ4h3$tTnI6>qJd50r9 z053VBa?j%|M9WP)<;SDGROLSDn`l@QSMiH_(@DP6@8`HJqJD|blJPhZ736=awARt* zL8afs!@^4Yai?6_aI0;_?s7P9+eyezVx33zMh2|pe&W&Uv30#+U2pIH=mx0`RV&T{ zw6|hCdN`pC#*X#`@~17`r2$~?!PVuguM3wqLorwA8jf~t_otlSt*BzA!(-HvP!ha1 zKvXceQGT^1ez7L%=CL(>Vof)!X@nK2vTv+cyp{hkI4R1NP0>7&@6&dpvGoS}&t#>n z0vrkhY!|=%iYSd^YwE_Iqr*T;Urf!b#iyYQrgo z8Ut?)zt6TE*R52YYO&&aura)<^vzNc6Wv-;oz>R}y-tLBNlp`?|0$C8De1nKw?K}9 zURT$zG)YQ?e%=OJqZav`b|-7|wfTqhFF>NVcBgjd;hobKNM{-*eUHt|xoO7UIcFe; zGis^_(@(b)*GZCEZ2WNWoMGxDaV<9b$Rp`!CxL46aFV2x^IJ2WWFM}+8NQpI|1-42@M mV@ZGe=oovSfSenerk%1>O?}SeISpHRnfyVrKQB=z4}Sv|fj`v% literal 0 HcmV?d00001 diff --git a/Game Server/Classes/System/GameManager.py b/Game Server/Classes/System/GameManager.py new file mode 100644 index 0000000..69dfe6b --- /dev/null +++ b/Game Server/Classes/System/GameManager.py @@ -0,0 +1,89 @@ +import socket +from Classes.Game.Player import Player + + +class GameManager: + __players:dict + __playingPlayer:Player + __state:str + __round:str + + def __init__(self): + self.__players = {} + self.__playingPlayer = None + self.__state = "waiting" + self.__round = "none" + pass + + # game round management + # this section manages the flow of rounds this should inherit itself + # ============================================================================= + + # this function iterates all + def progressRound(self): + # phases + # - playerPrep => playing player switches, gets a mana point and gets verified + if self.__playingPlayer != None: + for player in self.__players: + if self.__playingPlayer != player: + self.__playingPlayer = player + else: + self.__playingPlayer = next(iter(self.__players)) + # - playerDraw => player draws a card + # - playerPlay => player can place cards and active effects + # - playerEnd => player ends his turn and the code reiterates with the remaining player + pass + + # game state management + # this section mostly only used by the networking and event handling classes + # other parts should never need to interface with this unless really required + # ============================================================================= + def startGame(self): + self.__state = "running" + + print("game starts") + for userAddr in self.__users.keys(): + try: + user = self.__serverWorld.getPlayers[userAddr] + user.addMana(1000) + user.adjustHP(1000) + + payload = { + "event":"startgame", + "mana": user.getMana(), + "hp": user.getHP() + } + + self.send(payload, userAddr) + except Exception as e: + print(f"failed to start game due to error: {e}") + break + # handles notifying all players that the game starts + pass + + def stopGame(self): + # handles notifying all players that the game stops + # handles stoping the game itself and notifies server to stop itself + pass + + # player management + # the network manager will create a player instance + # ============================================================= + + # gets all player known to the game manager and returns them + def getPlayers(self) -> dict: + return self.__players + + # creates a player and handles counting all players and if conditions met starting the game + # returns the new dict in which the new player now is added + def addPlayers(self, player:Player, socket:socket, clientAddr) -> dict: + self.__players[clientAddr] = { + player: player, + socket:socket + } + + # counts participating players and starts the game if enough have joined + if len(self.__players) == 2: + self.startGame() + + return self.__players \ No newline at end of file diff --git a/Game Server/Classes/System/Network/EventHandler.py b/Game Server/Classes/System/Network/EventHandler.py index 7729d76..38112fc 100644 --- a/Game Server/Classes/System/Network/EventHandler.py +++ b/Game Server/Classes/System/Network/EventHandler.py @@ -1,4 +1,8 @@ import socket +from Classes.Game.Player import Player +from Classes.System.GameManager import GameManager + +from Classes.System.World import World class TCPEventHandler: @@ -8,13 +12,13 @@ class TCPEventHandler: self.__tcpSocket = socket # handles passing of event data to the right functions - def handleTCPEvents(self, event): + def handleTCPEvents(self, event, gameManager:GameManager, address): pass class UDPEventHandler: __udpSocket:socket - def __init__(self, socket:socket): + def __init__(self, socket:socket, gameManager:GameManager): self.__udpSocket = socket def handleUDPEvents(self, event): diff --git a/Game Server/Classes/System/Network/NetworkManger.py b/Game Server/Classes/System/Network/NetworkManger.py index 7c4bedc..38df93a 100644 --- a/Game Server/Classes/System/Network/NetworkManger.py +++ b/Game Server/Classes/System/Network/NetworkManger.py @@ -1,8 +1,11 @@ import json import socket import threading +from Classes.Game.Player import Player +from Classes.System.GameManager import GameManager from Classes.System.Network.EventHandler import UDPEventHandler, TCPEventHandler +from Classes.System.World import World class NetworkManager: @@ -11,24 +14,28 @@ class NetworkManager: __Port:str __BufferSize:int = 1024 __udpSocket:socket - __users:list + __users:dict __eventHandler: UDPEventHandler __UDPClientThread:threading.Thread - - def __init__(self, Addr:str, Port:str): + __gameManager:GameManager + + def __init__(self, Addr:str, Port:str, gameManager:GameManager): self.__Addr = Addr self.__Port = int(Port) - + self.__gameManager = gameManager self.__users = {} self.__eventHandler = {} self.__udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - self.__udpSocket.bind((self.__Addr, self.__Port)) - - # Starten eines Threads für das Empfangen von UDP-Daten + + try: + self.__udpSocket.bind((self.__Addr, self.__Port)) + except OSError as e: + print(f"Error binding UDP socket: {e}") + self.__UDPClientThread = threading.Thread(target=self.receive) self.__UDPClientThread.start() - # handles incomming udp data + # handles incoming udp data def receive(self): while True: data, address = self.__udpSocket.recvfrom(self.__BufferSize) @@ -40,7 +47,7 @@ class NetworkManager: self.__users[user] = address # Storing new user in dictionary # Process the message and handle accordingly - self.__eventHandler.handleUDPEvents(messageJson) + self.__eventHandler.handleUDPEvents(messageJson, self.__serverWorld) print(f"Received message from {address}: {message}") def broadcast(self, payload:dict): @@ -56,15 +63,14 @@ class NetworkManager: __Port:str __BufferSize:int = 1024 __tcpSocket:socket - __users:list - __eventHandler: TCPEventHandler + __eventHandler: dict __TCPClientThread:threading.Thread + __gameManager:GameManager - def __init__(self, Addr:str, Port:str): + def __init__(self, Addr:str, Port:str, gameManager:GameManager): self.__Addr = Addr self.__Port = int(Port) - - self.__users = {} + self.__gameManager = gameManager self.__eventHandler = {} self.__tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__tcpSocket.bind((self.__Addr, self.__Port)) @@ -95,16 +101,20 @@ class NetworkManager: data = client_socket.recv(self.__BufferSize) if not data: print(f"Connection with {client_address} closed.") - break # Verbindung geschlossen, Schleife beenden + break message = data.decode() messageJson = json.loads(message) user = messageJson.get("user") + # creates a user and counts how many currently are connected to the server + # if enough users for a round are connected the server has to start the game if user not in self.__users: - self.__users[user] = client_address + if messageJson["event"] == "login": + self.__gameManager.addPlayers(Player(messageJson["username"]), self.__tcpSocket, client_address) + print(f"connected users {len(self.__users)}") - self.__eventHandler[client_address].handleTCPEvents(messageJson) + self.__eventHandler[client_address].handleTCPEvents(messageJson, self.__gameManager, client_address) print(f"Received message from {client_address}: {message}") except socket.error as e: @@ -118,16 +128,20 @@ class NetworkManager: print(f"Error receiving data from {client_address}: {e}") def broadcast(self, payload:dict): - for user_socket in self.__users.values(): - user_socket.send(json.dumps(payload).encode()) + for user in self.__gameManager.getPlayers().values(): + user["socket"].send(json.dumps(payload).encode()) - def send(self, payload:dict, user:str): - if user in self.__users: - self.__users[user].send(json.dumps(payload).encode()) + def send(self, payload: dict, user: str): + players = self.__gameManager.getPlayers() + + if user in players and "socket" in players[user]: + players[user]["socket"].send(json.dumps(payload).encode()) + else: + print(f"user '{user}' or socket was not found 'socket' failed to send data.") tcp: TCP udp: UDP - def __init__(self, Addr:str, TCPPort:str, UDPPort:str): - self.tcp = self.TCP(Addr, TCPPort) - self.udp = self.UDP(Addr, UDPPort) + def __init__(self, Addr:str, TCPPort:str, UDPPort:str, gameManager:GameManager): + self.tcp = self.TCP(Addr, TCPPort, gameManager) + self.udp = self.UDP(Addr, UDPPort, gameManager) diff --git a/Game Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc b/Game Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc index 783943adb455fbe72e81b035eb9e3335e2990609..4f106e3fe69c2633a8906a481e83da09e3972edd 100644 GIT binary patch literal 2374 zcma)7&2Jk;6rcUH6MLIarG}&=pbD`CEJQydp{i1qMBzX~gd2*C#cH)P1}kej%xr=Z zMJR_JddQ)-L`XrL#<2h8rgdGp?Uy*Kao<`>Hv zBvAhT=O?zT6Y?i^k^+5MI%R0~2qjeUNf}$!SL$k6Rgl+wt*)1Kg{WkaQ2jBX#&eaB zU!lgOY)Fj>noLS#Ql&)f>|Z!=$yP#h*>^V?2hMoZdP2p($kRofrZeAdlzhj04#t+sZa^fQt(yCGtW6J9q{Jwi@b!`Bk2Uj=+gCGp`@c zeNtHwjEjm07~81KGqD;p*D9Yk{91#-X%;JsZk^4P7~f#LGUvNOFi|OO!ti=!i3LA2 z`D&%thT__0n01_5qZT;MRv~3iG11^HcZPxNkoM%;PxRw#;ZXh^kde@Ub-~@qjibzj zDoy3Ups7@O1Ld+%byd2B-`G~4b!GickX#ptVXk&M_qhVm0W~iDJ&dT5thT-s8VoNh zG(Ky7TWf^bb#Pn*yaS#c^f+?^hOXqek*)I_G<*~Zni*zXN;wlkpiMJScpk+=-^r^_ z+$6T96Sf-@#ngZ+FiXq<0mtQrpI+U)xBsY>yB-mBV5FTN`8_|?%1{0L<+Fu@8^_mg zA6>h1eC^Ire)c#&dzhbX=ZBxnM+OX)gZcs0o~e(ILHY zewO$R)E7cW#ZXVdO6$VvJe_`t&bUNpUZTrfqRaN`@T~U0k_1>d0BPD|b1tW0_Ca$a z<_5oD^%MSn5V+o|9FdRtIJ1YN_r0LD0nlBjR+$&b5o3w$0mOK~I12d`xXxBjQQgg; zeJD<@22h-^{U}bP0<(`e0CI}ruUonIB4Qzm0iA*$~{ne8U-oh@DF{q*h`a`m#=0+75nr)leCIMj zhvSJRe#?sTeUFWhiAx^1--y@QyK!#3$3K8Q@W~LnK)_3i(k9l9{MzK*!~Xw|{w`=E db5H>b&XSiXdv&TPjN`bod60)zaiwxt0IUIt*o5cXha2fd7qs(`<>bOzHJQs>i2%T?gyaj`u}-w zWLCYAnXk0_0TLt@AO{9~2WeD5nimGZA6nfjht-voYe-y!jNRtkYV~Il=k$h1``d;z zDuGfm_9V8vfQcFpU-a=i>2~rdAC#y z^Ldq^toq0pU~qxrHcC8!gK$OvGe1wD<#ymLx>c-u-@ZN*3pS6jW$1>OA7euqRHO7z zeT1GFP9*f0m5vW`=rX+eH)|b-qA5As6YILYh`w&yf0rNaDxV8JF_H}aq#9;KZYMc< z``g`elcE=gWRc9u$JCnj$&>zi@}pF%hu|?n!ia bYzOHG-{OXIch4_;9|t?&>*2mx!81GnMMrs& diff --git a/Game Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc b/Game Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc index ef6db75d6c3b4ed9dffff32ad2f76a20dc7f681c..7bc686b6c79c7120bdc8166f1b92f024a1e81e3f 100644 GIT binary patch delta 4212 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 Ky$6i)h4>#f5S{w~ delta 3327 zcmb_eTTEQX89uY;vb!vM-(@fCE|=w!1qWi>Bv|+Y=Hi$bLTlX0q&1~`4lx+-(m4m* zM(biLkz%Rs1D>d$Bo8F9TqF0vs{0aERVpQ}`eZ?cl=LWV-G@X?p4PI{hrXo$KL>UJ zL7zIi=R5!W^Z)bD%zv5l_u-p^?q9pz6#}%+zIsbrT6D+A3yaOo$|ZSBCIa)2m|IcF z86hKoi9*AR?>0oTNNqJ`lXyI{_<7bdsi+mNOJjD`1uB(nj3gJ6PVy^ujbuAjrzWZu znm8$`E|95ID_8*Ia?#8iw4`if>` zywnLQrZ|-|C^~?85WK8PuB*TaOzB5cIhB1|PS*RdE9;bBM;e+gVpT3QpuKswYIMn_E+Ul;xPyc+0vq+gU;ip_rkqyyO#uZ?urOT zm|b#Y$a`$b(HwA5zAOjTvh$NPe~DJIHAkw^S~g5%dM`}m)EVt;-$?(wmNRryo~5w6 zj6!Q!gEQ0B2tqoVtmTc?0ZEepuf~Tp<8q!}9Gb{YyrR)In4%5LXjAiAEsX1T*mdVs z=ent0mu>m897%ch5PD5?X~20WhVRDcztbPOA|T2=xfKbyHHOvIgzK{xN`6f%2u{*_a}n z1I6IPNYTGw$2}7bMakuCT@i}{yl$uYYd0j=CmyYWPjeC!vy1*Pc?VPQ*nTMpiRe*1 znimq$%M%Z1)yEUj4}HHHfJ6*3m+xufVuyX_>&oG`cQ)Sqzh$EYdFNn%6jSUQe~`^M zT%K|o!jPM_2C5_IJKlg(qF21zlFz#k0)dQ=4#Law&WlJ5BfNxw&Z1EO({<*h-WSKu zjDDxTXNV3VJC1Ax9jWEYUNi#}*{n8ejA!$?oR&4F@;RN3pnM9U27o6g4->3Hw4P;x zwaRfESS{r#Bk6l`XpxXGTMGB~qCr!!W~ObZ#n*_1&RS?WiZFnhSZwsnYkk~axXfU^t77RSp%~r0I4Fc`GVlUXsj#BLxZ74=#1}bv37z~)=;WVW>!Hz&(CAud zl>Ic>;+FkqNm1BDb~kyLe9pc~cErAR2+`D=1+c~i%E-P<9s-$UY7p>3YGibX;C^(h zTd%eEx`p4Jhys4(_70@Pj}ocAxcIRUMvMo5^YMXjzarjOkiH)c_jic*JKRVg4-dq| zKgDFAq4J~2eqps+=^@k0haS!2Ix`X?VJpyUXAR!{~%`C@D}?y`)%F%1+3)5nE=JQLAw!p z5KbWUBJhYT-8i%ldAwefO9j7h&f)+s8vRI>E*(06-EH>{*r%s}hXq`%x;xkQTT1Zhg*v>c!Wn^b7f2M%(z=6?hJsAW--gG8d=Yl8xjjQaNrq$tHP(j$WrHx&gH(9=JjC9MzH0&^b5zH%N7mSrZ6XqAQ1)SC@0*&=JrqXP_WBp4AscBe3VY)t&VRDc IC|~D)0aiA)umAu6 diff --git a/Game Server/Classes/System/PlayerManager.py b/Game Server/Classes/System/PlayerManager.py index 297a24a..e149622 100644 --- a/Game Server/Classes/System/PlayerManager.py +++ b/Game Server/Classes/System/PlayerManager.py @@ -1,12 +1,6 @@ import json -from Classes.Objects.Player import Player - class Player: - __users:list - - def __init__(self): - self.__users = [] - + def createUser(self, user:json): self.__users.append(user) @@ -23,12 +17,7 @@ class Player: def getUsers(self) -> list: return self.__users - def getUser(self, user:int) -> (any | None): + def getUser(self, user:int): for user in self.__users: if int(user["id"]) == user: - return user - - def getUser(self, user:str) -> (any | None): - for user in self.__users: - if user["name"] == user: return user \ No newline at end of file diff --git a/Game Server/Classes/System/Server.py b/Game Server/Classes/System/Server.py index f5f4fa6..bc8f7f6 100644 --- a/Game Server/Classes/System/Server.py +++ b/Game Server/Classes/System/Server.py @@ -1,25 +1,32 @@ import json import socket import threading +from Classes.System.GameManager import GameManager from Classes.System.Network.NetworkManger import NetworkManager +from Classes.System.PlayerManager import Player +from Classes.System.World import World class Server: __address:str __tcpPort:str __udpPort:str - + __world:World + __gameManager:GameManager + networkManager:NetworkManager def __init__(self, address:str, tcpPort:str, udpPort:str): self.__address = address self.__tcpPort = tcpPort self.__udpPort = udpPort + self.__world = World() + self.__gameManager = GameManager() - self.startServer() + self.startServer(self.__gameManager) # handles starting the server and assigning socket values to the local reference - def startServer(self): - self.__networkManager = NetworkManager(self.__address, self.__tcpPort, self.__udpPort) \ No newline at end of file + def startServer(self, gameManager:GameManager): + self.__networkManager = NetworkManager(self.__address, self.__tcpPort, self.__udpPort, gameManager) \ No newline at end of file diff --git a/Game Server/Classes/System/World.py b/Game Server/Classes/System/World.py new file mode 100644 index 0000000..f6b2957 --- /dev/null +++ b/Game Server/Classes/System/World.py @@ -0,0 +1,20 @@ +import socket +from Classes.Game.Player import Player + + +class World: + __players:dict + + def __init__(self): + self.__players = {} + + def getPlayers(self) -> list: + return self.__players + + def addPlayers(self, player:Player, socket:socket, clientAddr) -> list: + self.__players[clientAddr] = { + player: player, + socket:socket + } + + return self.__players \ No newline at end of file diff --git a/Game Server/Classes/System/__pycache__/GameManager.cpython-311.pyc b/Game Server/Classes/System/__pycache__/GameManager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fa01a3848fbfa0244ce36df8fdeffee74e8934c GIT binary patch literal 3243 zcmZ`*-ESMm5#Rgb=TSQAi?S^#tZ3L`?5a*`1c9Nra;4Tml`=u?ppBsRKxo%0E$Ybb zooq{`3$wG>Oq=b@+64maL#W;-tPtZ8iq_?CF_iO>EcpPajv8t(CwTe=s^|J0*u5Rr2b(MVFTg32+h zJdP}ZED7w18mzUnP8Ml{ghq2pB^UPj#sNb!TLQ2dk~ykXd;M`RS^t64%#qe^W^74 zTM)KGySmh|i`Oxn-RWd!*gEUr`W3G+aO0>s=2M@B+A*RVZu+Hz zOV85h+C)oU@lH+bPq&Gjc~!98m^YYp2hTlz?b+ZfZ6cj`)jR*n?z}rR^`fnT(U%Ew zX6jGs;~RhcMQdutotkOo-*EG9Y|p!TuALys%(lu;z^fwpK(9nTK7oh;CPX6YgohJq zQ;tST!rX;N`Jl%VR_xFtXrFdF1Ty(#OG@IrE)tPjVZQ3p$y{O(w!-vf-^Qtzn}u@ZrFN4i7qD({gyfUp1?aexiJZdm{uo9PuSb-*s} z*yVpiUi_r!pt_*=8oSLbIKpdylfL}R+GhS{sa#<+=Tw79IWeEEGt@B7tNe1VpbPBr zwHhzO{@(T4+E6fRi*7oBiN)dDXM2X&7x1BfN@#8Qo zR2m4-2Y|DvpZvkyWma>_RjZ%{^_IZbU8R)!DoTF5R@$gkOVpQ`ji)Jx6qI4$I2PaL zF!C|bcd)zbrQ0&F+l*2#(Cz2t-B!*d6(w~Py} zaiJ-GFFqR_Lqvd$blGRdaC78)pIik7zm_rU8naDf)-#58weIr*2!Ub*+W-&jQSkjQ zS7*L|QU3H|YA&mNdU;@OK>PcE266-^5HAHzU|Hg~!*#+3L3~1Z2Abd^3ZkB{;qDPZ zk6a*K?JSyOfeFY9QOS>S=B#t;>)&dCee|~IyuTm?_v4XG@JX1kIntZ-!_)U8+yRy? zWW9fI=Uy{0E`X6^ar!a4y1dGqfSRN@T!cIX(Lv^Ts8z$Hbz#8OpePH*893<{PW1k5XXjok zJ>jM&4!-p)orl{gIqvDkZ;QVvw)8PqA8YDkpZCVPSm?tq4GW6UH2sumu2t!J1!dhd zf3;q!bVgKKUUvL`(=1t56~4y+2yD~jm<(UB9nSG&aJ)u^`}`tGn0(M2j}Z!9zx-d_lXwyJ3vxTU*nR7WXf zXNIvGvS|goAsdpkiHGwLByHj-OQp1lgIJqD^Z2%C{zgUfjV$mCeSzGIj1P7`@TT$j zPX`$m5er<8hU2TmOc44jd=}QgI=7dAwG~N{Jd$aM$0KK((O)}uLy}a IQL*L!1CS`)r~m)} literal 0 HcmV?d00001 diff --git a/Game Server/Classes/System/__pycache__/PlayerManager.cpython-311.pyc b/Game Server/Classes/System/__pycache__/PlayerManager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b43d1ecfcb8993a6fcadb2ea1c26e2632f2f397d GIT binary patch literal 1987 zcmcIk&1(}u6rb7MY&XfK@%yXMrcyulqKJYTiij-~M5~bMAw-st9i^J4b!IEHMC`$X zNtq4xV+qi@0fAzGtw`#f2u6PDuj+kPC|#yG;$ zOS7}A>MSdsCRpV*kHJ9#qi3@}u8!u4H*i-`xQsn0jxll1otZ6Ot5&9}%$^(_FOHX{ zSvJr31ICM^m68xl6!Y`2eY)t!xmv20?l690cHT>rIV-sgPh8mUub$X2VZAzsKrE7V z!>pU1jDa;{pfR>;47H4*mGIYr9i$5$9SjIj=QW5WQX@^6H;)<=cz2FM}zB;foc zfE&Tq{JjW~r`s2)WUDi~Blso2GFZxlXCU@ffX>pqzB|lCNVoy#@;C~Ff+MqoLU0oe zDG-0a4bu^M5P(}U{e0xvNJDEBTKkT#CaqS|dOx|AJk=&No?AD!)vtUq2iMHOH+s{3 zf4Oz+>}vL0D|>F$Jl`_UuY|w03cIBXPs6!gVE-d7a?E;Jk$3iV&ZcL8K)pBi68=IL zVKz)jID+@1_^(;=T^OP_H@*j~Q8hM_lKDhQ;nmzZUM)wQ0x#4hU$=pReBEg0Jdway zR00DN-cg`KR&u~I0>8JSV_;YZR|1I_7b)| zJ>$$(P&aM+{#>aNtY~+|OjWiPKM2ufSv^&_@Exv9!E^wPnDDYsGrtvOgQCDMg!l+z zF?!k>jU8?{kYem`uh5lP4wqo+6$W~hdmZE<`j$(X#xQyTSlvQbW0}V3Hi7A{LP8}! zH&C%5xQ74f8Ac78O5XN|G2(-Ffgb@IvQbO=ufO6rTOjYV~U;cKs7#DnlD8nyS!a3GKn9KFJMnLt#-^7VX%Pwc2%O)-evk zsE|Vry%Y*gX$v_y3GSiC9C~jLJ*eOsW%1nlvCfE{n1a-&c1!~y`PzV^WNKe zQYz&Mj9Z28>8}bQf1!{JH3q}G0FH=FY{?-;G)smgWZ95mmK~*|8mfdg#mRIuLlana zvK`&f1jcS#H7W-&;f8nD8Yyg`8J^nRc+}8Xa$l}qzIG&t16HN zC?il7kcP<4QpMKc%~54bv-1yBL$?c5+mh`f;GA886O==3ld^l1g|lV^Ow+P$MmZnT z_|4s$9`naEdv>HLr>o$&jvdaY^7bepVcDHXN0?1Mkxh2a#v3-1LSjas$l@LT4B&`# zr7kg1FGg1eNlGOJq_jMKHqjGu4Dcis!7KfOUr5!jdL<MREf7`83Lk1<@qipcP6tOP79aNlBnl>Dk1s+>AoYzED<$Swin7;^>2 z%TL!nY~1FQ@do!Pz1R4J^0x2oHa>HmmP^gg*VY@@iIr%(#+qYsPI+VV0Ngu`NL$-I z2zAqJxh>x`@6W`_L@|%ws{`wi{&MA^`gM77I$yl{&HlIhU?`riyz||iAMQL<&-5z; zjpRyy>Pvsh11)Br6YKEc1R7t|cv|}fmv?{YV(0v&g$FEi@YylORp!=8O ztc}&~O>}%4SdW}nYES*24xjtK9RBA2ei)cLrkmf!MRZkkaui9QnNT7(TnaLJ2buH@a+SuhQeys4V zDTnwvu8po`xTi%sgjc6rqkB5OxLF1w3FoI=#04IuU!->xoJJ{sso#jo_z|mu0h^aU z0X9%1N$QhAPdt56>WQaMW`l(KVkxsem#F7^#A;a HRUG7B;)B(? delta 768 zcmZ`#L2DC16n?WiJJ}{?TNBVFMc8_%Y-uY!ScQrTDxM5tKqQAQ!P$DSZE$u~C?$Hx zq1P}79zE5T`U85XcMl?o1ciXmi-OR@mUIr9GBc^o%1gla0|HE1Ws2CfDIL?RV_{`;9Ea%TlPuMDTnd1x_ETEwpe=@ ziq^+dx~0x%Mj2$5!DGt z?R-lh;i$;dK`Jl^77zWEPsEU-N7&R8C-EjqT`HvX$$w^ZVM-Cts_F~)>P@c2ZyTHO zR^xsAq0#YXyWZ>y?b>JB+C@>(%Dyc>)0r`?r_g_T9dt46h4Tpn{LW}e-n7Po?czwA zqIc*>LYX!EDoQ}5wd*=<7Iiub1!4sxf#Wglh<$t}cde2fXQLBZmKHFKDp0W&_1nI@ pQ0GtP!z;p5XZSPGWBHDaR<_}4`>-dpK(OucxU0{9{->%t{sm9QtZM)O diff --git a/Game Server/Classes/System/__pycache__/World.cpython-311.pyc b/Game Server/Classes/System/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a74158dc0d79e833ec6f4645f3ebcb241535bd9f GIT binary patch literal 1183 zcmZ`%&uddb5T1R%nx;)!+aidz7Lh_gdJ+#(L}|6RD8?d$2g@V7%Cj#ob@#QGujvoCGZs_H`oVmcJtPdeYeNAI4D_Oa5ee)n5(ja=s$fmQ?<76lg8AU)jd%b>C20 z+}KWYoQH9kaK2N_d?)7|X3+(NCUh=c-ggd)`?z}OfYehm*;MhFN{E%IWD<=Q*71U_ z8mWMye^a9bG~cWQHI8PQe=d`37>mWz9@I-Kee0 zq;~Q)Fa~5BCO6PPCJdLgYlYS@r(K)oIqVr`S#lJmR#ODi2x-0+g)&a=386G4m`CXs z5D0OufPsg|>gxzi_&z>$_@IMutLxeedFtrl&bQpPZXPCQ2BnotV>FZ)XUBP(=e*t! zn-SULoWI-*qJG2?VJ*SO#e+C*Bta53V$HdtiKR{y>O@^YQ&A&K1?nPNZ7}UK#Fa}S z0@_+3G>2BFIMpmS%dg8_hq+g}a0(uC=iaQ4W9~e7o;&x>>jJ8eTSk2mM*SBuIz#|l zZW=w^f2oV~dKa_CW>pxzvv_q-!*OmYYtJ2Z6$A7J^<#vt%^2%Ip=nkJ7LLyTy50ms P_J6}K^8Nltz~uY`cWn-( literal 0 HcmV?d00001