Refactor code

It would seem I was wrong (was I drunk?). It doesn't support custom
message using formating (%s).
This simplifies things, as this stock is now meant to be used only on
predefined message.

* If not a predefined message, we redirect to client_print, as there is
more checks and can deal with ML.
* If length goes above known limits, we redirect to client_print to be
cut properly.
* Changed MSG_ONE to MSG_UNRELIABLE and MSG_ALL to MSG_BROADCAST.
* Updated documention.
This commit is contained in:
Arkshine 2014-05-05 20:42:51 +02:00
parent f691d2ed79
commit f5921a3535

View File

@ -58,7 +58,7 @@ stock make_deathmsg(killer, victim, headshot, const weapon[])
}
/**
* Sends a custom or predefined text message to player.
* Sends a predefined text message to player.
* Predefined texts are default game messages which will be translated
* to player's game language, e.g. #Game_join_ct.
*
@ -66,8 +66,8 @@ stock make_deathmsg(killer, victim, headshot, const weapon[])
*
* @note There does not necessarily have to be a total of 6 arguments.
* It will depend if message takes arguments, e.g.:
* Predefined message: client_printex(id, print_chat, "#Game_join_ct", "Pimp Daddy")
* Custom message : client_printex(id, print_chat, "%s is joining the Counter-Terrorist force", "Pimp Daddy")
* client_printex(id, print_chat, "#Game_join_ct", "Pimp Daddy")
* client_printex(id, print_chat, "1", "#Game_radio", "Pimp Daddy", "Hello world!")
*
* @param index Index of the player, use 0 to send to all players.
* @param type The message destination. See print_* constants.
@ -81,28 +81,38 @@ stock make_deathmsg(killer, victim, headshot, const weapon[])
*/
stock client_printex(index, type, const msg_name[], const msg_param1[] = "", const msg_param2[] = "", const msg_param3[] = "", const msg_param4[] = "")
{
static msgTextMsg;
new ch = msg_name[0];
if (!msgTextMsg)
// If not a predefined message, we don't care about it and forward directly to client_print.
// Special case for radio message. msg_name is an index, msg_param1 #Game_radio*, etc. Checking index should be enough.
if (ch != '#' && (type != print_radio || !strtol(msg_name)))
{
msgTextMsg = get_user_msgid("TextMsg");
return client_print(index, type, msg_name, msg_param1, msg_param2, msg_param3, msg_param4);
}
message_begin(index > 0 ? MSG_ONE : MSG_ALL, msgTextMsg, .player = index);
// Even if message starts with '#', we should check its length for safety.
new length = strlen(msg_name);
// If string is larger than expected, we forward to client_print which will cut message properly.
// This means also this can't be a predefined game message.
// Max console length: 128 = \n (126) + \0 (127)
// Max SayText length: 192 = \n (190) + \0 (191)
if ((length > 126 && (print_notify <= type <= print_console))
|| ( length > 190 && (print_chat <= type <= print_radio)))
{
return client_print(index, type, msg_name, msg_param1, msg_param2, msg_param3, msg_param4);
}
static msgTextMsg; msgTextMsg || (msgTextMsg = get_user_msgid("TextMsg"));
message_begin(index > 0 ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msgTextMsg, .player = index);
write_byte(type);
write_string(msg_name);
if (msg_param1[0])
write_string(msg_param1);
if (msg_param2[0])
write_string(msg_param2);
if (msg_param3[0])
write_string(msg_param3);
if (msg_param4[0])
write_string(msg_param4);
if (msg_param1[0]) { write_string(msg_param1); }
if (msg_param2[0]) { write_string(msg_param2); }
if (msg_param3[0]) { write_string(msg_param3); }
if (msg_param4[0]) { write_string(msg_param4); }
message_end();
return 1;
}