Mysql Нужен пример подключения

alexfyodrv

Участник
Сообщения
24
Реакции
0
@alexfyodrv, см должен быть 1.7 или выше
Как сделать чтобы ботам начислялись поинты, но сохранять ботов в базу не нужно просто для теста плагина. При убийстве бота чтобы выдавались поинты и засчитывались убийства. Мне так же интересно при написании ранга нужно каждый раз считать записи? И как потом получить позицию игрока? Меня даже не сами SQL запросы интересуют, а как это реализуется в игре.

C-подобный:
public Action ShowRank(int client, int args) {
    if (client && IsClientInGame(client)) {
    
      
        PrintToChatAll("%s %N позиция %d из %d игроков с %d поинтами, убийств %d, смертей %d.", PREFIX, client, 1, 1, g_iPoints[client], g_iKills[client], g_iDeaths[client]);
    }
    return Plugin_Handled;
}

Как вот здесь обратится и получить подсчёт строк и позицию игрока? Каким образом отправить и записать в переменную результат COUNT(*) и ранг игрока в этом списке.
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #22
Как сделать чтобы ботам начислялись поинты, но сохранять ботов в базу не нужно просто для теста плагина.
как сейчас сделано - учитывает ботов.
Мне так же интересно при написании ранга нужно каждый раз считать записи?
каждый раз это когда?

И как потом получить позицию игрока? Меня даже не сами SQL запросы интересуют, а как это реализуется в игре.
Если часто получать то лучше хранить в памяти и обновлять время от времени
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
RIKO у меня не выводиться никакая информация в чат при убийстве ботов и смерти. Я приложу код подскажи, что там не так. PrintToChatAll тоже не выводиться в else, а при написании !rank выводиться всё по нулям такое ощущение что код из Player_death не выполняется.

PHP:
#pragma semicolon 1

#include <sourcemod>

#pragma newdecls required

#define PREFIX "\x04[Статистика]\x01"

Database        g_hDatabase;
int             g_iClientID[MAXPLAYERS+1], g_iKills[MAXPLAYERS+1], g_iDeaths[MAXPLAYERS+1], g_iPoints[MAXPLAYERS+1], g_iManyKills[MAXPLAYERS+1];

public void OnPluginStart()
{
    if(SQL_CheckConfig("players")) Database.Connect(GotDatabase, "players");
    else SetFailState("Не удалось найти секцию \"players\" в databases.cfg");

    HookEvent("player_death", Event_PlayerDeath);

    RegConsoleCmd("sm_rank", ShowRank);
}

public Action ShowRank(int client, int args) {
    if (client && IsClientInGame(client)) {
  
    
        PrintToChatAll("%s %N позиция %d из %d игроков с %d поинтами, убийств %d, смертей %d.", PREFIX, client, 1, 1, g_iPoints[client], g_iKills[client], g_iDeaths[client]);
    }
    return Plugin_Handled;
}


public void GotDatabase(Database db, char[] sError, any data)
{
    if (db == null)
    {
        SetFailState("Не удалось подключиться к базе: %s", sError);
    }
    else
    {
        g_hDatabase = db;
        CreateTables();
    }
}

void CreateTables()
{
    SQL_LockDatabase(g_hDatabase);
    g_hDatabase.Query(SQL_Callback_CheckError,    "CREATE TABLE IF NOT EXISTS `players` (\
                                                                `id` INT NOT NULL AUTO_INCREMENT,\
                                                                `steamid` VARCHAR(32) NOT NULL,\
                                                                `user` VARCHAR(32) NOT NULL,\
                                                                `points` INT UNSIGNED NOT NULL default 0,\
                                                                `deaths` INT UNSIGNED NOT NULL default 0,\
                                                                `kills` INT UNSIGNED NOT NULL default 0,\
                                                                PRIMARY KEY (`id`)\
                                                                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;");
    SQL_UnlockDatabase(g_hDatabase);

    g_hDatabase.SetCharset("utf8");
}

public void SQL_Callback_CheckError(Database hDatabase, DBResultSet results, const char[] sError, any data)
{
    if(sError[0])
    {
        LogError("SQL_Callback_CheckError: %s", sError);
    }
}

public void OnClientPostAdminCheck(int iClient)
{
    if(IsFakeClient(iClient) == false)
    {
        char sQuery[256], sAuth[32];
        GetClientAuthId(iClient, AuthId_Engine, sAuth, sizeof(sAuth), true);
        FormatEx(sQuery, sizeof(sQuery), "SELECT `id`, `points`, `deaths`, `kills` FROM `players` WHERE `steamid` = '%s' LIMIT 1;", sAuth);
        g_hDatabase.Query(SQL_Callback_SearchClient, sQuery, GetClientUserId(iClient));
    }
}

public void SQL_Callback_SearchClient(Database hDatabase, DBResultSet results, const char[] sError, any UserID)
{
    if(sError[0])
    {
        LogError("SQL_Callback_SearchClient: %s", sError);
        return;
    }

    int iClient = GetClientOfUserId(UserID);
    if(iClient)
    {
        if(results.FetchRow())    // Игрок есть в базе
        {
            g_iClientID[iClient] = results.FetchInt(0); // results.FetchString(0, szBuffer, sizeof(szBuffer));
            g_iPoints[iClient] = results.FetchInt(1);
            g_iDeaths[iClient] = results.FetchInt(2);
            g_iKills[iClient] = results.FetchInt(3);
        }
        else    // Игрока нет в базе
        {
            char sQuery[256], sAuth[32], sName[MAX_NAME_LENGTH*2+1];
            GetClientAuthId(iClient, AuthId_Engine, sAuth, sizeof(sAuth), true);
            GetClientName(iClient, sQuery, MAX_NAME_LENGTH);
            g_hDatabase.Escape(sQuery, sName, sizeof(sName));
            FormatEx(sQuery, sizeof(sQuery), "INSERT INTO `players` (`steamid`, `user`) VALUES ('%s', '%s');", sAuth, sName);
            g_hDatabase.Query(SQL_Callback_CreateClient, sQuery, GetClientUserId(iClient));
        }
    }
}

public void SQL_Callback_CreateClient(Database hDatabase, DBResultSet results, const char[] sError, any UserID)
{
    if(sError[0])
    {
        LogError("SQL_Callback_CreateClient: %s", sError);
        return;
    }

    int iClient = GetClientOfUserId(UserID);
    if(iClient)
    {
        g_iClientID[iClient] = results.InsertId;
    }
}

public void OnClientDisconnect(int iClient)
{
    g_iClientID[iClient], g_iPoints[iClient], g_iDeaths[iClient], g_iKills[iClient], g_iManyKills[iClient] = 0;

    char sQuery[256];
    FormatEx(sQuery, sizeof(sQuery), "UPDATE `players` SET `points` = %i, `kills` = %i, `deaths` = %i WHERE `id` = '%i';", g_iPoints[iClient], g_iKills[iClient], g_iDeaths[iClient], g_iClientID[iClient]);
    g_hDatabase.Query(SQL_Callback_CheckError, sQuery);
}

public void Event_PlayerDeath(Event hEvent, const char[] sEventName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));

    int kill_pn = 2;
    int death_pn = 2;

    if(iClient && g_iPoints[iClient] > 0){
    
        if(g_iManyKills[iClient] > 1){
    
            int bonpoints = 0;
            bonpoints = g_iManyKills[iClient] - 1;
            PrintToChat(iClient, "%s Вы получили %d поинтов за %d убийств.", PREFIX, bonpoints, g_iManyKills[iClient]);
            g_iPoints[iClient] + bonpoints;
            g_iManyKills[iClient] = 0;
        }
    
        ++g_iDeaths[iClient];
        g_iPoints[iClient] - death_pn;
        PrintToChat(iClient, "%s %N (%d) получил %d очка за убийство %N (%d)", PREFIX, iAttacker, g_iPoints[iAttacker], kill_pn, iClient, g_iPoints[iClient]);
    }else PrintToChatAll("Error 1");

    if(iAttacker != 0 && g_iPoints[iAttacker] > 0){
    
        int addpoints = g_iPoints[iAttacker] / 100 + kill_pn;
        if(addpoints > 25) addpoints = 25;
    
        g_iPoints[iAttacker] + addpoints;
        ++g_iKills[iAttacker];
        ++g_iManyKills[iAttacker];
        PrintToChat(iAttacker, "%s %N (%d) получил %d очка за убийство %N (%d)", PREFIX, iAttacker, g_iPoints[iAttacker], kill_pn, iClient, g_iPoints[iClient]);
    }else PrintToChatAll("Error 2");
}

Можешь показать как занести kill_pn, death_pn в переменную, чтобы настраивать через config файл. В mysql всё нормально таблица создаётся и игрок добавляется.
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
Все отлично, только поинты не добавляет. Убийства и смерти добавляет нормально в чем здесь ошибка?
g_iPoints[iClient] + bonpoints; bonpoints - точно больше нуля в так как условие из серии убийств проходит.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #26
@alexfyodrv, наверное из-за bonpoints = g_iManyKills[iClient] - 1;
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
@alexfyodrv, наверное из-за bonpoints = g_iManyKills[iClient] - 1;
Так же само и здесь
C-подобный:
int addpoints = (g_iPoints[iClient] / 100) + kill_pn;
        if(addpoints > 25) addpoints = 25;
    
        g_iPoints[iAttacker] + addpoints;
kill_pn = 2 и в любом случаи он не будет нулём.

Вот смотри показывает что даёт по 2 поинта в addpoints
C-подобный:
[Статистика] Alex (0) получил 2 очка за убийство Buka (0)
[Статистика] Alex (0) получил 2 очка за убийство 4yK4a (0)
[Статистика] Вы получили 1 поинтов за 2 убийств.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #28
@alexfyodrv,
PHP:
public void Event_PlayerDeath(Event hEvent, const char[] sEventName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));

    int kill_pn = 2;
    int death_pn = 2;

    if(iClient)
    {
        ++g_iDeaths[iClient];
        g_iPoints[iClient] -= death_pn;
       
        if(iAttacker != 0 )
        {
            int addpoints = g_iPoints[iAttacker] / 100 + kill_pn;
            if(addpoints > 25) addpoints = 25;
       
            g_iPoints[iAttacker] += addpoints;
            ++g_iKills[iAttacker];
            ++g_iManyKills[iAttacker];
            PrintToChat(iAttacker, "%s %N (%d) получил %d очка за убийство %N (%d)", PREFIX, iAttacker, g_iPoints[iAttacker], kill_pn, iClient, g_iPoints[iClient]);
   
            if(g_iManyKills[iClient] > 1)
            {
                int bonpoints = 5;
                PrintToChat(iClient, "%s Вы получили %d поинтов за %d убийств.", PREFIX, bonpoints, g_iManyKills[iClient]);
                g_iPoints[iClient] += bonpoints;
                g_iManyKills[iClient] = 0;
            }
        }
    }

}

обрати внимание. ты писал просто + - не присваивая значения в переменную
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
Ещё несколько вопросов:
1. Как считать время в секундах которое игрок находиться на сервере?
2. Как получить кол-во урона которое нанёс атакующий до того как убил игрока?
3. Как получить текущее время в unix?
 
Последнее редактирование:

alexfyodrv

Участник
Сообщения
24
Реакции
0
Еще один вопрос по поводу функций в sourcepawn я создал метод
PHP:
char nameCombo[32];

public Action Combo(int combo_kill){
    switch (combo_kill){
        case 2:
        {
            nameCombo = "%t","Double Kill";
        }
    }
}

Вызываю его так
PHP:
CPrintToChat(iClient, "%t Вы получили %d поинтов за %s %d убийств.", "Stats", bonpoints, Combo(g_iManyKills[iClient]), g_iManyKills[iClient]);

Ошибка неверный индекс как его правильно вызывать?
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #31
Ещё несколько вопросов:
1. Как считать время в секундах которое игрок находиться на сервере?
2. Как получить кол-во урона которое нанёс атакующий до того как убил игрока?
3. Как получить текущее время в unix?
1. При подключении записать время подключения в какую-нибудь переменную. А потом при необходимости срочно получить время провождения игрока на сервере - запрашиваем снова текущее время и вычитаем то время, когда игрок подключился.
3. GetTime()
--- Добавлено позже ---
@alexfyodrv, то, как ты вызываешь метод... Так нельзя. Вызывай его ДО ТОГО, как начинаешь форматировать сообщение, а потом выводи свою глобальную переменную (что я считаю, не есть хорошо) в сообщение.
Вдобавок, у тебя функция должна вернуть некое значение типа Action, а ты ничего не возвращаешь. Поставь в таком случае void.

И если тебе надо занести переведённую строку в переменную, то лучше делать так.
PHP:
SetGlobalTransTarget(client);
FormatEx(nameCombo, sizeof(nameCombo), "%t", "Double Kill");
Но в таком случае в функцию придётся передавать и клиента.

То, как ты пытаешься занести в переменную текст в своём коде - не совсем корректный способ. Он даже синтаксису не соответствует.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
1. Как считать время в секундах которое игрок находиться на сервере?
PHP:
native Float:GetClientTime(client);
2. Как получить кол-во урона которое нанёс атакующий до того как убил игрока?
Событие player_hurt (EventHookMode_Pre) или SDKHook_OnTakeDamage.
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
В php есть функция number_format которая позволяет выводить число в нужно виде, как это реализуется в sourcepawn?

Сейчас у меня так
PHP:
Статистика : Alex (1065) получил 2 очка за убийство To4kaPy (21)
Статистика : Вы получили 2 поинтов за Triple Kill (3 убийств)
Статистика : PoZa (2) получил 2 очка за убийство Alex (1065)
Статистика : PoZa убил вас имея 100 хп.

нужно сделать

PHP:
Статистика : Alex (1,065) получил 2 очка за убийство To4kaPy (21)
Статистика : Вы получили 2 поинтов за Triple Kill (3 убийств)
Статистика : PoZa (2) получил 2 очка за убийство Alex (1,065)
Статистика : PoZa убил вас имея 100 хп.

И ещё помогите найти ошибку в sql запросе все правильно написано, но в логи пишет ошибка неверный синтаксис.
PHP:
FormatEx(sQuery, sizeof(sQuery), "UPDATE `players` SET `points` = %i, `kills` = %i, `deaths` = %i, `headshots` = %i, `doublekill` = %i, `triplekill` = %i, `domination` = %i, `rampage` = %i, `megakill` = %i, `ownage` = %i, `ultrakill` = %i, `killingspree` = %i, `monsterkill` = %i, `unstoppable` = %i, `godlike` = %i WHERE `id` = '%i' LIMIT 1;", g_iPoints[iClient], g_iKills[iClient], g_iDeaths[iClient], g_headshot[iClient], g_comboKill_2[iClient], g_comboKill_3[iClient], g_comboKill_4[iClient], g_comboKill_5[iClient], g_comboKill_6[iClient], g_comboKill_7[iClient], g_comboKill_8[iClient], g_comboKill_9[iClient], g_comboKill_10[iClient], g_comboKill_11[iClient], g_comboKill_12[iClient], g_iClientID[iClient]);
 
Последнее редактирование:

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
И ещё помогите найти ошибку в sql запросе все правильно написано, но в логи пишет ошибка неверный синтаксис.
PHP:
FormatEx(sQuery, sizeof(sQuery), "UPDATE `players` SET `points` = %i, `kills` = %i, `deaths` = %i, `headshots` = %i, `doublekill` = %i, `triplekill` = %i, `domination` = %i, `rampage` = %i, `megakill` = %i, `ownage` = %i, `ultrakill` = %i, `killingspree` = %i, `monsterkill` = %i, `unstoppable` = %i, `godlike` = %i WHERE `id` = '%i' LIMIT 1;", g_iPoints[iClient], g_iKills[iClient], g_iDeaths[iClient], g_headshot[iClient], g_comboKill_2[iClient], g_comboKill_3[iClient], g_comboKill_4[iClient], g_comboKill_5[iClient], g_comboKill_6[iClient], g_comboKill_7[iClient], g_comboKill_8[iClient], g_comboKill_9[iClient], g_comboKill_10[iClient], g_comboKill_11[iClient], g_comboKill_12[iClient], g_iClientID[iClient]);
что-то вроде мб
PHP:
UPDATE players SET points='%i', kills='%i', deaths='%i', headshots='%i', doublekill='%i', triplekill='%i', domination='%i', rampage='%i', megakill='%i', ownage='%i', ultrakill='%i', killingspree='%i', monsterkill='%i', unstoppable='%i', godlike='%i' WHERE id='%i' LIMIT 1;
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #35
@The End Is Near..., разве бд в запросах не читает символы в одинарных и двойных ковычках, как строчки?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #36
@alexfyodrv,
И ещё помогите найти ошибку в sql запросе все правильно написано, но в логи пишет ошибка неверный синтаксис.
PHP:
FormatEx(sQuery, sizeof(sQuery), "UPDATE `players` SET `points` = %i, `kills` = %i, `deaths` = %i, `headshots` = %i, `doublekill` = %i, `triplekill` = %i, `domination` = %i, `rampage` = %i, `megakill` = %i, `ownage` = %i, `ultrakill` = %i, `killingspree` = %i, `monsterkill` = %i, `unstoppable` = %i, `godlike` = %i WHERE `id` = '%i' LIMIT 1;", g_iPoints[iClient], g_iKills[iClient], g_iDeaths[iClient], g_headshot[iClient], g_comboKill_2[iClient], g_comboKill_3[iClient], g_comboKill_4[iClient], g_comboKill_5[iClient], g_comboKill_6[iClient], g_comboKill_7[iClient], g_comboKill_8[iClient], g_comboKill_9[iClient], g_comboKill_10[iClient], g_comboKill_11[iClient], g_comboKill_12[iClient], g_iClientID[iClient]);

Выводи запрос в лог перед отправлением.

В php есть функция number_format которая позволяет выводить число в нужно виде, как это реализуется в sourcepawn?
написать свою ф-ю
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
Подскажите как зачислить поинты игрокам победившей команды? Как пройтись по циклу?

PHP:
public void Event_RoundEnd(Event hEvent, const char[] sEventName, bool bDontBroadcast)
{
    new winner_team = GetEventInt(event, "winner");

    if (winner_team == CS_TEAM_T)
    {
      
    }
    else if (winner_team == CS_TEAM_CT)
    {
      
    }
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #38
PHP:
public void Event_RoundEnd(Event hEvent, const char[] sEventName, bool bDontBroadcast)
{
    int winner_team = GetEventInt(hEvent, "winner");
    for (int client = 1; client<=MaxClients; client++) {
        if (!IsClientInGame(client)) continue;
        if (GetClientTeam(client) == winner_team) // и без всяких предварительных условий аля if (winner_team == CS_TEAM_T)
            g_iPoints[client] += 10; // добавляем 10 очков
    }
}
 
Последнее редактирование:
Сверху Снизу