PDA

Просмотр полной версии : [Вопрос] CreateDynamicSphere



adamand
24.08.2017, 02:32
Всем привет.
Проблема собственно говоря с функцией CreateDynamicSphere.
Я её использую вместо пикапов для домов. Так вот, при создании дома (либо при загрузке из БД при запуске мода) происходит вот что:
Дом id1 - загружается нормально.
Дом id2 + id3 - находятся в одном месте
Дом id4 + id5 - находятся на месте 3 дома.
Дома дублируются, то есть сфера в сфере, но почему - не знаю.

Заранее благодарю за помощь.

Код команды создания домов:



CMD:createhouse(playerid, params[])//добавить проверку на админа
{
//if(!PlayerInfo[playerid][pAdmin]) return 1;
if(sscanf(params, "dd", params[0], params[1])) return SendClientMessage(playerid,CWHITE, !"Введите: /createhouse [класс дома (1-3)][цена]");
if(params[0] < 1 || params[0] > 3) return SendClientMessage(playerid,CGREY, !"Вы указали неверный класс дома!");
if(params[1] < 1) return SendClientMessage(playerid,CGREY, !"Вы указали неверное количество денег!");
TOTAL_HOUSE++;
GetPlayerPos(playerid, House[TOTAL_HOUSE][HEnter][0], House[TOTAL_HOUSE][HEnter][1], House[TOTAL_HOUSE][HEnter][2]);
House[TOTAL_HOUSE][ID] = TOTAL_HOUSE;
House[TOTAL_HOUSE][Class] = params[0];
House[TOTAL_HOUSE][Price] = params[1];
House[TOTAL_HOUSE][Lock] = 1;
House[TOTAL_HOUSE][Owned] = 0;

House[TOTAL_HOUSE][EnterPickup] = CreatePickup(1273,1, House[TOTAL_HOUSE][HEnter][0],House[TOTAL_HOUSE][HEnter][1],House[TOTAL_HOUSE][HEnter][2]);
House[TOTAL_HOUSE][MapIcons] = CreateDynamicMapIcon(House[TOTAL_HOUSE][HEnter][0],House[TOTAL_HOUSE][HEnter][1],House[TOTAL_HOUSE][HEnter][2],31,0,0,0,-1,130.0);
House[TOTAL_HOUSE][Area] = CreateDynamicSphere(House[TOTAL_HOUSE][HEnter][0],House[TOTAL_HOUSE][HEnter][1],House[TOTAL_HOUSE][HEnter][2],1.0,0,0,-1);

new mysql_query_one[500];
mysql_format(MYSQL_CONNECT,mysql_query_one,sizeof(mysql_query_one),"INSERT INTO `"TABLE_HOUSE"` (`ID`,`Owned`,`Owner`,`PosX`,`PosY`,`PosZ`,`Price`,`Class`,`Lock`) VALUES \
('%i', '0', 'None', '%f', '%f', '%f', '%i', '%i', '1')", TOTAL_HOUSE, House[TOTAL_HOUSE][HEnter][0], House[TOTAL_HOUSE][HEnter][1], House[TOTAL_HOUSE][HEnter][2],
params[1], params[0]);
mysql_function_query(MYSQL_CONNECT, mysql_query_one, false, "", "");
return 1;
}

vasyok28
24.08.2017, 10:56
Привет! Кидай загрузку домов, и действие при нахождение на дин. Зоне

adamand
24.08.2017, 13:39
Привет! Кидай загрузку домов, и действие при нахождение на дин. Зоне

Загрузка домов:

publics: HouseLoading()
{
new rows, fields;
cache_get_data(rows,fields,MYSQL_CONNECT);
if(rows)
{
for(new i = 1; i <= rows; i++)
{
House[i][ID] = cache_get_field_content_int(i-1, "ID", MYSQL_CONNECT);
House[i][Owned] = cache_get_field_content_int(i-1, "Owned", MYSQL_CONNECT);
cache_get_field_content(i-1, "Owner", House[i][Owner], MYSQL_CONNECT, 24);
House[i][HEnter][0] = cache_get_field_content_float(i-1, "PosX", MYSQL_CONNECT);
House[i][HEnter][1] = cache_get_field_content_float(i-1, "PosY", MYSQL_CONNECT);
House[i][HEnter][2] = cache_get_field_content_float(i-1, "PosZ", MYSQL_CONNECT);

House[i][Price] = cache_get_field_content_int(i-1, "Price", MYSQL_CONNECT);
House[i][Class] = cache_get_field_content_int(i-1, "Class", MYSQL_CONNECT);
House[i][Lock] = cache_get_field_content_int(i-1, "Lock", MYSQL_CONNECT);

TOTAL_HOUSE++;
if(!House[i][Owned])
{
House[i][EnterPickup] = CreatePickup(1273, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 31, CWHITE, 0, -1, -1, 200.0);
}
else
{
House[i][EnterPickup] = CreatePickup(19522, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 32, CWHITE, 0, -1, -1, 100.0);
}
House[i][Area] = CreateDynamicSphere(House[i][HEnter][0],House[i][HEnter][1],House[i][HEnter][2],1.0,0,0,-1);
}
}
printf("[Система домов]: %i домов было загружено.", TOTAL_HOUSE);
return true;
}

Действие, когда игрок входит в зону.

public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(areaid >= House[1][Area] && areaid <= House[TOTAL_HOUSE][Area])
{
new house_class[15], mes[128];
new houseid = areaid - House[1][Area]+1;
if(houseid == -1) return true;
switch(House[houseid][Class])
{
case 1: house_class = "Ýêîíîì";
case 2: house_class = "Ñðåäíèé";
case 3: house_class = "Ëþêñ";
}
if(!House[houseid][Owned])
{
f(mes, "Íîìåð äîìà: %i\nÄîì ïðîäà¸òñÿ!\n\nÊëàññ: %s\nÑòîèìîñòü: %i$", houseid, house_class, House[houseid][Price]);
ShowPlayerDialog(playerid, dBuyHouse,DIALOG_STYLE_MSGBOX,"Äîì ñâîáîäåí",mes,"Êóïèòü","Îòìåíà");
}
else
{
f(mes, "Íîìåð äîìà: %i\n\nÂëàäåëåö: %s\n\nÊëàññ: %s", houseid, House[houseid][Owner], house_class);
ShowPlayerDialog(playerid, dHouseEnter,DIALOG_STYLE_MSGBOX,"Äîì çàíÿò",mes,"Âîéòè","Îòìåíà");
}
PlayerInfo[playerid][SelectedHouseID] = houseid;
}
return 1;
}

adamand
26.08.2017, 00:54
Поднимаю

Sp1ke
26.08.2017, 20:26
public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(areaid >= House[1][Area] && areaid <= House[TOTAL_HOUSE][Area])
{
new house_class[15], mes[128];
for(new houseid = 1; houseid != TOTAL_HOUSE; houseid++)
{
if(House[houseid][Area] != areaid) continue;
switch(House[houseid][Class])
{
case 1: house_class = "Ýêîíîì";
case 2: house_class = "Ñðåäíèé";
case 3: house_class = "Ëþêñ";
}
if(!House[houseid][Owned])
{
f(mes, "Íîìåð äîìà: %i\nÄîì ïðîäà¸òñÿ!\n\nÊëàññ: %s\nÑòîèìîñòü: %i$", houseid, house_class, House[houseid][Price]);
ShowPlayerDialog(playerid, dBuyHouse,DIALOG_STYLE_MSGBOX,"Äîì ñâîáîäåí",mes,"Êóïèòü","Îòìåíà");
}
else
{
f(mes, "Íîìåð äîìà: %i\n\nÂëàäåëåö: %s\n\nÊëàññ: %s", houseid, House[houseid][Owner], house_class);
ShowPlayerDialog(playerid, dHouseEnter,DIALOG_STYLE_MSGBOX,"Äîì çàíÿò",mes,"Âîéòè","Îòìåíà");
}
PlayerInfo[playerid][SelectedHouseID] = houseid;
break;
}
}
return 1;
}

adamand
27.08.2017, 02:26
Не помогло.

Batya_Montes
27.08.2017, 09:58
public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(areaid >= House[0][Area] && areaid <= House[TOTAL_HOUSE - 1][Area])
{
new house_class[15], mes[128];
new houseid = areaid - House[0][Area];
if(houseid == -1) return true;
switch(House[houseid][Class])
{
case 1: house_class = "Ýêîíîì";
case 2: house_class = "Ñðåäíèé";
case 3: house_class = "Ëþêñ";
}
if(!House[houseid][Owned])
{
f(mes, "Íîìåð äîìà: %i\nÄîì ïðîäà¸òñÿ!\n\nÊëàññ: %s\nÑòîèìîñòü: %i$", houseid, house_class, House[houseid][Price]);
ShowPlayerDialog(playerid, dBuyHouse,DIALOG_STYLE_MSGBOX,"Äîì ñâîáîäåí",mes,"Êóïèòü","Îòìåíà");
}
else
{
f(mes, "Íîìåð äîìà: %i\n\nÂëàäåëåö: %s\n\nÊëàññ: %s", houseid, House[houseid][Owner], house_class);
ShowPlayerDialog(playerid, dHouseEnter,DIALOG_STYLE_MSGBOX,"Äîì çàíÿò",mes,"Âîéòè","Îòìåíà");
}
PlayerInfo[playerid][SelectedHouseID] = houseid;
}
return 1;
}

$continue$
27.08.2017, 13:46
ТС:


Можно свой код оборачивать в
тэг?
Можно залить с нормальной кодировкой из редактора Pawno?

adamand
27.08.2017, 22:48
ТС:


Можно свой код оборачивать в
тэг?
Можно залить с нормальной кодировкой из редактора Pawno?


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

P.S. Мне кажется, что проблема должна быть где-то в создании этих зон (загрузка домов + команда создания дома), ибо если копать паблик с поднятием зоны, то это не исправит баг с созданием двух зон.
В БД всё верно, кол-во домов совпадает с нужным.
Добавил команду для вывода переменной TOTAL_HOUSE, в ней данные верны.
Проблема конкретно в зонах, их почему-то две.

Batya_Montes
28.08.2017, 14:20
Какой код надо скинуть в удобном для вас виде? Просто не придавал этому особого значения.

P.S. Мне кажется, что проблема должна быть где-то в создании этих зон (загрузка домов + команда создания дома), ибо если копать паблик с поднятием зоны, то это не исправит баг с созданием двух зон.
В БД всё верно, кол-во домов совпадает с нужным.
Добавил команду для вывода переменной TOTAL_HOUSE, в ней данные верны.
Проблема конкретно в зонах, их почему-то две.

мой вариант проверь, должно работать

adamand
28.08.2017, 22:22
мой вариант проверь, должно работать

Он срабатывает почти как надо. Берётся одна зона, но последний дом не работает, пикап крутится, но зона не берётся.

Batya_Montes
29.08.2017, 10:08
Он срабатывает почти как надо. Берётся одна зона, но последний дом не работает, пикап крутится, но зона не берётся.

ах ну да, еще цикл кривой в загрузке домов

publics: HouseLoading()
{
new rows, fields;
cache_get_data(rows,fields,MYSQL_CONNECT);
if(rows)
{
for(new i = 0; i < rows; i++)
{
House[i][ID] = cache_get_field_content_int(i-1, "ID", MYSQL_CONNECT);
House[i][Owned] = cache_get_field_content_int(i-1, "Owned", MYSQL_CONNECT);
cache_get_field_content(i-1, "Owner", House[i][Owner], MYSQL_CONNECT, 24);
House[i][HEnter][0] = cache_get_field_content_float(i-1, "PosX", MYSQL_CONNECT);
House[i][HEnter][1] = cache_get_field_content_float(i-1, "PosY", MYSQL_CONNECT);
House[i][HEnter][2] = cache_get_field_content_float(i-1, "PosZ", MYSQL_CONNECT);

House[i][Price] = cache_get_field_content_int(i-1, "Price", MYSQL_CONNECT);
House[i][Class] = cache_get_field_content_int(i-1, "Class", MYSQL_CONNECT);
House[i][Lock] = cache_get_field_content_int(i-1, "Lock", MYSQL_CONNECT);

TOTAL_HOUSE++;
if(!House[i][Owned])
{
House[i][EnterPickup] = CreatePickup(1273, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 31, CWHITE, 0, -1, -1, 200.0);
}
else
{
House[i][EnterPickup] = CreatePickup(19522, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 32, CWHITE, 0, -1, -1, 100.0);
}
House[i][Area] = CreateDynamicSphere(House[i][HEnter][0],House[i][HEnter][1],House[i][HEnter][2],1.0,0,0,-1);
}
}
printf("[Система домов]: %i домов было загружено.", TOTAL_HOUSE);
return true;
}

adamand
01.09.2017, 13:13
ах ну да, еще цикл кривой в загрузке домов

publics: HouseLoading()
{
new rows, fields;
cache_get_data(rows,fields,MYSQL_CONNECT);
if(rows)
{
for(new i = 0; i < rows; i++)
{
House[i][ID] = cache_get_field_content_int(i-1, "ID", MYSQL_CONNECT);
House[i][Owned] = cache_get_field_content_int(i-1, "Owned", MYSQL_CONNECT);
cache_get_field_content(i-1, "Owner", House[i][Owner], MYSQL_CONNECT, 24);
House[i][HEnter][0] = cache_get_field_content_float(i-1, "PosX", MYSQL_CONNECT);
House[i][HEnter][1] = cache_get_field_content_float(i-1, "PosY", MYSQL_CONNECT);
House[i][HEnter][2] = cache_get_field_content_float(i-1, "PosZ", MYSQL_CONNECT);

House[i][Price] = cache_get_field_content_int(i-1, "Price", MYSQL_CONNECT);
House[i][Class] = cache_get_field_content_int(i-1, "Class", MYSQL_CONNECT);
House[i][Lock] = cache_get_field_content_int(i-1, "Lock", MYSQL_CONNECT);

TOTAL_HOUSE++;
if(!House[i][Owned])
{
House[i][EnterPickup] = CreatePickup(1273, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 31, CWHITE, 0, -1, -1, 200.0);
}
else
{
House[i][EnterPickup] = CreatePickup(19522, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 32, CWHITE, 0, -1, -1, 100.0);
}
House[i][Area] = CreateDynamicSphere(House[i][HEnter][0],House[i][HEnter][1],House[i][HEnter][2],1.0,0,0,-1);
}
}
printf("[Система домов]: %i домов было загружено.", TOTAL_HOUSE);
return true;
}

Стало только хуже :D
Создал 3 дома, ни один из них не "поднимается".
Сделал рестарт - загрузились 3 дома, но пикапа только 2, но каждый пикап имеет в себе еще по 2 дома.
1 пикап = 1 и 2 дома.
2 пикап = 3 и 4 дома.

DeimoS
01.09.2017, 13:20
Покажи как объявлен массив House

- - - Добавлено - - -

Система крайне криво реализована. Четвертовать нужно того, что придумал делать загрузку данных не в нулевую ячейку, а в первую. Лучше бы всё переписать в нормальный вид, но нужно и остальной код системы домов переписывать.


Вот так всё должно работать. Только возможен выход за пределы массива для House (его значение должно быть на один больше, чем общее количество домов).

publics: HouseLoading()
{
new fields;
cache_get_data(TOTAL_HOUSE, fields, MYSQL_CONNECT);
if(rows)
{
for(new i = 1, j = 0; j < TOTAL_HOUSE; i++, j++)
{
House[i][ID] = cache_get_field_content_int(j, "ID", MYSQL_CONNECT);
House[i][Owned] = cache_get_field_content_int(j, "Owned", MYSQL_CONNECT);
cache_get_field_content(j, "Owner", House[i][Owner], MYSQL_CONNECT, 24);
House[i][HEnter][0] = cache_get_field_content_float(j, "PosX", MYSQL_CONNECT);
House[i][HEnter][1] = cache_get_field_content_float(j, "PosY", MYSQL_CONNECT);
House[i][HEnter][2] = cache_get_field_content_float(j, "PosZ", MYSQL_CONNECT);

House[i][Price] = cache_get_field_content_int(j, "Price", MYSQL_CONNECT);
House[i][Class] = cache_get_field_content_int(j, "Class", MYSQL_CONNECT);
House[i][Lock] = cache_get_field_content_int(j, "Lock", MYSQL_CONNECT);

if(!House[i][Owned])
{
House[i][EnterPickup] = CreatePickup(1273, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 31, CWHITE, 0, -1, -1, 200.0);
}
else
{
House[i][EnterPickup] = CreatePickup(19522, 23, House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2],-1);
House[i][MapIcons] = CreateDynamicMapIcon(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 32, CWHITE, 0, -1, -1, 100.0);
}
House[i][Area] = CreateDynamicSphere(House[i][HEnter][0], House[i][HEnter][1], House[i][HEnter][2], 1.0, 0, 0, -1);
}
}
printf("[Система домов]: %i домов было загружено.", TOTAL_HOUSE);
return true;
}


public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(areaid >= House[1][Area] && areaid <= House[TOTAL_HOUSE][Area])
{
new house_class[15],
mes[128],
houseid = areaid - House[1][Area];
if(houseid == -1)
return true;
switch(House[houseid][Class])
{
case 1: house_class = "Эконом";
case 2: house_class = "Средний";
case 3: house_class = "Люкс";
}
if(!House[houseid][Owned])
{
f(mes, "Номер дома: %i\nДом продаётся!\n\nКласс: %s\nСтоимость: %i$", houseid, house_class, House[houseid][Price]);
ShowPlayerDialog(playerid, dBuyHouse,DIALOG_STYLE_MSGBOX,"Дом свободен",mes,"Купить","Отмена");
}
else
{
f(mes, "Номер дома: %i\n\nВладелец: %s\n\nКласс: %s", houseid, House[houseid][Owner], house_class);
ShowPlayerDialog(playerid, dHouseEnter,DIALOG_STYLE_MSGBOX,"Дом занят",mes,"Войти","Отмена");
}
PlayerInfo[playerid][SelectedHouseID] = houseid;
}
return 1;
}

$continue$
01.09.2017, 16:14
0 дом - скорее всего обозначает, что его нет, но это все равно не дает поощрение кто это писал, ибо для таких случаев есть -1

DeimoS
01.09.2017, 17:46
0 дом - скорее всего обозначает, что его нет, но это все равно не дает поощрение кто это писал, ибо для таких случаев есть -1

Чаще всего сдвиг делают лишь затем, чтоб в статистике и в 3d текстах перед домом писало красивую цифру для самого первого дома (не 0, а 1) :fool: