PDA

Просмотр полной версии : Создание простейшей системы чата команды



Salvacore
10.08.2014, 17:27
Команда


CMD:f(playerid, params[])//DC_CMD
{
if(!strlen(params))
return SendClientMessage(playerid, -1, "[ВВЕДИ]: (/f) [Текст]");

new
string[144],
name[MAX_PLAYER_NAME]
;
GetPlayerName(playerid,name,sizeof(name));
format(string, sizeof(string),"[Чат фракции]%s: %s", name, params);

TeamSendMsg(playerid, -1, string);
SetPlayerChatBubble(playerid,params,-1,20.0,3500);
return 1;
}

Функция отправки сообщения команде


TeamSendMsg(playerid,color, string[])
{
foreach(Player, i)//for(new i=0;i<MAX_PLAYERS;i++)
{
/*if(!IsPlayerConnected(playerid))
return 1;*/
if(gTeam[i] == gTeam[playerid]) //Измените на своё
{
SendClientMessage(i, color, string);
}
}
return 1;
}


Автор: Salvador (http://pro-pawn.ru/member.php?801-Salvador)

Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено!

SendClientMessage (http://wiki.sa-mp.com/wiki/SendClientMessage)
SetPlayerChatBubble (http://wiki.sa-mp.com/wiki/SetPlayerChatBubble_RU)
Foreach (http://forum.sa-mp.com/showthread.php?t=92679)
GetPlayerName (http://wiki.sa-mp.com/wiki/GetPlayerName_RU)
DC_CMD (http://pro-pawn.ru/showthread.php?1028-DC_CMD-v2-8-(23-03-14))

DeimoS
10.08.2014, 18:37
Команда


static const fmt_str[] = "[Чат фракции]%s: %s";
new
string[sizeof(fmt_str)-2+MAX_PLAYER_NAME-2+128],
name[MAX_PLAYER_NAME]
;

Вот к чему это извращение тут? Хотя да, проще написать лишнюю строку, нежели сосчитать 15 символов...
Или я что-то не понимаю в этом мире, или подобный способ оправдывает себя только когда у нас есть огромное сообщение, раскиданное на несколько строг (дабы компилятор его прожевал) и которое может редактироваться в дальнейшем (правила сервера или список команд, например). А если под каждое короткое сообщение подобное делать, кол-во ненужных строк возрастёт раза в 2, что явно не отразится на читаемости... В общем, как-то вы уж перебарщиваете с этим извращением.

Лучше бы убрал лишний массив, раз гоняешься за оптимизацией и сделал так

Команда


CMD:f(playerid, params[])//DC_CMD
{
if(sscanf(params, "s[128]", params))
return SendClientMessage(playerid, -1, "[ВВЕДИ]: (/f) [Текст]");

static const fmt_str[] = "[Чат фракции]%s: %s";
new
string[sizeof(fmt_str)-2+MAX_PLAYER_NAME-2+128]
;
GetPlayerName(playerid,string,MAX_PLAYER_NAME);
format(string, sizeof(string),fmt_str, string, params);

TeamSendMsg(playerid, -1, string);
SetPlayerChatBubble(playerid,params,-1,20.0,3500);
return 1;
}


P.S. Ещё один камень в огород твоего способа подсчёта символов - это ограничения SA-MP. SendClientMessage не прожуёт сообщение больше 144 символов, а у тебя массив явно за 144 ячейки переваливает :)

Seregamil
10.08.2014, 19:38
static const fmt_str[] = "[Чат фракции]%s: %s";
new
string[sizeof(fmt_str)-2+MAX_PLAYER_NAME-2+128],
name[MAX_PLAYER_NAME]
;
Чего вы так за ячейками гоняетесь? И без того известно, что в чат больше 128 символов не уйдет.

Salvacore
11.08.2014, 13:09
Чего вы так за ячейками гоняетесь? И без того известно, что в чат больше 128 символов не уйдет.

Я делаю так, чтобы не нагружать мод, вдруг у них RLS.
А я тебя не оскорблял.

Nazarik
11.08.2014, 17:57
if(sscanf(params, "s[128]", params))
return SendClientMessage(playerid, -1, "[ВВЕДИ]: (/f) [Текст]");


Бред...

Лучше уж:



if(isnull(params)) return SendClientMessage(playerid, -1, "[ВВЕДИ]: (/f) [Текст]");
// ну или if(strlen(params) < 1)


макрос:

#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))

DeimoS
11.08.2014, 19:02
Я делаю так, чтобы не нагружать мод, вдруг у них RLS.
А я тебя не оскорблял.

Ты напечатал более 50 символов ради того, чтоб не считать 15... И после этого ты что-то на людей с P-I говоришь... :facepalm:
Нравится насиловать себя и свой код - пожалуйста. Только не продвигайте это в массы :negative:

Seregamil
11.08.2014, 19:36
Бред...

Лучше уж:



if(isnull(params)) return SendClientMessage(playerid, -1, "[ВВЕДИ]: (/f) [Текст]");
// ну или if(strlen(params) < 1)


макрос:

#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))


if( !strlen( params ) )
return false;
Не?

Nazarik
11.08.2014, 20:28
if( !strlen( params ) )
return false;
Не?

Можна и так, но вроде в этом случае выведет сообщения "SERVER: Unknown Command".

Seregamil
12.08.2014, 06:24
Можна и так, но вроде в этом случае выведет сообщения "SERVER: Unknown Command".

Я как пример привёл же...

Salvacore
10.09.2014, 21:22
Update.

Иван Бубнов
19.03.2016, 14:38
new
string[128 - (15 + (-2 + MAX_PLAYER_NAME)) + 1];
Получается так?

$continue$
19.03.2016, 14:42
Вы про что?


new
string[128 - (15 + (-2 + MAX_PLAYER_NAME)) + 1];
Получается так?

iWors
19.03.2016, 15:28
Я к примеру бы иным способом сделал :)


CMD:f(playerid, params[])
{
if(!strlen(params))
return SendClientMessage(playerid, -1, "[ВВЕДИ]: (/f) [Текст]");
new
name[MAX_PLAYER_NAME]
;
GetPlayerName(playerid, name, sizeof(name));
static const fmt_str[] = "[Чат фракции] %s: %s";
new string[sizeof(fmt_str) - 2 + MAX_PLAYER_NAME];
format(string, sizeof(string), fmt_str, name, params);
TeamSendMsg(playerid, -1, string);
SetPlayerChatBubble(playerid, params, -1, 20.0, 3500);
return 1;
}

DeimoS
19.03.2016, 18:22
Я к примеру бы иным способом сделал :)


CMD:f(playerid, params[])
{
if(!strlen(params))
return SendClientMessage(playerid, -1, "[ВВЕДИ]: (/f) [Текст]");
new
name[MAX_PLAYER_NAME]
;
GetPlayerName(playerid, name, sizeof(name));
static const fmt_str[] = "[Чат фракции] %s: %s";
new string[sizeof(fmt_str) - 2 + MAX_PLAYER_NAME];
format(string, sizeof(string), fmt_str, name, params);
TeamSendMsg(playerid, -1, string);
SetPlayerChatBubble(playerid, params, -1, 20.0, 3500);
return 1;
}

А в чём, собственно, разница, кроме перестановки кода с одного места в другое?

TheMallard
08.09.2016, 15:03
а ты уверен что выводится сообщение игрока?

vovandolg
08.09.2016, 21:30
а ты уверен что выводится сообщение игрока?

Выводится там всё) размеры может быть слегка не правильно посчитаны

MrJu[N]ior
13.09.2016, 20:36
for(new i=0;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(playerid))
return 1;

Это один из допустимых тобой вариантов, вот в проверке на коннект почему-то вместо i стоит playerid. Норм))

m1n1vv
13.09.2016, 23:56
А если?

new
fmt_str[37] = !"[Чат фракции] ";
strcat(fmt_str, name);
strcat(fmt_str, !": ");
strcat(fmt_str, params);

MrJu[N]ior, проблема не только в неверной переменной, там и функция "останавливается", если ID не найден.

if (!IsPlayerConnected(i)/* || i == INVALID_PLAYER_ID*/)
continue;

И если делать через format, то можно же так:

format(params, 144, fmt_str, name, params);
SendClientMessage(playerid, -1, params);
Только сначала надо будет выводить SetPlayerChatBubble, а потом format с TeamSendMsg.
И чисто для красоты кода, я назвал бы функцию SendClientMessageToTeam.