Пример #1
0
    def _send(self, player_indexes, translated_kwargs):
        """Send the user message to the given players.

        :param iterable player_indexes: All players with the same language
            setting.
        :param AttrDict translated_kwargs: The translated arguments.
        """
        recipients = RecipientFilter(*player_indexes)
        recipients.reliable = self.reliable
        user_message = UserMessage(recipients, self.message_name)

        if user_message.is_protobuf():
            self.protobuf(user_message.buffer, translated_kwargs)
            user_message.send()
        else:
            try:
                self.bitbuf(user_message.buffer, translated_kwargs)
            except:
                # In case of an error during writing to the buffer (e. g. by using
                # the wrong data type for the write_* methods) reset the buffer
                # and send the message. This causes the engine to silently ignore
                # the user message and the server doesn't crash upon creating
                # another user message.
                # See also:
                # https://github.com/Source-Python-Dev-Team/Source.Python/issues/315
                user_message.buffer.reset()

                # Re-raise the exception to make the user aware of the problem
                raise
            finally:
                user_message.send()
Пример #2
0
 def send(self, *player_indexes):
     """Send the user message."""
     # We need to handle the ShowMenu user message with bitbuffers
     # differently, because the maximum size is 255. If the message exceeds
     # this length, we need to sent it in several parts.
     if UserMessage.is_protobuf():
         recipients = RecipientFilter(*player_indexes)
         user_message = UserMessage(recipients, self.message_name)
         self.protobuf(user_message.buffer, self)
         user_message.send()
     else:
         self.bitbuf(player_indexes, self)
Пример #3
0
    def _send(self, player_indexes, translated_kwargs):
        """Send the user message to the given players.

        :param iterable player_indexes: All players with the same language
            setting.
        :param AttrDict translated_kwargs: The translated arguments.
        """
        recipients = RecipientFilter(*player_indexes)
        user_message = UserMessage(recipients, self.message_name)

        if user_message.is_protobuf():
            self.protobuf(user_message.buffer, translated_kwargs)
        else:
            self.bitbuf(user_message.buffer, translated_kwargs)

        user_message.send()
Пример #4
0
    def bitbuf(self, player_indexes, kwargs):
        """Send the ShowMenu with bitbuf."""
        menu_string = kwargs.menu_string
        length = len(menu_string)
        recipients = RecipientFilter(*player_indexes)
        while True:
            user_message = UserMessage(recipients, self.message_name)

            buffer = user_message.buffer
            buffer.write_word(kwargs.valid_slots)
            buffer.write_char(kwargs.display_time)
            buffer.write_byte(length > self.chunk_size)
            buffer.write_string(menu_string[:self.chunk_size])

            user_message.send()

            if length > self.chunk_size:
                menu_string = menu_string[self.chunk_size:]
                length -= self.chunk_size
            else:
                break