Shake Player Menu

Сообщения
118
Реакции
65
Здравствуйте. Хотелось бы доработать функционал плагина amx_shake(по умолчанию админ через команду 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

Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
UNDER2, А чего тут понимать?

На место этого
Код:
            // Трясём игрока
            server_cmd("Shake #%d", get_user_userid(pPlayer));
            // Делаем чтобы сразу работало
            server_exec();
Вставляем это, заменив player на pPlayer
Код:
      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()
      }
 
Сообщения
118
Реакции
65
Собственно это первая моя попытка плагин под себя переделать. Спасибо огромное буду пробовать. ;) Всего 2 варнинга о не выравненной строке и одна ошибка должен был быть символ: "%s" но был найден: "%s" Плохо когда не знаешь ничерта да ещё и напрочь забыл ))
3 Дек 2018
ребят ошибка 001 в последней строке но пишет как то по другому
001: expected token: "}" , but found "-end of file-"

Форматирование (BB-код):
            new gmsgShake = get_user_msgid("ScreenShake");  //warning 217
           if(is_user_alive(pPlayer)){     //warning 217
            message_begin(MSG_ONE, gmsgShake, {0,0,0}, pPlayer)
            write_short(255<< 14 ) //ammount
            write_short(10 << 14) //lasts this long
            write_short(255<< 14) //frequency
            message_end()
            }
            return PLUGIN_HANDLED       //001: expected token: "}" , but found "-end of file-"
 
Последнее редактирование:
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
UNDER2, Для начала выровняйте отступы. Если не поможет, значит где-то не хватает закрывающего брекета " } ", либо где-то лишний открывающий " { ".
 
Последнее редактирование:
Сообщения
118
Реакции
65
с брекетами разобрался остались два варнинга на тех же строчках. Компилится и с ними но всё равно не приятно для глаз их видеть.
3 Дек 2018
решил проверить на себе функцию и в момент нажатия кнопки меня убили, сервер упал. Думаю что нужна функция продолжающая тряску даже когда игрок мёртвый? Подскажите пожалуйста?
3 Дек 2018
if(is_user_alive значит условие если игрок жив. Думаю в этом проблема
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу