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

xstage

🏹
Сообщения
726
Реакции
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,520
Реакции
4,979

Вложения

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

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 КБ · Просмотры: 4
  • DRSkip.phrases.txt
    1 КБ · Просмотры: 5

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 байт · Просмотры: 6
  • KickTimer.smx
    3.2 КБ · Просмотры: 3
Последнее редактирование:
  • Мне нравится
Реакции: s777

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
@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,520
Реакции
4,979
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 КБ · Просмотры: 6

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 КБ · Просмотры: 3
  • KickTimer.smx
    3.3 КБ · Просмотры: 2
  • Мне нравится
Реакции: 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

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

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

Вложения

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

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,520
Реакции
4,979
Видишь число 128 - это кол-во выделяемой памяти, если ты сделаешь большой текст, то тебе нужно и память увеличить.
А если убрать размер строковой переменной, то можно будет вписывать текст любой длины (правда ограничение на размер сообщения при кике никуда не денется)
 

lesha

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

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;
}
 
Сверху Снизу