PDA

View Full Version : Buy House Command -_-


nezo2001
17/06/2015, 11:05 AM
When the command run it changed all the data in the database not only the data of the certain house which the player should buy
CMD:buyhouse(playerid, params[])
{
for(new a; a != HouseLoad; ++a)
{
if(IsPlayerInRangeOfPoint(playerid, 3.0, HouseInfo[a][EntranceX], HouseInfo[a][EntranceY], HouseInfo[a][EntranceZ]))
{
if(HouseInfo[a][HousePrice] > GetPlayerMoney(playerid)) return SendClientMessage(playerid, COLOR_RED, "You don't have enough money!");
new draw[200];
format(draw,sizeof(draw),"ID: %i\nPrice %i\nOwned: Yes\nOwner: %s",PlayerName(playerid));
new query[200];
format(query, sizeof(query), "UPDATE houses SET owner='%s', owned='true', text='%s' WHERE id='%i'", PlayerName(playerid), draw, HouseInfo[a][HouseID]);
mysql_query(1, query);
Update3DTextLabelText(HouseLabel, COLOR_GREEN, HouseInfo[a][HouseText]);
GivePlayerMoney(playerid, -HouseInfo[a][HousePrice]);
PlayerInfo[playerid][pHouseID] = HouseInfo[a][HouseID];
SendClientMessage(playerid, COLOR_GREEN, "You've bought this house successfully!");
}
else
{
SendClientMessage(playerid, COLOR_RED, "You are not near any house");
}
}
return 1;
}
And it take the money from the player and also send a message that he isn't near the house?!

Darrenr
17/06/2015, 11:18 AM
--removed--

Darrenr
17/06/2015, 11:22 AM
You need to "break;" the loop also.

At the end of the if statement, add a "break;" to tell the code to stop looping through the code (as you have now bought a house)

http://wiki.sa-mp.com/wiki/Control_Structures#break

nezo2001
17/06/2015, 11:26 AM
So what is the condition to break it

Darrenr
17/06/2015, 11:31 AM
So what is the condition to break it

Read the wiki page that i posted above.

The idea of BREAK is to terminate the for loop which you are running to find what the id is of the house the player is standing at. Once the house is found in the loop, you can terminate the loop. The code would look like this below:

CMD:buyhouse(playerid, params[])
{
for(new a; a != HouseLoad; ++a)
{
if(IsPlayerInRangeOfPoint(playerid, 3.0, HouseInfo[a][EntranceX], HouseInfo[a][EntranceY], HouseInfo[a][EntranceZ]))
{
if(HouseInfo[a][HousePrice] > GetPlayerMoney(playerid)) return SendClientMessage(playerid, COLOR_RED, "You don't have enough money!");
new draw[200];
format(draw,sizeof(draw),"ID: %i\nPrice %i\nOwned: Yes\nOwner: %s",PlayerName(playerid));
new query[200];
format(query, sizeof(query), "UPDATE houses SET owner='%s', owned='true', text='%s' WHERE id='%i'", PlayerName(playerid), draw, HouseInfo[a][HouseID]);
mysql_query(1, query);
Update3DTextLabelText(HouseLabel, COLOR_GREEN, HouseInfo[a][HouseText]);
GivePlayerMoney(playerid, -HouseInfo[a][HousePrice]);
PlayerInfo[playerid][pHouseID] = HouseInfo[a][HouseID];
SendClientMessage(playerid, COLOR_GREEN, "You've bought this house successfully!");
break; // terminates the loop as we are finished searching for a house to buy
}
else
{
SendClientMessage(playerid, COLOR_RED, "You are not near any house");
}
}
return 1;
}

nezo2001
17/06/2015, 11:46 AM
Ok I did it but it send me that I bought this house and I'm not near any house at the same time

Konstantinos
17/06/2015, 11:49 AM
Don't send the message about not in range in the loop then!


CMD:buyhouse(playerid, params[])
{
new bool: in_range;
for(new a; a != HouseLoad; ++a)
{
if(IsPlayerInRangeOfPoint(playerid, 3.0, HouseInfo[a][EntranceX], HouseInfo[a][EntranceY], HouseInfo[a][EntranceZ]))
{
if(HouseInfo[a][HousePrice] > GetPlayerMoney(playerid)) return SendClientMessage(playerid, COLOR_RED, "You don't have enough money!");
new draw[200];
format(draw,sizeof(draw),"ID: %i\nPrice %i\nOwned: Yes\nOwner: %s",PlayerName(playerid));
new query[200];
format(query, sizeof(query), "UPDATE houses SET owner='%s', owned='true', text='%s' WHERE id='%i'", PlayerName(playerid), draw, HouseInfo[a][HouseID]);
mysql_query(1, query);
Update3DTextLabelText(HouseLabel, COLOR_GREEN, HouseInfo[a][HouseText]);
GivePlayerMoney(playerid, -HouseInfo[a][HousePrice]);
PlayerInfo[playerid][pHouseID] = HouseInfo[a][HouseID];
SendClientMessage(playerid, COLOR_GREEN, "You've bought this house successfully!");
in_range = true;
break;
}
}
if (!in_range) SendClientMessage(playerid, COLOR_RED, "You are not near any house");
return 1;
}


By the way, I don't know about the update thing you mentioned but the query seems correct and there is a WHERE clause. Print the query and execute it through phpMyAdmin, does it update only for that specific house?

Darrenr
17/06/2015, 11:50 AM
--remove--

nezo2001
17/06/2015, 11:55 AM
Don't send the message about not in range in the loop then!


CMD:buyhouse(playerid, params[])
{
new bool: in_range;
for(new a; a != HouseLoad; ++a)
{
if(IsPlayerInRangeOfPoint(playerid, 3.0, HouseInfo[a][EntranceX], HouseInfo[a][EntranceY], HouseInfo[a][EntranceZ]))
{
if(HouseInfo[a][HousePrice] > GetPlayerMoney(playerid)) return SendClientMessage(playerid, COLOR_RED, "You don't have enough money!");
new draw[200];
format(draw,sizeof(draw),"ID: %i\nPrice %i\nOwned: Yes\nOwner: %s",PlayerName(playerid));
new query[200];
format(query, sizeof(query), "UPDATE houses SET owner='%s', owned='true', text='%s' WHERE id='%i'", PlayerName(playerid), draw, HouseInfo[a][HouseID]);
mysql_query(1, query);
Update3DTextLabelText(HouseLabel, COLOR_GREEN, HouseInfo[a][HouseText]);
GivePlayerMoney(playerid, -HouseInfo[a][HousePrice]);
PlayerInfo[playerid][pHouseID] = HouseInfo[a][HouseID];
SendClientMessage(playerid, COLOR_GREEN, "You've bought this house successfully!");
in_range = true;
break;
}
}
if (!in_range) SendClientMessage(playerid, COLOR_RED, "You are not near any house");
return 1;
}


By the way, I don't know about the update thing you mentioned but the query seems correct and there is a WHERE clause. Print the query and execute it through phpMyAdmin, does it update only for that specific house?

Yes it did, And I will re-load it again to update the text, right?