def handle_channel_end(self, casting_spell): if not casting_spell.is_channeled(): return if self.unit_mgr.get_type() != ObjectTypes.TYPE_PLAYER: return if self.unit_mgr.channel_object: channel_object = MapManager.get_surrounding_gameobject_by_guid( self.unit_mgr, self.unit_mgr.channel_object) if channel_object and \ channel_object.gobject_template.type == GameObjectTypes.TYPE_RITUAL and \ channel_object.ritual_caster is self.unit_mgr: for player in channel_object.ritual_participants: ritual_channel_spell_id = channel_object.gobject_template.data2 player.spell_manager.remove_cast_by_id( ritual_channel_spell_id) MapManager.remove_object(channel_object) self.unit_mgr.set_channel_object(0) self.unit_mgr.set_channel_spell(0) self.unit_mgr.set_dirty() if self.unit_mgr.get_type() != ObjectTypes.TYPE_PLAYER: return data = pack('<I', 0) self.unit_mgr.enqueue_packet( PacketWriter.get_packet(OpCode.MSG_CHANNEL_UPDATE, data))
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 if self.duel_state == DuelState.DUEL_STATE_STARTED: duel_complete_flag = DuelComplete.DUEL_FINISHED # 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)) MapManager.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) MapManager.send_surrounding(packet, self.arbiter) packet = PacketWriter.get_packet(OpCode.SMSG_CANCEL_COMBAT) for entry in self.players.values(): entry.player.enqueue_packet(packet) entry.player.leave_combat() self.build_update(entry.player) entry.player.set_dirty() entry.player.spell_manager.remove_unit_from_all_cast_targets( entry.target.guid) entry.player.aura_manager.remove_harmful_auras_by_caster( entry.target.guid) # Clean up arbiter go and cleanup. MapManager.remove_object(self.arbiter) # Finally, flush this DualManager instance. self.flush()
def despawn(self, destroy=False): if destroy: MapManager.remove_object(self) else: MapManager.despawn_object(self)