[GameMode] [SQLite] Deathmatch (Bбsico)
#1

Mais um script que desenvolvi explorando o SQLite.
Sem maiores explicaзхes, aqui estб.


Cуdigo:
pawn Код:
#include <a_samp>



/* -----------------------------

        Deathmatch 1.0
            por Pedro Miranda


    Skype: pedro.miranda91

----------------------------- */

main();



new DB:main_database;


enum {
    DIALOG_REGISTER,
    DIALOG_LOGIN,
    DIALOG_RANKING
}



public OnGameModeInit() {

    main_database = db_open("sqlite.db");
    db_query(main_database, "CREATE TABLE IF NOT EXISTS `player_info` (`name`, `password`, `money`, `kills`, `deaths`)");

    SendRconCommand("mapname Los Santos");
    SendRconCommand("gamemodetext DM 1.0");
    SendRconCommand("hostname Deathmatch 1.0");

    for(new i; i < 300; ++i)
        AddPlayerClass(i, 2232.2813, -1158.4985, 29.7969, 0.3858, 24, 9999, 25, 9999, 34, 9999);

    UsePlayerPedAnims();
    return true;
}


public OnGameModeExit() {

    db_close(main_database);
    return true;
}


public OnPlayerConnect(playerid) {

    new
        playername[25],
        stringoutput[128],
        DBResult:queryresult;

    GetPlayerName(playerid, playername, sizeof playername);

    format(stringoutput, sizeof stringoutput, "SELECT * FROM `player_info` WHERE `name` = '%s'", DB_Escape(playername));
    queryresult = db_query(main_database, stringoutput);

    if(db_num_rows(queryresult)) {
        format(stringoutput, sizeof stringoutput, "{ffffff}Olб, {1e90ff}%s{ffffff}!\n\nDigite sua senha abaixo para logar.", playername);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{ffffff}Login", stringoutput, "Login", "Sair");
    }
    else {
        format(stringoutput, sizeof stringoutput, "{ffffff}Olб, {1e90ff}%s{ffffff}!\nVocк ainda nгo й registrado no servidor.\n\nDigite uma senha abaixo para se registrar.", playername);
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{ffffff}Registro", stringoutput, "Registrar", "Sair");
    }
    db_free_result(queryresult);
    return true;
}


public OnPlayerDisconnect(playerid, reason) {

    if(GetPVarInt(playerid, "playerLogged")) {

        new playername[25], stringoutput[150];

        GetPlayerName(playerid, playername, sizeof playername);

        format(stringoutput, sizeof stringoutput, "UPDATE player_info SET money = %d, kills = %d, deaths = %d WHERE name = '%s'",
            GetPlayerMoney(playerid),
            GetPVarInt(playerid, "playerKills"),
            GetPVarInt(playerid, "playerDeaths"),
            DB_Escape(playername));

        db_query(main_database, stringoutput);

        format(stringoutput, 64, "Server: {ffffff}%s deixou o servidor.", playername);
        SendClientMessageToAll(0xff0000ff, stringoutput);

        TextDrawDestroy(Text:GetPVarInt(playerid, "playerkTD"));
        TextDrawDestroy(Text:GetPVarInt(playerid, "playerdTD"));
    }
    return true;
}


public OnPlayerRequestClass(playerid, classid) {

    SetPlayerVirtualWorld(playerid, (playerid + 1));
    SetPlayerPos(playerid, 1025.5751, -2140.7637, 39.2032);
    SetPlayerCameraPos(playerid, 1019.7552, -2141.0266, 37.7274);
    SetPlayerCameraLookAt(playerid, 1021.9974, -2140.9907, 38.3012);
    SetPlayerFacingAngle(playerid, 82.6125);
    return true;
}


public OnPlayerDeath(playerid, killerid, reason) {

    new
        playername[25],
        stringoutput[128];

    GivePlayerMoney(playerid, 100); // Fix default money taking

    SetPVarInt(playerid, "playerDeaths", (GetPVarInt(playerid, "playerDeaths") + 1));
    if(killerid != 0xffff) {
        if(reason < 42) {
            new killername[25];
            GetPlayerName(killerid, killername, sizeof killername);

            SetPVarInt(killerid, "playerKills", (GetPVarInt(playerid, "playerKills") + 1));

            format(stringoutput, sizeof stringoutput, "    Vish! %s te matou e levou toda sua grana!", killername);
            SendClientMessage(playerid, 0xff0000ff, stringoutput);

            format(stringoutput, sizeof stringoutput, "    Boa garoto!! Vocк matou %s e levou toda a grana do otбrio!!", playername);
            SendClientMessage(playerid, 0xf6f600ff, stringoutput);

            GivePlayerMoney(killerid, GetPlayerMoney(playerid));
            ResetPlayerMoney(playerid);

            format(stringoutput, sizeof stringoutput, "Kills: ~y~%02d", GetPVarInt(killerid, "playerKills"));
            TextDrawSetString(Text:GetPVarInt(killerid, "playerkTD"), stringoutput);
        }
    }

    format(stringoutput, sizeof stringoutput, "Mortes: ~y~%02d", GetPVarInt(playerid, "playerDeaths"));
    TextDrawSetString(Text:GetPVarInt(playerid, "playerdTD"), stringoutput);

    TextDrawHideForPlayer(playerid, Text:GetPVarInt(playerid, "playerkTD"));
    TextDrawHideForPlayer(playerid, Text:GetPVarInt(playerid, "playerdTD"));
    return true;
}


public OnPlayerRequestSpawn(playerid) {

    return GetPVarInt(playerid, "playerLogged");
}


public OnPlayerSpawn(playerid) {

    SetPlayerVirtualWorld(playerid, 0);

    TextDrawShowForPlayer(playerid, Text:GetPVarInt(playerid, "playerkTD"));
    TextDrawShowForPlayer(playerid, Text:GetPVarInt(playerid, "playerdTD"));
    return true;
}


public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {

    new
        playername[25],
        stringoutput[150],
        DBResult:queryresult;

    GetPlayerName(playerid, playername, sizeof playername);

    if(dialogid == DIALOG_REGISTER) {

        if(!response)
            return Kick(playerid);

        if(!(4 < strlen(inputtext) < 33))
            return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{ffffff}Registro", "{ffffff}Sua senha deve ter no mнnimo 5 e no mбximo 32 caracteres.\n\nPor favor, tente novamente.", "Registrar", "Sair");

        format(stringoutput, sizeof stringoutput, "INSERT INTO player_info (name, password, money, kills, deaths) VALUES ('%s', '%s', 5000, 0, 0)", DB_Escape(playername), DB_Escape(inputtext));
        db_query(main_database, stringoutput);

        format(stringoutput, sizeof stringoutput, "{ffffff}Muito bem, {1e90ff}%s{ffffff}!\nVocк se registrou com sucesso.\n\nDigite sua senha abaixo para logar.", playername);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{ffffff}Login", stringoutput, "Login", "Sair");
    }
    else if(dialogid == DIALOG_LOGIN) {

        if(!response)
            return Kick(playerid);

        format(stringoutput, sizeof stringoutput, "SELECT * FROM player_info WHERE name = '%s' AND password = '%s'", DB_Escape(playername), DB_Escape(inputtext));
        queryresult = db_query(main_database, stringoutput);

        if(db_num_rows(queryresult)) {
            SetPVarInt(playerid, "playerLogged", 1);

            db_get_field_assoc(queryresult, "money", stringoutput, 32);
            ResetPlayerMoney(playerid); GivePlayerMoney(playerid, strval(stringoutput));

            db_get_field_assoc(queryresult, "kills", stringoutput, 32);
            SetPVarInt(playerid, "playerKills", strval(stringoutput));

            db_get_field_assoc(queryresult, "deaths", stringoutput, 32);
            SetPVarInt(playerid, "playerDeaths", strval(stringoutput));

            SetPVarInt(playerid, "playerkTD", _:TextDrawCreate(498.000000, 101.000000, "Kills:"));
            TextDrawBackgroundColor(Text:GetPVarInt(playerid, "playerkTD"), 255);
            TextDrawFont(Text:GetPVarInt(playerid, "playerkTD"), 1);
            TextDrawLetterSize(Text:GetPVarInt(playerid, "playerkTD"), 0.500000, 1.000000);
            TextDrawColor(Text:GetPVarInt(playerid, "playerkTD"), -1);
            TextDrawSetOutline(Text:GetPVarInt(playerid, "playerkTD"), 1);
            TextDrawSetProportional(Text:GetPVarInt(playerid, "playerkTD"), 1);

            SetPVarInt(playerid, "playerdTD", _:TextDrawCreate(497.000000, 112.000000, "Mortes:"));
            TextDrawBackgroundColor(Text:GetPVarInt(playerid, "playerdTD"), 255);
            TextDrawFont(Text:GetPVarInt(playerid, "playerdTD"), 1);
            TextDrawLetterSize(Text:GetPVarInt(playerid, "playerdTD"), 0.500000, 1.000000);
            TextDrawColor(Text:GetPVarInt(playerid, "playerdTD"), -1);
            TextDrawSetOutline(Text:GetPVarInt(playerid, "playerdTD"), 1);
            TextDrawSetProportional(Text:GetPVarInt(playerid, "playerdTD"), 1);

            format(stringoutput, sizeof stringoutput, "Kills: ~y~%02d", GetPVarInt(playerid, "playerKills"));
            TextDrawSetString(Text:GetPVarInt(playerid, "playerkTD"), stringoutput);

            format(stringoutput, sizeof stringoutput, "Mortes: ~r~%02d", GetPVarInt(playerid, "playerDeaths"));
            TextDrawSetString(Text:GetPVarInt(playerid, "playerdTD"), stringoutput);

            format(stringoutput, sizeof stringoutput, "Server: {ffffff}%s conectou-se!", playername);
            SendClientMessageToAll(0x32cd32ff, stringoutput);
        }
        else {
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{ffffff}Login", "{ffffff}Senha incorreta!\n\nPor favor, tente novamente.", "Login", "Sair");
        }
        db_free_result(queryresult);
    }
    return true;
}


public OnPlayerCommandText(playerid, cmdtext[]) {

    if(!strcmp("ranking", cmdtext[1], true)) {

        static
            i,
            result[32],
            playerkills,
            dialogstring[64 * 10],
            DBResult:queryresult;

        queryresult = db_query(main_database, "SELECT name, kills FROM player_info ORDER BY kills DESC LIMIT 10");

        for(i = 0; i != db_num_rows(queryresult); ++i) {
            db_get_field_assoc(queryresult, "kills", result, sizeof result);
            playerkills = strval(result);

            db_get_field_assoc(queryresult, "name", result, sizeof result);

            format(dialogstring, sizeof dialogstring, "%s %02d. %s - %02d assassinatos\n", dialogstring, (i + 1), result, playerkills);
            db_next_row(queryresult);
        }
        db_free_result(queryresult);
        ShowPlayerDialog(playerid, DIALOG_RANKING, DIALOG_STYLE_LIST, "{ffffff}Ranking", dialogstring, "Fechar", "");
        return true;
    }

    return SendClientMessage(playerid, 0x1e90ffff, "Server: {ffffff}Este comando nгo existe!");
}





stock DB_Escape(text[])
{
    new
        ret[80 * 2],
        ch,
        i,
        j;
    while ((ch = text[i++]) && j < sizeof (ret))
    {
        if (ch == '\'')
        {
            if (j < sizeof (ret) - 2)
            {
                ret[j++] = '\'';
                ret[j++] = '\'';
            }
        }
        else if (j < sizeof (ret))
        {
            ret[j++] = ch;
        }
        else
        {
            j++;
        }
    }
    ret[sizeof (ret) - 1] = '\0';
    return ret;
}

Download:
http://pastebin.com/f4WwxUwd
Reply
#2

Gostei do code..

Agora uma duvida qual й o mais leve? em trafego de sockets/Dados

SQLite ou MySQL?
Reply
#3

Pra quem ta aprendendo SQLite isso e uma maravilha!
Reply
#4

Quote:
Originally Posted by Schocc
Посмотреть сообщение
Gostei do code..

Agora uma duvida qual й o mais leve? em trafego de sockets/Dados

SQLite ou MySQL?
Sinceramente nгo sei.
Reply
#5

Quote:
Originally Posted by Schocc
Посмотреть сообщение
Gostei do code..

Agora uma duvida qual й o mais leve? em trafego de sockets/Dados

SQLite ou MySQL?
SQLite nгo usa sockets. Ela й baseado em arquivos binбrios na mesma mбquina da aplicaзгo.
Reply
#6

Quote:
Originally Posted by steki.
Посмотреть сообщение
SQLite nгo usa sockets. Ela й baseado em arquivos binбrios na mesma mбquina da aplicaзгo.
hum...
Obrigado por me dizer isto ...
Entгo й bem diferente mesmo ...
Reply
#7

Atualizado.

Havia esquecido de dar free result na consulta de login.
Reply
#8

Parece que SQLite й bem facil de mecher , vlw por compartilhar vou tentar aprimorar meus conheзimentos com esse gamemode
Reply
#9

Quote:
Originally Posted by Nice-.-
Посмотреть сообщение
Parece que SQLite й bem facil de mecher , vlw por compartilhar vou tentar aprimorar meus conheзimentos com esse gamemode
Nгo tem de que.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)