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

Madness aka null138

Участник
Сообщения
713
Реакции
734
при OnClientPostAdminCheck у игрока нет випки. оно выдается гораздо позднее. например, может быть даже через пару секунд после OnClientPutInServer.
стоит использовать:

C-подобный:
/**
 *    Вызывается когда игрок был загружен.
 *
 * @param iClient            Индекс игрока.
 * @param bIsVIP            Имеет ли игрок VIP-статус.
 *
 * @noreturn
*/
forward void VIP_OnClientLoaded(int iClient, bool bIsVIP);
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
при OnClientPostAdminCheck у игрока нет випки. оно выдается гораздо позднее. например, может быть даже через пару секунд после OnClientPutInServer.
стоит использовать:

C-подобный:
/**
 *    Вызывается когда игрок был загружен.
 *
 * @param iClient            Индекс игрока.
 * @param bIsVIP            Имеет ли игрок VIP-статус.
 *
 * @noreturn
*/
forward void VIP_OnClientLoaded(int iClient, bool bIsVIP);
Потому код уже и исправлен в том же посте
 

Haseek

йфя
Сообщения
472
Реакции
79
Нужен плагин который проверяет оружие у всех игроков в начале раунда, если есть скаут, то удаляет его (CSGO)
 

Temlik

Участник
Сообщения
668
Реакции
174
Как узнать за кем следит умерший игрок? (также он может быть в спектаторах)
 

xstage

🏹
Сообщения
726
Реакции
754
Нужен плагин который проверяет оружие у всех игроков в начале раунда, если есть скаут, то удаляет его (CSGO)
C-подобный:
#include "sdktools"
#include "cstrike"

public void OnPluginStart() {
    HookEvent("round_start", RoundStart_Handler, EventHookMode_PostNoCopy);
}

void RoundStart_Handler(Event hEvent, const char[] sEvent, bool dontBroadcast) {
    CheckWeapon();
}

void CheckWeapon() {
    int iWeapon;
    char sNameWeapon[64];
    
    for(int i = 1; i <= MaxClients; i++) {
        if(IsClientInGame(i) && IsPlayerAlive(i)) {
            iWeapon = GetPlayerWeaponSlot(i, CS_SLOT_PRIMARY);
            
            if(iWeapon == -1)
                continue;

            GetEntityClassname(iWeapon, sNameWeapon, sizeof sNameWeapon);

            if(!strcmp(sNameWeapon, "weapon_ssg08")) {
                RemovePlayerItem(i, iWeapon);
                AcceptEntityInput(iWeapon, "Kill");
            }
        }
    }
}
Сообщения автоматически склеены:

Как узнать за кем следит умерший игрок? (также он может быть в спектаторах)
C-подобный:
GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
 

Haseek

йфя
Сообщения
472
Реакции
79
C-подобный:
#include "sdktools"
#include "cstrike"

public void OnPluginStart() {
    HookEvent("round_start", RoundStart_Handler, EventHookMode_PostNoCopy);
}

void RoundStart_Handler(Event hEvent, const char[] sEvent, bool dontBroadcast) {
    CheckWeapon();
}

void CheckWeapon() {
    int iWeapon;
    char sNameWeapon[64];
   
    for(int i = 1; i <= MaxClients; i++) {
        if(IsClientInGame(i) && IsPlayerAlive(i)) {
            iWeapon = GetPlayerWeaponSlot(i, CS_SLOT_PRIMARY);
           
            if(iWeapon == -1)
                continue;

            GetEntityClassname(iWeapon, sNameWeapon, sizeof sNameWeapon);

            if(!strcmp(sNameWeapon, "weapon_ssg08")) {
                RemovePlayerItem(i, iWeapon);
                AcceptEntityInput(iWeapon, "Kill");
            }
        }
    }
}
Сообщения автоматически склеены:


C-подобный:
GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
Thank you! Работает
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@Temlik, вот так делается в плагине Spectator List:
C-подобный:
enum
{
    SPECMODE_FIRSTPERSON = 4,
    SPECMODE_3RDPERSON
};

...

public Action Timer_UpdateHudHint(Handle timer, any client)
{
    int iSpecMode;

    static char szText[254];
    szText[0] = '\0';

    // Dealing with a client who is in the game and playing.
    if(IsPlayerAlive(client))
    {
        for(int i = 1; i <= MaxClients; i++)
        {
            if(!IsClientInGame(i) || !IsClientObserver(i)) continue;

            // The 'client' is not an admin and do not display admins is enabled and the client (i) is an admin, so ignore them.
            if(!IsPlayerAdmin(client) && g_bNoAdmins && IsPlayerAdmin(i)) continue;

            iSpecMode = GetEntProp(i, Prop_Send, "m_iObserverMode");

            // The client isn't spectating any one person, so ignore them.
            if(iSpecMode != SPECMODE_FIRSTPERSON && iSpecMode != SPECMODE_3RDPERSON) continue;

            // Find out who the client is spectating.
            // Are they spectating our player?
            if(GetEntPropEnt(i, Prop_Send, "m_hObserverTarget") == client)
                Format(szText, sizeof(szText), "%s%N\n", szText, i);
        }
    }
    else
    {
        int iSpecModeUser = GetEntProp(client, Prop_Send, "m_iObserverMode");
        if(iSpecModeUser == SPECMODE_FIRSTPERSON || iSpecModeUser == SPECMODE_3RDPERSON)
        {
            // Find out who the User is spectating.
            int iTargetUser = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
    
            for(int i = 1; i <= MaxClients; i++)
            {
                if(!IsClientInGame(i) || !IsClientObserver(i)) continue;
    
                // The 'client' is not an admin and do not display admins is enabled and the client (i) is an admin, so ignore them.
                if(!IsPlayerAdmin(client) && g_bNoAdmins && IsPlayerAdmin(i)) continue;
    
                iSpecMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
    
                // The client isn't spectating any one person, so ignore them.
                if(iSpecMode != SPECMODE_FIRSTPERSON && iSpecMode != SPECMODE_3RDPERSON) continue;
    
                // Find out who the client is spectating.
                // Are they spectating the same player as User?
                if(GetEntPropEnt(i, Prop_Send, "m_hObserverTarget") == iTargetUser) Format(szText, sizeof(szText), "%s%N\n", szText, i);
            }
        }
    }

    if(szText[0])
    {
        iSpecMode = 0;
        while(szText[iSpecMode]) iSpecMode++;
        szText[iSpecMode-1] = 0;
    }

    // Send our message
    Handle hBuffer = StartMessageOne("KeyHintText", client);
    BfWriteByte(hBuffer, 1);
    BfWriteString(hBuffer, szText);
    EndMessage();

    return Plugin_Continue;
}
 

Temlik

Участник
Сообщения
668
Реакции
174
Как по нажатию кнопки (IN_ALT1, например) выполнить действие?
 

Temlik

Участник
Сообщения
668
Реакции
174
Только IN_USE работает, когда меняю на IN_ALT1/IN_ALT2/IN_DUCK - ничего не происходит
Сообщения автоматически склеены:

C-подобный:
public Action OnPlayerRunCmd(int iClient, int& buttons)
{
    if (GetUserAdmin(iClient) != INVALID_ADMIN_ID && !IsPlayerAlive(iClient))
    {
        static iPrevButtons[MAXPLAYERS+1];
        if ((buttons & IN_USE) && !(iPrevButtons[iClient] & IN_USE))
        {
            if (OnButtonUsePress(iClient) != Plugin_Continue)
            {
                buttons &= ~IN_USE;
            }
        }
        iPrevButtons[iClient] = buttons;
        return Plugin_Continue;
    }
}
 

xstage

🏹
Сообщения
726
Реакции
754
Только IN_USE работает, когда меняю на IN_ALT1/IN_ALT2/IN_DUCK - ничего не происходит
Сообщения автоматически склеены:

C-подобный:
public Action OnPlayerRunCmd(int iClient, int& buttons)
{
    if (GetUserAdmin(iClient) != INVALID_ADMIN_ID && !IsPlayerAlive(iClient))
    {
        static iPrevButtons[MAXPLAYERS+1];
        if ((buttons & IN_USE) && !(iPrevButtons[iClient] & IN_USE))
        {
            if (OnButtonUsePress(iClient) != Plugin_Continue)
            {
                buttons &= ~IN_USE;
            }
        }
        iPrevButtons[iClient] = buttons;
        return Plugin_Continue;
    }
}
Какая именно кнопка интересует ?
Сообщения автоматически склеены:

Можно сделать так:

C-подобный:
public void OnPluginStart() {
    AddCommandListener(BtnDuck_Handler, "+duck");
}

Action BtnDuck_Handler(int client, const char[] command, int argc) {
    //...
}
 

MoOvik

ABKAMHOL"..."
Сообщения
193
Реакции
26
Можно ли написать плагин, возможно это квар, На определённых картах прыжки можно было менять
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@Temlik, откуда взялось OnButtonUsePress(iClient)? В SM нет такой функции, в процитированном коде она тоже отсутствует.

@MoOvik, м/б достаточно гравитацию менять в зависимости от карты?
Через плагин Map Config, например.
 

MoOvik

ABKAMHOL"..."
Сообщения
193
Реакции
26
@Temlik, откуда взялось OnButtonUsePress(iClient)? В SM нет такой функции, в процитированном коде она тоже отсутствует.

@MoOvik, м/б достаточно гравитацию менять в зависимости от карты?
Через плагин Map Config, например.
У меня мг сервер 4 прыжка, я бы хотел изменить прыжки до двух на PVP картах
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@Temlik, т.е. ты процитировал только кусок кода и жалуешься, что он не пашет.
Сообщения автоматически склеены:

Вообще вот так обрабатывается нажатие/отпускание клавиш:
C-подобный:
static const int BUTTON = IN_DUCK;

public Action OnPlayerRunCmd(int client, int& buttons)
{
    static int prev_buttons[MAXPLAYERS+1];
    if(buttons & BUTTON && !(prev_buttons[client] & BUTTON))
    {
        // код, срабатывающий при нажатии кнопки забинденой как BUTTON
    }

    if(!(buttons & BUTTON) && prev_buttons[client] & BUTTON)
    {
        // код, срабатывающий при отпускании кнопки забинденой как BUTTON
    }

    prev_buttons[client] = buttons;

    return Plugin_Continue;
}
 
Последнее редактирование:

Fen1x

Участник
Сообщения
74
Реакции
10
Помогите пожалуйста в плагин добавить оповещение игрокам, в начале раунда. Что недостаточно игроков для плента на Б.
#define BLOCKPLANT 1 // 1 = B | 2 = A
#define MINPLAYERS 10 + оповещение - если игрок захочет плентить на Б но игроков недостаточно. (Для плента нужно 10 игроков!) + оповещение когда наберётся достаточное количество игроков. Что плент доступен на А и Б. (ПРОШУ ВАС РЕБЯТА) ПОМОГИТЕ всех с Наступающим Новым Годом!!!!
 

Вложения

  • plant_block.sp
    2.7 КБ · Просмотры: 5

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@Fen1x, ща допилю поддержку переводов и выложу в ресурсах.

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

@Fen1x, пробуй:
 
Последнее редактирование:
Сверху Снизу