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

The End Is Near...

Russian Roulette
Сообщения
896
Реакции
667
В этой теме можете оставлять свои заявки по написанию различных плагинов:
1. Название плагина
2. Детальное описание
P.S. Некоторые плагины могу пропустить

P.S.S. Буду рад, если кто-то из скриптеров сюда будет заглядывать

 
Последнее редактирование модератором:

Grey83

Ленивая и невнимательная жопа
Сообщения
4,004
Реакции
2,361
0-BuTaJIuK-0, я бы так сделал:
Pawn:
#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 минус полсекунды.
 

Вложения

s777

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

Pawn:
#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

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

Pawn:
#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;
}
 

Вложения

  • Мне нравится
Реакции: s777

s777

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

Pawn:
#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

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

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

Вложения

0-BuTaJIuK-0

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

s777

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

Grey83

Ленивая и невнимательная жопа
Сообщения
4,004
Реакции
2,361
Видишь число 128 - это кол-во выделяемой памяти, если ты сделаешь большой текст, то тебе нужно и память увеличить.
А если убрать размер строковой переменной, то можно будет вписывать текст любой длины (правда ограничение на размер сообщения при кике никуда не денется)
 

lesha

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

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

Участник
Сообщения
443
Реакции
70
Всем здравствуйте. Можно ли добавить сюда таймер в 15 секунд, чтобы не выполнялась постоянная проверка на +right? Одной проверки в 15 секунд будет достаточно чтобы выявить афк игрока и кикнуть
Pawn:
#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;
}
 

Haseek

Участник
Сообщения
242
Реакции
24
Всем привет. Можете написать мне плагин для вывода вип игроков которые играют на сервере (не весь список а только те випы которые прямо сейчас играют) в личный чат (то есть кто написал тому и выводится) по команде !viplist допустим ^_^
 

iLoco

А печеньки будут :?
Сообщения
1,725
Реакции
673
Всем привет. Можете написать мне плагин для вывода вип игроков которые играют на сервере (не весь список а только те випы которые прямо сейчас играют) в личный чат (то есть кто написал тому и выводится) по команде !viplist допустим ^_^
 

Вложения

Haseek

Участник
Сообщения
242
Реакции
24
Спасибо! Но сможешь подкоректировать немного? :) хотелось бы чтобы еще писало какая привилегия у игрока. +список нужно чтобы выводился в чат а не в см меню. но если в чат не получится тогда сделай кнопку закрытия менюшки плиз.
 

iLoco

А печеньки будут :?
Сообщения
1,725
Реакции
673
Спасибо! Но сможешь подкоректировать немного? :) хотелось бы чтобы еще писало какая привилегия у игрока. +список нужно чтобы выводился в чат а не в см меню. но если в чат не получится тогда сделай кнопку закрытия менюшки плиз.
 

Вложения

Koder ;D

Участник
Сообщения
53
Реакции
7
Помогите пожалуйста в Advanced Admin's сделать КД на респавн админам в 40 секунд, "sm_respawn".
 

Вложения

iLoco

А печеньки будут :?
Сообщения
1,725
Реакции
673

alexandr200121

Участник
Сообщения
9
Реакции
0
В этой теме можете оставлять свои заявки по написанию различных плагинов:


P.S. Некоторые плагины могу пропустить

P.S.S. Буду рад, если кто-то из скриптеров сюда будет заглядывать

Здравтсвуйте, мне нужно написать 2 плагина !medic - который можно будет использовать 1 раз за раунд и бесплатно (доступное только ct), !kevlar - покупка брони вне зависимости где ты находишься (доступное только ct)(цену сделать 2500$)
 

iLoco

А печеньки будут :?
Сообщения
1,725
Реакции
673
Здравтсвуйте, мне нужно написать 2 плагина !medic - который можно будет использовать 1 раз за раунд и бесплатно (доступное только ct), !kevlar - покупка брони вне зависимости где ты находишься (доступное только ct)(цену сделать 2500$)
А что должен делать !medic?
Сообщения автоматически склеены:

 

Вложения

Последнее редактирование:

alexandr200121

Участник
Сообщения
9
Реакции
0
А что должен делать !medic?
Сообщения автоматически склеены:
лечить игрока который пропишет данную команду в чате, в не зависимости где он находится на карте, доступное только людям. Да и кстати тот плагин что был во вложении не рабочий
 
Сверху