def logout(self): # TODO: Temp hackfix until groups are saved in db if self.group_manager: self.group_manager.leave_party( self, force_disband=self.group_manager.party_leader == self) self.session.save_character() GridManager.remove_object(self) self.session.player_mgr = None self.session = None self.is_online = False
def end_duel(self, duel_winner_flag, duel_complete_flag, winner): if not self.arbiter or self.duel_state == DuelState.DUEL_STATE_FINISHED or not self.players: return # Set this first to prevent next tick to trigger. self.duel_state = DuelState.DUEL_STATE_FINISHED if duel_winner_flag == DuelWinner.DUEL_WINNER_KNOCKOUT: # TODO: Should trigger EMOTE BEG on loser? # TODO: Should root loser for 3 secs? pass # Send either the duel ended by natural means or if it was canceled/interrupted packet = PacketWriter.get_packet(OpCode.SMSG_DUEL_COMPLETE, pack('<B', duel_complete_flag)) GridManager.send_surrounding(packet, self.arbiter) # Was not interrupted, broadcast duel result. if duel_complete_flag == DuelComplete.DUEL_FINISHED: winner_name_bytes = PacketWriter.string_to_bytes(winner.player.name) loser_name_bytes = PacketWriter.string_to_bytes(self.players[winner.guid].target.player.name) data = pack(f'<B{len(winner_name_bytes)}s{len(loser_name_bytes)}s', duel_winner_flag, winner_name_bytes, loser_name_bytes) packet = PacketWriter.get_packet(OpCode.SMSG_DUEL_WINNER, data) GridManager.send_surrounding(packet, self.arbiter) packet = PacketWriter.get_packet(OpCode.SMSG_CANCEL_COMBAT) for entry in self.players.values(): entry.player.session.enqueue_packet(packet) entry.player.leave_combat() self.build_update(entry.player) entry.player.set_dirty() # Clean up arbiter go and cleanup. GridManager.remove_object(self.arbiter) # Finally, flush this DualManager instance. self.flush()
def logout(self): self.session.save_character() GridManager.remove_object(self) self.session.player_mgr = None self.session = None self.is_online = False