Ejemplo n.º 1
0
    async def on_player_won(self, player, order, player_time):
        if self.username == player.username:
            self.last_record_time = player_time
        if self.is_playing:
            return
        if player.username not in self.stalked_players:
            return
        if self._room.map.xml:
            hole_pos = self._room.map.hole_pos
            for key in hole_pos:
                hole_color = key["CT"] if "CT" in key else 0
                packet = Packet.new(5, 18).write8(hole_color).write32(
                    self._room.round_code).write32(
                        self._room.map.code).write16(15).write16(
                            key["X"]).write16(key["Y"])
                if not self.is_recording:
                    if self.first_stalked_player == player.username:
                        await self.bulle.send(packet)
                    return

                if self.is_bootcamp_room:
                    if self._room.map.is_reversed:
                        self.stalked_players[
                            player.username]["map_movements"] *= 0
                        return await self.sendRoomMessage(
                            "!me Run ignored. Map is reversed")
                    if self.last_record_time < player_time:
                        self.stalked_players[
                            player.username]["map_movements"] *= 0
                        return
                    self.last_record_time = player_time

                await self.save_movement(player.username, str(bytes(packet)),
                                         "hole")

                loop.create_task(
                    update_maps_storage(
                        "@" + str(self._room.map.code),
                        (ujson.dumps(self.stalked_players[player.username]
                                     ["map_movements"],
                                     ensure_ascii=False), self._room.map.xml)))

                self.stalked_players[player.username]["map_movements"] *= 0
                break
        else:
            if self.first_stalked_player == player.username:
                await self.bulle.send(
                    Packet.new(5, 18).write8(0).write32(
                        self._room.round_code).write32(
                            self._room.map.code).write16(15).write16(
                                fix_pos(player.x)).write16(fix_pos(player.y)))
Ejemplo n.º 2
0
 async def on_player_cheese_state_change(self, player):
     if self.is_playing or player.username not in self.stalked_players:
         return
     if self._room.map.xml:
         cheese_pos = self._room.map.cheese_pos
         for key in cheese_pos:
             packet = Packet.new(5,
                                 19).write32(self._room.round_code).write16(
                                     key["X"]).write16(key["Y"]).write24(15)
             if not self.is_recording:
                 if self.first_stalked_player == player.username:
                     await self.bulle.send(packet)
                 return
             return await self.save_movement(player.username,
                                             str(bytes(packet)), "cheese")
     if self.first_stalked_player == player.username:
         await self.bulle.send(
             Packet.new(5, 19).write32(self._room.round_code).write16(
                 fix_pos(player.x)).write16(fix_pos(player.y)).write24(15))
Ejemplo n.º 3
0
    async def play_map(self, sequence=None):
        if not self.is_playing:
            return
        if not self.is_bootcamp_room:
            await asyncio.sleep(self.born_period)

        cheese_pos, hole_pos = self._room.map.cheese_pos, self._room.map.hole_pos
        round_code = self._room.round_code

        move = 0
        _sequence = json.loads(sequence)
        for i in _sequence:
            time_sleep = i[2] if len(i) >= 3 else 1
            
            if not isinstance(i[0], dict):
                _bytes = i[0][2:].encode().decode('unicode-escape').encode()

            step = i[1]
            if step == 'walk':
                movingRight, movingLeft = i[0]['movingRight'], i[0]['movingLeft']
                x, vx = i[0]['x'], i[0]['vx']

                if self._room.map.is_reversed:
                    x = calc_pos(800 - fix_pos(unpack(">l", pack(">L", x))[0]))

                    if movingRight or movingLeft:
                        movingLeft, movingRight = not movingLeft, not movingRight
                    vx = -unpack(">h", pack(">H", vx))[0] if movingRight else -vx
                packet = Packet.new(4, 4).write32(round_code).writeBool(movingRight).writeBool(movingLeft).write32(x).write32(i[0]['y']).write16(vx).write16(i[0]['vy']).writeBool(i[0]['jumping']).write8(i[0]['frame']).write8(i[0]['onPortal'])
            elif i[1] in ['crouch', 'duck']:
                packet = Packet.new(4, 9).write8(_bytes[2])
            elif step == 'emote':
                packet = Packet.new(8, 1).write8(_bytes[2]).write32(0)
                if len(_bytes) > 8:
                    _len = _bytes[8]
                    flag = unpack(f'!{_len}s', _bytes[9:9+_len])[0]
                    packet.writeString(flag)

            if move > 0:
                await asyncio.sleep(time_sleep)
            if step == "cheese":
                await self._cheese()
            elif step in ["hole", "win"]:
                await self._win()
            else:
                await self.bulle.send(packet)
            move += 1

        self.is_playing = False