diff --git a/dpnet/gamepackets.py b/dpnet/gamepackets.py index bffb180..b6bba9c 100644 --- a/dpnet/gamepackets.py +++ b/dpnet/gamepackets.py @@ -112,22 +112,53 @@ class MSG_DROP_WEAPON(): p.putByte(0x00) return p.getvalue() -class MSG_BULLET_EXPLOSION(): - def __init__(self, player, projectile, x, y, z): +class MSG_NEW_PROJECTILE(): + def __init__(self, player, oid, projectiletype, x, y, z, o): self.player = player - self.projectile = projectile self.x = x self.y = y self.z = z + self.o = o + self.projectiletype = projectiletype + self.oid = oid + + def to_packet(self): + p = Packet() + p.putByte(0x09) # opcode + p.putULong(0x23) + p.putByte(self.player.get_index()) + p.putShort(self.player.oid) + p.putByte(0x00) + p.putByte(0x10) + p.putULong(0x02) + p.putFloat(self.x) + p.putFloat(self.y) + p.putFloat(self.z) + p.putULong(self.o) + p.putShort(self.oid) + p.putShort(0x00) + p.putByte(self.projectiletype) + p.putByte(0x00) + return p.getvalue() + + +class MSG_BULLET_EXPLOSION(): + def __init__(self, player, oid, x, y, z, isbackpackitem): + self.player = player + self.oid = oid + self.x = x + self.y = y + self.z = z + self.isbackpackitem = isbackpackitem def to_packet(self): p = Packet() p.putByte(0x09) # opcode p.putULong(0x1a) p.putByte(self.player.get_index()) - p.putShort(0x0631) + p.putShort(self.oid) p.putByte(0x00) - p.putByte(0x03) + p.putByte(0x03) if not self.isbackpackitem else p.putByte(0x01) # 0x01 for backpackitem, 0x03 for anything else? p.putULong(0x4d) p.putFloat(self.x) p.putFloat(self.y) @@ -187,4 +218,41 @@ class MSG_PLAYER_TELEPORT(): p.putFloat(self.newy) p.putFloat(self.newz) p.putByte(0x00) - return p.getvalue() \ No newline at end of file + return p.getvalue() + + +class MSG_PLAYER_USE_BACKPACK(): + def __init__(self, player, backpackitem): + self.player = player + self.backpackitem = backpackitem + + def to_packet(self): + p = Packet() + p.putByte(0x09) # opcode + p.putULong(0x12) + p.putByte(self.player.get_index()) + p.putShort(self.player.oid) + p.putByte(0x00) + p.putByte(self.backpackitem) # popup? + p.putULong(0x02) + p.putULong(0x46aae90a) # ? + p.putByte(0x00) + return p.getvalue() + + +class MSG_PLAYER_DROP_BACKPACK(): + def __init__(self, player): + self.player = player + + def to_packet(self): + p = Packet() + p.putByte(0x09) # opcode + p.putULong(0x13) + p.putByte(self.player.get_index()) + p.putShort(self.player.oid) + p.putByte(0x11) + p.putULong(0x02) + p.putULong(0x3a04) + p.putByte(0x0a) + p.putByte(0x00) + return p.getvalue() diff --git a/dpnet/netserver.py b/dpnet/netserver.py index 75930db..254554a 100644 --- a/dpnet/netserver.py +++ b/dpnet/netserver.py @@ -668,18 +668,30 @@ class Netserver(asyncio.DatagramProtocol): return await player.send_message("PROJECTILE SHOOT: %s" % payload.hex()) await self.server.broadcast_gamedata_except(player, payload) - await self.server.broadcast_event("on_player_shoot", player) + await self.server.broadcast_event("on_player_shoot", player, payload) elif payload[0] == 0x09 and payload[1] == 0x1a: player = self.get_player(session) if not player: logger.debug("Fuck that no player wtf man") return await player.send_message("PROJECTILE EXPLOSION: %s" % payload.hex()) - #await self.server.broadcast_gamedata_except(player, payload) + await self.server.broadcast_gamedata_except(player, payload) + oid = struct.unpack(" 1 and command[0] == "bullet": + t = int(command[1]) + player.opts["bullet"] = t + + async def on_player_shoot(self, player, payload): + if "bullet" in player.opts and player.opts["bullet"] != 0: + oid = struct.unpack(" 1 and command[0] == "drop": weap = int(command[1]) await player.send_message("Dropped weapon %s" % weap, color=ChatColor.Cyan) - await self.server.broadcast_gamedata(MSG_DROP_WEAPON(player, self.server._nextid, weap, 255).to_packet()) - self.server._nextid += 1 + await self.server.broadcast_gamedata(MSG_DROP_WEAPON(player, self.server.new_oid(), weap, 255).to_packet()) if command[0] == "coords": await player.send_message("You are at (%s,%s,%s)" % (player.x, player.y, player.z), color=ChatColor.Cyan) @@ -161,6 +160,25 @@ class Commands: await player.send_message("Teleporting you to (%s,%s,%s)" % (x, y, z), color=ChatColor.Cyan) await self.server.broadcast_gamedata(MSG_PLAYER_TELEPORT(player, x, y, z, o).to_packet()) + if len(command) > 1 and command[0] == "fire": + weap = int(command[1]) + + if len(command) > 2: + i = int(command[2]) + else: + i = 1 + + for _ in range(i): + x = randint(-200, 200) + y = randint(-200, 200) + z = randint(-200, 200) + o = 0 + await player.send_message("Firing to (%s,%s,%s)" % (x, y, z), color=ChatColor.Cyan) + await self.server.broadcast_gamedata(MSG_NEW_PROJECTILE(player, self.server.new_oid(), weap, x, y, z, o).to_packet()) + + if command[0] == "popup": + await player.send_message("Spawned popup", color=ChatColor.Cyan) + await self.server.broadcast_gamedata(bytes.fromhex("09160000000438000002250000000a000000040700000913000000040700001102000000041d00000a090e00000004380000032500000000")) def setup(server): plugin = Commands(server) diff --git a/plugins/instagib.py b/plugins/instagib.py index af54f27..242948e 100644 --- a/plugins/instagib.py +++ b/plugins/instagib.py @@ -24,34 +24,34 @@ class Instagib: # give stuff await self.give_stuff(player) - async def on_player_shoot(self, player): + async def on_player_shoot(self, player, payload): await self.spawn_sniper(player) async def on_player_hit(self, player, shooter, damage, weapon): # make player die - await self.server.broadcast_gamedata(MSG_PLAYER_DIE(player, 1)) + #await self.server.broadcast_gamedata(MSG_PLAYER_DIE(player, 1)) + pass async def give_stuff(self, player): # remove current weapon - await self.remove_current_weapon(player) + #await self.remove_current_weapon(player) # add sniper await self.spawn_sniper(player) async def spawn_sniper(self, player): - await self.server.broadcast_gamedata(MSG_DROP_WEAPON(player, self.server._nextid, 6, 255).to_packet()) - self.server._nextid += 1 + await self.server.broadcast_gamedata(MSG_DROP_WEAPON(player, self.server.new_oid(), 6, 255).to_packet()) async def remove_current_weapon(self, player): await self.server.broadcast_gamedata(MSG_SWITCH_WEAPON(player, 0xff).to_packet()) async def random_teleport(self, player): # random teleport - maxdist = 300 + maxdist = 2000 x = randint(-(maxdist/2), maxdist/2) y = randint(-(maxdist/2), maxdist/2) z = randint(-(maxdist/2), maxdist/2) - await self.server.broadcast_gamedata(MSG_PLAYER_TELEPORT(player, x, y, z).to_packet()) + await self.server.broadcast_gamedata(MSG_PLAYER_TELEPORT(player, x, y, z, 0).to_packet()) def setup(server): diff --git a/server.py b/server.py index 065a477..53af954 100644 --- a/server.py +++ b/server.py @@ -268,6 +268,11 @@ class Server: await self.broadcast_gamedata(p.getvalue(), acknow=False) #await self.broadcast_gamedata(bytes.fromhex("0a32000000" + plix + struct.pack("