forked from hipstercat/giantsd
Added debug command, WIP sync joining and leaving
This commit is contained in:
parent
1589188357
commit
892b7c8ad4
@ -138,7 +138,7 @@ class DN_MSG_INTERNAl_SEND_CONNECT_INFO(DFrame):
|
|||||||
packet.putULong(self.dwReplySize)
|
packet.putULong(self.dwReplySize)
|
||||||
packet.putULong(self.dwSize)
|
packet.putULong(self.dwSize)
|
||||||
packet.putULong(self.dwFlags)
|
packet.putULong(self.dwFlags)
|
||||||
packet.putULong(self.dwMaxPlayers)
|
packet.putLong(self.dwMaxPlayers)
|
||||||
packet.putULong(self.dwCurrentPlayers)
|
packet.putULong(self.dwCurrentPlayers)
|
||||||
packet.putULong(self.dwSessionNameOffset)
|
packet.putULong(self.dwSessionNameOffset)
|
||||||
packet.putULong(self.dwSessionNameSize)
|
packet.putULong(self.dwSessionNameSize)
|
||||||
|
@ -369,6 +369,7 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
player.phase = PlayerPhases.DN_SEND_CONNECT_INFO
|
player.phase = PlayerPhases.DN_SEND_CONNECT_INFO
|
||||||
|
|
||||||
elif payload[0] == 0xc3:
|
elif payload[0] == 0xc3:
|
||||||
|
# CMESG_CONNECTED
|
||||||
player = self.get_temp_player(session)
|
player = self.get_temp_player(session)
|
||||||
if not player or not player.phase == PlayerPhases.DN_SEND_CONNECT_INFO:
|
if not player or not player.phase == PlayerPhases.DN_SEND_CONNECT_INFO:
|
||||||
return
|
return
|
||||||
@ -485,16 +486,22 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
await player.session.send_gamedata(b"\x10" + struct.pack("<B", player.team) + struct.pack("<L", player.id) + b"\x00\x00", acknow=False)
|
await player.session.send_gamedata(b"\x10" + struct.pack("<B", player.team) + struct.pack("<L", player.id) + b"\x00\x00", acknow=False)
|
||||||
|
|
||||||
# spawn server as mecc
|
# spawn server as mecc
|
||||||
await player.session.send_gamedata(bytes.fromhex("05007300000200000000"), acknow=False)
|
#await player.session.send_gamedata(bytes.fromhex("05007300000200000000"), acknow=False)
|
||||||
await player.session.send_gamedata(bytes.fromhex("0a320000000073000001020000000000000000000000000000000000000000000000000000000000000000000000000000000a120000000073000003020000000000000000"), acknow=False)
|
#await player.session.send_gamedata(bytes.fromhex("0a320000000073000001020000000000000000000000000000000000000000000000000000000000000000000000000000000a120000000073000003020000000000000000"), acknow=False)
|
||||||
|
|
||||||
# spawn Bot 1 as kab
|
# spawn Bot 1 as kab
|
||||||
#await player.session.send_gamedata(bytes.fromhex("05017400000100000000"), acknow=False)
|
#await player.session.send_gamedata(bytes.fromhex("05017400000100000000"), acknow=False)
|
||||||
#await player.session.send_gamedata(bytes.fromhex("0a320000000174000001010000000000000000000000000000000000000000000000000000000000000000000000000000000a120000000174000003020000000000000000"), acknow=False)
|
#await player.session.send_gamedata(bytes.fromhex("0a320000000174000001010000000000000000000000000000000000000000000000000000000000000000000000000000000a120000000174000003020000000000000000"), acknow=False)
|
||||||
|
|
||||||
# spawn Bot 2 as reap
|
# spawn Bot 2 as reap
|
||||||
await player.session.send_gamedata(bytes.fromhex("05027500000300000000"), acknow=False)
|
#await player.session.send_gamedata(bytes.fromhex("05027500000300000000"), acknow=False)
|
||||||
await player.session.send_gamedata(bytes.fromhex("0a320000000275000001030000000000000000000000000000000000000000000000000000000000000000000000000000000a120000000275000003020000000000000000"), acknow=False)
|
#await player.session.send_gamedata(bytes.fromhex("0a320000000275000001030000000000000000000000000000000000000000000000000000000000000000000000000000000a120000000275000003020000000000000000"), acknow=False)
|
||||||
|
|
||||||
|
# TODO: spawn all players except himself
|
||||||
|
await self.spawn_all_players_except(player)
|
||||||
|
|
||||||
|
# TODO: spawn player in other sessions
|
||||||
|
#await self.spawn_player_except(player)
|
||||||
|
|
||||||
# spawn Bot 3 as <id>
|
# spawn Bot 3 as <id>
|
||||||
objid = "75"
|
objid = "75"
|
||||||
@ -550,7 +557,7 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
#logger.info("%s is now at coords (%s,%s,%s)", player.name, player.x, player.y, player.z)
|
#logger.info("%s is now at coords (%s,%s,%s)", player.name, player.x, player.y, player.z)
|
||||||
if player.opts["debug"]:
|
if player.opts["debug"]:
|
||||||
await player.send_message("%s is now at coords (%s,%s,%s, %s). Model: %s" % (player.name, player.x, player.y, player.z, player.o, model))
|
await player.send_message("%s is now at coords (%s,%s,%s, %s). Model: %s" % (player.name, player.x, player.y, player.z, player.o, model))
|
||||||
#await self.server.broadcast_message("(%s,%s,%s, %s,%s)" % (unknown4, unknown5, unknown6, unknown7, unknown9))
|
await self.server.broadcast_gamedata_except(player, payload)
|
||||||
|
|
||||||
elif payload[0] == 0x3a:
|
elif payload[0] == 0x3a:
|
||||||
# CLIENT EXITED
|
# CLIENT EXITED
|
||||||
@ -609,6 +616,77 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
mapdl.putByte(0x00) # ending
|
mapdl.putByte(0x00) # ending
|
||||||
await player.session.send_gamedata(mapdl.getvalue(), acknow=False) # map chunk
|
await player.session.send_gamedata(mapdl.getvalue(), acknow=False) # map chunk
|
||||||
data = fh.read(512)
|
data = fh.read(512)
|
||||||
|
elif payload[0] == 0x0a and payload[1] == 0x12:
|
||||||
|
player = self.get_player(session)
|
||||||
|
if not player:
|
||||||
|
logger.debug("Fuck that no player wtf man")
|
||||||
|
return
|
||||||
|
p = Packet(payload)
|
||||||
|
opcode = p.getByte()
|
||||||
|
length = p.getByte() # length?
|
||||||
|
unknown1 = p.getByte()
|
||||||
|
unknown2 = p.getByte()
|
||||||
|
unknown3 = p.getByte()
|
||||||
|
playerindex = p.getByte()
|
||||||
|
objid = p.getShort()
|
||||||
|
unknown5 = p.getByte()
|
||||||
|
unknown6 = p.getByte()
|
||||||
|
model = p.getULong()
|
||||||
|
direction = p.getShort()
|
||||||
|
orientation = p.getShort()
|
||||||
|
|
||||||
|
if not direction == 0:
|
||||||
|
if player.opts["debug"]:
|
||||||
|
await player.send_message("ObjID %s went: %s, o: %s" % (objid, direction, orientation))
|
||||||
|
await self.server.broadcast_gamedata_except(player, payload)
|
||||||
|
elif payload[0] == 0x0a and payload[1] == 0x12:
|
||||||
|
player = self.get_player(session)
|
||||||
|
if not player:
|
||||||
|
logger.debug("Fuck that no player wtf man")
|
||||||
|
return
|
||||||
|
p = Packet(payload)
|
||||||
|
opcode = p.getByte()
|
||||||
|
length = p.getByte() # length?
|
||||||
|
unknown1 = p.getByte()
|
||||||
|
unknown2 = p.getByte()
|
||||||
|
unknown3 = p.getByte()
|
||||||
|
playerindex = p.getByte()
|
||||||
|
objid = p.getShort()
|
||||||
|
unknown5 = p.getByte()
|
||||||
|
unknown6 = p.getByte()
|
||||||
|
model = p.getULong()
|
||||||
|
direction = p.getShort()
|
||||||
|
orientation = p.getShort()
|
||||||
|
|
||||||
|
if not direction == 0:
|
||||||
|
if player.opts["debug"]:
|
||||||
|
await player.send_message("ObjID %s went: %s, o: %s" % (objid, direction, orientation))
|
||||||
|
await self.server.broadcast_gamedata_except(player, payload)
|
||||||
|
|
||||||
|
elif payload[0] == 0x05: # SPAWN OBJECT
|
||||||
|
player = self.get_player(session)
|
||||||
|
if not player:
|
||||||
|
logger.debug("Fuck that no player wtf man")
|
||||||
|
return
|
||||||
|
p = Packet(payload)
|
||||||
|
opcode = p.getByte()
|
||||||
|
plix = p.getByte() # length?
|
||||||
|
oid = p.getShort()
|
||||||
|
unknown = p.getByte()
|
||||||
|
model = p.getULong()
|
||||||
|
|
||||||
|
player.oid = oid
|
||||||
|
|
||||||
|
await self.server.broadcast_gamedata_except(player, payload)
|
||||||
|
else:
|
||||||
|
player = self.get_player(session)
|
||||||
|
if not player:
|
||||||
|
logger.debug("Fuck that no player wtf man")
|
||||||
|
return
|
||||||
|
if player.opts["debug"]:
|
||||||
|
await player.send_message("Unknown: %s" % payload.hex())
|
||||||
|
|
||||||
|
await self.server.broadcast_gamedata_except(player, payload)
|
||||||
|
|
||||||
|
|
||||||
def build_players_dpid(self, exceptplayer=False):
|
def build_players_dpid(self, exceptplayer=False):
|
||||||
@ -627,6 +705,32 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
p1 += b'\x00\x00'
|
p1 += b'\x00\x00'
|
||||||
return p1
|
return p1
|
||||||
|
|
||||||
|
async def spawn_player_except(self, player):
|
||||||
|
plix = self.server.get_player_index(player)
|
||||||
|
p = Packet()
|
||||||
|
p.putByte(0x05) # opcode
|
||||||
|
p.putByte(plix)
|
||||||
|
p.putShort(player.oid)
|
||||||
|
p.putByte(0x00)
|
||||||
|
p.putULong(2) # 2: mecc
|
||||||
|
p.putByte(0x00)
|
||||||
|
|
||||||
|
await self.server.broadcast_gamedata_except(player, p.getvalue())
|
||||||
|
|
||||||
|
async def spawn_all_players_except(self, player):
|
||||||
|
for pplayer in self.server.players:
|
||||||
|
if pplayer.name == "[Server]" or pplayer == player:
|
||||||
|
continue
|
||||||
|
plix = self.server.get_player_index(pplayer)
|
||||||
|
p = Packet()
|
||||||
|
p.putByte(0x05) # opcode
|
||||||
|
p.putByte(plix)
|
||||||
|
p.putShort(pplayer.oid)
|
||||||
|
p.putByte(0x00)
|
||||||
|
p.putULong(2) # 2: mecc
|
||||||
|
p.putByte(0x00)
|
||||||
|
await player.session.send_gamedata(p.getvalue())
|
||||||
|
|
||||||
def send_packet(self, addr, packet):
|
def send_packet(self, addr, packet):
|
||||||
self.remotesocket.sendto(packet.getvalue(), addr)
|
self.remotesocket.sendto(packet.getvalue(), addr)
|
||||||
#logger.debug("%s:%s < %s", addr[0], addr[1], packet.getvalue().hex())
|
#logger.debug("%s:%s < %s", addr[0], addr[1], packet.getvalue().hex())
|
||||||
|
@ -60,7 +60,7 @@ class Commands:
|
|||||||
|
|
||||||
if command[0] == "spawn" and len(command) > 1:
|
if command[0] == "spawn" and len(command) > 1:
|
||||||
await self.server.broadcast_message("Spawning " + command[1] + "")
|
await self.server.broadcast_message("Spawning " + command[1] + "")
|
||||||
await self.server.spawn(player, 0, int(command[1]))
|
await self.server.spawn(player, int(command[1]))
|
||||||
|
|
||||||
if command[0] == "changeme" and len(command) > 1:
|
if command[0] == "changeme" and len(command) > 1:
|
||||||
await self.server.broadcast_message("Changing your model to " + command[1] + "")
|
await self.server.broadcast_message("Changing your model to " + command[1] + "")
|
||||||
|
@ -3,10 +3,11 @@ import random
|
|||||||
class Greetings:
|
class Greetings:
|
||||||
def __init__(self, server):
|
def __init__(self, server):
|
||||||
self.server = server
|
self.server = server
|
||||||
self.messages = ["Welcome %s!", "Beware! %s has arrived!", "A wild %s appears", "%s has come and is ready to pwn."]
|
self.join_messages = ["Welcome %s!", "Beware! %s has arrived!", "A wild %s appears.", "%s has come and is ready to pwn."]
|
||||||
|
self.left_messages = ["%s has left.", "%s has stopped Giants and started playing Apex. Shame!", "A wild %s disappeared.", "%s was happy with the score and left the game."]
|
||||||
|
|
||||||
async def on_player_join(self, player):
|
async def on_player_join(self, player):
|
||||||
await self.server.broadcast_message(random.choice(self.messages) % player.name)
|
await self.server.broadcast_message(random.choice(self.join_messages) % player.name)
|
||||||
|
|
||||||
async def on_map_change(self, newmap):
|
async def on_map_change(self, newmap):
|
||||||
await self.server.broadcast_message("You are now playing on "+newmap.mapname)
|
await self.server.broadcast_message("You are now playing on "+newmap.mapname)
|
||||||
@ -15,7 +16,7 @@ class Greetings:
|
|||||||
await self.server.broadcast_message("%s switched to team %s" % (player.name, newteam))
|
await self.server.broadcast_message("%s switched to team %s" % (player.name, newteam))
|
||||||
|
|
||||||
async def on_player_left(self, player):
|
async def on_player_left(self, player):
|
||||||
await self.server.broadcast_message("%s has left the game" % player.name)
|
await self.server.broadcast_message(random.choice(self.left_messages) % player.name)
|
||||||
|
|
||||||
|
|
||||||
def setup(server):
|
def setup(server):
|
||||||
|
@ -152,7 +152,8 @@ class Server:
|
|||||||
continue
|
continue
|
||||||
await pplayer.send_message(text, color=color, type=type)
|
await pplayer.send_message(text, color=color, type=type)
|
||||||
|
|
||||||
async def spawn(self, player, plix, model):
|
async def spawn(self, player, model):
|
||||||
|
plix = self.get_player_index(player)
|
||||||
p = Packet()
|
p = Packet()
|
||||||
p.putByte(0x05) # opcode
|
p.putByte(0x05) # opcode
|
||||||
p.putByte(plix)
|
p.putByte(plix)
|
||||||
|
Loading…
Reference in New Issue
Block a user