Просмотр полной версии : [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) :)
А что она вообще делает?
По коду нихрена не понял толком)
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
Лол, я совершенно и окончательно запутался :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
Чем плох мой вариант?
Чем плох мой вариант?
Тем, что Вы изобретаете велосипед? Вот как выглядит реализация с вызовом 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"? Может у меня уже по-своему реализована проверка на онлайн, а Вы мне свою пихаете... Неправильно это, сударь
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot