Beispiel #1
0
    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))
Beispiel #2
0
    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()
Beispiel #3
0
 def despawn(self, destroy=False):
     if destroy:
         MapManager.remove_object(self)
     else:
         MapManager.despawn_object(self)