PDA

Просмотр полной версии : [CMD] /byplayer (DC_CMD)



Alanchick
05.01.2016, 22:39
Как то раз ко мне ВКонтакте обратился человек с помощью.
Он попросил, чтобы я помог ему написать команду, с помощью которой администратор будет писать от лица игрока.
Я ему помог. (Подтолкнул его на правильный путь)
Сегодня решил доработать и выложить эту команду на Pro-Pawn.Ru.
Ну что-ж, для чего команда нужна и как она работает, я думаю, вы уже поняли, по этому перейдем к коду:
Если нету этого макроса, то добавляем:

#define SCM SendClientMessage
В public OnPlayerConnect:

SetPVarInt(playerid, "Logged", 0);
В public OnPlayerSpawn:

SetPVarInt(playerid, "Logged", 1);
Сама команда:

CMD:byplayer(playerid, params[])
{
new string[180],
player,
text;
if(GetPVarInt(playerid, "Logged") == 0) return true; // Проверка на авторизацию
if(PlayerInfo[playerid][pAdmin] <= 4) return true; // Проверка на админ-уровень (с 5 админ-уровня)
if(sscanf(params, "ds[144]", player, text)) return
SCM(playerid, -1, "Введите: /byplayer [id игрока] [текст]"); // Если игрок не ввел какое либо значение
if(GetPVarInt(id, "Logged") == 0) return
SCM(playerid, -1, "Игрок не авторизован!"); // Если игрок, id которого ввели, не авторизован
if(PlayerInfo[playerid][pName] == PlayerInfo[player][pName]) return
SCM(playerid, -1, "Вы не можете указать свой ID!"); // Если игрок указал свой ID
if(PlayerInfo[id][pAdmin] > 0) return
SCM(playerid, -1, "Вы не можете что то сказать от имени администраторa!"); // Если указанный игрок - администратор
format(string, sizeof(string), "<< All >> %s сказал: %s", PlayerInfo[player][pName],text); // форматируем текст
SendClientMessageToAll(-1, string);
return 1;
}
Получается: "<< All >> Nick_Name сказал: Добро пожаловать на Pro-Pawn.Ru :)".
(Чат глобальный)


Моя первая команда для публики :)
Жду адекватной критики, спасибо.
Спасибо за помощь Untonyst (http://pro-pawn.ru/member.php?4123-Untonyst) :)

#enotik
05.01.2016, 22:44
А что она вообще делает?
По коду нихрена не понял толком)

Alanchick
05.01.2016, 22:53
А что она вообще делает?
По коду нихрена не понял толком)

Выше написано.
Админ пишет /byplayer 0 123 и от игрока с id'ом 0 отправится сообщение 123 в глобальный чат.
В общем позволяет писать администратору от имени обычного игрока.

Desulaid
05.01.2016, 22:56
Чет идея ввода id игрока и отправка сообща в чат под чужим именем не очень. Представим себе, что на сервер заходит OKStyle и вводит id Daniel_Cortez и всем в чат пишется "<< All >> Daniel_Cortez сказал: признаю, анимлист OKStyle лучше моего". Согласись, глупо. Кроме того меня смущает название команды и то, что ты в переменную text хочешь сохранить строку. Держи мой вариант.


COMMAND:byplayer(playerid, params[])
{
if (sscanf(params, "s[116]", params)) // как остаток от лимита чата (144)
return SendClientMessage(playerid, -1, "Введите /byplayer <сообщение>");

static const
msg[] = "<< All >> %s сказал: %s";
new
name[MAX_PLAYER_NAME], fmt_msg[sizeof(msg) + (-2*2) + 116];

GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(fmt_msg, sizeof(fmt_msg), msg, name, params);
SendClientMessageToAll(-1, fmt_msg);
return 1;
}

Alanchick
05.01.2016, 23:02
Это у тебя уже команда /o(oc).
А задача была сделать команду, чтобы администратор мог писать от имени игрока.
И на счет твоего примера с OKStyle и Daniel_Cortez:
Писать может только администратор.
Я думаю основатели серверов отнесутся к этой команде с умом.
И вообще идея не моя, меня попросили - я написал.
Я даже сейчас не понимаю смысл этой команды. К себе в мод вставлять не стал бы :)

Desulaid
05.01.2016, 23:05
Это у тебя уже команда /o(oc).
А задача была сделать команду, чтобы администратор мог писать от имени игрока.
И на счет твоего примера с OKStyle и Daniel_Cortez:
Писать может только администратор.
Я думаю основатели серверов отнесутся к этой команде с умом.
И вообще идея не моя, меня попросили - я написал.
Я даже сейчас не понимаю смысл этой команды. К себе в мод вставлять не стал бы :)

Лол, я совершенно и окончательно запутался :D

#enotik
05.01.2016, 23:12
Лол, я совершенно и окончательно запутался :D

Крч, типо /o(oc)
Только ты пишешь не от своего имени, а от имени того, чей id ввел..(как пример взял твой ник и свой)
Так бы вышло: EnotiK сказал(а): тип лол
А от этой кмд выйдет: Untonyst сказал(а): тип лол

Desulaid
05.01.2016, 23:21
Крч, типо /o(oc)
Только ты пишешь не от своего имени, а от имени того, чей id ввел..(как пример взял твой ник и свой)
Так бы вышло: EnotiK сказал(а): тип лол
А от этой кмд выйдет: Untonyst сказал(а): тип лол

Ну так можно много поставных сообщений писать, особенно от лица администрации, да только ссору может разжечь! По мне дак бесполезно 0))

Daniel_Cortez
05.01.2016, 23:41
Не то, чтобы я одобряю идею этой команды, но... что мешает просто вызвать OnPlayerText с указанным игроком и текстом? Заодно и не пришлось бы подстраивать вывод сообщений точь-в-точь, как в OnPlayerText.

Alanchick
06.01.2016, 00:22
Чем плох мой вариант?

DeimoS
09.01.2016, 20:02
Чем плох мой вариант?

Тем, что Вы изобретаете велосипед? Вот как выглядит реализация с вызовом OnPlayerText


CMD:byplayer(playerid, params[])
{
if(GetPVarInt(playerid, "Logged") == 0 || PlayerInfo[playerid][pAdmin] <= 4) return true; // Проверка на админ-уровень (с 5 админ-уровня)
new player, text[145];
if(sscanf(params, "ds[144]", player, text)) return SendClientMessage(playerid, -1, "Введите: /byplayer [id игрока] [текст]"); // Если игрок не ввел какое либо значение
if(GetPVarInt(player, "Logged") == 0) return SendClientMessage(playerid, -1, "Игрок не авторизован!"); // Если игрок, id которого ввели, не авторизован
if(playerid == player) return SendClientMessage(playerid, -1, "Вы не можете указать свой ID!"); // Если игрок указал свой ID
if(PlayerInfo[player][pAdmin] > 0) return SendClientMessage(playerid, -1, "Вы не можете что то сказать от имени администраторa!"); // Если указанный игрок - администратор
OnPlayerText(player, text);
return true;
}
И никакого массива для форматирования строки, и никакого форматирования строки... Ещё есть вопросы о том, почему Ваш вариант хуже?

P.S. И зачем Вы навязываете нам какие-то свои макросы? Зачем мне ваш SCM? Вам трудно было изменить 3 SCM на нормальную функцию? Этот макрос никакой ценности не несёт, а значит он тут ни к чему.

Так же, как уже писали выше, Вы пытаетесь записать текст в обычную переменную (это я о переменной "text")

Плюс ко всему, Вы записываете ID игрока в переменную "player", а уже потом используете какой-то "id".

В общем, идея на тройку (бессмысленно, да и придумали её до Вас), а реализация на двойку

UPD: Ещё вот эта проверка очень забавная. Что Вы тут проверяете? И как? О_о

if(PlayerInfo[playerid][pName] == PlayerInfo[player][pName]) return SendClientMessage(playerid, -1, "Вы не можете указать свой ID!"); // Если игрок указал свой ID

Да и имя "player" для переменной не самое лучшее, ибо его легко спутать с "playerid". Сами же потом будете свои глазки напрягать для поиска нужного отрезка кода...

Да и если Вы решили возвращать "bool", то извольте делать это до конца. А то в одном месте у Вас "true", а в другом - "1". Как сказал один очень умный человек: "любой компилятор C++ уже отругал бы тебя". В Вашем случае он бы Вас давно высек кнутом

+, опять же, зачем Вы навязываете нам свой ненужный код? Что за pVar "Logged"? Может у меня уже по-своему реализована проверка на онлайн, а Вы мне свою пихаете... Неправильно это, сударь