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

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
Дабы не засорять тему, напишу так, на чистом сервере без SM при подключении ничего не показывает, а вот как подключаю SM начинает показывать о подключении - отключении.
Стандартные сообщения не выводятся, сам тестировал.
 
  • Мне нравится
Реакции: vb

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
В общем решил использовать OnClientPostAdminCheck так будет вовремя выводить сообщение при коннекте.

OnClientPostAdminCheck() может и не произойти...
Раньше был крюк player_connect_full , происходил он при полном коннекте, сейчас его судьбу не проверял.
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
OnClientPostAdminCheck() может и не произойти...
Раньше был крюк player_connect_full , происходил он при полном коннекте, сейчас его судьбу не проверял.
Подтверждаю. Буду искать другой выход. Может все таки вариант от @Grey83 был неплохим.
--- Добавлено позже ---
Хотя опять же будут вылазить два сообщения. О коннекте и заходе за команду.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@Wightjeck, можно свести в одно сообщение, если сильно нужно
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
@Grey83, ну не знаю, а как это будет реализовано? Игрок %N подключился к серверу и зашёл за команду Террористов.
 

ravskiy1

Участник
Сообщения
190
Реакции
75
Кто может подправить плагин
 

Вложения

  • decompile.sp
    9.3 КБ · Просмотры: 16

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Помогите написать плагин,чтобы по команде !he , выдавались 3 взрывные гранаты,и при повторном написании команды выводилось сообщение,что лимит исчерпан.
Можно ли выдать сразу 3 гранаты, не проверял...
Как я себе это представляю? Выдаешь гранату и устанавливаешь ей 'запас'.

Но есть такой варик (легкий же плагин):
PHP:
#include <sourcemod>
#include <sdktools_functions>
#include <sdkhooks>

public Plugin myinfo =
{
    name = "Limited Grenade",
    author = "Drumanid",
    version = "1.0.0",
    url = "Discord: Drumanid#9108 | Telegram: t.me/drumanid"
};

int g_iCountGrenade[MAXPLAYERS +1];
static const char g_sGrenade[32] = "weapon_hegrenade";  // Название гранаты
#define COMMAND "sm_he"                                 // Команда выдачи гранат(ы)
#define COUNT 3                                         // Кол-во выдаваемых гранат

#define VE(%0) view_as<EventHook>(%0)
#define LC(%0) for(int %0 = 1; %0 <= MaxClients; ++%0) if(IsClientInGame(%0))
public void OnPluginStart()
{
    LoadTranslations("limited_grenade.phrases.txt");

    RegConsoleCmd(COMMAND, Comamnd);

    HookEvent("round_start",VE(RoundStart), EventHookMode_PostNoCopy);
    HookEvent("hegrenade_detonate", VE(HeGrenadeDetonate));

    LC(iClient)
        OnClientPostAdminCheck(iClient);
}

public Action Comamnd(int iClient, int iArgs)
{
    if(iClient && iArgs == 0)
    {
        if(IsPlayerAlive(iClient))
        {
            if(g_iCountGrenade[iClient] == -1)
            {
                GivePlayerItem(iClient, g_sGrenade);
                PrintHintText(iClient, "%t", "Give grenade", (g_iCountGrenade[iClient] = COUNT));
            }
            else
                PrintToChat(iClient, "%t", "Took grenades");
        }
        else
            PrintToChat(iClient, "%t", "Player is dead");
    }

    return Plugin_Handled;
}

void RoundStart()
{
    LC(iClient)
        g_iCountGrenade[iClient] = -1;
}

void HeGrenadeDetonate(Event hEvent)
{
    RequestFrame(HeGrenadeDetonateFrame, hEvent.GetInt("userid"));
}

void HeGrenadeDetonateFrame(int iClient)
{
    if((iClient = GetClientOfUserId(iClient)) &&
    IsClientInGame(iClient) &&
    IsPlayerAlive(iClient))
    {
        if(g_iCountGrenade[iClient] > 0)
        {
            if(--g_iCountGrenade[iClient] == 0)
            {
                PrintHintText(iClient, "%t", "No grenade");
                return;
            }

            GivePlayerItem(iClient, g_sGrenade);
            PrintHintText(iClient, "%t", "Count of greandes", g_iCountGrenade[iClient]);
        }
    }
}

void WeaponSwitchPost(int iClient, int iEntity)
{
    if(g_iCountGrenade[iClient] < 1)
        return;
   
    int iOther = GetEntPropEnt(iEntity, Prop_Send, "m_hThrower");
    if(iOther == iClient)
        return;
   
    char sItem[32];
    GetEdictClassname(iEntity, sItem, sizeof(sItem));

    if(StrEqual(sItem, g_sGrenade))
        ++g_iCountGrenade[iClient];
}

public void OnClientPostAdminCheck(int iClient)
{
    g_iCountGrenade[iClient] = -1;

    if(!IsFakeClient(iClient))
        SDKHook(iClient, SDKHook_WeaponSwitchPost, WeaponSwitchPost);
}
 

Вложения

  • LimitedGrenade.smx
    5.4 КБ · Просмотры: 3
  • limited_grenade.phrases.txt
    832 байт · Просмотры: 6

rokfestr

Участник
Сообщения
340
Реакции
63
Как сделать чтобы weapon_healthshot не выдавало? Чтобы работало только для оружия.

C-подобный:
public Action:weapon_fire_on_empty(Event event, const char []name, bool silent)
{
    int iClient = GetClientOfUserId(GetEventInt(event, "userid"));
    new weapon = GetEntPropEnt(iClient, Prop_Send, "m_hActiveWeapon");
    
    if(g_bEnable[iClient])
    {
        if(RemovePlayerItem(iClient, weapon))
        {   
            AcceptEntityInput(weapon, "Kill");
            decl String:item[32];
            GetEventString(event, "weapon", item, 32);
            
            GivePlayerItem(iClient, item);
        }
    }
}
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Ему сто лет в обед. Еще и с багами, дюпает оружие.
Тогда в чём трабл сделать обрезание своими руками? Просто удаляешь сначала идёшь и к командам (sm_...), смотришь какое действие оно будет отсылать (CMD_Speed) на обработку, идёшь по нём (вниз файла) и удаляешь блок с этим названием процесса (public Action CMD_Speed), и так для каждой ненужной, компилишь, если есть варны/ошибки, то идёшь на ту строчку (советую с самого конца начинать фиксить) и удаляешь ненужное, за пару минут всё будет готово))
 

Truyn

King of clowns
Сообщения
1,591
Реакции
749
Люди добрые здравствуйте,может кто поможет.
Нужно плагин VIP SKINS подправить чтобы можно было выгружать без ошибок тут есть инструкция но у меня все равно не удалось сделать.
Сделал как было написано,он скомпилился с одной ошибкой и при нажатии выбор скина менюшка просто офалась.
 
Сверху Снизу