PDA

Просмотр полной версии : [Вопрос] Система домов.Покупка



azlagor
29.08.2017, 22:32
Здравствуйте.У меня не работает система домов.При покупке любого дома с любым ID,игрок покупает дом с идом 0.В базу записываются данные в 0 ид дома.И в базе игрока записывает ид дома 0.

Вот покупка дома



if(clickedid == housetd[4])
{
for(new h = 0; h < sizeof(House);h++)
{
switch(House[h][hplayer])
{
case 0:
{
if(player[playerid][phouse] != 9999) return SendClientMessage(playerid,red,!"У вас уже есть дом");
if(player[playerid][pmoney] < House[h][hmoney]) return SendClientMessage(playerid,grey,!"У вас недостаточно денег,чтобы купить этот дом");
strmid(House[h][hname],GN(playerid),0,strlen(GN(playerid)),MAX_PLAYER_NAME);
House[h][hplayer] = 1;
House[h][hopen] = 1;
player[playerid][pmoney] -= House[h][hmoney];
player[playerid][phouse] = h;
saveaccounts(playerid);
SaveHouse(h);
BuyHouse(h);
SetPlayerInterior(playerid,House[h][hint]);
SetPlayerVirtualWorld(playerid,h);
SetPlayerPos(playerid,House[h][hx2],House[h][hy2],House[h][hz2]);
SendClientMessage(playerid,yell,!"Вы купили дом!Введите /hmenu.");
for(new i; i != 6; i++)TextDrawHideForPlayer(playerid,housetd[i]);
CancelSelectTextDraw(playerid);
return 1;
}
case 1:
{
if(House[h][hopen] == 0 || player[playerid][phouse] == h)
{
SetPlayerVirtualWorld(playerid,h);
SetPlayerInterior(playerid,House[h][hint]);
SetPlayerPos(playerid,House[h][hx2],House[h][hy2],House[h][hz2]);
for(new i; i != 6; i++)TextDrawHideForPlayer(playerid,housetd[i]);
CancelSelectTextDraw(playerid);
return 1;
}
else SendClientMessage(playerid,red,!"Дом закрыт");
return 1;
}
}
}
}

Так же при перезаходе на сервер,игрок спавнится в ид 0 доме и при выходе из дома появляется у выхода 0 ида дома

wAx
30.08.2017, 12:21
а где собственно проверка на позицию дома возле которого игрок находится? В коде я увидел только цикл по всему массиву домов

for(new h = 0; h < sizeof(House);h++)
и тут понятно, что если нет никаких условий, то коду подойдет первый попавшийся дом и он произведет действия с ним.

Решение проблемы будет в одной проверке (по позиции, по динамическим зонам - это как душе угодно)
В тело цикла:

if(!IsPlayerInRangeOfPoint(playerid, 5.0, house_pos_x, house_pos_y, house_pos_z)) continue;

Но как по мне, самым удобным способом, будет присвоение значения PVar'у игрока при его взаимодействии с пикапом/меткой дома. То есть - подобрал игрок пикап дома записываем номер ячейки массива в котором хранится пикап в PVar игроку. А далее все от тебя зависит, хочешь - очищай PVar как только игрок например нажмет куда-нибудь и тебе уже не нужен будет этот пикап.

azlagor
30.08.2017, 12:48
Спасибо,теперь всё работает отлично!Закрывайте