From 88573a22b21c4f7929a37846b181c35f10220066 Mon Sep 17 00:00:00 2001 From: Hipstercat Date: Tue, 5 Mar 2019 01:49:13 +0100 Subject: [PATCH] Added map download --- dpnet/netserver.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ server.py | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/dpnet/netserver.py b/dpnet/netserver.py index 4cd79b4..656f198 100644 --- a/dpnet/netserver.py +++ b/dpnet/netserver.py @@ -1,3 +1,5 @@ +import os + from .packet import Packet from .EnumQuery import EnumQuery from .EnumResponse import EnumResponse @@ -559,6 +561,48 @@ class Netserver(asyncio.DatagramProtocol): await self.server.broadcast_event("on_player_left", player) await self.server.remove_player(player) + elif payload[0] == 0x4d: + # CLIENT DOWNLOAD MAP + player = self.get_player(session) + if not player: + logger.debug("Fuck that no player wtf man") + return + + payload = Packet() + payload.putByte(0x4e) # packet opcode + #payload.putByte(0x9d) # packet opcode? + + mapsize = os.stat("maps/"+self.server.currentmap.mappath).st_size + payload.putULong(mapsize) # map size + payload.putBytes((self.server.currentmap.mapname+"\x00"*(128-len(self.server.currentmap.mapname))).encode("ascii")) + + await player.session.send_gamedata(payload.getvalue()) + + with open("maps/"+self.server.currentmap.mappath, "rb") as fh: + data = fh.read(512) + while data != b"": + if len(data) == 512: + # full packet + mapdl = Packet() + mapdl.putByte(0x4f) # opcode + mapdl.putByte(0x00) # unknown + mapdl.putByte(0x02) # unknown + mapdl.putByte(0x00) # unknown + mapdl.putByte(0x00) # unknown + mapdl.putBytes(data) + mapdl.putByte(0x00) # ending + await player.session.send_gamedata(mapdl.getvalue(), acknow=False) # map chunk + else: + # last packet + mapdl = Packet() + mapdl.putByte(0x4f) # opcode + mapdl.putULong(len(data)) # map end length + mapdl.putBytes(data) + # fill with crap at the end + mapdl.putBytes(b"\x00"*(512-len(data))) + mapdl.putByte(0x00) # ending + await player.session.send_gamedata(mapdl.getvalue(), acknow=False) # map chunk + data = fh.read(512) def send_packet(self, addr, packet): diff --git a/server.py b/server.py index 53f8260..3c9e8a6 100644 --- a/server.py +++ b/server.py @@ -22,7 +22,7 @@ class Server: self.register_with_ms = kwargs.get("register", False) self.teams = kwargs.get("teams", Teams.MvM) self.game_type = kwargs.get("gametype", GameTypes.TeamDeathmatchWithFullBase) - self.currentmap = kwargs.get("map", Map("test3.gck")) + self.currentmap = kwargs.get("map", Map("Testmap.gck")) self.maxplayers = kwargs.get("maxplayers", 20) self.name = kwargs.get("name", "Default Server Name")