Участник
Пользователь
- Сообщения
- 118
- Реакции
- 65
Здравствуйте. Хотелось бы доработать функционал плагина amx_shake(по умолчанию админ через команду amx_shake "НИК"
может трясти экран игроку в течении примерно 10 секунд)
хотелось бы сделать эту функцию через меню игроков
меню для плагина готово и добавлена функция запрета консольной команды kill на клиенте.
собственно я не могу правильно зарегистрировать функцию и переделать функционал на работу через меню.
прилагаю плагин с меню (shakepleermenu) и плагин с функционалом (amx_shake).
Не прошу сделать всё за меня прошу помочь мне понять не читая кучи статей.
может трясти экран игроку в течении примерно 10 секунд)
хотелось бы сделать эту функцию через меню игроков
меню для плагина готово и добавлена функция запрета консольной команды kill на клиенте.
собственно я не могу правильно зарегистрировать функцию и переделать функционал на работу через меню.
прилагаю плагин с меню (shakepleermenu) и плагин с функционалом (amx_shake).
Не прошу сделать всё за меня прошу помочь мне понять не читая кучи статей.
2 Дек 2018
Форматирование (BB-код):
#include <amxmodx>
#include <fakemeta>
#include <amxmisc>
// Текущая страница меню
new g_iPlayerMenuPage[33];
// Соотношение пункта к игроку в меню
new g_apPlayerMenuPlayers[33][32];
// Прекеш плагина
public plugin_precache()
register_plugin(
"Shake Player Menu",
"Alpha",
"WPMG PRoSToTeM@"
); // Регистрируем плагин
// Инициализация плагина
public plugin_init()
{
// Регистрируем команду для вызова меню
register_clcmd("say /ShakePlayerMenu", "ClCmdShakePlayerMenu", ADMIN_KICK);
// Регистрируем меню (1-ый аргумент - ID меню (получается по его названию), 2-ой аргумент - кнопки (1023 все кнопки), 3-ий аргумент - функция которая будет вызываться при нажатии кнопки)
register_menucmd(register_menuid("Shake Player"), 1023, "MenuShakePlayer");
// Регистрируем словарь
register_dictionary("ShakePlayerMenu.txt");
//Запрет самоубийств
register_forward(FM_ClientKill, "ClientKill_Pre", false);
}
public ClientKill_Pre(const iClient)
{
return FMRES_SUPERCEDE;
}
// Кто-то написал /ShakePlayerMenu
public ClCmdShakePlayerMenu(pId, bitsAccess)
{
// Если нету нужного флага не продолжаем
if (!(get_user_flags(pId) & bitsAccess))
return PLUGIN_CONTINUE;
// Показываем меню кика и обнуляем страницу
ShowMenuShakePlayer(pId, g_iPlayerMenuPage[pId] = 0);
// Не показываем команду в чате
return PLUGIN_HANDLED;
}
// Показываем меню игроку
public ShowMenuShakePlayer(pId, iPage)
{
// Если страница меньше нуля не продолжаем
if (iPage < 0)
return PLUGIN_HANDLED;
new apPlayers[32]; // Массив из игроков
new iPlayers; // Всего игроков
new szMenu[512], szName[32]; // Меню, имя
new pPlayer; // Игрок
// Получаем игроков
get_players(apPlayers, iPlayers);
// Находим стартового игрока
new i = min(iPage * 8, iPlayers);
new iStart = i - (i % 8);
// Находим конечного игрока
new iEnd = min(iStart + 8, iPlayers);
// Получаем страницу
iPage = iStart / 8;
// Записываем игроку
g_apPlayerMenuPlayers[pId] = apPlayers;
g_iPlayerMenuPage[pId] = iPage;
// Формируем заголовок меню, получаем длину строки
new iLen = formatex(szMenu, 511, "\r%L\R%d/%d^n^n", pId, "#ShakePlayerMenu_Title", iPage + 1, ((iPlayers - 1) / 8) + 1);
// Добавляем к кнопкам 0
new bitsKeys = MENU_KEY_0;
// Пункт
new iItem;
// Флаги игрока
new bitsFlags;
// Цикл из игроков
for (i = iStart; i < iEnd; i++)
{
// Получаем id игрока
pPlayer = apPlayers;
// Берём имя игрока
get_user_name(pPlayer, szName, 31);
// Делаем ник жёлтым если этот игрок это мы =)
if (pId == pPlayer)
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \y%s^n", ++iItem, szName);
}
// Рассматриваем другой случай
else
{
// Получаем флаги игрока
bitsFlags = get_user_flags(pPlayer);
// Если игрок имеет имунитет делаем пункт серым, получаем длину
if (bitsFlags & ADMIN_IMMUNITY)
iLen += formatex(szMenu[iLen], 511 - iLen, "\d%d. %s^n", ++iItem, szName);
// Игрок админ добавляем после ника красную звёздочку
else if (bitsFlags > 0 && !(bitsFlags & ADMIN_USER))
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s\r*^n", ++iItem, szName);
}
// Обычный игрок
else
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s^n", ++iItem, szName);
}
}
}
// Если последний игрок меньше всех игроков, добавляем пункт далее
if (iEnd < iPlayers)
{
// Добавляем к кнопкам 9
bitsKeys |= MENU_KEY_9;
// Форматируем пункты
formatex(szMenu[iLen], 511 - iLen, "^n\r9. \w%L^n\r0. \w%L", pId, "#ShakePlayerMenu_Next", pId, iPage ? "#ShakePlayerMenu_Back" : "#ShakePlayerMenu_Exit");
}
else
formatex(szMenu[iLen], 511 - iLen, "^n\r0. \w%L", pId, iPage ? "#ShakePlayerMenu_Back" : "#ShakePlayerMenu_Exit");
// Показываем меню
return show_menu(pId, bitsKeys, szMenu, -1, "Shake Player");
}
// Игрок нажал кнопку
public MenuShakePlayer(pId, iKey)
{
// Смотрим какая кнопка
switch (iKey)
{
// (9) Далее
case 8: ShowMenuShakePlayer(pId, ++g_iPlayerMenuPage[pId]); // Сразу прибавляем страницу
// (0) Назад/Выход
case 9: ShowMenuShakePlayer(pId, --g_iPlayerMenuPage[pId]); // Сразу уменьшаем страницу, если страница будет меньше нуля, то иеню закроется
// Выбрали игрока
default:
{
// Получаем игрока из массива (Умножаем текущую страницу на 8 и прибавляем кнопку)
new pPlayer = g_apPlayerMenuPlayers[pId][(g_iPlayerMenuPage[pId] * 8) + iKey];
// Если игрок вышел
if (!is_user_connected(pPlayer))
{
// Пишем игроку что игрок вышел
client_print(pId, print_chat, "%L", pId, "#ShakePlayerMenu_TargetDisconnected");
// Снова показываем меню
ShowMenuShakePlayer(pId, g_iPlayerMenuPage[pId]);
return PLUGIN_HANDLED;
}
// Если игрок получил иммунитет
if (pId != pPlayer && (get_user_flags(pPlayer) & ADMIN_IMMUNITY))
{
// Пишем что игрок получил иммунитет
client_print(pId, print_chat, "%L", pId, "#ShakePlayerMenu_TargetImmunity");
// Снова показываем меню
ShowMenuShakePlayer(pId, g_iPlayerMenuPage[pId]);
return PLUGIN_HANDLED;
}
// Трёс ли себя администратор
new bool:bKickSelf = bool:(pId == pPlayer);
// Берём имя игрока
new szName[32];
get_user_name(pId, szName, 31);
// Пишем что администратор трёс себя
if (bKickSelf)
client_print(0, print_chat, "%L", LANG_PLAYER, "#ShakePlayerMenu_SelfShake", szName);
else
{
// Берём имя цели
new szName2[32];
get_user_name(pPlayer, szName2, 31);
// Пишем что администратор трёс игрока
client_print(0, print_chat, "%L", LANG_PLAYER, "#ShakePlayerMenu_TargetShake", szName, szName2);
// Снова показываем меню
ShowMenuShakePlayer(pId, g_iPlayerMenuPage[pId]);
}
// Трясём игрока
server_cmd("Shake #%d", get_user_userid(pPlayer));
// Делаем чтобы сразу работало
server_exec();
}
}
return PLUGIN_HANDLED;
}
2 Дек 2018
Форматирование (BB-код):
#include <amxmodx>
#include <amxmisc>
public plugin_init()
{
register_plugin("Shake It baby!","1.0","ThantiK")
register_clcmd("amx_shake","amx_shake",ADMIN_LEVEL_A,"<name or id>")
return PLUGIN_CONTINUE
}
public amx_shake(id,level,cid){
if (!cmd_access(id,level,cid,2))
return PLUGIN_HANDLED
new target[32]
read_argv(1,target,31)
if (target[0]=='@') {
new team[32], team_num
get_players(team,team_num,"ae",target[1])
if (!team_num) {
console_print(id,"[AMX] No clients found on provided team. (@CT or @TERRORIST)")
return PLUGIN_HANDLED
}
for (new i=0;i<team_num;i++) {
new gmsgShake = get_user_msgid("ScreenShake")
message_begin(MSG_ONE, gmsgShake, {0,0,0}, team)
write_short(255<< 14 ) //ammount
write_short(10 << 14) //lasts this long
write_short(255<< 14) //frequency
message_end()
}
}
else if (target[0]=='*') {
new all[32], all_num
get_players(all,all_num,"a")
for (new i=0;i<all_num;i++) {
new gmsgShake = get_user_msgid("ScreenShake")
message_begin(MSG_ONE, gmsgShake, {0,0,0}, all)
write_short(255<< 14 ) //ammount
write_short(10 << 14) //lasts this long
write_short(255<< 14) //frequency
message_end()
}
}
else {
new player = cmd_target(id, target,31)
new gmsgShake = get_user_msgid("ScreenShake")
if(is_user_alive(player)){
message_begin(MSG_ONE, gmsgShake, {0,0,0}, player)
write_short(255<< 14 ) //ammount
write_short(10 << 14) //lasts this long
write_short(255<< 14) //frequency
message_end()
}
}
return PLUGIN_HANDLED
}
Download all Attachments
-
7.6 KB Просмотры: 0
-
1.8 KB Просмотры: 1