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