[Tutorial] Criando sistema de casas em MySQL
#1


Criaзгo sistema de casas em MySQL


Boas pessoal, hoje irei ensinar como vocкs podem fazer o vosso sistema de casas em MySQL, primeiro de tudo vocкs deverгo saber usar MySQL, neste caso eu irei usar o Plugin do BlueG a R7 que й o update mais recente que ele fez, entгo vamos lб comeзar.

pawn Код:
#define M_HOUSE (100) //Aqui serб o mбximo de casas do servidor, coloque as que vocк quiser...
new entrou[MAX_PLAYERS];
new ChaveCasa[MAX_PLAYERS];
new MysqlC; //Estб й uma variбvel que iremos usar mais para a frente.
new const
    mysql_host[] = "localhost", //Nгo troque
    mysql_user[] = "root", //Nгo troque
    mysql_password = "1234", //mude para a password do seu MySQL
    mysql_database[] = "samp"; //esta й a nossa database, vocк deverб criar uma assim.

new query[500]; //Sim iremos necessitar de 500 cйlulas.

enum hInfo{
    hOwner[25], //Aqui serб gravado o nome do comprador...
    Float:hEX, //Coordenada da entrada X
    Float:hEY, //Coordenada da entrada Y
    Float:hEZ, //Coordenada da entrada Z
    Float:hSX, //Coordenada para a saнda X
    Float:hSY, //Coordenada para a saнda Y
    Float:hSZ, //Coordenada para a saнda Z
    hMundo, //Aqui serб o mundo da casa
    hInt, //Aqui serб o interior da casa
    hVenda, //Aqui serб uma variбvel para verificar se a casa estб a venda ou nгo.
    hPreco, //Aqui serб o preзo da casa.
    hLock //Aqui serб uma variбvel para trancar a casa.
};
new HouseInfo[M_HOUSE][hInfo];
Bem, no fim disto nуs deveremos comeзar pela conexгo a database e a criaзгo da tabela no MySQL.

pawn Код:
//OnGameModeInIt
MysqlStartConnection();

//Fim do GM

forward MysqlStartConnection();
public MysqlStartConnection(){
    MysqlC = mysql_connect(mysql_host,mysql_user,mysql_database,mysql_password); //aqui й a conexгo a database
    if(!MysqlC){
        print("Foi impossivel conectar a database, reveja as definiзхes novamente");
        SendRconCommand("exit"); //Iremos fechar o servidor para nгo haver problemas com as casas...
    }
    print("Conectado a database.");
    mysql_function_query(MysqlC,
        "CREATE TABLE IF NOT EXISTS `casas` ( \
            `id` int(11) NOT NULL AUTO_INCREMENT, \
            `owner` varchar(25) NOT NULL, \
            `EX` double NOT NULL, \
            `EY` double NOT NULL, \
            `EZ` double NOT NULL, \
            `Interior` int(11) NOT NULL, \
            `Mundo` int(11) NOT NULL, \
            `Venda` int(11) NOT NULL, \
            `Preco` int(11) NOT NULL, \
            PRIMARY KEY (`id`) \
        )"
,false,"r@MysqlStartConnection","s","casas");
    //Aqui iremos criar uma tabela com esses parвmetros caso nгo existir, depois iremos mandar uma resposta de sucesso para a public r@MysqlStartConnection.
    LoadHouse(); //Eu gosto muito de usar funзхes inglesas, poupгo mais espaзo...
    return 1;
}
forward r@MysqlStartConnection(text[]);
public r@MysqlStartConnection(text[]){
    printf("tabela %s criada com sucesso",text);
    return 1;
}
Pronto, estб parte й muito simples, vocк apenas tem que fazer isso, o que nгo й nada difнcil, na minha opiniгo, para quem nгo sabe esta й a nova versгo do Mysql que й a R7 que o BlueG fez, ela tem uma funзгo nova, quer dizer nгo й bem nova, й uma nova versгo do "mysql_query" ela й a mysql_function_query, ela faz o seguinte, ela conecta-se com a database, depois faz o query que vocк escreveu, depois manda uma resposta para uma callback com os parвmetros que vocк usou. Й muito simples, agora vamos para o sistema de Spawn de casas.

pawn Код:
forward LoadHouse();
public LoadHouse(){
    for(new i = 0; i<M_HOUSE; i++){
        mysql_format(MysqlC,query,"SELECT * FROM `casas` WHERE id=%d",i); //Aqui iremos formatar o nosso query, isto significa assim "SELECIONAR TUDO DA TABELA `casas` ONDE o id й igual a %d", lembrando que o * й igual a TUDO, vocк tem que usar * nгo pode usar ALL й sempre * ou o parвmetro em especifico.
        mysql_function_query(MysqlC,query,true,"r@LoadHouse","i",i);
    }
    return 1;
}
forward r@LoadHouse(i);
public r@LoadHouse(i){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);

    cache_get_field_content(0,"owner",query,MysqlC);
    strmid(query,HouseInfo[i][hOwner],0,strlen(query),255);

    cache_get_field_content(0,"EX",query,MysqlC);
    HouseInfo[i][hEX] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[i][hEZ] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[i][hEZ] = floatstr(query);

    cache_get_field_content(0,"Interior",query,MysqlC);
    HouseInfo[i][hInt] = strval(query);

    cache_get_field_content(0,"Mundo",query,MysqlC);
    HouseInfo[i][hMundo] = strval(query);

    cache_get_field_content(0,"Venda",query,MysqlC);
    HouseInfo[i][hVenda] = strval(query);

    cache_get_field_content(0,"Preco",query,MysqlC);
    HouseInfo[i][hPreco] = strval(query);
   
    CreateExit(i,HouseInfo[i][hInt]);
    return 1;
}
forward CreateExit(i,var);
public CreateExit(i,var){
    if(var == 1){
        HouseInfo[i][hSX] = 223.1929;
        HouseInfo[i][hSY] = 1287.0780;
        HouseInfo[i][hSZ] = 1082.1406;
    }
    else if(var == 2){
        HouseInfo[i][hSX] = 225.756989;
        HouseInfo[i][hSY] = 1240.000000;
        HouseInfo[i][hSZ] = 1082.149902;   
    }
    //Enfim vб adicionando mais interiores e pegando a coordenada da saнda deles...
    return 1;
}
Bem agora vamos comeзar por criar alguns comandos bбsicos. Vamos comeзar por um comando para criar as casas.

pawn Код:
CMD:criarcasa(playerid,params[]){
    if(isnull(params))
        return SendClientMessage(playerid,-1,"USE: /criarcasa [ID da casa]");
    CheckHouse(strval(params));
    return 1;
}
forward CheckHouse(playerid,var);
public CheckHouse(playerid,var){
    mysql_format(MysqlC,query,"SELECT * FROM `casas` WHERE id=%d",var);
    mysql_function_query(MysqlC,query,true,"r@CheckHouse","ii",playerid,var);
    return 1;
}
forward r@CheckHouse(playerid,var);
public r@CheckHouse(playerid,var){
    new rows,fields;
    cache_get_data(rows,fields);
    if(rows){
        SendClientMessage(playerid,-1,"Jб existe uma casa com este id...");
    }
    else {
        new Float:hPos[3];
        GetPlayerPos(playerid,hPos[0],hPos[1],hPos[2]);
        HouseInfo[var][hEX] = hPos[0];
        HouseInfo[var][hEY] = hPos[1];
        HouseInfo[var][hEZ] = hPos[2];

        mysql_format(MysqlS,query,"INSERT INTO `casas` (owner,EX,EY,EZ,mundo,interior,venda,preco) VALUES ('EM-VENDA',%f,%f,%f,1,1,1,1000);",HouseInfo[hid][hEX],HouseInfo[hid][hEY],HouseInfo[hid][hEZ]);
        mysql_function_query(MysqlS,query,true,"r@CheckSave","i",playerid);
    }
}
forward r@CheckSave(playerid);
public r@CheckSave(playerid){
    SCM(playerid,-1,"Casa Criada Com sucesso.");
    return 1;
}
Pronto, agora vocк pode fazer como quiser, isto й apenas uma base digamos, vocк pode criar como quer ou usar o meu sistema de casas que estarei criando brevemente, agora vamos passar para o comando de compra, entrada, venda e saнda que й muito simples, apenas veja.

pawn Код:
CMD:comprarcasa(playerid){
    new pname[25],money = GetPlayerMoney(playerid);
    GetPlayerName(playerid,pname,sizeof(pname));
    for(new i=0; i<M_HOUSE; i++){
        if(IsPlayerInRangeOfPoint(playerid,10,HouseInfo[i][hEX],HouseInfo[i][hEY],HouseInfo[i][hEZ]))
        {
            if(ChaveCasa[playerid] != 9999)
                return SendClientMessage(playerid,-1,"Ei nigga vocк jб tem uma casa, vende ela (/vendercasa)");
            else if(HouseInfo[i][hVenda] == 1){
                f(money > HouseInfo[i][hPreco]){
                    GivePlayerMoney(playerid,-HouseInfo[i][hPreco]);
                    strmid(pname,HouseInfo[i][hOwner],0,strlen(pname),255);
                    format(result,sizeof(result),"Vocк pagou %d$ pela casa, sua chave й %d",HouseInfo[i][hPreco],i);
                    SendClientMessage(playerid,-1,result);
                    ChaveCasa[playerid] = i;
                    HouseInfo[i][hVenda] = 0;
                        UpdateHouse(playerid,housei);

                    }
                else
                    return SendClientMessage(playerid,-1,"Vocк nгo tem esse dinheiro...");
            }
        }
    }
    return 1;
}
CMD:sair(playerid){
    for(new i=0; i<M_HOUSE; i++){
        if(IsPlayerInRangeOfPoint(playerid,3,HouseInfo[i][hSX], HouseInfo[i][hSY], HouseInfo[i][hSZ])){
            if(Entrou[playerid] == i){
                                SetPlayerInterior(playerid,0);
                SetPlayerPos(playerid,HouseInfo[i][hEX],HouseInfo[i][hEY],HouseInfo[i][hEZ]);
                SetCameraBehindPlayer(playerid);
                SetPlayerVirtualWorld(playerid,0);
                Entrou[playerid] = 9999;
            }
        }
    }
    return 1;
}
CMD:entrar(playerid){
    for(new i=0; i<M_HOUSE; i++){
        if(IsPlayerInRangeOfPoint(playerid,10,HouseInfo[i][hEX],HouseInfo[i][hEY],HouseInfo[i][hEZ]))
        {
            if(HouseInfo[i][hLocked] == 0 || ChaveCasa[playerid] == i){
                SetPlayerInterior(playerid,HouseInfo[i][hInt]);
                SetPlayerVirtualWorld(playerid,HouseInfo[i][hWorld]);
                SetPlayerPos(playerid,HouseInfo[i][hSX],HouseInfo[i][hSY],HouseInfo[i][hSZ]);
                GameTextForPlayer(playerid,"~g~Bem Vindo a casa",3000,1);
                Entrou[playerid] = i;
            }
            else {
                GameTextForPlayer(playerid,"~r~Trancada use /destrancar",3000,1);
            }
        }
    }
    return 1;
}
CMD:trancar(playerid){
    for(new i=0; i<M_HOUSE; i++){
        if(IsPlayerInRangeOfPoint(playerid,10,HouseInfo[i][hEX],HouseInfo[i][hEY],HouseInfo[i][hEZ]))
        {
            if(ChaveCasa[playerid] == i){
                if(HouseInfo[i][hLocked] == 0){
                    HouseInfo[i][hLocked] = 1;
                    GameTextForPlayer(playerid,"~r~Casa trandaca",3000,1);
                }
                else if(HouseInfo[i][hLocked] == 1){
                    SCM(playerid,-1,"((A sua casa jб estб destrancada, use /trancar para trancar a mesma.))");
                }
            }
        }
    }
    return 1;
}
CMD:destrancar(playerid){
    for(new i=0; i<M_HOUSE; i++){
        if(IsPlayerInRangeOfPoint(playerid,10,HouseInfo[i][hEX],HouseInfo[i][hEY],HouseInfo[i][hEZ]))
        {
            if(ChaveCasa[playerid] == i){
                if(HouseInfo[i][hLocked] == 0){
                    SCM(playerid,-1,"((A sua casa jб estб destrancada, use /trancar para trancar a mesma.))");
                }
                else if(HouseInfo[i][hLocked] == 1){
                    HouseInfo[i][hLocked] = 0;
                    GameTextForPlayer(playerid,"~g~Casa destrandaca",3000,1);
                }
            }
        }
    }
    return 1;
}
CMD:vendercasa(playerid){
    if(ChaveCasa[playerid] == 9999)
        return SCM(playerid,-1,"ERRO: vocк nгo tem nenhuma casa.");
    else {
        new housei = ChaveCasa[playerid];
        GivePlayerMoney(playerid,HouseInfo[housei][hPreco]);
        HouseInfo[housei][hVenda] = 1;
        format(result,sizeof(result),"~w~Vocк vendeu a sua casa por ~g~%d$",HouseInfo[housei][hPreco]);
        GameTextForPlayer(playerid,result,3000,1);
        ChaveCasa[playerid] = 9999;
        UpdateHouse(playerid,housei);

    }
    return 1;
}
forward UpdateHouse(playerid,hid);
public UpdateHouse(playerid,hid){
    mysql_format(MysqlS,query,"UPDATE `casas` SET owner='%s' , venda=%d WHERE id=%d",HouseInfo[hid][hOwner],HouseInfo[hid][hVenda],hid);
    mysql_function_query(MysqlS,query,true,"r@UpdateHouse","ii",playerid,hid);
    return 1;
}[/i]


Bem por agora й isto pessoal, eu acho que jб deu para entender, acho que nгo preciso de explicar comandinho por comandinho, pois este tutorial й grande, mas bem, espero que gostem, eu estarei a fazer um sistema de criaзгo de casas caso queiram usar ele eu irei atualizar a pбgina quando o mesmo tiver feito, lembrando que ele gravarб em MySQL pessoal.

~Le Crйditos
Reply
#2

Legal, para quem esses dias tava querendo aprender mysql ta otimo! Perfect...
Reply
#3

Excelente
Reply
#4

Уtimo tutorial.
Irб ser bastante ъtil.
Reply
#5

Quote:
Originally Posted by x'ReyaLp
Посмотреть сообщение
Bueno Script!
Thanks

Quote:
Originally Posted by paulor
Посмотреть сообщение
Legal, para quem esses dias tava querendo aprender mysql ta otimo! Perfect...
Sim, eu acho que MySQL nгo й nada dificil, sinceramente, desde que eu entrei em contacto com a programaзгo quem me ensinou muita coisa foi o Stewie, ele sim й foda mano, cara ele falou para eu usar ZCMD ai eu falei que nunca conseguiria usar ZCMD, aconteceu o mesmo com o MySQL eu falei que nunca ia conseguir, mas viu, o problema й que eu nunca tentei, sempre tente, nada й difнcil, apenas й difнcil se vocк nгo tentar Valeu Paulinho

Quote:
Originally Posted by Pedro_Miranda
Посмотреть сообщение
Excelente
Yap, thanks :P


Quote:
Originally Posted by Đeagle
Посмотреть сообщение
Уtimo tutorial.
Irб ser bastante ъtil.
Eu gosto de fazer coisas uteis :3

Eu tava a pensar em fazer umas videoaulas de MySQL, alguйm quer aprender? o:
Reply
#6

Quote:
Originally Posted by BlueX
Посмотреть сообщение
Eu tava a pensar em fazer umas videoaulas de MySQL, alguйm quer aprender? o:
Se possнvel.
Eu estava a pensar que MySQL й um bixo de sete cabeзas, mais eu estou estudando cуdigos e tutoriais como o seu aqui, e estou vendo que nгo й bem assim.

Mais se possнvel, faзa essa vнdeo-aula por gentileza, assim ajuda-rб bastante usuбrios alйm de mim.
Reply
#7

Sim, claro. Dps q vc aprende a logica, tudo fica mais facil! pois toda linguagem q conheзo tem seus if e else. Hehe
Reply
#8

Sу uma coisa

ali no r@LoadHouse(var) ao invйs de 'i' nгo seria 'var' ?

pawn Код:
forward r@LoadHouse(var);
public r@LoadHouse(var){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);

    cache_get_field_content(0,"owner",query,MysqlC);
    strmid(query,HouseInfo[var][hOwner],0,strlen(query),255);

    cache_get_field_content(0,"EX",query,MysqlC);
    HouseInfo[var][hEX] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[var][hEZ] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[var][hEZ] = floatstr(query);

    cache_get_field_content(0,"Interior",query,MysqlC);
    HouseInfo[var][hInt] = strval(query);

    cache_get_field_content(0,"Mundo",query,MysqlC);
    HouseInfo[var][hMundo] = strval(query);

    cache_get_field_content(0,"Venda",query,MysqlC);
    HouseInfo[var][hVenda] = strval(query);

    cache_get_field_content(0,"Preco",query,MysqlC);
    HouseInfo[var][hPreco] = strval(query);

    CreateExit(var,HouseInfo[var][hInt]);
    return 1;
}
Reply
#9

Quote:
Originally Posted by Pedro_Miranda
Посмотреть сообщение
Sу uma coisa

ali no r@LoadHouse(var) ao invйs de 'i' nгo seria 'var' ?

pawn Код:
forward r@LoadHouse(var);
public r@LoadHouse(var){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);

    cache_get_field_content(0,"owner",query,MysqlC);
    strmid(query,HouseInfo[var][hOwner],0,strlen(query),255);

    cache_get_field_content(0,"EX",query,MysqlC);
    HouseInfo[var][hEX] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[var][hEZ] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[var][hEZ] = floatstr(query);

    cache_get_field_content(0,"Interior",query,MysqlC);
    HouseInfo[var][hInt] = strval(query);

    cache_get_field_content(0,"Mundo",query,MysqlC);
    HouseInfo[var][hMundo] = strval(query);

    cache_get_field_content(0,"Venda",query,MysqlC);
    HouseInfo[var][hVenda] = strval(query);

    cache_get_field_content(0,"Preco",query,MysqlC);
    HouseInfo[var][hPreco] = strval(query);

    CreateExit(var,HouseInfo[var][hInt]);
    return 1;
}
Como assim? e.e vocк me confundiu agora, vocк estб dizendo porque eu estou a usar var em vez de i? o var й a variavel da public mesmo, ao transferir o i para essa public ela vai se transformar em var e.e esses codes todos estгo no meu gm que eu estou a desenvolver, ai tem coisas que sгo minhas e nгo mostrei para todos kkk'


Quote:
Originally Posted by BreakDriFT
Посмотреть сообщение
Vai ajudar muita gente.
Espero que sim (:
Reply
#10

Quote:
Originally Posted by BlueX
Посмотреть сообщение
Como assim? e.e vocк me confundiu agora, vocк estб dizendo porque eu estou a usar var em vez de i? o var й a variavel da public mesmo, ao transferir o i para essa public ela vai se transformar em var e.e esses codes todos estгo no meu gm que eu estou a desenvolver, ai tem coisas que sгo minhas e nгo mostrei para todos kkk'




Espero que sim (:
Nгo quis dizer isto.

pawn Код:
#include <a_samp>

forward oi(var);

stock daroi(id) {
    return oi(id);
}

public oi(var) {
    return SendClientMessage(id,-1,"oi");
}
Код:
C:\Users\Pedro Miranda.Pedro-PC\Desktop\Script\filterscripts\teste2.pwn(11) : error 017: undefined symbol "id"
Pawn compiler 3.2.3664	 	 	Copyright © 1997-2006, ITB CompuPhase


1 Error.
Foi mais o menos o que vocк fez ali, veja sua public:

pawn Код:
forward r@LoadHouse(var);
public r@LoadHouse(var){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);

    cache_get_field_content(0,"owner",query,MysqlC);
    strmid(query,HouseInfo[i][hOwner],0,strlen(query),255);

    cache_get_field_content(0,"EX",query,MysqlC);
    HouseInfo[i][hEX] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[i][hEZ] = floatstr(query);

    cache_get_field_content(0,"EZ",query,MysqlC);
    HouseInfo[i][hEZ] = floatstr(query);

    cache_get_field_content(0,"Interior",query,MysqlC);
    HouseInfo[i][hInt] = strval(query);

    cache_get_field_content(0,"Mundo",query,MysqlC);
    HouseInfo[i][hMundo] = strval(query);

    cache_get_field_content(0,"Venda",query,MysqlC);
    HouseInfo[i][hVenda] = strval(query);

    cache_get_field_content(0,"Preco",query,MysqlC);
    HouseInfo[i][hPreco] = strval(query);
   
    CreateExit(i,HouseInfo[i][hInt]);
    return 1;
}
Aquilo acarretarб em ' undefined symbol "i" ' posto que a variбvel da public й 'var', pelo menos foi o que ocorreu aqui em meu teste
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)