PDA

Просмотр полной версии : [Вопрос] Правильно ли оформлен цикл загрузки бизнесов?



Dimon_Fanat
05.06.2018, 18:23
Добрый день, скажите правильно ли делаю for?


enum bInfo
{
bID,
bName[32],
bType,
Float:bEnterX,
Float:bEnterY,
Float:bEnterZ,
Float:bExitX,
Float:bExitY,
Float:bExitZ,
bInterior,
}
new BizInfo[MAX_BUSINESS][bInfo];


for(new i = 0; i < sizeof(BizInfo); i++)
{
if(IsPlayerInRangeOfPoint(playerid,0.8,BizInfo[i][bEnterX],BizInfo[i][bEnterY],BizInfo[i][bEnterZ]))
{
SetPlayerPos(playerid,BizInfo[i][bExitX],BizInfo[i][bExitY],BizInfo[i][bExitZ]);
SetPlayerInterior(playerid,BizInfo[i][bInterior]);
SetPlayerVirtualWorld(playerid,BizInfo[i][bID]);
}
}



publics LoadBusiness()
{
new rows;
cache_get_row_count(rows);
for(new i = 0; i < rows; i++)
{
cache_get_value_name_int(i,"ID",BizInfo[i][bID]);
cache_get_value_name(i,"NameBiz",BizInfo[i][bName],32);
cache_get_value_name_int(i,"Type",BizInfo[i][bType]);
cache_get_value_name_float(i,"EnterX",BizInfo[i][bEnterX]);
cache_get_value_name_float(i,"EnterY",BizInfo[i][bEnterY]);
cache_get_value_name_float(i,"EnterZ",BizInfo[i][bEnterZ]);
cache_get_value_name_float(i,"ExitX",BizInfo[i][bExitX]);
cache_get_value_name_float(i,"ExitY",BizInfo[i][bExitY]);
cache_get_value_name_float(i,"ExitZ",BizInfo[i][bExitZ]);
cache_get_value_name_int(i,"Interior",BizInfo[i][bInterior]);

CreateDynamicMapIcon(BizInfo[i][bEnterX],BizInfo[i][bEnterY],BizInfo[i][bEnterZ],BizInfo[i][bType],0xFFFFFFAA,0,-1,-1,400.0);
CreateDynamicCP(BizInfo[i][bEnterX],BizInfo[i][bEnterY],BizInfo[i][bEnterZ],1.0,-1,-1,-1,3.0);
}
printf("Загружено [%i] бизнесов.",rows);
}

DeimoS
05.06.2018, 20:24
Да. Только нужно ещё либо в запрос добавить
"... LIMIT %d", ..., sizeof(BizInfo));
Либо в LoadBusiness
publics LoadBusiness()
{
new rows;
cache_get_row_count(rows);

if(rows == 0)
return 0;
if(rows >= sizeof(BizInfo))
rows = sizeof(BizInfo);

for(new i = 0; i < rows; i++)
дабы в случае, если в таблице окажется слишком много строк, не словить выход за пределы массива. Можно ещё добавить сообщение в консоль с предупреждением о том, что нужно увеличить BizInfo

UPD: Вот так можно сделать ещё

publics LoadBusiness()
{
new rows;
cache_get_row_count(rows);
if(!rows)
{
print("Загружено [0] бизнесов. Таблица с бизнесами пуста!");
return 0;
}
else if(rows >= sizeof(BizInfo))
{
printf("Внимание: в таблице с бизнесами слишком много строк. Увеличте массив BizInfo на %d, дабы исправить ошибку [%d|%d]", rows-sizeof(BizInfo), rows, sizeof(BizInfo));
rows = sizeof(BizInfo);
}
new Float:x,
Float:y,
Float:z;
for(new i = 0; i < rows; i++)
{
cache_get_value_name_int(i,"ID",BizInfo[i][bID]);
cache_get_value_name(i,"NameBiz",BizInfo[i][bName],32);
cache_get_value_name_int(i,"Type",BizInfo[i][bType]);
cache_get_value_name_float(i,"EnterX", x);
cache_get_value_name_float(i,"EnterY", y);
cache_get_value_name_float(i,"EnterZ", z);
cache_get_value_name_float(i,"ExitX",BizInfo[i][bExitX]);
cache_get_value_name_float(i,"ExitY",BizInfo[i][bExitY]);
cache_get_value_name_float(i,"ExitZ",BizInfo[i][bExitZ]);
cache_get_value_name_int(i,"Interior",BizInfo[i][bInterior]);

BizInfo[i][bEnterX] = x;
BizInfo[i][bEnterY] = y;
BizInfo[i][bEnterZ] = z;

CreateDynamicMapIcon(x, y, z, BizInfo[i][bType],0xFFFFFFAA,0,-1,-1,400.0);
CreateDynamicCP(x, y, z, 1.0, -1, -1, -1, 3.0);
}
printf("Загружено [%i] бизнесов.",rows);
}

Dimon_Fanat
06.06.2018, 15:31
Да. Только нужно ещё либо в запрос добавить
"... LIMIT %d", ..., sizeof(BizInfo));
Либо в LoadBusiness
publics LoadBusiness()
{
new rows;
cache_get_row_count(rows);

if(rows == 0)
return 0;
if(rows >= sizeof(BizInfo))
rows = sizeof(BizInfo);

for(new i = 0; i < rows; i++)
дабы в случае, если в таблице окажется слишком много строк, не словить выход за пределы массива. Можно ещё добавить сообщение в консоль с предупреждением о том, что нужно увеличить BizInfo

UPD: Вот так можно сделать ещё

publics LoadBusiness()
{
new rows;
cache_get_row_count(rows);
if(!rows)
{
print("Загружено [0] бизнесов. Таблица с бизнесами пуста!");
return 0;
}
else if(rows >= sizeof(BizInfo))
{
printf("Внимание: в таблице с бизнесами слишком много строк. Увеличте массив BizInfo на %d, дабы исправить ошибку [%d|%d]", rows-sizeof(BizInfo), rows, sizeof(BizInfo));
rows = sizeof(BizInfo);
}
new Float:x,
Float:y,
Float:z;
for(new i = 0; i < rows; i++)
{
cache_get_value_name_int(i,"ID",BizInfo[i][bID]);
cache_get_value_name(i,"NameBiz",BizInfo[i][bName],32);
cache_get_value_name_int(i,"Type",BizInfo[i][bType]);
cache_get_value_name_float(i,"EnterX", x);
cache_get_value_name_float(i,"EnterY", y);
cache_get_value_name_float(i,"EnterZ", z);
cache_get_value_name_float(i,"ExitX",BizInfo[i][bExitX]);
cache_get_value_name_float(i,"ExitY",BizInfo[i][bExitY]);
cache_get_value_name_float(i,"ExitZ",BizInfo[i][bExitZ]);
cache_get_value_name_int(i,"Interior",BizInfo[i][bInterior]);

BizInfo[i][bEnterX] = x;
BizInfo[i][bEnterY] = y;
BizInfo[i][bEnterZ] = z;

CreateDynamicMapIcon(x, y, z, BizInfo[i][bType],0xFFFFFFAA,0,-1,-1,400.0);
CreateDynamicCP(x, y, z, 1.0, -1, -1, -1, 3.0);
}
printf("Загружено [%i] бизнесов.",rows);
}

Понял, спасибо!
А еще такой вопрос, допустим у меня бизнес в базе данных начинается с 1, 0 бизнеса нет, но когда я ввожу команду /goto и тп к бизнесу 1, меня тп к бизнесу №2, а если введу №0 то тп к бизнесу 1.


CMD:gotobiz(playerid,params[])
{
if(sscanf(params,"d",params[0]))return SendClientMessage(playerid,0x00BFFFAA,"[КОМАНДЫ] {FFFFFF}/gotobiz [id бизнеса].");
if(params[0] < 0 || params[0] >= sizeof(BizInfo))return SendClientMessage(playerid,0x00BFFFAA, "Неправильный номер бизнеса");
SetPlayerPos(playerid,BizInfo[params[0]][bEnterX],BizInfo[params[0]][bEnterY],BizInfo[params[0]][bEnterZ]);
SetPlayerVirtualWorld(playerid,0);
SetPlayerInterior(playerid,0);
return 1;
}

Geebrox
06.06.2018, 16:47
Можно так:

publics LoadBusiness()
{
new rows;
cache_get_row_count(rows);
if(!rows)
{
print("Загружено [0] бизнесов. Таблица с бизнесами пуста!");
return 0;
}
else if(rows >= sizeof(BizInfo))
{
printf("Внимание: в таблице с бизнесами слишком много строк. Увеличте массив BizInfo на %d, дабы исправить ошибку [%d|%d]", rows-sizeof(BizInfo), rows, sizeof(BizInfo));
rows = sizeof(BizInfo);
}
new Float:x,
Float:y,
Float:z;
for(new i = 0, j = 1; i < rows; i++, j++)
{
cache_get_value_name_int(i,"ID",BizInfo[j][bID]);
cache_get_value_name(i,"NameBiz",BizInfo[j][bName],32);
cache_get_value_name_int(i,"Type",BizInfo[j][bType]);
cache_get_value_name_float(i,"EnterX", x);
cache_get_value_name_float(i,"EnterY", y);
cache_get_value_name_float(i,"EnterZ", z);
cache_get_value_name_float(i,"ExitX",BizInfo[j][bExitX]);
cache_get_value_name_float(i,"ExitY",BizInfo[j][bExitY]);
cache_get_value_name_float(i,"ExitZ",BizInfo[j][bExitZ]);
cache_get_value_name_int(i,"Interior",BizInfo[j][bInterior]);

BizInfo[j][bEnterX] = x;
BizInfo[j][bEnterY] = y;
BizInfo[j][bEnterZ] = z;

CreateDynamicMapIcon(x, y, z, BizInfo[j][bType],0xFFFFFFAA,0,-1,-1,400.0);
CreateDynamicCP(x, y, z, 1.0, -1, -1, -1, 3.0);
}
printf("Загружено [%i] бизнесов.",rows);
}

DeimoS
06.06.2018, 16:55
Понял, спасибо!
А еще такой вопрос, допустим у меня бизнес в базе данных начинается с 1, 0 бизнеса нет, но когда я ввожу команду /goto и тп к бизнесу 1, меня тп к бизнесу №2, а если введу №0 то тп к бизнесу 1.


ID в базе данных никак не связан с ID на сервере. По крайней мере не должен быть связан.
ID в базе (поле с AUTO_INCREMENT) нужен сугубо для работы с базой. Хочешь связать ID бизнеса на сервере с базой - создавай дополнительное поле и храни ID в нём, а потом, при выгрузке данных, используй этот ID в качестве индекса массива.