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

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@7pElllHuK,
C-подобный:
    if (hTimer) CloseHandle(hTimer);
замени на
C-подобный:
    if (hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Хотя строка if (hTimer) delete hTimer; должна делать точно то же самое.
 

babka68

Участник
Сообщения
2,124
Реакции
956
Всем привет, подскажите пожалуйста как исправить ошибку:
L 06/25/2024 - 00:57:24: [SM] Exception reported: Handle c695055a is invalid (error 1)
L 06/25/2024 - 00:57:24: [SM] Blaming: C4 10 sec 1.1.0.smx
L 06/25/2024 - 00:57:24: [SM] Call stack trace:
L 06/25/2024 - 00:57:24: [SM] [0] CloseHandle
L 06/25/2024 - 00:57:24: [SM] [1] Line 76, D:\ONEdRIVE\Desktop\Компиляторы\1.11 scripting\C4 10 sec 1.1.0.sp::Event_End
L 06/25/2024 - 00:57:24: [SM] [3] CS_TerminateRound
L 06/25/2024 - 00:57:24: [SM] [4] Line 81, C:\Users\Admin\Desktop\kac_new\delayroundend.sp::CS_OnTerminateRound
Плагин:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_sound>
#include <sdktools_stringtables>

static const char g_szSound[][] =
{
    "sound/kosmicheskiy/c4_explode/3.mp3",
    "sound/kosmicheskiy/c4_explode/4.mp3"
};

Handle
    hTimer;

float
    fTimer;
int
    iPos;

public Plugin myinfo =
{
    name        = "C4 10 seconds",
    version        = "1.1.0 (rewritten by Grey83)",
    description = "Воспроизведение музыки за 10 секунд до взрыва бомбы",
    author        = "Ало, Ва-Вадик?",
    url            = "https://vk.com/kopojlebckuu_7pelllhuk"
}

public void OnPluginStart()
{
    ConVar cvar = FindConVar("mp_c4timer");
    if(!cvar) SetFailState("Can't find convar 'mp_c4timer'!");

    cvar.AddChangeHook(CVarChange);
    CVarChange(cvar, "", "");

    HookEvent("bomb_planted", Event_BombPlanted, EventHookMode_Pre);
    HookEvent("round_start", Event_End, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_End, EventHookMode_PostNoCopy);
}

public void CVarChange(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    fTimer = cvar.FloatValue - 10;
}

public void OnMapStart()
{
    hTimer = null;
    for(int i; i < sizeof(g_szSound); i++)
    {
        AddFileToDownloadsTable(g_szSound[i]);
        PrecacheSound(g_szSound[i][6]);
    }
}

public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast)
{
    if(fTimer >= 0.0) hTimer = CreateTimer(fTimer, Timer_Countdown, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Countdown(Handle timer)
{
    hTimer = null;
    int i;
    while((i = GetRandomInt(0, sizeof(g_szSound)-1)) == iPos) {}
    iPos = i;
    EmitSoundToAll(g_szSound[i][6]);

    return Plugin_Stop;
}

public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
    if (hTimer) CloseHandle(hTimer);
}
Почитай Как остановить (удалить) глобальный таймер
Часто ошибка возникает?
Попробуй так:

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_sound>
#include <sdktools_stringtables>

static const char g_szSound[][] =
{
    "sound/kosmicheskiy/c4_explode/3.mp3",
    "sound/kosmicheskiy/c4_explode/4.mp3"
};

Handle
hTimer;

float
fTimer;
int
iPos;

public Plugin myinfo =
{
    name = "C4 10 seconds",
    version = "1.1.0 (rewritten by Grey83)",
    description = "Воспроизведение музыки за 10 секунд до взрыва бомбы",
    author = "Ало, Ва-Вадик?",
    url = "https://vk.com/kopojlebckuu_7pelllhuk"
}

public void OnPluginStart()
{
    ConVar cvar = FindConVar("mp_c4timer");
    if (!cvar)SetFailState("Can't find convar 'mp_c4timer'!");
   
    cvar.AddChangeHook(CVarChange);
    CVarChange(cvar, "", "");
   
    HookEvent("bomb_planted", Event_BombPlanted, EventHookMode_Pre);
    HookEvent("round_start", Event_End, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_End, EventHookMode_PostNoCopy);
}

public void CVarChange(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    fTimer = cvar.FloatValue - 10;
}

public void OnMapStart()
{
    hTimer = null;
    for (int i; i < sizeof(g_szSound); i++)
    {
        AddFileToDownloadsTable(g_szSound[i]);
        PrecacheSound(g_szSound[i][6]);
    }
}

public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast)
{
        delete hTimer; // предотвращает двойной запуск (на всякий случай)
     if (fTimer >= 0.0)hTimer = CreateTimer(fTimer, Timer_Countdown, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Countdown(Handle timer)
{
    int i;
    while ((i = GetRandomInt(0, sizeof(g_szSound) - 1)) == iPos) {  }
    iPos = i;
    EmitSoundToAll(g_szSound[i][6]);
   
    hTimer = null;
    return Plugin_Stop;
}

public void OnMapEnd() // требуется, поскольку принудительная смена карты не вызывает событие "round_end"
{
    delete hTimer;
}


public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
    delete hTimer; // останавливаем таймер на случай, если он ещё не сработал, таким образом этот старый таймер не будет перенесён на новый раунд и не сработает случайно в процессе загрузки уровня
    fTimer == 0.0;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
@7pElllHuK,
C-подобный:
    if (hTimer) CloseHandle(hTimer);
замени на
C-подобный:
    if (hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }
Почитай Как остановить (удалить) глобальный таймер
Часто ошибка возникает?
Попробуй так:

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_sound>
#include <sdktools_stringtables>

static const char g_szSound[][] =
{
    "sound/kosmicheskiy/c4_explode/3.mp3",
    "sound/kosmicheskiy/c4_explode/4.mp3"
};

Handle
hTimer;

float
fTimer;
int
iPos;

public Plugin myinfo =
{
    name = "C4 10 seconds",
    version = "1.1.0 (rewritten by Grey83)",
    description = "Воспроизведение музыки за 10 секунд до взрыва бомбы",
    author = "Ало, Ва-Вадик?",
    url = "https://vk.com/kopojlebckuu_7pelllhuk"
}

public void OnPluginStart()
{
    ConVar cvar = FindConVar("mp_c4timer");
    if (!cvar)SetFailState("Can't find convar 'mp_c4timer'!");
  
    cvar.AddChangeHook(CVarChange);
    CVarChange(cvar, "", "");
  
    HookEvent("bomb_planted", Event_BombPlanted, EventHookMode_Pre);
    HookEvent("round_start", Event_End, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_End, EventHookMode_PostNoCopy);
}

public void CVarChange(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    fTimer = cvar.FloatValue - 10;
}

public void OnMapStart()
{
    hTimer = null;
    for (int i; i < sizeof(g_szSound); i++)
    {
        AddFileToDownloadsTable(g_szSound[i]);
        PrecacheSound(g_szSound[i][6]);
    }
}

public void Event_BombPlanted(Event event, const char[] name, bool dontBroadcast)
{
        delete hTimer; // предотвращает двойной запуск (на всякий случай)
     if (fTimer >= 0.0)hTimer = CreateTimer(fTimer, Timer_Countdown, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Countdown(Handle timer)
{
    int i;
    while ((i = GetRandomInt(0, sizeof(g_szSound) - 1)) == iPos) {  }
    iPos = i;
    EmitSoundToAll(g_szSound[i][6]);
  
    hTimer = null;
    return Plugin_Stop;
}

public void OnMapEnd() // требуется, поскольку принудительная смена карты не вызывает событие "round_end"
{
    delete hTimer;
}


public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
    delete hTimer; // останавливаем таймер на случай, если он ещё не сработал, таким образом этот старый таймер не будет перенесён на новый раунд и не сработает случайно в процессе загрузки уровня
    fTimer == 0.0;
}
Спасибо большое, помогли оба варианта
Сообщения автоматически склеены:

Добрый вечер, подскажите пожалуйста, как можно отправить сообщение в ВК без использования расширения Rest in Pawn?
Взял код от VK Core, но не удобно что нужно ставить на сервер Rest in Pawn
C-подобный:
#include <ripext>
#include <vkcore>

#pragma        semicolon 1
#pragma     newdecls required

HTTPClient g_hHTTPClient;

char        g_sToken[1024] = {""};    //ID группы
int            g_iID  = ;    //ID

GlobalForward OnMessagesSend;

public Plugin myinfo =
{
    name        =   "VK Core",
    description =   "Простая библиотека для отправки сообщений в личные сообщения, беседы, группы с помощью VK API",
    version     =   "1.0.2",
    author      =   "fr4nch",
    url         =   "https://hlmod.ru/members/fr4nch.85922/"
};

public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErr_max)
{
    RegPluginLibrary("vkcore");
    CreateNative("VK_MessagesSend", Native_MessagesSend);
    OnMessagesSend = new GlobalForward("VK_OnMessagesSend", ET_Ignore, Param_String);
    return APLRes_Success;
}

public void OnPluginStart()
{
    VK_MessagesSend(g_iID, "Тестовое сообщение");
}

public int Native_MessagesSend(Handle hPlugin, int iArgs)
{
    int iPID = GetNativeCell(1);
    int iLen;
    GetNativeStringLength(2, iLen);
    iLen += 384;
    char[] sMessage = new char[iLen];
    GetNativeString(2, sMessage, iLen);

    ReplaceString(sMessage, iLen, " ", "%20", true);
    ReplaceString(sMessage, iLen, "NWLN", "%0A", true);
    ReplaceString(sMessage, iLen, "\n", "%0A", true);
    ReplaceString(sMessage, iLen, "#", "%23", true);

    Forward_OnClientReportSend(sMessage);
    Format(sMessage, iLen, "https://api.vk.com/method/messages.send?v=5.101&random_id=%i&access_token=%s&peer_id=%d&message=%s", GetRandomInt(1, 2147483646), g_sToken, iPID, sMessage);
    RIP_SendMessage(sMessage);
}

stock void Forward_OnClientReportSend(char[] sMessage)
{
    Call_StartForward(OnMessagesSend);
    Call_PushString(sMessage);
    Call_Finish();
}

void RIP_SendMessage(const char[] sURL)
{
    g_hHTTPClient = new HTTPClient(sURL);
    g_hHTTPClient.Get(sURL, OnRequestCompleteRIP);
}

void OnRequestCompleteRIP(HTTPResponse hResponse, any iData)
{
    if (hResponse.Status != HTTPStatus_OK) LogMessage("[VK API] Response: %d", hResponse.Status);
}
 
Последнее редактирование:

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Всем привет!
Кому не сложно,подправьте пожалуйста плагин выдачу кредитов за возрождение.
Если это возможно конечно.
Пользуюсь версией sm_revival 1.0.9,ну с ней не работает выдача.
Заранее благодарю.
 

Вложения

  • revival_shop_credits.sp
    1,001 байт · Просмотры: 9
  • sm_revival 1.0.9.sp
    26.6 КБ · Просмотры: 2

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Спасибо большое, помогли оба варианта
Сообщения автоматически склеены:

Добрый вечер, подскажите пожалуйста, как можно отправить сообщение в ВК без использования расширения Rest in Pawn?
Взял код от VK Core, но не удобно что нужно ставить на сервер Rest in Pawn
C-подобный:
#include <ripext>
#include <vkcore>

#pragma        semicolon 1
#pragma     newdecls required

HTTPClient g_hHTTPClient;

char        g_sToken[1024] = {""};    //ID группы
int            g_iID  = ;    //ID

GlobalForward OnMessagesSend;

public Plugin myinfo =
{
    name        =   "VK Core",
    description =   "Простая библиотека для отправки сообщений в личные сообщения, беседы, группы с помощью VK API",
    version     =   "1.0.2",
    author      =   "fr4nch",
    url         =   "https://hlmod.ru/members/fr4nch.85922/"
};

public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErr_max)
{
    RegPluginLibrary("vkcore");
    CreateNative("VK_MessagesSend", Native_MessagesSend);
    OnMessagesSend = new GlobalForward("VK_OnMessagesSend", ET_Ignore, Param_String);
    return APLRes_Success;
}

public void OnPluginStart()
{
    VK_MessagesSend(g_iID, "Тестовое сообщение");
}

public int Native_MessagesSend(Handle hPlugin, int iArgs)
{
    int iPID = GetNativeCell(1);
    int iLen;
    GetNativeStringLength(2, iLen);
    iLen += 384;
    char[] sMessage = new char[iLen];
    GetNativeString(2, sMessage, iLen);

    ReplaceString(sMessage, iLen, " ", "%20", true);
    ReplaceString(sMessage, iLen, "NWLN", "%0A", true);
    ReplaceString(sMessage, iLen, "\n", "%0A", true);
    ReplaceString(sMessage, iLen, "#", "%23", true);

    Forward_OnClientReportSend(sMessage);
    Format(sMessage, iLen, "https://api.vk.com/method/messages.send?v=5.101&random_id=%i&access_token=%s&peer_id=%d&message=%s", GetRandomInt(1, 2147483646), g_sToken, iPID, sMessage);
    RIP_SendMessage(sMessage);
}

stock void Forward_OnClientReportSend(char[] sMessage)
{
    Call_StartForward(OnMessagesSend);
    Call_PushString(sMessage);
    Call_Finish();
}

void RIP_SendMessage(const char[] sURL)
{
    g_hHTTPClient = new HTTPClient(sURL);
    g_hHTTPClient.Get(sURL, OnRequestCompleteRIP);
}

void OnRequestCompleteRIP(HTTPResponse hResponse, any iData)
{
    if (hResponse.Status != HTTPStatus_OK) LogMessage("[VK API] Response: %d", hResponse.Status);
}
Нет вариантов?
 

danil253467

💘Italo-Disco & Neon One Love💘
Сообщения
90
Реакции
52
Есть

Тут отправка сообщений через сокет
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Есть

Тут отправка сообщений через сокет
Спасибо
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Подскажите, пожалуйста. Плагин подключен к базе данных и вот такая запись происходит
запрос:
public bool OnKeyUse(int iClient, const char[] sKeyType, ArrayList hParamsArr, char[] sError, int iErrLen)
{

    decl char sParam[KEYS_MAX_LENGTH], szAuth[32], szName[MAX_NAME_LENGTH];
   
    hParamsArr.GetString(1, sParam, sizeof(sParam));
   
    GetClientAuthId(iClient, AuthId_Steam2, szAuth, sizeof(szAuth));
     GetClientName(iClient, szName, sizeof(szName));
    if (g_hUsers.FindString(szAuth) == -1)
    {
        char szQuery[256];
       
       
        int iExpires = StringToInt(sParam);
        FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `test` (`steam`, `name`, `time`) VALUES ('%s', '%s',  '%d');", szAuth, szName, GetTime(), iExpires != 0 ? iExpires + GetTime() : iExpires);
       
        DataPack hPack = new DataPack();
       
        hPack.WriteCell(GetClientUserId(iClient));
        hPack.WriteCell(iExpires);
       
        g_hDatabase.Query(DB_InsertCallback, szQuery, hPack);
        return true;
    }
    return false;
}

необходимо подключиться к этой же базе, но к другой таблице `info` , которая имеет данные: id, cfg и прочее, возьмем на примере cfg и передать их в запись, найти cfg, выборку сделать по `name`, так как оно уникальное

FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `test` (`steam`, `name`, `time`, `cfg` ) VALUES
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
@sviridov_artem, Так и в чём вопрос та? Это таблица, если в этом вопрос INSERT INTO `test`
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
@sviridov_artem, Так и в чём вопрос та? Это таблица, если в этом вопрос INSERT INTO `test`
Необходимо найти в таблице info информацию по name, строку найти эту, из этой строки получить данные `cfg` и записать их, изменив запрос из кода выше на запись, добавляя параметр cfg из таблицы info.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Спасибо конечно, я пробовал сам сделать, искал/читал, не выходит, к сожалению, поэтому и попросил помощи здесь.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@sviridov_artem, по третьей ссылке онлайн-инструмент, которым можно проверить валидность своей sql-команды.
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
@sviridov_artem, по третьей ссылке онлайн-инструмент, которым можно проверить валидность своей sql-команды.
Проверить валидность sql запроса можно обычным способом через mysql web, а я не пойму как подключиться к другой таблице, и взять с нее то, что мне нужно, и далее передать эту информацию в запрос на запись. Если не трудно, подскажи, пожалуйста, примером.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
как подключиться к другой таблице, и взять с нее то, что мне нужно
Точно так же как и к этой, предварительно отключившись от предыдущей.
и далее передать эту информацию в запрос на запись
Запись куда? Если в другую таблицу, то выше уже написал.
Если не трудно, подскажи, пожалуйста, примером.
Ты бы показал как сам это пытался сделать и тебе бы подсказали где ошибся.
Я вообще SQL-запросами давно дела не имел и потому мало что помню.
Сообщения автоматически склеены:

Хотя м/б и не нужно отключаться от предыдущей БД.
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Необходимо найти в таблице info информацию по name, строку найти эту, из этой строки получить данные `cfg` и записать их, изменив запрос из кода выше на запись, добавляя параметр cfg из таблицы info.
С телефона сижу, форматирование может испортиться
Вот буквально то, что тебе нужно, совсем немного изменить название таблицы и выбираемые поля, ну и убрать лишнее
Код из урока рико:
public void OnClientPostAdminCheck(int iClient)
{
if(IsFakeClient(iClient) == false)
{
char szQuery[256], szAuth[32];
GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth), true);
FormatEx(szQuery, sizeof(szQuery), "SELECT `id`, `points` FROM `table_players` WHERE `auth` = '%s';", szAuth); // Формируем запрос
g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient));
}
}

public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet results, const char[] sError, any iUserID) // Обратный вызов
{
if(sError[0]) // Если произошла ошибка
{
LogError("SQL_Callback_SelectClient: %s", sError); // Выводим в лог
return; // Прекращаем выполнение ф-и
}

int iClient = GetClientOfUserId(iUserID);
if(iClient)
{
// Игрок всё еще на сервере
}
}
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
С телефона сижу, форматирование может испортиться
Вот буквально то, что тебе нужно, совсем немного изменить название таблицы и выбираемые поля, ну и убрать лишнее
Код из урока рико:
public void OnClientPostAdminCheck(int iClient)
{
if(IsFakeClient(iClient) == false)
{
char szQuery[256], szAuth[32];
GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth), true);
FormatEx(szQuery, sizeof(szQuery), "SELECT `id`, `points` FROM `table_players` WHERE `auth` = '%s';", szAuth); // Формируем запрос
g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient));
}
}

public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet results, const char[] sError, any iUserID) // Обратный вызов
{
if(sError[0]) // Если произошла ошибка
{
LogError("SQL_Callback_SelectClient: %s", sError); // Выводим в лог
return; // Прекращаем выполнение ф-и
}

int iClient = GetClientOfUserId(iUserID);
if(iClient)
{
// Игрок всё еще на сервере
}
}
спасибо, суть примерно понял)
 
Сверху Снизу