[Tutorial] Criando casas para vender.
#1

Introduзao

->Este tutorial vocк precisa saber o basico do ZCMD se eu fizesse isso com apenas strcmp em OnPlayerCommandText as pessoas teriam problemas.
->Tambem й utilizado a include streamer(Basta procurar essa include no forum).

Comeзando

Em primeiro lugar temos que colocar a include samp,include streamer a ZCMD e criar nossas variaveis.
Devemos ter uma variбvel para armazenar o banco de dados, o resultado do banco de dados ea string de formato para a nossa consulta. DB tag estб conectado ao banco de dados ea variбvel DBResult estб ligado ao resultado da consulta.

Код:
#include <a_samp>
#include <zcmd>
#include <streamer>

new DB:database, DBResult:queryresult, fquery[300];
Abaixo estгo algumas define que estamos usando para que possamos editб-los facilmente qualquer hora que queremos. Temos a definir MAX_HOUSES que й usado para criar a variбvel houseinformation. Й bom estar esperto da quantidade de casas que vocк usa, porque o MAX_HOUSES quanto menor, menor й a variбvel eo tamanho do AMX. MAX_HOUSES_PER_PLAYER й usado posteriormente em nosso script para definir o numero de casas que um jogador pode ter.

Код:
#define MAX_HOUSES 300 //MAX_HOUSES estб 300 .
#define MAX_HOUSES_PER_PLAYER 2 //MAX_HOUSES_PER_PLAYER estб 2 
#define databasename "housedb.db" //O DatabaseName й atualmente housedb.db
Precisamos criar agora nossas enum e as informaзoes das variaveis..

Код:
 enum hinfo
{
    owner[24],          // Armazena o nome do proprietario da casa
    Hname[100],        //Armazena o nome da casa.
    costprice,                 //Armazena o preзo de custo da casa
    Float:EnterPos[3],      // vai armazenar a posiзгo do checkpoint da casa 
    Float:TelePos[3],         // Ela sу й a posiзгo que sгo enviados para se entrar na casa
    sellprice,                     //Permite-nos vender a casa pelo preзo que foi escolhido
    interiors,               //Permite definir o interior do jogador
    Text3D:textid,          //Sao as informaзoes em 3D textlabel que fica fora da nossa casa mudei para  gametext to 3D text porque й a maneira mais facil.
    checkpointidx[2]
};

new HouseInformation[MAX_HOUSES][hinfo], houseid;
new InHouse[MAX_PLAYERS], InHouseCP[MAX_PLAYERS];
A primeira coisa й em primeiro lugar, precisamos ter as duas linhas seguintes sob OnGameModeInit ou sob OnFilterScriptInit. Precisamos em primeiro lugar utilizar a funзгo db_open para conectar nosso servidor samp com o banco de dados SQLite. Nуs usamos a variбvel do banco de dados acima para salvar o nosso nъmero de banco de dados nele. Em segundo lugar, precisamos fazer a nossa tabela se ela nгo existe. Vocк nгo precisa manter essa linha no sistema porque ele sу precisa ser chamado uma vez. A funзгo db_query nos permite GET / STORE / SET informaзхes no nosso banco de dados. Neste caso, estamos criando nossa mesa. A tabela nos permite armazenar informaзхes e pode ser usado para adicionar mais funзхes, como vamos dizer que um carro da casa. Para este tutorial, estamos apenas usando-a para armazenar o nome de proprietбrios.

Код:
public OnFilterScriptInit()
{
    database = db_open(databasename);
    db_query(database, "CREATE TABLE IF NOT EXISTS `HOUSEINFO` (housename varchar(51), houseowner varchar(25))");
    return 1;
}
Agora vamos fazer o trabalho bбsico de redefinir as variбveis ​​para -1 (Nenhum ID de casa estб sob esta variбvel).

Код:
public OnPlayerConnect(playerid)
{
    InHouse[playerid] = -1;
    InHouseCP[playerid] = -1;
    return 1;
}
Agora vamos comeзar a parte mais dificil! Nуs vamos fazer a nossa funзгo que cria as nossas casas. Ele tambйm irб consultar nosso banco de dados para ver se hб alguйm que й dono da casa. Nуs estaremos usando uma funзгo de aзхes que cria uma ъnica linha que podemos usar para armazenar todas as informaзхes de uma vez. O formato de nossas aзхes й

Код:
CreateHouse(HouseName[], CostP, Float:EnterX, Float:EnterY, Float:EnterZ, Float:TeleX, Float:TeleY, Float:TeleZ, SellP, Interiorx)
Код:
HouseName[] - O nome que voce quer dar para a casa (EX:Mansao1)
CostP - O preзo que vocк quer dar para a casa (Ex: 500000)
Float:EnterX -  O ponto de entrada da casa X (Ex: 1264.53433)
Float:EnterY - O ponto de entrada da casa Y (Ex: 2625.6436)
Float:EnterZ - O ponto de entrada da casa Z(Ex: 200.532)
Float:TeleX - O teleporte X,tele para o interior (Ex: 432.4234)
Float:TeleY - O teleporte Y,tele para o interior(Ex: 4216.4152)
Float:TeleZ - O teleporte Z,tele para o interior(Ex: 10.53672)
SellP - O preзo de quando o dono vender a casa (Ex: 200000)
Interiorx - O id do interior que vamos se teleportar
Quando ele consulta o banco de dados na parte inferior, o que estamos fazendo й encontrar se a casa tem um proprietбrio, se assim ele vai armazenar o nome de proprietбrios na variбvel houseinformation. Se nгo houver nenhum proprietбrio para a casa, a variбvel serб deixado em branco. Fazemos isso usando
a instruзгo SELECT.

Код:
SELECT [VARIABLE] FROM [TABLENAME] WHERE [ANOTHER VARIABLE] = [A VALUE]
VARIABLE = Dono da casa
TABLENAME = HOUSEINFO
ANOTHER VARIABLE = housename
A VALUE = our house name.
Em seguida, usamos db_num_rows para verificar se houve alguma linha com o nosso nome da casa que temos buscado. Se nгo houver nenhuma linha com o nome da casa (sem dono), entгo vamos apenas liberar o resultado com db_free_result. Se hб uma linha, vamos buscar esse valor usando db_get_field_assoc. Para mais informaзхes sobre SQLite, visite https://sampwiki.blast.hk/wiki/SQLite

Nуs tambйm temos que adicionar o nosso entrar e sair checkpoints em nosso script usando CreateDynamicCP. Ele cria os postos de controle e armazena o IDS em checkpointid [0] para o CP entrar e checkpointid [1] para a CP saнda. Tambйm vamos fazer a nossa variбvel texto com informaзхes 3D CreateDynamic3DTextLabel e armazenб-lo no textid variбvel.


Код:
stock CreateHouse(HouseName[], CostP, Float:EnterX, Float:EnterY, Float:EnterZ, Float:TeleX, Float:TeleY, Float:TeleZ, Interiorx, SellP)
{
    format(HouseInformation[houseid][Hname], 100, "%s", HouseName);
    HouseInformation[houseid][costprice] = CostP;
    HouseInformation[houseid][EnterPos][0] = EnterX;
    HouseInformation[houseid][EnterPos][1] = EnterY;
    HouseInformation[houseid][EnterPos][2] = EnterZ;
    HouseInformation[houseid][TelePos][0] = TeleX;
    HouseInformation[houseid][TelePos][1] = TeleY;
    HouseInformation[houseid][TelePos][2] = TeleZ;
    HouseInformation[houseid][sellprice] = SellP;
    HouseInformation[houseid][interiors] = Interiorx;
    format(fquery, sizeof(fquery), "SELECT donodacasa informaзoes nome dacasa = '%s'", HouseName);
    queryresult = db_query(database, fquery); 
    if(db_num_rows(queryresult) != 0) db_get_field_assoc(queryresult, "dono da casa", HouseInformation[houseid][owner], 24); 
    HouseInformation[houseid][checkpointidx][0] = CreateDynamicCP(EnterX, EnterY, EnterZ, 1.0);
    //CreateDynamicCP(Float:x, Float:y, Float:z, Float:size);
    HouseInformation[houseid][checkpointidx][1] = CreateDynamicCP(TeleX, TeleY, TeleZ, 1.0, 15500000+houseid, Interiorx);
    //CreateDynamicCP(Float:x, Float:y, Float:z, Float:size, worldid, interiorid);
    if(!HouseInformation[houseid][owner][0]) format(fquery, sizeof(fquery), "House Name: %s \n House Price:$%d \n Sell Price: $%d", HouseName, CostP, SellP);
    else if(HouseInformation[houseid][owner][0] != 0) format(fquery, sizeof(fquery), "House Name: %s \n Owner: %s", HouseName, HouseInformation[houseid][owner]);
    HouseInformation[houseid][textid] = CreateDynamic3DTextLabel(fquery, 0xFFFFFF, EnterX, EnterY, EnterZ + 0.5, 50.0);
    //CreateDynamic3DTextLabel(const text[], color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 100.0);
    houseid ++; 
    return 1;
}
Agora vamos fazer o nosso pequenas funзхes que serгo utilizados mais tarde. Eles sгo para definir e excluir o proprietбrio de uma certa casa. Estamos usando duas consultas SQL bбsico. Uma inserзгo ser

Код:
INSERT INTO [TABLENAME] ([FIELD1], [FIELD2]) VALUES ([VALUE1], [VALUE2])
TABLENAME - HOUSEINFO
FIELD1 - housename
FIELD2 - houseowner
VALUE1 - Our housename value
VALUE2 - Our houseowner value
E o outro sendo APAGAR

Код:
DELETE FROM [TABLENAME] WHERE [FIELD] = [VALUE]
TABLENAME - HOUSEINFO
FIELD - housename
VALUE - the housename
------------------------------**-------------------------------------------------

Код:
stock SetOwner(HouseName[], ownername[], houseids)
{
    format(fquery, sizeof(fquery), "INSERT INTO `HOUSEINFO` (`housename`, `houseowner`)  VALUES('%s', '%s')", HouseName, ownername);
    db_query(database, fquery); //SQLITE 
    format(HouseInformation[houseids][owner], 24, "%s", ownername);
    format(fquery, sizeof(fquery), "House Name: %s \n Owner: %s", HouseName, HouseInformation[houseids][owner]);
    UpdateDynamic3DTextLabelText(HouseInformation[houseids][textid], 0xFFFFFF, fquery); //Text label.
    return 1;
}

stock DeleteOwner(HouseName[], houseids)
{
    format(HouseInformation[houseids][owner], 24, "%s", "\0");
    format(fquery, sizeof(fquery), "DELETE FROM `HOUSEINFO` WHERE `housename` = '%s'", HouseName);
    db_query(database, fquery); //SQLITE.
    format(fquery, sizeof(fquery), "House Name: %s \n House Price:$%d \n Sell Price: $%d", HouseName, HouseInformation[houseids][costprice], HouseInformation[houseids][sellprice]);
    UpdateDynamic3DTextLabelText(HouseInformation[houseids][textid], 0xFFFFFF, fquery); //Text Label.
    return 1;
}
Antes de fazermos os comandos /comprar e /vender vamos usar o callback OnPlayerEnterDynamicCheckpoint para definir a posiзгo dos jogadores dentro ou fora da casa. Fazemos um loop chamando cada variбvel checkpoint ъnico em nossas casas atual para ver se o ponto de verificaзгo й um dos checkpoints nossa casa.


Nуs, em primeiro lugar verificamos se o jogador й o proprietбrio para que ele possa imediatamente entrar na casa.
Se assim for, vamos teleportar ele para dentro da casa.

Em seguida ele verifica se o jogar й o proprietario se nao for envia uma mensagem para o mesmo.

Por fim, usamos o OnPlayerExitDynamicCP callback para sair do ponto de verificaзгo

Код:
public OnPlayerEnterDynamicCP(playerid, checkpointid)
{
    for(new x; x<houseid; x++) //Loops through all current house ids.
    {
        if(HouseInformation[x][checkpointidx][0] == checkpointid) //If the entry checkpoint is entry checkpoint.
        {
            if(InHouse[playerid] != -1) 
            {
                InHouse[playerid] = -1; 
                return 1;
            }
            InHouseCP[playerid] = x;
            new Pname[24]; 
            GetPlayerName(playerid, Pname, 24); 
            if(HouseInformation[x][owner][0] != 0 && !strcmp(Pname, HouseInformation[x][owner][0]))
            {
                SetPlayerPos(playerid, HouseInformation[x][TelePos][0], HouseInformation[x][TelePos][1], HouseInformation[x][TelePos][2]); 
                SetPlayerInterior(playerid, HouseInformation[x][interiors]); 
                SetPlayerVirtualWorld(playerid, 15500000 + x); 
            }
            if(!HouseInformation[x][owner][0]) SendClientMessage(playerid, -1, "Esta casa esta б venda use /comprar para adiquiri-lб");
            return 1;
        }
        if(HouseInformation[x][checkpointidx][1] == checkpointid) 
        {
            if(InHouse[playerid] == -1)
            {
                InHouse[playerid] = x;
                return 1;
            }
            SetPlayerPos(playerid, HouseInformation[x][EnterPos][0], HouseInformation[x][EnterPos][1], HouseInformation[x][EnterPos][2]);
            SetPlayerInterior(playerid, 0); 
            SetPlayerVirtualWorld(playerid, 0); 
            return 1;
        }
    }
    return 1;
}

public OnPlayerLeaveDynamicCP(playerid, checkpointid)
{
    if(InHouseCP[playerid] != - 1) InHouseCP[playerid] = -1; /
    return 1;
Reply
#2

[*pawn] [*/pawn] Seria BOM. PS: sem o *.
Reply
#3

Mals jonathan sou novo no forum..
Reply
#4

Muito bom,
atй aque enfim alguйm com competкncia para fazer algum sistema em MySQL.
Parabйns!
Reply
#5

SQLite? Nem curto.
Reply
#6

Muito Bom
Reply
#7

Tutorial bem explicado, parabйns, mais acho que existem vбrios Filter pelo fуrum que seria muito mais ъtil!
10/10
Reply
#8

Vlw gente *-*

Pfv da reputation ae,eu agradeзo.
Reply
#9

Muito Bom Thanks
Reply
#10

eu nao acho bom , usar um tutorial de alguem e simplismente disfarзar e fingir que й seu , que coisa feia voce apenas traduziu

http://forum.sa-mp.com/showthread.ph...t=create+house
Reply
#11

Quote:
Originally Posted by Joey_R
View Post
eu nao acho bom , usar um tutorial de alguem e simplismente disfarзar e fingir que й seu , que coisa feia voce apenas traduziu

http://forum.sa-mp.com/showthread.ph...t=create+house
joey eu ia falar isso agora
pois respondi uma pergunta dele que, quem sabe criar um sistema de casas nгo perguntaria
Reply
#12

este tutorial esta mais pra cod mais ta bom pros novatos
Reply
#13

Ainda nem traduziu direito '---
Coloque os creditos do [HiC]TheKiller.
Reply
#14

Velho, aprende a dar os crйditos aos verdadeiros criadores. Traduziu bem, mas faltou os crйditos. Nгo adianta vocк pegar um cуdigo de uma бrea de outra lнngua,traduzir e falar que й seu. Se nгo fosse isso te dava +rep...
Reply
#15

Olhem a data da postagem deixa o tуpico continuar morto parem de invoca-lo
Reply
#16

Malz Recussitar o tуpico mais , deu um Warning
pawn Code:
C:\Users\Administrador\Downloads\Samp\gamemodes\BWR.pwn(170) : warning 225: unreachable code
Pawn compiler 3.2.3664          Copyright (c) 1997-2006, ITB CompuPhase


1 Warning.
Oque estб na Linha 168 a 170:
pawn Code:
{
    InHouse[playerid] = -1;
    InHouseCP[playerid] = -1;
    return 1;
    }
    TextDrawShowForPlayer(playerid, TextDrawBarraStatus);
    return 1;
}
Reply
#17

kk cara revivei topico de 2011 kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
pior que eu
Reply
#18

Quote:
Originally Posted by WKhalifa
View Post
Malz Recussitar o tуpico mais , deu um Warning
pawn Code:
C:\Users\Administrador\Downloads\Samp\gamemodes\BWR.pwn(170) : warning 225: unreachable code
Pawn compiler 3.2.3664          Copyright (c) 1997-2006, ITB CompuPhase


1 Warning.
Oque estб na Linha 168 a 170:
pawn Code:
{
    InHouse[playerid] = -1;
    InHouseCP[playerid] = -1;
    return 1;
    }
    TextDrawShowForPlayer(playerid, TextDrawBarraStatus);
    return 1;
}
pawn Code:
{
    InHouse[playerid] = -1;
    InHouseCP[playerid] = -1;
    TextDrawShowForPlayer(playerid, TextDrawBarraStatus);
    return 1;
}
Reply
#19

mysql aff
Reply
#20

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)