PDA

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



Dimon_Fanat
03.06.2019, 21:03
Добрый вечер, создал систему создания домов на сервере, но они не загружаются из базы данных. Чет не дописал где-то((
Выручайте.


new HOME;


mysql_tquery(database,"SELECT * FROM `houses`","LoadHouses","");


publics LoadHouses()
{
new rows,string[126];
cache_get_row_count(rows);
for(new i = 0; i < HOME; i++)
{
cache_get_value_name_int(i,"ID",HouseInfo[i][hID]);
cache_get_value_name_int(i,"Owner",HouseInfo[i][hOwner]);
cache_get_value_name_float(i,"Enter1",HouseInfo[i][hEnter][0]);
cache_get_value_name_float(i,"Enter2",HouseInfo[i][hEnter][1]);
cache_get_value_name_float(i,"Enter3",HouseInfo[i][hEnter][2]);
cache_get_value_name_float(i,"Exit1",HouseInfo[i][hEnter][0]);
cache_get_value_name_float(i,"Exit2",HouseInfo[i][hEnter][1]);
cache_get_value_name_float(i,"Exit3",HouseInfo[i][hEnter][2]);
if(HouseInfo[i][hOwned] == 0)
{
format(string,sizeof(string),"{00FF00}Дом №%d\n{33CCFF}Класс: {FFFF00}Нет\n{33CCFF}Уровень: {FFFF00}Нет\n{33CCFF}Цена: {FFFF00}$0",i);
HouseInfo[i][hMIcon] = CreateDynamicMapIcon(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],31,0xFFFFFFAA,0,-1,-1,400.0);
HouseInfo[i][hPickup][0] = CreateDynamicPickup(1273,23,HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],-1);
HouseInfo[i][hPickup][1] = CreateDynamicCP(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],1.0,-1,-1,-1,3.0);
}
else if(HouseInfo[i][hOwned] == 1)
{
format(string,sizeof(string),"{00FF00}Дом №%d\n{33CCFF}Класс: {FFFF00}Нет\n{33CCFF}Владелец: {00FF00}Нет",i);
HouseInfo[i][hMIcon] = CreateDynamicMapIcon(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],32,0xFFFFFFAA,0,-1,-1,400.0);
HouseInfo[i][hPickup][0] = CreateDynamicPickup(19522,23,HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],-1);
HouseInfo[i][hPickup][1] = CreateDynamicCP(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],1.0,-1,-1,-1,3.0);
}
HouseInfo[i][hLabel] = Create3DTextLabel(string,0xFFFFFFFF,HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2]+1,20.0,0,1);
}
printf("Загружено [%i] домов.",HOME);
return 1;
}


stock UpdateHouse(id)
{
new string[126];
DestroyDynamicPickup(HouseInfo[id][hPickup][0]);
if(HouseInfo[id][hOwned] == 0)
{
format(string,sizeof(string),"{00FF00}Дом №%d\n{33CCFF}Класс: {FFFF00}Нет\n{33CCFF}Уровень: {FFFF00}Нет\n{33CCFF}Цена: {FFFF00}$0",id);
HouseInfo[id][hMIcon] = CreateDynamicMapIcon(HouseInfo[id][hEnter][0],HouseInfo[id][hEnter][1],HouseInfo[id][hEnter][2],31,0xFFFFFFAA,0,-1,-1,400.0);
HouseInfo[id][hPickup][0] = CreateDynamicPickup(1273,23,HouseInfo[id][hEnter][0],HouseInfo[id][hEnter][1],HouseInfo[id][hEnter][2],-1);
HouseInfo[id][hPickup][1] = CreateDynamicCP(HouseInfo[id][hEnter][0],HouseInfo[id][hEnter][1],HouseInfo[id][hEnter][2],1.0,-1,-1,-1,3.0);
}
else if(HouseInfo[id][hOwned] == 1)
{
format(string,sizeof(string),"{00FF00}Дом №%d\n{33CCFF}Класс: {FFFF00}Нет\n{33CCFF}Владелец: {00FF00}Нет",id);
HouseInfo[id][hMIcon] = CreateDynamicMapIcon(HouseInfo[id][hEnter][0],HouseInfo[id][hEnter][1],HouseInfo[id][hEnter][2],32,0xFFFFFFAA,0,-1,-1,400.0);
HouseInfo[id][hPickup][0] = CreateDynamicPickup(19522,23,HouseInfo[id][hEnter][0],HouseInfo[id][hEnter][1],HouseInfo[id][hEnter][2],-1);
HouseInfo[id][hPickup][1] = CreateDynamicCP(HouseInfo[id][hEnter][0],HouseInfo[id][hEnter][1],HouseInfo[id][hEnter][2],1.0,-1,-1,-1,3.0);
}
Update3DTextLabelText(HouseInfo[id][hLabel],0xFFFFFFFF,string);
}


CMD:addhouse(playerid,params[])
{
new Float:X,Float:Y,Float:Z;
new Float:EX,Float:EY,Float:EZ,int;
if(Player[playerid][pAdmin] != 10 && Player[playerid][pAdmin] != 11 || AdminDuty[playerid] == 0)return NoRights(playerid,!"[ОШИБКА] {FFFFFF}Недостаточно прав для использования команды.");
if(sscanf(params,"d",params[0]))return SendClientMessage(playerid,0x00BFFFAA,"[КОМАНДЫ] {FFFFFF}/addhouse [Класс].");
if(params[0] > 6 || params[0] < 1)return NoRights(playerid,!"[ОШИБКА] {FFFFFF}Доступное значение класса дома от 1 до 6.");
switch(params[0])
{
case 1:
{
EX = 243.7219;
EY = 304.7986;
EZ = 999.1484;
int = 1;
}
case 2:{}
case 3:{}
case 4:{}
case 5:{}
case 6:{}
case 7:
{

}
}
GetPlayerPos(playerid,X,Y,Z);
HouseInfo[HOME][hID] = HOME;
HouseInfo[HOME][hInt] = int;
HouseInfo[HOME][hEnter][0] = X;
HouseInfo[HOME][hEnter][1] = Y;
HouseInfo[HOME][hEnter][2] = Z;
HouseInfo[HOME][hExit][0] = EX;
HouseInfo[HOME][hExit][1] = EY;
HouseInfo[HOME][hExit][2] = EZ;
HouseInfo[HOME][hPickup] = CreateDynamicPickup(1273,23,HouseInfo[HOME][hEnter][0],HouseInfo[HOME][hEnter][1],HouseInfo[HOME][hEnter][2],-1);

new string[500];
format(string,sizeof(string),"INSERT INTO `houses` (`Interior` ,`Enter1`,`Enter2`,`Enter3`,`Exit1`,`Exit2`,`Exit3`)\
VALUES (%i,'%f','%f','%f','%f','%f','%f')",int,X,Y,Z,EX,EY,EZ);
mysql_query(database,string,false);

UpdateHouse(HOME);
HOME++;
return 1;
}

DeimoS
04.06.2019, 12:45
publics LoadHouses()
{
new rows,string[126];
cache_get_row_count(rows);
for(new i = 0; i < HOME; i++)
{
на
publics LoadHouses()
{
new string[126];
cache_get_row_count(HOME);
for(new i = 0; i < HOME; i++)
{

И да, гораздо практичнее совместить ID дома из базы и ID ячейки из массива.
Сделать это просто:
1) Создаёшь итератор с размером MAX_HOUSES.
2) При создании дома делаешь так:
new house_id = Iter_Free(/*Итератор домов*/);
if(house_id == ITER_NONE)
{
//Лимит домов исчерпан
return 1;
}
// Код создания
new string[500];
format(string,sizeof(string),"INSERT INTO `houses` (ID,`Interior` ,`Enter1`,`Enter2`,`Enter3`,`Exit1`,`Exit2`,`Exit3`) VALUES (%i,%i,'%f','%f','%f','%f','%f','%f')",house_id, int,X,Y,Z,EX,EY,EZ);
mysql_query(database,string,false); // В запросе выше указываем значение для поле "ID", равное значению house_id.
Iter_Add(/*Итератор домов*/, house_id);

3) А уже при загрузке делать так:
for(new i = 0, idx; i < HOME; i++)
{
cache_get_value_name_int(i,"ID", idx);
if(!(0 <= idx < MAX_HOUSES))// Проверяем, "вмещается" ли ID дома в массив и если нет, то сообщаем об этом
{
printf("ID дома %d невалиден", idx);
continue;
}// А если да, то теперь переменную "i" используем как номер строки, из которого будем грузить данные из кэша
// А "idx" уже используем в массиве HouseInfo
cache_get_value_name_int(i, "Owner", HouseInfo[idx][hOwner]);
cache_get_value_name_float(i, "Enter1", HouseInfo[idx][hEnter][0]);
// И т.п.

Теперь, при работе с домами, не нужно будет запускать каких-то циклов и сверять ID, записанный у игрока, с переменной hID. Достаточно сразу взять записанный ID у игрока и использовать его как индекс ячейки при обращении к массиву HouseInfo.



И да, советую использовать только строчные символы в названиях ячеек в БД. Тогда и риск опечатки будет ниже, и не нужно будет помнить порядок размера символов в названии.

Dimon_Fanat
04.06.2019, 20:33
publics LoadHouses()
{
new rows,string[126];
cache_get_row_count(rows);
for(new i = 0; i < HOME; i++)
{
на
publics LoadHouses()
{
new string[126];
cache_get_row_count(HOME);
for(new i = 0; i < HOME; i++)
{

И да, гораздо практичнее совместить ID дома из базы и ID ячейки из массива.
Сделать это просто:
1) Создаёшь итератор с размером MAX_HOUSES.
2) При создании дома делаешь так:
new house_id = Iter_Free(/*Итератор домов*/);
if(house_id == ITER_NONE)
{
//Лимит домов исчерпан
return 1;
}
// Код создания
new string[500];
format(string,sizeof(string),"INSERT INTO `houses` (ID,`Interior` ,`Enter1`,`Enter2`,`Enter3`,`Exit1`,`Exit2`,`Exit3`) VALUES (%i,%i,'%f','%f','%f','%f','%f','%f')",house_id, int,X,Y,Z,EX,EY,EZ);
mysql_query(database,string,false); // В запросе выше указываем значение для поле "ID", равное значению house_id.
Iter_Add(/*Итератор домов*/, house_id);

3) А уже при загрузке делать так:
for(new i = 0, idx; i < HOME; i++)
{
cache_get_value_name_int(i,"ID", idx);
if(!(0 <= idx < MAX_HOUSES))// Проверяем, "вмещается" ли ID дома в массив и если нет, то сообщаем об этом
{
printf("ID дома %d невалиден", idx);
continue;
}// А если да, то теперь переменную "i" используем как номер строки, из которого будем грузить данные из кэша
// А "idx" уже используем в массиве HouseInfo
cache_get_value_name_int(i, "Owner", HouseInfo[idx][hOwner]);
cache_get_value_name_float(i, "Enter1", HouseInfo[idx][hEnter][0]);
// И т.п.

Теперь, при работе с домами, не нужно будет запускать каких-то циклов и сверять ID, записанный у игрока, с переменной hID. Достаточно сразу взять записанный ID у игрока и использовать его как индекс ячейки при обращении к массиву HouseInfo.



И да, советую использовать только строчные символы в названиях ячеек в БД. Тогда и риск опечатки будет ниже, и не нужно будет помнить порядок размера символов в названии.

Не загружаются дома на серве.

Dimon_Fanat
04.06.2019, 21:53
Сделал как показано, и получилась вот такое.


C:\Users\Dima\Desktop\MySql R41-4\gamemodes\newproject.pwn(2213) : error 017: undefined symbol "idx"
C:\Users\Dima\Desktop\MySql R41-4\gamemodes\newproject.pwn(2215) : error 017: undefined symbol "idx"
C:\Users\Dima\Desktop\MySql R41-4\gamemodes\newproject.pwn(2216) : error 017: undefined symbol "idx"
C:\Users\Dima\Desktop\MySql R41-4\gamemodes\newproject.pwn(2218) : error 017: undefined symbol "idx"
C:\Users\Dima\Desktop\MySql R41-4\gamemodes\newproject.pwn(4096) : error 017: undefined symbol "ITER_NONE"
Pawn compiler 3.10.8 Copyright (c) 1997-2006, ITB CompuPhase


5 Errors.


new HOME;
new Iterator:HousesServ<MAX_HOUSES>;


CMD:addhouse(playerid,params[])
{
new Float:X,Float:Y,Float:Z;
new Float:EX,Float:EY,Float:EZ,int;
if(Player[playerid][pAdmin] != 10 && Player[playerid][pAdmin] != 11 || AdminDuty[playerid] == 0)return NoRights(playerid,!"[ОШИБКА] {FFFFFF}Недостаточно прав для использования команды.");
if(sscanf(params,"d",params[0]))return SendClientMessage(playerid,0x00BFFFAA,"[КОМАНДЫ] {FFFFFF}/addhouse [Класс].");
if(params[0] > 6 || params[0] < 1)return NoRights(playerid,!"[ОШИБКА] {FFFFFF}Доступное значение класса дома от 1 до 6.");
switch(params[0])
{
case 1:
{
EX = 243.7219;
EY = 304.7986;
EZ = 999.1484;
int = 1;
}
case 2:{}
case 3:{}
case 4:{}
case 5:{}
case 6:{}
case 7:
{

}
}
GetPlayerPos(playerid,X,Y,Z);
HouseInfo[HOME][hID] = HOME;
HouseInfo[HOME][hInt] = int;
HouseInfo[HOME][hEnter][0] = X;
HouseInfo[HOME][hEnter][1] = Y;
HouseInfo[HOME][hEnter][2] = Z;
HouseInfo[HOME][hExit][0] = EX;
HouseInfo[HOME][hExit][1] = EY;
HouseInfo[HOME][hExit][2] = EZ;
HouseInfo[HOME][hPickup] = CreateDynamicPickup(1273,23,HouseInfo[HOME][hEnter][0],HouseInfo[HOME][hEnter][1],HouseInfo[HOME][hEnter][2],-1);

new string[500];
new house_id = Iter_Free(HousesServ);
if(house_id == ITER_NONE)
{
NoRights(playerid,!"[ОШИБКА] {FFFFFF}Превышен лимит домов на сервере.");
return 1;
}
format(string,sizeof(string),"INSERT INTO `houses` (ID,`Interior` ,`Enter1`,`Enter2`,`Enter3`,`Exit1`,`Exit2`,`Exit3`)\
VALUES (%i,%i,'%f','%f','%f','%f','%f','%f')",house_id,int,X,Y,Z,EX,EY,EZ);
mysql_query(database,string,false);
Iter_Add(HousesServ, house_id);

UpdateHouse(HOME);
HOME++;
return 1;
}


publics LoadHouses()
{
new string[126];
cache_get_row_count(HOME);
for(new i = 0; idx < HOME; i++)
{
cache_get_value_name_int(i,"ID",idx);
if(!(0 <= idx < MAX_HOUSES))
{
printf("ID дома %d невалиден", idx);
continue;
}
//cache_get_value_name_int(i,"Owner",HouseInfo[i][hOwner]);
cache_get_value_name_float(i,"Enter1",HouseInfo[i][hEnter][0]);
cache_get_value_name_float(i,"Enter2",HouseInfo[i][hEnter][1]);
cache_get_value_name_float(i,"Enter3",HouseInfo[i][hEnter][2]);
cache_get_value_name_float(i,"Exit1",HouseInfo[i][hEnter][0]);
cache_get_value_name_float(i,"Exit2",HouseInfo[i][hEnter][1]);
cache_get_value_name_float(i,"Exit3",HouseInfo[i][hEnter][2]);
if(HouseInfo[i][hOwned] == 0)
{
format(string,sizeof(string),"{00FF00}Дом №%d\n{33CCFF}Класс: {FFFF00}Нет\n{33CCFF}Уровень: {FFFF00}Нет\n{33CCFF}Цена: {FFFF00}$0",i);
HouseInfo[i][hMIcon] = CreateDynamicMapIcon(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],31,0xFFFFFFAA,0,-1,-1,400.0);
HouseInfo[i][hPickup][0] = CreateDynamicPickup(1273,23,HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],-1);
HouseInfo[i][hPickup][1] = CreateDynamicCP(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],1.0,-1,-1,-1,3.0);
}
else if(HouseInfo[i][hOwned] == 1)
{
format(string,sizeof(string),"{00FF00}Дом №%d\n{33CCFF}Класс: {FFFF00}Нет\n{33CCFF}Владелец: {00FF00}Нет",i);
HouseInfo[i][hMIcon] = CreateDynamicMapIcon(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],32,0xFFFFFFAA,0,-1,-1,400.0);
HouseInfo[i][hPickup][0] = CreateDynamicPickup(19522,23,HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],-1);
HouseInfo[i][hPickup][1] = CreateDynamicCP(HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2],1.0,-1,-1,-1,3.0);
}
HouseInfo[i][hLabel] = Create3DTextLabel(string,0xFFFFFFFF,HouseInfo[i][hEnter][0],HouseInfo[i][hEnter][1],HouseInfo[i][hEnter][2]+1,20.0,0,1);
}
printf("Загружено [%i] домов.",HOME);
return 1;
}

Чет запутался совсем.

DeimoS
05.06.2019, 01:07
Во-первых, если хочешь использовать мой вариант, то ещё раз внимательно перепрочти все комментарии. Сейчас у тебя неправильно.
Во-вторых, смотри логи MySQL и если ошибок нет - логируй вызов паблика LoadHouses/значение HOME после cache_get_row_count и т.п.

Dimon_Fanat
05.06.2019, 14:37
Во-первых, если хочешь использовать мой вариант, то ещё раз внимательно перепрочти все комментарии. Сейчас у тебя неправильно.
Во-вторых, смотри логи MySQL и если ошибок нет - логируй вызов паблика LoadHouses/значение HOME после cache_get_row_count и т.п.

Честно скажу, я впервые с итераторами работаю.

DeimoS
05.06.2019, 14:57
Ну учись :) Либо делай так, как умеешь.
Или предлагаешь мне научить тебя работать с итераторами, пересказав тебе статьи из интернета?)

Dimon_Fanat
05.06.2019, 17:11
Ну учись :) Либо делай так, как умеешь.
Или предлагаешь мне научить тебя работать с итераторами, пересказав тебе статьи из интернета?)

Нее, учить точно не нужно)