Page 1 of 1

Sending messages to all players

Posted: Fri Aug 30, 2013 4:20 am
by arawra
There is no error on the code, but on round_start no message appears.

Syntax: Select all

import messages

from events import Event

from player_c import CPlayerGenerator
from players.helpers import index_from_playerinfo

@Event
def round_start(game_event):
welcome = '[DND] Welcome to DND!'
for players in CPlayerGenerator():
i = index_from_playerinfo(players)
m = messages.SayText(index=i, chat=1, message=welcome)
m.send(i)

Posted: Fri Aug 30, 2013 4:22 am
by arawra
Oops, had to change messages.SayText to messages.SayText2

Posted: Fri May 09, 2014 3:46 pm
by Tuck
Going to bump this thread instead of creating a new, How would i use saytext2 with the current release?

Edit: Would be great with an example for hinttext (hud hint) also

Thanks in advance

Posted: Fri May 09, 2014 5:36 pm
by arawra
You can supply your own tag to use on the second line.

Syntax: Select all

msg('This will be sent to all players.')

def msg(the_message):
formatted_message = '%s'%the_message
for players in PlayerGenerator():
i = index_from_playerinfo(players)
m = messages.SayText2(index=i, chat=1, message=formatted_message)
m.send(i)

Posted: Fri May 09, 2014 6:10 pm
by satoon101
No need to loop through all players yourself. If you do not pass a value for users, all users are sent the message. Also, the message package classes automatically loop through and send the appropriate translation for each user. This is how I would use both SayText2 and HintText:

Syntax: Select all

from messages import HintText
from messages import SayText2

my_hint = HintText(message='This is a test hinttext message')
my_saytext2 = SayText2(message='\x01One\x02 Two\x03 Three\x04 Four\x05 Five\x06 Six\x07 Seven')

def something():
my_hint.send()
my_saytext2.index = 1
my_saytext2.send()

Also, as I stated, you can pass in LangStrings values for the message, and each of the users will be sent their specific translation:

Syntax: Select all

# ../resource/source-python/translations/myaddon.ini
[HintText]
en = "This is a test hinttext message"

[SayText2]
en = "\x01One\x02 Two\x03 Three\x04 Four\x05 Five\x06 Six\x07 Seven"

Syntax: Select all

from messages import HintText
from messages import SayText2
from translations.strings import LangStrings

my_strings = LangStrings('myaddon')

my_hint = HintText(message=my_strings['HintText'])
my_saytext2 = SayText2(message=my_strings['SayText2'])

def something():
my_hint.send()
my_saytext2.index = 0
my_saytext2.send()

Obviously, if you want to use the "index" (used for the "team" color, /x03) of each user for their own message, then you will have to loop through each one. Or, at the very least, you can loop through each team and choose one index from the team and set the users on send().

Posted: Fri May 09, 2014 8:42 pm
by Tuck
Is there a way to loop trough all PlayerEntities ? (for something else, where i need each steam id)

or is the PlayerGenerator returning IPlayerInfo for each player ?

from players.helpers import uniqueid_from_playerinfo

could get steamid from this i guess, however is this the fastest way to do this?

Posted: Fri May 09, 2014 9:10 pm
by satoon101
First off, I do apologize for the lack of a wiki, currently. We hope to have that back up asap, but it will take some time.

This question was asked about recently:
http://www.sourcepython.com/showthread.php?146-Stripping-weapons&p=2525&viewfull=1#post2525

The link in that link shows functionality that has mostly not changed. The WeaponTagIter was moved to filters.weapons.WeaponClassIter and WeaponIter was moved to filters.weapons.WeaponEdictIter. We have also recently added filters.entities.EntityIter to loop through entities by classname. filters.players.PlayerIter has been untouched for some time.

To iterate over player steamids:

Syntax: Select all

from filters.players import PlayerIter

for steamid in PlayerIter(return_types='steamid'):
print(steamid)