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

xstage

🏹
Сообщения
727
Реакции
754
Добрый день! Напишите пожалуйста кто нибудь плагин, на ограничения покупки гранат по времени, то есть к примеру с начала раунда закуп гранат действует 30 секунд, после 30 секунд что бы нельзя было купить гранаты, а все остальное оружие можно было купить
C-подобный:
#define TIME 30.0 // Время
bool bBuy;

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

public void EventRoundStart(Event hEvent, const char[] sEvent, bool db)
{
    bBuy = false;
    CreateTimer(TIME, Timer_Delay);
}

public Action Timer_Delay(Handle timer)
{
    bBuy = true;
}

public Action CS_OnBuyCommand(int client, const char[] weapon)
{
    if(bWeapon(weapon))
    {
        if(bBuy)
        {
            return Plugin_Handled;
        }
    }
    return Plugin_Continue;
}

bool bWeapon(const char[] weapon)
{
    if(StrEqual(weapon, "hegrenade") || StrEqual(weapon, "smokegrenade") || StrEqual(weapon, "flashbang") || StrEqual(weapon, "molotov") || StrEqual(weapon, "incgrenade") || StrEqual(weapon, "decoy"))
    {
        return true;
    }
    else
    {
        return false;
    }
}
 

DENFER

Пишу плагины за два биг тести и картошку фри..
Сообщения
260
Реакции
289
C-подобный:
#define TIME 30.0 // Время
bool bBuy;

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

public void EventRoundStart(Event hEvent, const char[] sEvent, bool db)
{
    bBuy = false;
    CreateTimer(TIME, Timer_Delay);
}

public Action Timer_Delay(Handle timer)
{
    bBuy = true;
}

public Action CS_OnBuyCommand(int client, const char[] weapon)
{
    if(bWeapon(weapon))
    {
        if(bBuy)
        {
            return Plugin_Handled;
        }
    }
    return Plugin_Continue;
}

bool bWeapon(const char[] weapon)
{
    if(StrEqual(weapon, "hegrenade") || StrEqual(weapon, "smokegrenade") || StrEqual(weapon, "flashbang") || StrEqual(weapon, "molotov") || StrEqual(weapon, "incgrenade") || StrEqual(weapon, "decoy"))
    {
        return true;
    }
    else
    {
        return false;
    }
}
А если сменится карта?)
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,645
Реакции
5,115

Вложения

  • buy_nades_block.sp
    1.1 КБ · Просмотры: 23

Vrnteam

Участник
Сообщения
14
Реакции
1
Другое - DRSkip
Нужен такой плагин,но:
1. Morecolors(чтобы в чат при пропуске или выборе стандартного раунда писалось цветным)
2. Исходник
3. Чтобы при пропуске игроков, ловушки блокировались.
Цена в районе от 50 до 150 рублей - было бы неплохо, а если бесплатно так вообще крутяк).
Заранее, спасибо.
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Другое - DRSkip
Нужен такой плагин,но:
1. Morecolors(чтобы в чат при пропуске или выборе стандартного раунда писалось цветным)
2. Исходник
3. Чтобы при пропуске игроков, ловушки блокировались.
Цена в районе от 50 до 150 рублей - было бы неплохо, а если бесплатно так вообще крутяк).
Заранее, спасибо.

Скомпилил этот плагин, добавил зеленый цвет по аналагу префикса в phrases, проверяй.
 

Вложения

  • DRSkip.smx
    8.6 КБ · Просмотры: 15
  • DRSkip.phrases.txt
    1 КБ · Просмотры: 16

Vrnteam

Участник
Сообщения
14
Реакции
1
Скомпилил этот плагин, добавил зеленый цвет по аналагу префикса в phrases, проверяй.
Да это я знаю, сам делал. Там именно ловушки не блокируются и меню баганное немного, то появляется, то нет, а так спасибо)
 

s777

Участник
Сообщения
449
Реакции
74
Привет. Нужен плагин, который кикает с причиной "бла бла бла/n бла бла бла" если игрок не выбрал команду.
Сейчас причины нет совсем, просто выкидывает в меню. Наверное нужно реализовать кик за 1 сек до того, как сервер отключит вас сам.
Получается, у меня время на выбор команды mp_force_pick_time 15, а кикать нужно на 14й
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
@s777
Думаю, разберешься, как поменять время и причину кика (27 и 36 строки)

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

public Plugin:myinfo =
{
    name = "KickTimer",
    author = "0-BuTaJIuK-0",
    description = "Privat dlya s777",
    version = "666",
};

new bool:Tut[MAXPLAYERS + 1];

public OnPluginStart()
{
    HookEvent("player_disconnect", Event_PlayerDisconnect);
}

public Event_PlayerDisconnect(Handle:event, String:name[], bool:dontBroadcast)
{
    Tut[GetClientOfUserId(GetEventInt(event, "userid"))] = false;
}

public OnClientPostAdminCheck(client)
{
    if (!Tut[client])
    {
        CreateTimer(14.0, Timer_Darova, client, TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action:Timer_Darova(Handle:timer, any:client)
{
    if (IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_NONE)
    {
            Tut[client] = true;
            KickClient(client, "Ты не выбрал команду");
    }
    return Plugin_Stop;
}
 

Вложения

  • KickTimer.sp
    842 байт · Просмотры: 16
  • KickTimer.smx
    3.2 КБ · Просмотры: 12
Последнее редактирование:
  • Мне нравится
Реакции: s777

Nekro

Терра инкогнита
Сообщения
4,087
Реакции
2,359
@s777
Думаю, разберешься, как поменять время и причину кика (27 и 36 строки)

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

public Plugin:myinfo =
{
    name = "KickTimer",
    author = "0-BuTaJIuK-0",
    description = "Privat dlya s777",
    version = "666",
};

new bool:Tut[MAXPLAYERS + 1];

public OnPluginStart()
{
    HookEvent("player_disconnect", Event_PlayerDisconnect);
}

public Event_PlayerDisconnect(Handle:event, String:name[], bool:dontBroadcast)
{
    Tut[GetClientOfUserId(GetEventInt(event, "userid"))] = false;
}

public OnClientPostAdminCheck(client)
{
    if (!Tut[client])
    {
        CreateTimer(14.0, Timer_Darova, client, TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action:Timer_Darova(Handle:timer, any:client)
{
    if (IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_NONE)
    {
            Tut[client] = true;
            KickClient(client, "Ты не выбрал команду");
    }
    return Plugin_Stop;
}
Отличный приват выложеный в паблике)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,645
Реакции
5,115
0-BuTaJIuK-0, я бы так сделал:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

Handle
    hTimer[MAXPLAYERS+1];
bool
    bCheck;
float
    fChooseTime = 14.5;    // дефолтное значение для не КСГО


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

    ConVar cvar = FindConVar("mp_force_pick_time");
    if(!cvar) return;

    cvar.AddChangeHook(CVarChanged_Time);
    fChooseTime = cvar.IntValue - 0.5;
}

public void CVarChanged_Time(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    fChooseTime = cvar.IntValue - 0.5;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    if(bCheck) return;

    bCheck = true;
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !GetClientTeam(i) && !IsClientInKickQueue(i))
        StartTimer(i);
}

public void OnClientPostAdminCheck(int client)
{
    if(bCheck) StartTimer(client);
}

stock void StartTimer(int client)
{
    if(!IsFakeClient(client) && !hTimer[client]) hTimer[client] = CreateTimer(fChooseTime, Timer_Check, client);
}

public Action Timer_Check(Handle timer, int client)
{
    if(!GetClientTeam(client) && !IsClientInKickQueue(client)) KickClient(client, "Вы не выбрали команду за отведённое время!");
    hTimer[client] = null;
}

public void OnClientDisconnect(int client)
{
    if(hTimer[client]) delete hTimer[client];
}

public void OnMapEnd()
{
    bCheck = false;
    for(int i = 1; i <= MaxClients; i++) if(hTimer[i]) delete hTimer[i];
}
На смене карт таймеры вырубаются и стартуют только после начала первого раунда на карте.
Если игра не КСГО, то таймер ставится 14.5 секунд, если КСГО, то значение квара mp_force_pick_time минус полсекунды.
 

Вложения

  • noteam_kick.sp
    1.5 КБ · Просмотры: 16

s777

Участник
Сообщения
449
Реакции
74
@s777
Думаю, разберешься, как поменять время и причину кика (27 и 36 строки)

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

public Plugin:myinfo =
{
    name = "KickTimer",
    author = "0-BuTaJIuK-0",
    description = "Privat dlya s777",
    version = "666",
};

new bool:Tut[MAXPLAYERS + 1];

public OnPluginStart()
{
    HookEvent("player_disconnect", Event_PlayerDisconnect);
}

public Event_PlayerDisconnect(Handle:event, String:name[], bool:dontBroadcast)
{
    Tut[GetClientOfUserId(GetEventInt(event, "userid"))] = false;
}

public OnClientPostAdminCheck(client)
{
    if (!Tut[client])
    {
        CreateTimer(14.0, Timer_Darova, client, TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action:Timer_Darova(Handle:timer, any:client)
{
    if (IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_NONE)
    {
            Tut[client] = true;
            KickClient(client, "Ты не выбрал команду");
    }
    return Plugin_Stop;
}
Все работает прекрасно, но я извиняюсь, можно ли добавить условие, что необходимо как минимум 10 человек для работы плагина?
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
@s777
Не проверял:

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

public Plugin:myinfo =
{
    name = "KickTimer",
    author = "0-BuTaJIuK-0",
    description = "Privat dlya s777",
    version = "666v2",
};

float Time = 14.0; // Время до кика
char Text[128] = "Ты не выбрал команду за отведенное время"; // Причина кика
int Players = 10; // Количество игроков

new bool:Tut[MAXPLAYERS + 1];

public OnPluginStart()
{
    HookEvent("player_disconnect", Event_PlayerDisconnect);
}

public Event_PlayerDisconnect(Handle:event, String:name[], bool:dontBroadcast)
{
    Tut[GetClientOfUserId(GetEventInt(event, "userid"))] = false;
}

public OnClientPostAdminCheck(client)
{
    if (!Tut[client] && GetClientCount(false) > Players)
    {
        CreateTimer(Time, Timer_Darova, client, TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action:Timer_Darova(Handle:timer, any:client)
{
    if (IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_NONE)
    {
            Tut[client] = true;
            KickClient(client, "%s", Text);
    }
    return Plugin_Stop;
}
 

Вложения

  • KickTimer.sp
    1.1 КБ · Просмотры: 15
  • KickTimer.smx
    3.3 КБ · Просмотры: 12
  • Мне нравится
Реакции: s777

s777

Участник
Сообщения
449
Реакции
74
@s777
Не проверял:

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

public Plugin:myinfo =
{
    name = "KickTimer",
    author = "0-BuTaJIuK-0",
    description = "Privat dlya s777",
    version = "666v2",
};

float Time = 14.0; // Время до кика
char Text[128] = "Ты не выбрал команду за отведенное время"; // Причина кика
int Players = 10; // Количество игроков

new bool:Tut[MAXPLAYERS + 1];

public OnPluginStart()
{
    HookEvent("player_disconnect", Event_PlayerDisconnect);
}

public Event_PlayerDisconnect(Handle:event, String:name[], bool:dontBroadcast)
{
    Tut[GetClientOfUserId(GetEventInt(event, "userid"))] = false;
}

public OnClientPostAdminCheck(client)
{
    if (!Tut[client] && GetClientCount(false) > Players)
    {
        CreateTimer(Time, Timer_Darova, client, TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action:Timer_Darova(Handle:timer, any:client)
{
    if (IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_NONE)
    {
            Tut[client] = true;
            KickClient(client, "%s", Text);
    }
    return Plugin_Stop;
}
Когда добавляю свою причину кика, ошибка error 018: initialization data exceeds declared size, тк она длинная. в предыдущей версии плагина не было этого.
Подправил причину как в старом плагине - скомпилилось. Проверил сейчас при онлайне ниже 10 не кикает, спасибо огромное)
 
Последнее редактирование:

lesha

Участник
Сообщения
91
Реакции
10
Скомпилируйте пожалуйста плагин SMAC На Sourcemod 1.9

Не компилирует, ошибка: error 100: function prototypes do not match
 

Вложения

  • scripting.rar
    25.4 КБ · Просмотры: 18

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Когда добавляю свою причину кика, ошибка error 018: initialization data exceeds declared size, тк она длинная. в предыдущей версии плагина не было этого.
Подправил причину как в старом плагине - скомпилилось. Проверил сейчас при онлайне ниже 10 не кикает, спасибо огромное)
char Text[128] = "Ты не выбрал команду за отведенное время"; // Причина кика
Видишь число 128 - это кол-во выделяемой памяти, если ты сделаешь большой текст, то тебе нужно и память увеличить.
Если помог, ставь "👍"
 

s777

Участник
Сообщения
449
Реакции
74
char Text[128] = "Ты не выбрал команду за отведенное время"; // Причина кика
Видишь число 128 - это кол-во выделяемой памяти, если ты сделаешь большой текст, то тебе нужно и память увеличить.
Если помог, ставь "👍"
Понял, но хуже же не будет если оставлю так? KickClient(client, "моя причина");
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,645
Реакции
5,115
Видишь число 128 - это кол-во выделяемой памяти, если ты сделаешь большой текст, то тебе нужно и память увеличить.
А если убрать размер строковой переменной, то можно будет вписывать текст любой длины (правда ограничение на размер сообщения при кике никуда не денется)
 

lesha

Участник
Сообщения
91
Реакции
10
Добрый день всем! Подскажите пожалуйста что за ошибки и как их исправить?

L 07/29/2020 - 00:20:59: SourceMod error session started
L 07/29/2020 - 00:20:59: Info (map "zm_eh_pavlov_v4") (file "errors_20200729.log")
L 07/29/2020 - 00:20:59: [SM] Exception reported: Client 2 is not connected/Игрок 2 не подключен
L 07/29/2020 - 00:20:59: [SM] Blaming: vip/VIP_Core.smx
L 07/29/2020 - 00:20:59: [SM] Call stack trace:
L 07/29/2020 - 00:20:59: [SM] [0] ThrowNativeError
L 07/29/2020 - 00:20:59: [SM] [1] Line 1307, vip/API.sp::CheckValidClient
L 07/29/2020 - 00:20:59: [SM] [2] Line 994, vip/API.sp::Native_IsClientFeatureUse
L 07/29/2020 - 00:20:59: [SM] [4] VIP_IsClientFeatureUse

SM 1.9
 

s777

Участник
Сообщения
449
Реакции
74
Всем здравствуйте. Можно ли добавить сюда таймер в 15 секунд, чтобы не выполнялась постоянная проверка на +right? Одной проверки в 15 секунд будет достаточно чтобы выявить афк игрока и кикнуть
C-подобный:
#include <sdktools_hooks>

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    if((buttons & IN_LEFT) || (buttons & IN_RIGHT)) return Plugin_Handled;

    return Plugin_Continue;
}
 
Сверху Снизу