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

Nekro

Терра инкогнита
Сообщения
4,026
Реакции
2,260
1. Players Online Mysql [CSGO]
2. Простенький плагин который будет записывать данные о подключении игрока в бд и удалять запись при отключении.
Так же ботов вносить в этот список (если возможно)
id (int autoincrement), auth (steam_1 или BOT), connect_time (время подключение игрока в timestamp, чтобы можно было отсчитать сколько он провел на серваке)
Заранее спасибо 🥲
А в чём глубокий смысл? Ведь после выхода игрока информация записанная будет удалена
удалять запись при отключении.
Смотреть онлайн сервера можно же и более простым путём, на пример как мониторинги
 

xstage

🏹
Сообщения
726
Реакции
754
А в чём глубокий смысл? Ведь после выхода игрока информация записанная будет удалена

Смотреть онлайн сервера можно же и более простым путём, на пример как мониторинги
Ему нужен steamid, sourcequery такого не даст
 

skaeN

Участник
Сообщения
204
Реакции
108
Статус через ркон запросить?
Через статус мароки, с парсом выводящей инфы, слишком много по моему.
А к плагину можно тот же инклюд lvl подключить и в бд кидать например данные за сессию для мониторинга.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Через статус мароки, с парсом выводящей инфы, слишком много по моему.
А к плагину можно тот же инклюд lvl подключить и в бд кидать например данные за сессию для мониторинга.
Прописываешь 2 двух местах в таком случае параллельно либо новый запрос, либо в текущие добавляешь свой текст
 

skaeN

Участник
Сообщения
204
Реакции
108
Если используешь lvl, можно отредачить просто запросы в исходнике database.sp
Так мне нужно в другую бд инфу кидать для монитора данных. По мне так, зачем я буду базу лвл`а трогать под этот плагин?
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Так мне нужно в другую бд инфу кидать для монитора данных. По мне так, зачем я буду базу лвл`а трогать под этот плагин?
А почему бы не потрогать, когда нужные данные уже готовы и нужно просто их взять с базы?
 

skaeN

Участник
Сообщения
204
Реакции
108
А почему бы не потрогать, когда нужные данные уже готовы и нужно просто их взять с базы?
По сути, как я описал выше: мне просто нужно вывести данные по игрокам которые находятся в данные момент онлайн. При выходе - дропать их запись из базы. Чтобы можно было массив перебрать и например, вывести уровень, время, киллов и т.п за сессию в мониторинг
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
По сути, как я описал выше: мне просто нужно вывести данные по игрокам которые находятся в данные момент онлайн. При выходе - дропать их запись из базы. Чтобы можно было массив перебрать и например, вывести уровень, время, киллов и т.п за сессию в мониторинг
C++:
#define TABLENAME "client_data"

Database db;

public void OnPluginStart()
{
    Database.Connect(SQLConnect, "session_data");
}

public void OnClientConnected(int client)
{
    AddClientToDb(client);
}

public void OnClientDisconnect(int client)
{
    RemoveClientFromDb(client);
}

public void SQLConnect(Database hdb, const char[] error, any data)
{
    if(hdb == INVALID_HANDLE || error[0])
    {
        SetFailState("ERROR CONNECT TO DB: %s", error);
        return;
    }
 
    db = hdb;
    CreateTable();
}

void CreateTable()
{
    char sQuery[256];
    SQL_FormatQuery(db, sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `%s` (\
                                                `id` AUTO_INCREMENT, \
                                                `auth` VARCHAR(22) NOT NULL, \
                                                `connect_time` TIMESTAMP)", TABLENAME);
    db.Query(SQLCreateTableCallBack, sQuery, _, DBPrio_High);
}

void AddClientToDb(int client)
{
    char sQuery[256], sAuth[22];
    GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
 
    //char sTime[32];
    //FormatTime(sTime, sizeof(sTime), "%F %X", GetTime());
 
    SQL_FormatQuery(db, sQuery, sizeof(sQuery), "INSERT INTO `%s` (\
                                                `auth`, \
                                                `connect_time`) VALUES ('%s', CURRENT_TIMESTAMP)", TABLENAME, sAuth);
    db.Query(SQLAddToDBCallBack, sQuery, _, DBPrio_High);
}

void RemoveClientFromDb(int client)
{
    char sQuery[256], sAuth[22];
    GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
    SQL_FormatQuery(db, sQuery, sizeof(sQuery), "DELETE FROM `%s` WHERE `auth`='%s'"TABLENAME, sAuth);
    db.Query(RemoveFromDBCallBack, sQuery, _, DBPrio_High);
}

public void SQLCreateTableCallBack(Database hdb, DBResultSet results, const char[] error, any data)
{
    if(error[0] || db == INVALID_HANDLE)
    {
        SetFailState("ERROR CREATE TABLE: %s", error);
        return;
    }
}

public void SQLAddToDBCallBack(Database hdb, DBResultSet results, const char[] error, any data)
{
    if(error[0] || db == INVALID_HANDLE)
    {
        SetFailState("ERROR ADD CLIENT: %s", error);
        return;
    }
}

public void RemoveFromDBCallBack(Database hdb, DBResultSet results, const char[] error, any data)
{
    if(error[0] || db == INVALID_HANDLE)
    {
        SetFailState("ERROR REMOVE CLIENT: %s", error);
        return;
    }
}
 
Последнее редактирование:

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Доброго времени суток.
Нужно сделать, чтобы когда игрок подбирал оружие, оружие удалялась и выдавалась заново.
Для чего? На некоторых картах разбросано оружие, но на него не действует скинченджер. Таким костылём, можно выдать оружие со скином.

В итоге, бесконечный цикл, с выдачей оружия и его удаления. У кого какие идеи, как это можно сделать? Может запоминать используемые weapon.
+при старте раунда, выдаётся нож и т.д. и они тоже вызывают этот бесконечный цикл.
DEL weapon:
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <cstrike>

public OnPluginStart()
{
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i))
        OnClientPutInServer(i); // На случай если плагин был перезагружен
    }
}

public OnClientPutInServer(client) // Хуки
{
    SDKHook(client, SDKHook_WeaponEquipPost, OnWeaponEquipPost); // подбирает любое оружие
}

public OnWeaponEquipPost(client, weapon) // Хук Подбора
{
    char classnameweapon[64];
    GetEntityClassname(weapon, classnameweapon, sizeof classnameweapon)
    AcceptEntityInput(weapon, "kill")
    GivePlayerItem(client, classnameweapon)
}
Почему ещё компилятор не понимает:
RemovePlayerItem(client, classnameweapon);
Когда есть #include <sdktools>
 
Последнее редактирование:

xstage

🏹
Сообщения
726
Реакции
754
Доброго времени суток.
Нужно сделать, когда игрок подбирал оружие, оружие удалялась и выдавалась заново.
Для чего? На некоторых картах разбросано оружие, но на него не действует скинченджер. Таким костылём, можно выдать оружие со скином.

В итоге, бесконечный цикл, с выдачей оружия и его удаления. У кого какие идеи, как это можно сделать? Может запоминать используемые weapon.
+при старте раунда, выдаётся нож и т.д. и они тоже вызывают этот бесконечный цикл.
DEL weapon:
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <cstrike>

public OnPluginStart()
{
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i))
        OnClientPutInServer(i); // На случай если плагин был перезагружен
    }
}

public OnClientPutInServer(client) // Хуки
{
    SDKHook(client, SDKHook_WeaponEquipPost, OnWeaponEquipPost); // подбирает любое оружие
}

public OnWeaponEquipPost(client, weapon) // Хук Подбора
{
    char classnameweapon[64];
    GetEntityClassname(weapon, classnameweapon, sizeof classnameweapon)
    AcceptEntityInput(weapon, "kill")
    GivePlayerItem(client, classnameweapon)
}
Может это поможет:
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
В итоге, бесконечный цикл, с выдачей оружия и его удаления. У кого какие идеи, как это можно сделать?
м/б всё дело, что это SDKHook_WeaponEquipPost?
Т.е. игрок уже экипировался этим оружием, ты это оружие удаляешь и выдаёшь ему оружие снова и тут хук срабатывает опять.
Тут можно просто таймаут (не таймер, а просто запомнить время или просто bool значение менять и при выдаче это учитывать) поставить, кмк. На кадр или 0.1 секунды.
Сообщения автоматически склеены:

Вот так, например:
C-подобный:
#include <sdkhooks>

bool bChanged[MAXPLAYERS+1];

public void OnPluginStart()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
}

public void OnClientPutInServer(int client) // Хуки
{
    if(IsFakeClient(client)) return;

    bChanged[client] = false;
    SDKHook(client, SDKHook_WeaponEquipPost, OnWeaponEquipPost);
}

public void OnWeaponEquipPost(int client, int weapon) // Хук Подбора
{
    if(!(bChanged[client] = !bChanged[client])) return;

    static char cls[32];
    GetEntityClassname(weapon, cls, sizeof cls)
    AcceptEntityInput(weapon, "Kill")
    GivePlayerItem(client, cls)
}
Только нужно ещё как-то определить выдаваемое при спавне, чтобы его не пыталось подменить. Я без тестирования точно не скажу как это реализовать.
 
Последнее редактирование:

DarkerZ

Участник
Сообщения
395
Реакции
175
Оружие с карты можно определять следующим образом если weapon_* имеет hammerid>0, то это оружие с карты. Если не критично можно стриппером просто всë оружие на карте удалять глобальным фильтром
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Вот так, например:
Теперь просто через раз работает.
Одно оружие подбирает (как в обычной игре, без выдачи со скином)
А потом подбирает, сразу удаляет, а новое не спавниться)
И по кругу.
Сообщения автоматически склеены:

Оружие с карты можно определять следующим образом если weapon_* имеет hammerid>0, то это оружие с карты. Если не критично можно стриппером просто всë оружие на карте удалять глобальным фильтром
Хммм
Есть примеры, как можно использовать, через что хукать.
Но смысл в том, что оружие не нужно удалять, а нужно просто, что бы у игроков были скины, когда подбирают его. Я думал сделать костылём, с удалением и созданием заного. Слишком сложно оказалось. Нужно ещё определять кол-во патронов, если вдруг ты взял оружие того, кто его выбросил.

P.S. Может попытаться через item_pickup
 
Последнее редактирование:

DarkerZ

Участник
Сообщения
395
Реакции
175
Хммм
Есть примеры, как можно использовать, через что хукать.
Для получения hammerid:
C-подобный:
int                    GetEntProp(entity, Prop_Data, "m_iHammerID");
Выполняется при спавне любой энтити на карте:
C-подобный:
public void OnEntityCreated(int iEntity, const char[] sClassname)
Ну и SDKHooks:
C-подобный:
public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_WeaponEquipPost, OnWeaponEquip);
    SDKHook(iClient, SDKHook_WeaponCanUse, OnWeaponCanUse);
    //...
}
Это если игрок подошёл к оружию перед подбором самого оружия(впринципе вот здесь и удалять оружку):
C-подобный:
public Action OnWeaponCanUse(int iClient, int iWeapon)
Игрок уже подобрал оружку:
C-подобный:
public void OnWeaponEquip(int iClient, int iWeapon)
Пример можешь посмотреть в плагине EntWatch, правда там немного не по твоей теме... смысл плагина - подгружается конфиг и указанное оружие с карты отображается в HUD
 

skaeN

Участник
Сообщения
204
Реакции
108
Помогите устоканить sql запрос, а то он вредный.. Если строку с `hs` убирать, то все работает, а так выдает ошибку
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NUL' at line 1

C#:
    SQL_FormatQuery(db, sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `%s` (\
  `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,\
  `auth` varchar(32) NOT NULL,\
  `name` varchar(64) NOT NULL,\
  `rank` int(11) unsigned NOT NULL,\
  `kills` int(11) NOT NULL,\
  `death` int(11) NOT NULL,\
  `hs` int(11) unsigned NOT NULL,\
  `connect_time` datetime unsigned NULL) ENGINE InnoDBDEFAULT CHARSET utf8;", TABLENAME);
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Помогите устоканить sql запрос, а то он вредный.. Если строку с `hs` убирать, то все работает, а так выдает ошибку
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NUL' at line 1

C#:
    SQL_FormatQuery(db, sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `%s` (\
  `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,\
  `auth` varchar(32) NOT NULL,\
  `name` varchar(64) NOT NULL,\
  `rank` int(11) unsigned NOT NULL,\
  `kills` int(11) NOT NULL,\
  `death` int(11) NOT NULL,\
  `hs` int(11) unsigned NOT NULL,\
  `connect_time` datetime unsigned NULL) ENGINE InnoDBDEFAULT CHARSET utf8;", TABLENAME);
у тебя id - AUTO_INCREMENT
зачем ты ему ставишь int not null?
 

skaeN

Участник
Сообщения
204
Реакции
108
у тебя id - AUTO_INCREMENT
зачем ты ему ставишь int not null?
Видимо учусь на своих же ошибках) Без этого он выдает ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AUTO_INCREMENT,`auth` varchar(22) NOT NULL,`name` varchar(64) NOT NULL,`rank` in' at line 1
 
Сверху Снизу