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)))
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))
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