Написание плагинов

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
можно реализовать
можно попробовать и такое

часов через 8-9 гляну, как с работы приду
Сообщения автоматически склеены:

@Туник, пробуй:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

static const char
    CMDS[][][]    =
{
    {"!knife",    "Выбрать нож"},
    {"!ws",        "Выбрать скин"},
    {"!gl",        "Выбрать перчатки"}
};

Menu
    hMenu;
bool
    bInMenu[MAXPLAYERS+1];

public void OnPluginStart()
{
    AddCommandListener(Cmd_Drop, "drop");

    hMenu = new Menu(Handler_Menu);
    hMenu.SetTitle("Меню игрока:\n ");
    int i = -1;
    while(++i < sizeof(CMDS)) hMenu.AddItem("", CMDS[i][1]);
}

public void OnClientDisconnect(int client)
{
    bInMenu[client] = false;
}

public Action Cmd_Drop(int client, const char[] cmd, int argc)
{
    if(!client || !IsClientInGame(client))
        return Plugin_Continue;

    if((bInMenu[client] ^= true))
    {
        hMenu.Display(client, MENU_TIME_FOREVER);
        return Plugin_Handled;
    }

    if(GetClientMenu(client, null) == MenuSource_External)
        CancelClientMenu(client, true, null);

    return Plugin_Continue;
}

public int Handler_Menu(Menu menu, MenuAction action, int client, int param)
{
    if(action == MenuAction_Select) FakeClientCommand(client, "say_team \"%s\"", CMDS[param][0]);
    return 0;
}
Если выбрасывание не будет блочиться напиши.
 
Последнее редактирование:

Mr_panica

XenForo one 💖
Сообщения
921
Реакции
436
Привет всем.

Можете написать пример кода для меню, чтоб на каждой странице этого меню был бы одинаковый первый пункт.
Например:

Первая страница.
C-подобный:
Title

1. confirm
2. Name1
3. Name2
4. Name3
5. Name4
6. Name5
7. Name6

8. Назад
9. Далее
0. Выход

Вторая страница.
C-подобный:
Title

1. confirm
2. Name7
3. Name8
4. Name9
5. Name10
6. Name11
7. Name12

8. Назад
9. Далее
0. Выход
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Привет всем.

Можете написать пример кода для меню, чтоб на каждой странице этого меню был бы одинаковый первый пункт.
Например:

Первая страница.
C-подобный:
Title

1. confirm
2. Name1
3. Name2
4. Name3
5. Name4
6. Name5
7. Name6

8. Назад
9. Далее
0. Выход

Вторая страница.
C-подобный:
Title

1. confirm
2. Name7
3. Name8
4. Name9
5. Name10
6. Name11
7. Name12

8. Назад
9. Далее
0. Выход
C-подобный:
#include <sourcemod>

#define ITEMS 65

public void OnPluginStart()
{
    RegConsoleCmd("test_menu", OpenMenu);
}

public Action OpenMenu(int client, int args)
{
    OpenMenuVoid(client);
    return Plugin_Handled;
}

void OpenMenuVoid(int client)
{
    char temp[64];
   
    Menu hMenu = CreateMenu(Mendler);
   
    hMenu.SetTitle("Название");
   
    for(int i = 0; i <= ITEMS - 1; i++)
    {
        if(i % 7 == 0 || !i) hMenu.AddItem("confim", "confirm");
        else
        {
            Format(temp, sizeof(temp), "Name%d", i+1);
            hMenu.AddItem(temp, temp);
        }
    }
   
    hMenu.ExitBackButton = true;
    hMenu.ExitButton = true;
   
    hMenu.Display(client, 0);
}

public int Mendler(Menu hMenu, MenuAction action, int client, int item)
{
    return 0;
}
как то так, там возможно с делением не угадал, но для примера думаю пойдет
 

Mr_panica

XenForo one 💖
Сообщения
921
Реакции
436
C-подобный:
#include <sourcemod>

#define ITEMS 65

public void OnPluginStart()
{
    RegConsoleCmd("test_menu", OpenMenu);
}

public Action OpenMenu(int client, int args)
{
    OpenMenuVoid(client);
    return Plugin_Handled;
}

void OpenMenuVoid(int client)
{
    char temp[64];
  
    Menu hMenu = CreateMenu(Mendler);
  
    hMenu.SetTitle("Название");
  
    for(int i = 0; i <= ITEMS - 1; i++)
    {
        if(i % 7 == 0 || !i) hMenu.AddItem("confim", "confirm");
        else
        {
            Format(temp, sizeof(temp), "Name%d", i+1);
            hMenu.AddItem(temp, temp);
        }
    }
  
    hMenu.ExitBackButton = true;
    hMenu.ExitButton = true;
  
    hMenu.Display(client, 0);
}

public int Mendler(Menu hMenu, MenuAction action, int client, int item)
{
    return 0;
}
как то так, там возможно с делением не угадал, но для примера думаю пойдет

Да, благодарю, были небольшие проблемы, но в итоге получилось.
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Как можно убрать hud с игроками в режиме DM в ксго? (не меняя режим)
1679957837799.png
 

Туник

Участник
Сообщения
1,281
Реакции
263

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Изменить вид только можно, сейчас отображает по 5 игроков всего как я вижу за команду.
sv_competitive_official_5v5 0 в конфиг пропиши
Не робит. Эта команда, насколько я знаю, по бокам убирает игроков, когда ты следишь мёртвым или за спектаров.
Но двигаться нужно в этом направлении))
Вот на cybershoke решил зайти проверить, как у них.
1679998135751.png

Сообщения автоматически склеены:

Уже два часа не могу найти решение)
На других режимах всё ок. Именно в режиме DeathMatch нужно убрать эту панель и поставить стандартную

Сообщения автоматически склеены:

Если кто будет искать, поменять на 1 или 2:

mp_dm_teammode0In deathmatch, enables team DM visuals and scoring. (0: personal, 1: team mode, 2: To do
 
Последнее редактирование:

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Приветствую всех. Необходим плагин, в котором будут меняться команды местами, через определенное кол-во раундов, значение меняется в конфиге. Пример: map_round_swapteam "30" + сообщение в чат в последнем раунде, что произойдет смена, по окончанию раунда, и в начале 1 раунда, что смена произошла. CSS v34 SM 1.11 (myarena). Спасибо.
 

Anpic1

Участник
Сообщения
213
Реакции
46
Приветствую всех. Необходим плагин, в котором будут меняться команды местами, через определенное кол-во раундов, значение меняется в конфиге. Пример: map_round_swapteam "30" + сообщение в чат в последнем раунде, что произойдет смена, по окончанию раунда, и в начале 1 раунда, что смена произошла. CSS v34 SM 1.11 (myarena). Спасибо.
MapTime TeamSwap посмотри, может это подойдет
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Подскажите, как можно указывать в ConVar/Config флаг админа, а в коде правильно получить и проверить этот флаг:

C-подобный:
new Handle:g_FlagUnlimitedAWP;

public OnPluginStart()
{
    g_FlagUnlimitedAWP = CreateConVar("dm_FlagUnlimitedAWP", "ADMFLAG_CUSTOM1", "Specifies the flag of the players who have unlimited use of AWP available");
}



    if (GetUserFlagBits(client) & GetConVar(g_FlagUnlimitedAWP))
    {
        ...
    }
Сообщения автоматически склеены:

Попробую
GetConVarFlags )))
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Подскажите, как можно указывать в ConVar/Config флаг админа, а в коде правильно получить и проверить этот флаг:

C-подобный:
new Handle:g_FlagUnlimitedAWP;

public OnPluginStart()
{
    g_FlagUnlimitedAWP = CreateConVar("dm_FlagUnlimitedAWP", "ADMFLAG_CUSTOM1", "Specifies the flag of the players who have unlimited use of AWP available");
}



    if (GetUserFlagBits(client) & GetConVar(g_FlagUnlimitedAWP))
    {
        ...
    }
Сообщения автоматически склеены:

Попробую
GetConVarFlags )))

C-подобный:
ConVar g_FlagUnlimitedAWP;

public OnPluginStart()
{
    g_FlagUnlimitedAWP = CreateConVar("dm_FlagUnlimitedAWP", "ADMFLAG_CUSTOM1", "Specifies the flag of the players who have unlimited use of AWP available");
}

    char value[128];
    int f;
    g_FlagUnlimitedAWP.GetString(value, sizeof(value))
    switch(value)
    {
        case "ADMFLAG_RESERVATION": f = 1<<0;
        case "ADMFLAG_GENERIC": f = 1<<1;
        case "ADMFLAG_KICK": f = 1<<2;
        case "ADMFLAG_BAN": f = 1<<3;
        case "ADMFLAG_UNBAN": f = 1<<4;
        case "ADMFLAG_SLAY": f = 1<<5;
        case "ADMFLAG_CHANGEMAP": f = 1<<6;
        case "ADMFLAG_CONVARS": f = 1<<7;
        case "ADMFLAG_CONFIG": f = 1<<8;
        case "ADMFLAG_CHAT": f = 1<<9;
        case "ADMFLAG_VOTE": f = 1<<10;
        case "ADMFLAG_PASSWORD": f = 1<<11;
        case "ADMFLAG_RCON": f = 1<<12;
        case "ADMFLAG_CHEATS": f = 1<<13;
        case "ADMFLAG_ROOT": f = 1<<14;
        case "ADMFLAG_CUSTOM1": f = 1<<15;
        case "ADMFLAG_CUSTOM2": f = 1<<16;
        case "ADMFLAG_CUSTOM3": f = 1<<17;
        case "ADMFLAG_CUSTOM4": f = 1<<18;
        case "ADMFLAG_CUSTOM5": f = 1<<19;
        case "ADMFLAG_CUSTOM6": f = 1<<20;
    }
    if(GetUserFlagBits(client) & f)
    {
        ...
    }
можно мб так попробовать
Сообщения автоматически склеены:

Попробую
GetConVarFlags )))
зачем? ты получишь флаги конвара: FCVAR_...
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Доброго времени суток)
Подскажите, можно как-то это лучше написать?

Code:
SetGlobalTransTarget(client);
char szBuffer[128];
FormatEx(szBuffer, sizeof(szBuffer), "%t", "How to buy", "G"); //"G" будет заменена на переменную
CGOPrintToChat(client, "%t%s", "Prefix", szBuffer);


Phrases:
"Phrases"
{
    "Prefix"
    {
        "en"      "{DEFAULT}[{LIGHTBLUE}DM{DEFAULT}] "
        "ru"      "{DEFAULT}[{LIGHTBLUE}DM{DEFAULT}] "
    }

    "How to buy"
    {
        "#format" "{1:s}"
        "en"      "To open the weapon selection menu, use - {RED}[{1}]"
        "ru"      "Для открытия меню выбора оружия, используйте - {RED}[{1}]"
    }
}

[DM] To open the weapon selection menu, use - [G]

Остановился на таком варианте:
C-подобный:
CGOPrintToChat(client, "%T%T", "Prefix", client, "How to buy", client, "G");
Сообщения автоматически склеены:

Разбиваю плагин на
Deathmatch.sp
Include:
dm/gunmenu.sp
dm/hp.sp

Как сделать глобальную переменную, что бы можно её использовать во всех структурах?
Странно, через раз компилируется -_-
(Может плагин в VisualStudio кривой)
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Остановился на таком варианте:
Достаточно было сделать так: CGOPrintToChat(client, "%t%t", "Prefix", "How to buy", "G");
В функциях, где идёт отправка сообщений игроку (или то же создание заголовка меню) можно использовать %t.
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Интересная задача появилась.
Нужно отключить звук игроку на N времени. Что бы он ничего на сервере не слышал. Ещё бы voice отрубить
Пока вариант только в бесконечный цикл, пока таймер не кончится
C-подобный:
ClientCommand(client,"snd_playsounds Music.StopAllExceptMusic");

+к этому, нужно глушить все звуки игроку, кроме одного определённого, который я вызываю
C-подобный:
EmitSoundToClient(target, "test.mp3", _, _, 0);
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Интересная задача появилась.
Нужно отключить звук игроку на N времени. Что бы он ничего на сервере не слышал. Ещё бы voice отрубить
Пока вариант только в бесконечный цикл, пока таймер не кончится
C-подобный:
ClientCommand(client,"snd_playsounds Music.StopAllExceptMusic");

+к этому, нужно глушить все звуки игроку, кроме одного определённого, который я вызываю
C-подобный:
EmitSoundToClient(target, "test.mp3", _, _, 0);
возможно так, но я не уверен

C-подобный:
#include <sdktools_sound>

static const char files[][] =         // без sound/
{
    "weapon/long/penis.mp3",
    "weapon/long/penis1.mp3",
    "weapon/long/penis2.mp3",
    "weapon/long/penis3.mp3",
    "weapon/long/penis4.mp3"
}

public void OnPluginStart(int client)
{
    AddNormalSoundHook(Hooker);
}

// отключаем звук игроку допустим так bSoundStatus[client] = false

public Action Hooker(int clients[MAXPLAYERS], int& numClients, char sample[PLATFORM_MAX_PATH], int& entity, int& channel, float& volume, int& level, int& pitch, int& flags, char soundEntry[PLATFORM_MAX_PATH], int& seed)
{
    if(sample[0])
    {
        for(int i = 0; i < sizeof(files); i++)
            if(StrContains(sample, files[i]) != -1)
                return Plugin_Continue;            

        for(int i = 0; i < numClients; i++)
        {
            if(IsClientInGame(clients[i]) && !IsFakeClient(clients[i]) && !bSoundStatus[clients[i]]) volume = 0;
            else clients[i] = -1;
        }
        return Plugin_Changed;            
    }
    return Plugin_Continue;
}
Сообщения автоматически склеены:

Это неправильно кстати, счас исправлю
 
Последнее редактирование:

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
возможно так, но я не уверен

Это неправильно кстати, счас исправлю
На строчке:
C-подобный:
 for(int i = 0, i < numClients; i ++)
e:\GitHub\test\addons\sourcemod\scripting\test.sp(53) : error 001: expected token: ";", but found "<"
e:\GitHub\test\addons\sourcemod\scripting\test.sp(53) : error 001: expected token: ")", but found ";"
e:\GitHub\test\addons\sourcemod\scripting\test.sp(53) : error 036: empty statement
 
Сверху Снизу