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

Synd1qate

Участник
Сообщения
745
Реакции
259
Подскажите, пожалуйста. Плагин подключен к базе данных и вот такая запись происходит
запрос:
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
Попробуй через INNER JOIN, может прокатит
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@DENZEL519, ты скомпиленый пытался ставить, что ли?
 

DENZEL519

Работаю с AI !
Сообщения
417
Реакции
198
@Grey83, Да, не компилится sp.
C-подобный:
// C:\Users\OneDrive\╨рсюўшщ ёЄюы\scripting\sm_translator.sp(238) : error 105: cannot find method or property StringMap.ContainsKey
// C:\Users\OneDrive\╨рсюўшщ ёЄюы\scripting\sm_translator.sp(247) : error 105: cannot find method or property StringMap.ContainsKey
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем доброе утро, подскажите пожалуйста, как можно реализовать данное событие в 34 ксс:
Игрок %s обезвредил бомбу за 0,00%s сек. до взрыва.
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Всем доброе утро, подскажите пожалуйста, как можно реализовать данное событие в 34 ксс:
Игрок %s обезвредил бомбу за 0,00%s сек. до взрыва.
Доброе Утро
Сообщения автоматически склеены:

Всем доброе утро, подскажите пожалуйста, как можно реализовать данное событие в 34 ксс:
Игрок %s обезвредил бомбу за 0,00%s сек. до взрыва.
Кодом или условием ?
Давай условием:

1) Получаем время взрыва бомбы, храним в переменой
2) Получаем событие когда кт минирует с4 и от него делает далее
3) когда прекращает, также минусуем,
4) И в туда сюда милионер показываем друг, сам понимаешь ты шаришь)
 

7pElllHuK

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


Кодом или условием ?
Давай условием:

1) Получаем время взрыва бомбы, храним в переменой
2) Получаем событие когда кт минирует с4 и от него делает далее
3) когда прекращает, также минусуем,
4) И в туда сюда милионер показываем друг, сам понимаешь ты шаришь)
Желательно кодом для наглядности)
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Желательно кодом для наглядности)
code:
float fTime;
public void OnPluginStart(){
    HookEvent("bomb_begindefuse", OnBomb);
    HookEvent("bomb_planted", OnBomb);
}
public void OnBomb(Event event, const char[] name, bool dontBroadcast){
    if(name[5] == 'p'){ //bomb_planted
        fTime = GetGameTime();
    }
    else if(name[5] == 'd'){ // bomb_begindefuse
        if((GetGameTime() - fTime) < 5.0) // показывать время до взрыва когда остается 5 секунд
            PrintToChatAll("%.1f", 35.0 - (GetGameTime() - fTime));
    }
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
code:
float fTime;
public void OnPluginStart(){
    HookEvent("bomb_begindefuse", OnBomb);
    HookEvent("bomb_planted", OnBomb);
}
public void OnBomb(Event event, const char[] name, bool dontBroadcast){
    if(name[5] == 'p'){ //bomb_planted
        fTime = GetGameTime();
    }
    else if(name[5] == 'd'){ // bomb_begindefuse
        if((GetGameTime() - fTime) < 5.0) // показывать время до взрыва когда остается 5 секунд
            PrintToChatAll("%.1f", 35.0 - (GetGameTime() - fTime));
    }
}
Спасибо большое, сейчас попробую
Сообщения автоматически склеены:

code:
float fTime;
public void OnPluginStart(){
    HookEvent("bomb_begindefuse", OnBomb);
    HookEvent("bomb_planted", OnBomb);
}
public void OnBomb(Event event, const char[] name, bool dontBroadcast){
    if(name[5] == 'p'){ //bomb_planted
        fTime = GetGameTime();
    }
    else if(name[5] == 'd'){ // bomb_begindefuse
        if((GetGameTime() - fTime) < 5.0) // показывать время до взрыва когда остается 5 секунд
            PrintToChatAll("%.1f", 35.0 - (GetGameTime() - fTime));
    }
}
Все работает, спасибо еще раз
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Добрый вечер, подскажите пожалуйста, как проверить какой у игрока включен режим стрельбы с glock18 или Famas (по 3 пули или по 1), игра ксс34
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Добрый вечер, подскажите пожалуйста, как проверить какой у игрока включен режим стрельбы с glock18 или Famas (по 3 пули или по 1), игра ксс34
GetEntProp(iEnt, Prop_Send, "m_bBurstMode"); - включен ли режим очередью
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем доброй ночи, подскажите пожалуйста, почему раунд завершается ДО взрыва бомбы, по идее должен заканчиваться ПОСЛЕ взрыва.
C-подобный:
bool g_bExploded;

public void OnPluginStart()
{
    HookEvent("round_start",     Events_Round,     EventHookMode_PostNoCopy);
    HookEvent("round_end",         Events_Round,   EventHookMode_PostNoCopy);
    HookEvent("bomb_exploded",     Event_Bomb,     EventHookMode_Pre);
}

public void Event_Bomb(Event hEvent, const char[] sName, bool bBdontBroadcast)
{
    switch (sName[5])
    {
        case 'e':
        {
            g_bExploded = true;
            PrintToChatAll("Бомба взорвалась, g_bExploded == %i", g_bExploded);
        }
    }
}

public Action Events_Round(Event hEvent, const char[] sName, bool bBdontBroadcast)
{
    switch (sName[6])
    {
        case 's':
        {
            PrintToChatAll("Раунд начался");
            g_bExploded = false;
        }
        case 'e':  PrintToChatAll("Раунд закончился, g_bExploded == %i", g_bExploded);
    }
}
Если можно как-то установить значение переменно g_bExploded на true перед завершением раунда, то подскажите пожалуйста как это сделать. У меня в голове только вариант с таймером, делать отсчет до взрыва бомбы и за 1 сек до взрыва переключать переменную
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Всем доброй ночи, подскажите пожалуйста, почему раунд завершается ДО взрыва бомбы, по идее должен заканчиваться ПОСЛЕ взрыва.
C-подобный:
bool g_bExploded;

public void OnPluginStart()
{
    HookEvent("round_start",     Events_Round,     EventHookMode_PostNoCopy);
    HookEvent("round_end",         Events_Round,   EventHookMode_PostNoCopy);
    HookEvent("bomb_exploded",     Event_Bomb,     EventHookMode_Pre);
}

public void Event_Bomb(Event hEvent, const char[] sName, bool bBdontBroadcast)
{
    switch (sName[5])
    {
        case 'e':
        {
            g_bExploded = true;
            PrintToChatAll("Бомба взорвалась, g_bExploded == %i", g_bExploded);
        }
    }
}

public Action Events_Round(Event hEvent, const char[] sName, bool bBdontBroadcast)
{
    switch (sName[6])
    {
        case 's':
        {
            PrintToChatAll("Раунд начался");
            g_bExploded = false;
        }
        case 'e':  PrintToChatAll("Раунд закончился, g_bExploded == %i", g_bExploded);
    }
}
Если можно как-то установить значение переменно g_bExploded на true перед завершением раунда, то подскажите пожалуйста как это сделать. У меня в голове только вариант с таймером, делать отсчет до взрыва бомбы и за 1 сек до взрыва переключать переменную

Как вариант можно так

C-подобный:
public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
    switch(reason)
    {
        case CSRoundEnd_TargetBombed: {
            PrintToChatAll("BOMB!");
        }
    }
    return Plugin_Continue;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Как вариант можно так

C-подобный:
public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
    switch(reason)
    {
        case CSRoundEnd_TargetBombed: {
            PrintToChatAll("BOMB!");
        }
    }
    return Plugin_Continue;
}
Спасибо большое, замечательно работает
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Добрый день. Подскажите пожалуйста, почему выдает ошибку:
L 08/28/2024 - 13:58:14: [SM] Exception reported: Invalid WeaponID passed for this game
L 08/28/2024 - 13:58:14: [SM] Blaming: test.smx
L 08/28/2024 - 13:58:14: [SM] Call stack trace:
L 08/28/2024 - 13:58:14: [SM] [0] CS_GetWeaponPrice
L 08/28/2024 - 13:58:14: [SM] [1] Line 14, D:\ONEdRIVE\Desktop\�����������\1.11 scripting\test.sp::CS_OnCSWeaponDrop
C-подобный:
#include <cstrike>

int g_iCountDropWeapon[MAXPLAYERS + 1],
    g_iWeaponDropValue[MAXPLAYERS + 1];

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

public Action CS_OnCSWeaponDrop(int iClient, int iIndex)
{
    g_iCountDropWeapon[iClient]++;
    int iMoney = CS_GetWeaponPrice(iClient, view_as<CSWeaponID>(iIndex)); (ТУТ ОШИБКА)
    g_iWeaponDropValue[iClient] += iMoney;
}

public void OnClientDisconnect(int iClient)
{
    g_iCountDropWeapon[iClient] = g_iWeaponDropValue[iClient] = 0;
}

public Action Events_Round(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        g_iCountDropWeapon[i] = g_iWeaponDropValue[i] = 0;
    }
}

Пример использования функции CS_GetWeaponPrice(iClient, view_as<CSWeaponID>(iIndex)); брал из weapon_restrict, там ошибки нет, у меня есть
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@7pElllHuK, у тебя там должен быть индекс оружия, а не индекс энтити, насколько я понимаю.
 
Сверху Снизу