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

F

FBI

@Altaj, sv_infinite_ammo 0 //Бесконечные патроны у игроков? (1 = Да, 0 = Нет)? Если поставить 2, то патроны будут бесконечными, но магазин придется перезаряжать, каждый раз.
 
F

FBI

C-подобный:
Ребята помогите допилить данную warn систему
всесто кика и бана сделать мут микро и чата.
Макс число предупреждений 3. связать с соурскомсом
макс мут на время до 2х недель
да и можно сделать причины примерно такие
Мат
Неадекватное поведение
Нарушение правил
Спам
Фоновый шум
Флуд

Вот сам код

/*
* ********************************************************
*  EuroCSS.LT | Warning System  **************************
* ********************************************************
* This plugins is part of EuroCSS.LT Gaming community
* Please do not remove the copyrights of this plugin, otherway,
* ***************************************************************
* I RAPE YOU I RAPE YOU I RAPE YOU I RAPE YOU I RAPE YOU I RAPE YOU *
* ********************************************************************
*

Special Thanks to Peace-Maker, who helped me a lot in creating this plugin.

MYSQL tables:

CREATE TABLE user_warn (
  id int(10) unsigned NOT NULL auto_increment,
  nick varchar(65) NOT NULL,
  steam_id varchar(65) NOT NULL,
  warn int(10) NOT NULL,
  PRIMARY KEY (id)
);


*/

#pragma semicolon 1

#include <sourcemod>


#include <colors>

#define PLUGIN_VERSION "0.4a"

new Handle:warn_sistema = INVALID_HANDLE;
new Handle:warn_max = INVALID_HANDLE;
new Handle:warn_punishment = INVALID_HANDLE;
new Handle:warn_breason = INVALID_HANDLE;
new Handle:warn_kreason = INVALID_HANDLE;
new Handle:warn_ban_time = INVALID_HANDLE;

new Handle:db = INVALID_HANDLE;

public Plugin:myinfo = 
{
    name = "Warning system",
    author = "MindziusLT",
    description = "This system will ban players for 1 week, after they get warnings thereshold.",
    version = PLUGIN_VERSION,
    url = "EuroCSS.LT"
};
public OnPluginStart()
{
    CreateConVar("warn_version", PLUGIN_VERSION, "Warn system version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
    RegAdminCmd("sm_warn", Command_Warn, ADMFLAG_BAN, "Warn command. ADMFLAG_BAN");
    RegConsoleCmd("sm_mywarn", Command_MyWarn);
    warn_max = CreateConVar("warn_max", "5", "Maximum WARN thereshold.", FCVAR_PLUGIN);
    warn_punishment = CreateConVar("warn_punishment", "2", "Punishment: 1- KICK, 2-BAN", FCVAR_PLUGIN);   
    warn_breason = CreateConVar("warn_ban_reason", "[WARN] You've been bad boy. Take a rest", "Warn BAN reason.", FCVAR_PLUGIN);   
    warn_kreason = CreateConVar("warn_kick_reason", "[WARN] Slow down, Bieber", "Warn KICK reason.", FCVAR_PLUGIN);   
    warn_ban_time = CreateConVar("warn_ban_time", "60", "BAN time in minutes. Permanently[0] 1hour[60min] 1Day[1440min] 3days[4320min] 5days[7200min]", FCVAR_PLUGIN);   
    warn_sistema = CreateConVar("eurocss_warn", "1", "Enable/disable plugin", FCVAR_PLUGIN);
   
    //This starts the connection defines the callback to run once connected/error'd 
    SQL_TConnect(SQL_OnConnect, "default");

    AutoExecConfig(true, "warn_system_eurocss");
}


public SQL_OnConnect(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    //Since we are not guaranteed a connection, we make sure it actually worked 
    if (hndl == INVALID_HANDLE)
    {
        //It didn't work, so we log the error 
        LogError("Database failure: %s", error);
    } 
    else 
    {
        //It worked, so we set the global to the handle the callback provided for this connection 
        db = hndl;
    }
}



public Action:Command_MyWarn(client, args) // Let's check my warning level.
{
    if (GetConVarInt(warn_sistema) == 1)
    {    
   
        decl String:auth[64];
        GetClientAuthString(client,auth,sizeof(auth));
   
        decl String:query[100];
   
        Format(query,sizeof(query),"SELECT warn FROM user_warn WHERE steam_id = '%s'", auth);
        SQL_TQuery(db,SQL_CheckWarnings, query, GetClientUserId(client));
    }
    else
    {
        ReplyToCommand(client, "\x03[WARN] Command: /warn <nick> <reason>");
    }

   
    return Plugin_Handled;
}

public Action:Command_Warn(client, args) // Let's add warning level to EMO.
{
    if (GetConVarInt(warn_sistema) == 1)
    {    
        if (args < 2)
        {
            ReplyToCommand(client, "\x03[WARN] Command: /warn <nick> <reason>");
            return Plugin_Handled;
        }
   
        decl String:query[512];
        decl String:arg1[32];
        decl String:reason[32];
        decl String:name[MAX_NAME_LENGTH];
   
   
        GetCmdArg(1, arg1, sizeof(arg1));
        new target = FindTarget(client, arg1,true,true);
        GetClientName(target,name,sizeof(name));
       
        decl String:auth[64];
        GetClientAuthString(target,auth,sizeof(auth));
       
       
        GetCmdArg(2, reason, sizeof(reason));
       
        new Handle:dp = CreateDataPack();
        WritePackCell(dp, GetClientUserId(target));
        WritePackString(dp, reason);
        ResetPack(dp);
       
        Format(query,sizeof(query),"SELECT warn FROM user_warn WHERE steam_id = '%s'", auth);
       
        SQL_TQuery(db,SQL_AddWarnings,query, dp);

    }
    else
    {
        ReplyToCommand (client, "\x03[WARN] Warn system is offline.");
    }
    return Plugin_Handled;
}
public SQL_NothingCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
{

    if(hndl == INVALID_HANDLE)
    {
        LogError("Could not connect to database: %s", error);
        return;
    }
   
    LogMessage("[WARN] - Connected Successfully to Database");
}

public SQL_CheckWarnings(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    new client;
    client = GetClientOfUserId(data);
   
    if(client == 0)
    return;
   
    if (hndl == INVALID_HANDLE)
    {
        LogError("Query error: %s", error);
        return;
    }
    decl String:warn[5];
   
    while (SQL_FetchRow(hndl))
    {
        SQL_FetchString(hndl, 0, warn, sizeof(warn));
    }
   
    new kWarn = StringToInt(warn);
    new iMax = GetConVarInt(warn_max);
   
    CPrintToChat(client, "{red}[WARN] {olive}You have [{green}%d{olive}/{red}%d{olive}] warns.", kWarn, iMax);

}

public SQL_AddWarnings(Handle:owner, Handle:hndl, const String:error[], any:dp)
{
    new target;
    decl String:reason[32];
    if(dp != INVALID_HANDLE)
    {
        target = GetClientOfUserId(ReadPackCell(dp));
        ReadPackString(dp, reason, sizeof(reason));
        CloseHandle(dp); 
      // THIS IS MANDATORY!! After you're done with reading the info from the datapack, you have to close the handle to avoid memory leaks. 
        // You also have to close the handle, even if you don't need the info in it at the time due to sql error or something. 
        // That's why it's even before error checking.
    }
   
    if (hndl == INVALID_HANDLE || strlen(error) > 0)
    {
        LogError("Query error: %s", error);
        return;
    }
   
    if(target == 0)
    return;
   
    decl String:query[512];
    decl String:name[MAX_NAME_LENGTH], String:auth[64];
    GetClientName(target,name,sizeof(name));
    GetClientAuthString(target,auth,sizeof(auth));
   
    decl String:max_warn[5];
    GetConVarString(warn_max, max_warn, sizeof(max_warn));
    new iMax = StringToInt(max_warn);
   
    // This player wasn't warned before? Add him to the database!
    if(!SQL_MoreRows(hndl))
    {
        Format(query, sizeof(query), "INSERT INTO user_warn (nick, steam_id, warn) VALUES ('%s', '%s', 1)", name, auth);
        SQL_TQuery(db,SQL_NothingCallback,query);
       
        CPrintToChatAll("{red}[WARN]{green} %s {olive}have been warned [{green}1{olive}/{red}%d{olive}]. {red}Reason: {green}%s", name, iMax, reason);
    }
    // He's been warned before.. increase!
    else
    {
       
        decl String:warn[5];
        SQL_FetchRow(hndl);
        SQL_FetchString(hndl, 0, warn, sizeof(warn));
       
        new iWarn = StringToInt(warn);
        // Increase the warn level
        iWarn++;
       
        Format(query, sizeof(query), "UPDATE user_warn SET warn = %d WHERE steam_id = '%s'", iWarn, auth);
        SQL_TQuery(db,SQL_NothingCallback,query);
        CPrintToChatAll("{red}[WARN]{green} %s {olive}have been warned [{green}%d{olive}/{red}%d{olive}]. {red}Reason: {green}%s", name, iWarn, iMax, reason);
           
        if(iWarn >= GetConVarInt(warn_max))
        {
            if(GetConVarInt(warn_punishment) == 1)
            {
                if( target > 0 )
                {
                    CPrintToChatAll("{red}[WARN]{green} %s {olive}kicked. [{green}%d{olive}/{red}%d{olive}].", name, iMax, iWarn);
                    Format(query, sizeof(query), "UPDATE user_warn SET  warn = '0' WHERE steam_id = '%s'", auth);
                    SQL_TQuery(db,SQL_NothingCallback,query);
                   
                    new String:kick_reason[50];
                    GetConVarString(warn_kreason, kick_reason, sizeof(kick_reason));
                       
                    ServerCommand("sm_kick %s %s", name, kick_reason);
                }
            }
            else if(GetConVarInt(warn_punishment) == 2)
            {
                if( target > 0 )
                {
                    new String:bantime[30];
                    new String:ban_reason[50];
                    GetConVarString(warn_ban_time, bantime, sizeof(bantime));
                    new iBanTime = StringToInt(bantime); 
                    GetConVarString(warn_breason, ban_reason, sizeof(ban_reason));
                   
                    CPrintToChatAll("{red}[WARN]{green} %s {olive}is beeing banned [{green}%d{olive}/{red}%d{olive}]. {red}Ban Lenght: {green}%d min", name, iWarn, iMax, bantime);
                    Format(query, sizeof(query), "UPDATE user_warn SET  warn = '0' WHERE steam_id = '%s'", auth);
                    SQL_TQuery(db,SQL_NothingCallback,query);
                   
                    ServerCommand("sm_ban %s %d %s", name, iBanTime, ban_reason);
   
                }
            }
        }
    }



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

NaN

FPE_INTDIV_TRAP
Сообщения
1,513
Реакции
1,487
C-подобный:
Ребята помогите допилить данную warn систему
всесто кика и бана сделать мут микро и чата.
Макс число предупреждений 3. связать с соурскомсом
макс мут на время до 2х недель
да и можно сделать причины примерно такие
Мат
Неадекватное поведение
Нарушение правил
Спам
Фоновый шум
Флуд

Вот сам код

// This file was auto-generated by SourceMod (v1.3.7)
// ConVars for plugin "warn_system_public.smx"


// Enable/disable plugin
// -
// Default: "1"
eurocss_warn "1"

// Warn BAN reason.
// -
// Default: "[WARN] You've been bad boy. Take a rest"
warn_ban_reason "[WARN] You've been bad boy. Take a rest"

// BAN time in minutes. Permanently[0] 1hour[60min] 1Day[1440min] 3days[4320min] 5days[7200min]
// -
// Default: "60"
warn_ban_time "60"

// Warn KICK reason.
// -
// Default: "[WARN] Slow down, Bieber"
warn_kick_reason "[WARN] Slow down, Bieber"

// Maximum WARN thereshold.
// -
// Default: "5"
warn_max "5"

// Punishment: 1- KICK, 2-BAN
// -
// Default: "2"
warn_punishment "2"

Это не код, а конфиг :biggrin:

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

BaFeR

Добрый человек
Сообщения
721
Реакции
216
Вопросик,занимает ли цвет байты?Ну к примеру русский 1 символ 2 байта,а русский красный символ 4 байта или т.п.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Forever Alone, занимает. Но только один-два. Размер не добавляется к каждому перекрашенному символу.
 

Fox1qqq

Крякнем, плюнем и надежно склеим скотчем!
Сообщения
247
Реакции
145
Парни, на что и как заменить OnGameFrame ?
PHP:
public void OnGameFrame()
{
    if(bEnable)
    {
        for(int i = 1; i <= MaxClients; i++)
        {
            if(IsClientInGame(i) && IsPlayerAlive(i) && iAimPref[i] != NUM_COLORS)
            {
                static char weapon[12];
                GetClientWeapon(i, weapon, sizeof(weapon));

                if((StrContains(weapon, "weapon_", true) == 0)) CreateBeam(i, iAimPref[i]);
            }
        }
    }
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
а из архива хоть сам so-файл доставал?
--- Добавлено позже ---
@R1KO, с sdkhooks попутал
--- Добавлено позже ---
@Fox1qqq, на повторяющийся таймер с интервалом, который прописан в параметрах для CreateBeam()

хм, 'iAimPref != NUM_COLORS' это что такое? М/б там должен быть знак '<' ?
 
Последнее редактирование:

Fox1qqq

Крякнем, плюнем и надежно склеим скотчем!
Сообщения
247
Реакции
145
а из архива хоть сам so-файл доставал?
--- Добавлено позже ---
@R1KO, с sdkhooks попутал
--- Добавлено позже ---
@Fox1qqq, на повторяющийся таймер с интервалом, который прописан в параметрах для CreateBeam()

хм, 'iAimPref != NUM_COLORS' это что такое? М/б там должен быть знак '<' ?
Это я твой старый плагин переделываю для себя [NMRiH] Laser Aim v.1.6.1 [2016/10/07] - AlliedModders
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Парни, на что и как заменить OnGameFrame ?
PHP:
public void OnGameFrame()
{
    if(bEnable)
    {
        for(int i = 1; i <= MaxClients; i++)
        {
            if(IsClientInGame(i) && IsPlayerAlive(i) && iAimPref[i] != NUM_COLORS)
            {
                static char weapon[12];
                GetClientWeapon(i, weapon, sizeof(weapon));

                if((StrContains(weapon, "weapon_", true) == 0)) CreateBeam(i, iAimPref[i]);
            }
        }
    }
}
Говорил же тебе, есть более простой способ создавать лазеры.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
У меня эта часть кода отвечает там за отключения луча.
Если таймером делать, то смещение луча будет с большими рывками,
а минимальный кулдаун таймера - 0.1 сек
При использовании OnGameFrame частота обновления равна частоте кадров, которая раз в 6 будет больше, чем частота обновления таймера

Можно ещё сделать луч как лазерных минах, но прикрепить его к оружию, а не мине
Но как ты будешь отлавливать положение, куда нужно прикрепить луч, и угол, под которым его нужно прикреплять, я хз.
В этом случае не нужен будет OnGameFrame, но длина луча будет фиксированная (т.е. луч будет проходить через все предметы).
Можно пересоздавать луч с помощью таймера, но тогда овчинка не будет стоить выделки, кмк.
 
Последнее редактирование:

Fox1qqq

Крякнем, плюнем и надежно склеим скотчем!
Сообщения
247
Реакции
145
У меня эта часть кода отвечает там за отключения луча.
Если таймером делать, то смещение луча будет с большими рывками,
а минимальный кулдаун таймера - 0.1 сек
При использовании OnGameFrame частота обновления равна частоте кадров, которая раз в 6 будет больше, чем частота обновления таймера

Можно ещё сделать луч как лазерных минах, но прикрепить его к оружию, а не мине
Но как ты будешь отлавливать положение, куда нужно прикрепить луч, и угол, под которым его нужно прикреплять, я хз.
В этом случае не нужен будет OnGameFrame, но длина луча будет фиксированная (т.е. луч будет проходить через все предметы).
Можно пересоздавать луч с помощью таймера, но тогда овчинка не будет стоить выделки, кмк.
Я 3 дня промучился , хотел сделать чтобы можно было цвет луча по RGBA менять(Без смены модели), а ничего не вышло.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Fox1qqq, в моём плагине?
Там цвета жёстко вшиты в массив aColor[][].
Тебе просто нужно организовать ввод значения цветов и последующее хранение этих значений.
Ну и чтобы эти значения использовались плагином вместо вшитых.
Правда точку ты таким образом не перекрасишь.
 

Fox1qqq

Крякнем, плюнем и надежно склеим скотчем!
Сообщения
247
Реакции
145
@Fox1qqq, в моём плагине?
Там цвета жёстко вшиты в массив aColor[][].
Тебе просто нужно организовать ввод значения цветов и последующее хранение этих значений.
Ну и чтобы эти значения использовались плагином вместо вшитых.
Правда точку ты таким образом не перекрасишь.
Ну тогда пока эту идею отложу на потом.
Ты не против если я потом выложу сюда?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Fox1qqq, ну если он будет работать, то выкладывай
Кто же тебе запретит?
 
Сверху Снизу