Skocz do zawartości
kox1906

[Brak rozwiązania] Prosty system punktów na serwerze

Rekomendowane odpowiedzi

Napisano (edytowane)

Cześć,

To jak na razie ostatni plugin, jaki chciałbym napisać do mojego serwera deathmatch. Prawie cały plugin skopiowałem od Magneta z drugiej części poradnika MySQL, ale dodałem trochę swoich rzeczy i chciałem obsłużyć !rank. Pokaże to na czacie wiadomość typu "*nick* is X/Y | [*points*]", gdzie X to miejsce posiadane przez gracza, a Y to liczba wszystkich graczy, którzy się kiedykolwiek połączyli. To mnie przerosło, więc przychodzę z prośbą o pomoc tutaj. Dodam, że w całym pluginie, który wyślę tylko "public Action ClientRanking(int client, int args) mnie interesuje, reszta jest obsłużona poprawnie. *komentarze dla mnie, nie zwracajcie uwagi* Oto plugin:

#include <sourcemod>
#include <multicolors>
 
#define RANK_TAG "{green}[RANKING]{purple}"
 
int kills[MAXPLAYERS];
int points[MAXPLAYERS];
 
Database DB;
 
public void OnPluginStart()
{
    RegConsoleCmd("sm_rank", ClientRanking);
    RegConsoleCmd("sm_top", TopRanking);
 
    HookEvent("player_death", PlayerDeath);
}
 
public void OnMapStart()
{
    char error[128];
    DB = SQL_Connect("Killer"true, error, sizeof(error));
    if(DB == INVALID_HANDLE)
    {
        LogError("Could not connect: %s", error);
        return;
    }
 
    char buffer[1024];
    Format(buffer, sizeof(buffer), "CREATE TABLE IF NOT EXISTS `Kills`(`steamid` INT NOT NULL PRIMARY KEY,`nick` VARCHAR(64),`kills` INT NOT NULL,`points` INT NOT NULL)");
    if(!SQL_FastQuery(DB, buffer))
    {
        SQL_GetError(DB, error, sizeof(error));
        PrintToServer("Could not create a table, error: %s", error);
    }
}
 
public Action ClientRanking(int client, int args)
{
    char buffer[1024];
    Format(buffer, sizeof(buffer), "SELECT `points` FROM `Kills` ORDER BY `points` DESC;");
 
    //char nameBuffer[MAX_NAME_LENGTH];
    //int pointsBuffer;
 
    CPrintToChat(client, "%s {lightblue}%N{purple} is {olive}X{purple}/{darkred}Y{purple} | [{orchid}%d{purple} points]", RANK_TAG, client, points[client]);
    //OBSLUZYC, ZROBIC MENU WYLACZAJACE DZWIEKI (OVERLAYE ITP)
}
 
public Action PlayerDeath(Event e, const char[] n, bool b)
{
    int client   = GetClientOfUserId(e.GetInt("userid"));
    int attacker = GetClientOfUserId(e.GetInt("attacker"));
    kills[attacker]++;
    points[client]-=2;
    if(points[client]<0)    points[client]=0;
    if(IsVip(attacker))     
    {
        points[attacker]+=6;  
    }
    else
    {
        points[attacker]+=4;
    }
}
 
public void OnClientPutInServer(int client)
{
    kills[client] = 0;
    points[client] = 0;
    if(IsFakeClient(client) || IsClientSourceTV(client))
    return;
 
    int sid = GetSteamAccountID(client);
    char buffer[1024];
    Format(buffer, sizeof(buffer), "SELECT `kills`,`points` FROM `Kills` WHERE `steamid`=%d", sid);
    DBResultSet query = SQL_Query(DB, buffer);
    if(query == null)   // null or INVALID_HANDLE
    {
        char error[255];
        SQL_GetError(DB, error, sizeof(error));
        PrintToServer("Could not player's (%N) data download, error: %s", client, error);
        return;
    }
 
    if(!SQL_GetRowCount(query))
    {
        Format(buffer, sizeof(buffer), "INSERT INTO `Kills` VALUES(%d, '%N', 0, 1000)", sid, client);
        if(!SQL_FastQuery(DB, buffer))
        {
            char error[255];
            SQL_GetError(DB, error, sizeof(error));
            PrintToServer("Could not add new player (%N), error: %s", client, error);
        }
        return;
    }
 
    while(SQL_FetchRow(query))
    {
        kills[client]    = SQL_FetchInt(query, 0);
        points[client]   = SQL_FetchInt(query, 1);
    }
}
 
public void OnClientDisconnect(int client)
{
   char buffer[1024];
   Format(buffer, sizeof(buffer), "UPDATE `Kills` SET `kills`=%d,`points`=%d WHERE `steamid`=%d", kills[client], points[client], GetSteamAccountID(client));
   if(!SQL_FastQuery(DB, buffer))
   {
       char error[255];
       SQL_GetError(DB, error, sizeof(error));
       PrintToServer("Could not update player's (%N) data, error: %s", client, error);
   } 
}
 
public Action TopRanking(int client, int args)
{
    Menu top = new Menu(TopRanking_Handler);
    top.SetTitle("TOP 10:");
 
    char buffer[1024];
    Format(buffer, sizeof(buffer), "SELECT `nick`,`points` FROM `Kills` ORDER BY `points` DESC LIMIT 10;");
 
    DBResultSet query = SQL_Query(DB, buffer);
 
    char nameBuffer[MAX_NAME_LENGTH];
    int pointsBuffer;
 
    while(SQL_FetchRow(query))
    {
        pointsBuffer = SQL_FetchInt(query, 1);
        SQL_FetchString(query, 0, nameBuffer, sizeof(nameBuffer));
        if (IsVip(client))  Format(buffer, sizeof(buffer), "[VIP] %s [%d]", nameBuffer, pointsBuffer);
        else Format(buffer, sizeof(buffer), "%s [%d]", nameBuffer, pointsBuffer);
        top.AddItem("", buffer);
    }
    top.Display(client, 120);
 
    return Plugin_Continue;
}
 
public int TopRanking_Handler(Menu top, MenuAction action, int client, int position)
{
    if(action == MenuAction_End || action == MenuAction_Select)
    delete top;
}






 
//////////////////////////////////// BOOLS ////////////////////////////////////
bool IsVip(int client)  //or owner or admin
{
    if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1 || GetUserFlagBits(client) & ADMFLAG_CUSTOM2 || GetUserFlagBits(client) & ADMFLAG_CUSTOM3)     return true;
    
    return false;
}
Edytowane przez kox1906

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przejrzyj kod mojego pluginu i znajdziesz odpowiedź.

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kurde, przesiedziałem sporo czasu, żeby ogarnąć ten Twój plugin i przepisałem nawet niektóre linijki, ale nie do końca działa tak jak powinno.. Cały czas wyświetla się error, bo wchodzi w ten warunek: 

if (!g_iDatabase)
    {
        CPrintToChat(client, "%s There is an error with plugin-database connection. Try it on the next map", RANK_TAG);
        return;
    }

przepisałem go po prostu, ale nie mam pojęcia co znaczy xd. Oto fragment kodu teraz:

public Action ClientRanking(int client, int args)
{
    char buffer[256];
    if (!g_iDatabase)
    {
        CPrintToChat(client, "%s There is an error with plugin-database connection. Try it on the next map", RANK_TAG);
        return;
    }
    Format(buffer, sizeof(buffer), "SELECT `steamid`,`points` FROM `Kills` WHERE `points`>='0' ORDER BY `points` DESC;");
    DB.Query(SQL_Rank_Handler, buffer, client, DBPrio_High);
}
 
public void SQL_Rank_Handler(Database db, DBResultSet results, const char[] sError, any client) 
{
    if (db == null || results == null) {
        LogError("%s There is an error, error: %s", RANK_TAG, sError);
        return;
    }
 
    int i;
    char sAuthIdQuery[64], sAuthId[64];
    GetClientAuthId(client, AuthId_Steam2, sAuthId, sizeof(sAuthId));
    int TotalPlayers = results.RowCount;
    while (results.HasResults && results.FetchRow()) {
        i++;
        results.FetchString(0, sAuthIdQuery, sizeof(sAuthIdQuery));
        if (StrEqual(sAuthIdQuery, sAuthId)) {
            CPrintToChat(client, "%s {lightblue}%N{purple} is {olive}%d{purple}/{darkred}%d{purple} | [{orchid}%d{purple} points]", RANK_TAG, client, i, TotalPlayers, points[client]);
        }
    }
}

A oto co wyświetla się w konsoli serwerowej:

Client "Koxu csgoatse.com" connected (193.xxx.xxx.xxx:xxxxx).
L 07/02/2020 - 21:14:32: [SM] Exception reported: Error fetching data from field 1
L 07/02/2020 - 21:14:32: [SM] Blaming: #Server_RANKING.smx
L 07/02/2020 - 21:14:32: [SM] Call stack trace:
L 07/02/2020 - 21:14:32: [SM]   [0] SQL_FetchInt
L 07/02/2020 - 21:14:32: [SM]   [1] Line 103, C:\Users\Koxu\Desktop\Server\scripting\#Server_RANKING.sp::OnClientPutInServer
PutClientInServer: no info_player_start on level
Dropped Koxu csgoatse.com from server: Disconnect
-> Reservation cookie 0:  reason reserved(yes), clients(no), reservationexpires(0.00)
Server is hibernating

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Brak rozwiązania problemu

Jeżeli się z tym nie zgadzasz, raportuj ten post

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...