PDA

Просмотр полной версии : [Вопрос] Не покупается последний созданный дом



Vasya_Pupkin
05.04.2018, 19:08
Всем привет.
Столкнулся с такой проблемой нельзя купить дом который был созданный последний.
На пример: создаю 1,2,3 дома то 3 дом купить нельзя а иконки все есть но не вылазит диалог который должен появляться(OnPlayerEnterDynamicArea(playerid, areaid))
В public OnPlayerEnterDynamicArea(playerid, areaid)

for(new h = 1; h < TotalHouse; h++)
{
if(areaid != gHouses[h][hArea]) continue;

new subsidia = floatround(gHouses[h][hValue] * 0.005);
if(gHouses[h][houseImprove][3]) subsidia = subsidia / 2;
new raion[30];
GetPlayer2DZone(playerid,raion,30);

if(strcmp(gHouses[h][houseOwner], "The State"))
{
if ( gHouses[h][hFamily] && pInfo[playerid][pFamily] != gHouses[h][hFamily])
{
format(stringer, 250, "{f0f0f0}Внимание!\nЭтот дом принадлежит семье ' %s '.\n\nУ вас есть возможность вступить в эту семью, для этого нужно ввести секретный код в поле ниже.\nЕсли не желаете просто нажмите 'Отмена'", _family[gHouses[h][hFamily]-1][family_create_name]);
ShowPlayerDialog(playerid,DIALOG_ENTER_FAMILY_HOUSE,DIALOG_STYLE_INPUT,"{F0F0F0}Информация",stringer,"Ввод","Отмена");
}
else
{
new status_online[32] = "{AA3333}Оффлайн", id;
sscanf(gHouses[h][houseOwner], "u", id);
if(id != INVALID_PLAYER_ID) status_online = "{33AA33}Онлайн";
ShowPlayerDialog(playerid,DIALOG_HOUSE_INFO,DIALOG_STYLE_MSGBOX,"Дом занят",stringer,"Войти","Отмена");
}
}
else
{
stringer[0] = EOS;
format(stringer, 1024, "{f0f0f0}Номер дома: %d (%d)\nЦена: %d$\nКласс: %s\nКвартплата: %d$ за 1 день\nРайон: %s\n\nНа следующем шаге вы сможете купить этот дом или посмотреть его интерьер",gHouses[h][hID],h,gHouses[h][hValue],gHousesClassName[gHouses[h][hKlass]-1],subsidia,raion);
ShowPlayerDialog(playerid,DIALOG_HOUSE_INFO_2,DIALOG_STYLE_MSGBOX,"Дом продается",stringer,"Далее","Отмена");
}

SetPVarInt(playerid,"HOUSE_ID", h ) ;

break;
}

Команда для создания дома:

CMD:addhouse(playerid,params[])
{
new house_class, house_price;
new Float:X,
Float:Y,
Float:Z,
Float:Az;

if(TotalHouse>=MAX_HOUSES) return SendClientMessage(playerid,COLOR_GREY,"Ëèìèò äîìîâ èñ÷åðïàí");
if(sscanf(params, "ii", house_class,house_price))
{
SendClientMessage(playerid, COLOR_GREY, "/addhouse [íîìåð êëàññà] [öåíà ïðîäàæè]");
SendClientMessage(playerid, COLOR_GREY, "Êëàññû: [1 - Ýêîíîì-êëàññ] [2 - Êîìôîðò-êëàññ] [3 - Ïðåìèóì-êëàññ] [4 - Ýëèòíûé-êëàññ]");
return 1;
}
if(house_class > 4 || house_class < 1)
{
SendClientMessage(playerid, COLOR_GREY, "ID èíòåðüåðà îò 1 äî 4");
return 1;
}
SetPVarInt(playerid, "aretick", GetTickCount());
TotalHouse ++;
//
GetPlayerPos(playerid,X,Y,Z);
GetPlayerFacingAngle(playerid,Az);
gHouses[TotalHouse][houseX]=X;
gHouses[TotalHouse][houseY]=Y;
gHouses[TotalHouse][houseZ]=Z;
gHouses[TotalHouse][houseA]=Az;
gHouses[TotalHouse][hKlass]=house_class;
gHouses[TotalHouse][hValue]=house_price;
gHouses[TotalHouse][hLock]=0;
gHouses[TotalHouse][hDays]=1;
strmid(gHouses[TotalHouse][houseOwner],"The State",0,strlen("The State"),28);
format(stringer, 144, "Âû óñïåøíî ñîçäàëè äîì íîìåð {e7e7e7}%d {ffffff}Ñòîèìîñòü ïîêóïêè: {e7e7e7}%d",TotalHouse,gHouses[TotalHouse][hValue]);
SendClientMessage(playerid,-1,stringer);
//
mysql_query_string[0] = EOS;
format(mysql_query_string,1000,"INSERT INTO `housetest`\
(`hEntrx`, `hEntry`, `hEntrz`,`houseA`, `hOwner`, `hDiscript`, `hPrice`, `hLock`, `hCarx`, `hCary`, `hCarz`, `hCara`, `hDays`) VALUES \
('%.2f','%.2f','%.2f','%.2f','The State','%d','%d','0','%.2f','%.2f','%.2f','%.2f','1')",
gHouses[TotalHouse][houseX],gHouses[TotalHouse][houseY],gHouses[TotalHouse][houseZ],gHouses[TotalHouse][houseA],gHouses[TotalHouse][hKlass],gHouses[TotalHouse][hValue],
gHouses[TotalHouse][houseParkX],gHouses[TotalHouse][houseParkY],gHouses[TotalHouse][houseParkZ],gHouses[TotalHouse][houseParkR]);
mysql_pquery(mysql_connect_ID,mysql_query_string,"AddHouseEpt","d", TotalHouse);
//
gHouses[TotalHouse][hPickup] = CreateDynamicPickup(1273, 23, gHouses[TotalHouse][houseX], gHouses[TotalHouse][houseY], gHouses[TotalHouse][houseZ]);
gHouses[TotalHouse][hMIcon] = CreateDynamicMapIcon(gHouses[TotalHouse][houseX], gHouses[TotalHouse][houseY], gHouses[TotalHouse][houseZ], 31, CWHITE);
gHouses[TotalHouse][hArea] = CreateDynamicSphere(gHouses[TotalHouse][houseX], gHouses[TotalHouse][houseY], gHouses[TotalHouse][houseZ], 1.3, 0, 0, -1);
return 1;
}

forward AddHouseEpt(id_house);
public AddHouseEpt(id_house)
{
gHouses[id_house][hID] = cache_insert_id();
return 1;
}


А так же как лучше
Так
for(new h = 1; h < TotalHouse; h++)
или так
for(new h = 1; h < sizeof(TotalHouse); h++)
или разницы не какой?

DeimoS
06.04.2018, 10:57
Касаемо вопроса о создании дома. Ну так при создании ты сначала прибавляешь значение к переменной TotalHouse, а потом уже это значение используешь в качестве индекса массива. В цикле же ты делаешь условие, которое не включает самое большое значение переменной TotalHouse в выборку, от чего и происходит такая проблема. Выходом будет смена условия на такой вид:

for(new h = 1; h <= TotalHouse; h++)
Хотя лучше всего отказаться от пресловутой переменной TotalHouse и создать итератор для домов, который будет содержать в себе ID созданных домов. Тогда для поиска свободного ID достаточно использовать "Iter_Free", которая вернёт "-1" в случае, если свободных ячеек не будет. И "общение" с домами уже будет более надёжным (сейчас твой код создания домов будет ловить выход за пределы массива, когда ты создашь максимальное количество домов, так как условие

if(TotalHouse>=MAX_HOUSES)
стоит до того, как ты прибавляешь значение TotalHouse


Касаемо второго вопроса. Правильнее, как я уже выше сказал, будет использовать итератор, но если отвечать на конкретно твой вопрос, то вот это условие:

for(new h = 1; h < sizeof(TotalHouse); h++)
в корне неверно и даже не скомпилируется, так как TotalHouse - не массив. Ты, видимо, хотел сделать такое условие

for(new h = 1; h < sizeof(gHouses); h++)