PDA

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



GodFather
18.05.2014, 22:48
Итак... Когда покупаю дом, все остальные иконки домов перемещаются на иконку того что я купил и у всех тех домов я становлюсь владельцем...

Команда покупки:

CMD:buyhouse(playerid,params[])
{
//if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
if(PlayerInfo[playerid][pHouseKey] != -1) return SendMes(playerid,COLOR_B," У вас уже есть дом. Введите /sellhouse, чтобы его продать");
for(new h = 1; h <= TOTALHOUSES; h++)
{
if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
{
if(HouseInfo[h][hOwned] == 1) SendMes(playerid,COLOR_B,"В этом доме уже кто-то проживает");
if(PlayerInfo[playerid][pCash] < HouseInfo[h][hPrice]) return SendMes(playerid,COLOR_B," У вас недостаточно денег на покупку дома");
PlayerInfo[playerid][pHouseKey] = h;
HouseInfo[h][hOwned] = 1;
HouseInfo[h][hHel] = 0;
HouseInfo[h][hTakings] = 50*(HouseInfo[h][hClass]+1)*2;
strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
PlayerInfo[playerid][pCash] -= HouseInfo[h][hPrice];
GivePlayerMoney(playerid,PlayerInfo[playerid][pCash]);
SetPlayerPos(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
SetPlayerInterior(playerid,HouseInfo[h][hInt]);
SetPlayerVirtualWorld(playerid,h+50);
SendMes(playerid,COLOR_B," Поздравляем с покупкой!");
Update3DTexts();
OnHouseSave(h);
break;
}
}
return true;
}


public OnHouseSave(houseid)
{
new string[32],query[256];
format(string,sizeof(string),"UPDATE `"TABLE_HOUSES"` SET "),strcat(query,string);
format(string,sizeof(string),"`hOwned` = '%i', ",HouseInfo[houseid][hOwned]),strcat(query,string);
format(string,sizeof(string),"`hOwner` = '%s', ",HouseInfo[houseid][hOwner]),strcat(query,string);
format(string,sizeof(string),"`hEnterX` = '%f', ",HouseInfo[houseid][hEnterX]),strcat(query,string);
format(string,sizeof(string),"`hEnterY` = '%f', ",HouseInfo[houseid][hEnterY]),strcat(query,string);
format(string,sizeof(string),"`hEnterZ` = '%f', ",HouseInfo[houseid][hEnterZ]),strcat(query,string);
format(string,sizeof(string),"`hExitX` = '%f', ",HouseInfo[houseid][hExitX]),strcat(query,string);
format(string,sizeof(string),"`hExitY` = '%f', ",HouseInfo[houseid][hExitY]),strcat(query,string);
format(string,sizeof(string),"`hExitZ` = '%f', ",HouseInfo[houseid][hExitZ]),strcat(query,string);
format(string,sizeof(string),"`hLevel` = '%i', ",HouseInfo[houseid][hLevel]),strcat(query,string);
format(string,sizeof(string),"`hPrice` = '%i', ",HouseInfo[houseid][hPrice]),strcat(query,string);
format(string,sizeof(string),"`hLock` = '%i', ",HouseInfo[houseid][hLock]),strcat(query,string);
format(string,sizeof(string),"`hTakings` = '%i', ",HouseInfo[houseid][hTakings]),strcat(query,string);
format(string,sizeof(string),"`hInt` = '%i', ",HouseInfo[houseid][hInt]),strcat(query,string);
format(string,sizeof(string),"`hHel` = '%i', ",HouseInfo[houseid][hHel]),strcat(query,string);
format(string,sizeof(string),"`hClass` = '%i' ",HouseInfo[houseid][hClass]),strcat(query,string);
format(string,sizeof(string),"WHERE `hID` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);
mysql_function_query(MYSQL_ARG,query,false,"","");
return true;
}

DeimoS
19.05.2014, 05:39
Если SendMes функция, а не макрос - советую от неё избавиться.
Покажите Update3DTexts

GodFather
19.05.2014, 16:42
Если SendMes функция, а не макрос - советую от неё избавиться.
Покажите Update3DTexts



stock Update3DTexts()
{
new string[128];
for(new idx = 1; idx <= TOTALHOUSES; idx++)
{
new klass[2];
DestroyDynamicMapIcon(HouseInfo[idx][hIconID]);
DestroyPickup(HouseInfo[idx][hPickupID]);
Delete3DTextLabel(HouseInfo[idx][hTextID]);
if(HouseInfo[idx][hOwned] == 0)
{
HouseInfo[idx][hPickupID] = CreatePickup(1273, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
HouseInfo[idx][hIconID] = CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 31, COLOR_WHITE, 0, -1, -1, 100.0);
switch(HouseInfo[idx][hClass])
{
case 0: klass = "E";
case 1: klass = "D";
case 2: klass = "C";
case 3: klass = "B";
case 4: klass = "A";
case 5: klass = "S";
}
format(string,sizeof(string),"Номер дома: %i\nЦена: %i долларов\nКласс: %s",idx,HouseInfo[idx][hPrice],klass);
HouseInfo[idx][hTextID] = Create3DTextLabel(string,COLOR_SEND,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
}
else
{
HouseInfo[idx][hPickupID] = CreatePickup(1272, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
HouseInfo[idx][hIconID] = CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 100.0);
switch(HouseInfo[idx][hClass])
{
case 0: klass = "E";
case 1: klass = "D";
case 2: klass = "C";
case 3: klass = "B";
case 4: klass = "A";
case 5: klass = "S";
}
format(string,sizeof(string),"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[idx][hOwner],klass);
HouseInfo[idx][hTextID] = Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
}
}
}

SendMes - Макрос.

wAx
19.05.2014, 17:53
Попробуй заменить команду /buyhouse на вариант предложенный ниже.
P.S Это всего лишь вариант, поэтому сохрани старый вариант команды


CMD:buyhouse(playerid,params[])
{
//if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
if(PlayerInfo[playerid][pHouseKey] != -1) return SendMes(playerid,COLOR_B," У вас уже есть дом. Введите /sellhouse, чтобы его продать");
for(new h = 1; h <= TOTALHOUSES; h++)
{
if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
{
if(HouseInfo[h][hOwned] == 1) SendMes(playerid,COLOR_B,"В этом доме уже кто-то проживает");
if(PlayerInfo[playerid][pCash] < HouseInfo[h][hPrice]) return SendMes(playerid,COLOR_B," У вас недостаточно денег на покупку дома");
PlayerInfo[playerid][pHouseKey] = h;
HouseInfo[h][hOwned] = 1;
HouseInfo[h][hHel] = 0;
HouseInfo[h][hTakings] = 50*(HouseInfo[h][hClass]+1)*2;
strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
PlayerInfo[playerid][pCash] -= HouseInfo[h][hPrice];
GivePlayerMoney(playerid,PlayerInfo[playerid][pCash]);
SetPlayerPos(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
SetPlayerInterior(playerid,HouseInfo[h][hInt]);
SetPlayerVirtualWorld(playerid,h+50);
SendMes(playerid,COLOR_B," Поздравляем с покупкой!");
OnHouseSave(h);
DestroyDynamicMapIcon(HouseInfo[h][hIconID]);
DestroyPickup(HouseInfo[h][hPickupID]);
Delete3DTextLabel(HouseInfo[h][hTextID]);
HouseInfo[h][hPickupID] = CreatePickup(1272, 23, HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ],-1);
HouseInfo[h][hIconID] = CreateDynamicMapIcon(HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 100.0);
switch(HouseInfo[h][hClass])
{
case 0: klass = "E";
case 1: klass = "D";
case 2: klass = "C";
case 3: klass = "B";
case 4: klass = "A";
case 5: klass = "S";
}
format(string,sizeof(string),"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[h][hOwner],klass);
HouseInfo[h][hTextID] = Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ],20.0,0,1);
break;
}
}
return true;
}

GodFather
19.05.2014, 18:15
Попробуй заменить команду /buyhouse на вариант предложенный ниже.
P.S Это всего лишь вариант, поэтому сохрани старый вариант команды


CMD:buyhouse(playerid,params[])
{
//if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
if(PlayerInfo[playerid][pHouseKey] != -1) return SendMes(playerid,COLOR_B," У вас уже есть дом. Введите /sellhouse, чтобы его продать");
for(new h = 1; h <= TOTALHOUSES; h++)
{
if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
{
if(HouseInfo[h][hOwned] == 1) SendMes(playerid,COLOR_B,"В этом доме уже кто-то проживает");
if(PlayerInfo[playerid][pCash] < HouseInfo[h][hPrice]) return SendMes(playerid,COLOR_B," У вас недостаточно денег на покупку дома");
PlayerInfo[playerid][pHouseKey] = h;
HouseInfo[h][hOwned] = 1;
HouseInfo[h][hHel] = 0;
HouseInfo[h][hTakings] = 50*(HouseInfo[h][hClass]+1)*2;
strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
PlayerInfo[playerid][pCash] -= HouseInfo[h][hPrice];
GivePlayerMoney(playerid,PlayerInfo[playerid][pCash]);
SetPlayerPos(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
SetPlayerInterior(playerid,HouseInfo[h][hInt]);
SetPlayerVirtualWorld(playerid,h+50);
SendMes(playerid,COLOR_B," Поздравляем с покупкой!");
OnHouseSave(h);
DestroyDynamicMapIcon(HouseInfo[h][hIconID]);
DestroyPickup(HouseInfo[h][hPickupID]);
Delete3DTextLabel(HouseInfo[h][hTextID]);
HouseInfo[h][hPickupID] = CreatePickup(1272, 23, HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ],-1);
HouseInfo[h][hIconID] = CreateDynamicMapIcon(HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 100.0);
switch(HouseInfo[h][hClass])
{
case 0: klass = "E";
case 1: klass = "D";
case 2: klass = "C";
case 3: klass = "B";
case 4: klass = "A";
case 5: klass = "S";
}
format(string,sizeof(string),"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[h][hOwner],klass);
HouseInfo[h][hTextID] = Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[h][hEnterX], HouseInfo[h][hEnterY], HouseInfo[h][hEnterZ],20.0,0,1);
break;
}
}
return true;
}

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

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

Поставил в паблик сохранения домов printf с надписью "Дом номер %d сохранён" Паблик значит вызывается, но запрос в БД не отправляется... :shock:

wAx
19.05.2014, 18:18
Мой вариант никак не затрагивает ваш паблик сохранения.

GodFather
19.05.2014, 18:19
Мой вариант никак не затрагивает ваш паблик сохранения.
Знаю, знаю... Но... я ничего кроме добавления принта с ним не делал... И до этого он работал. Что то я совсем уже запутался...

wAx
19.05.2014, 18:19
Скиньте логирование запроса, вставьте перед mysql_function_query в вашем паблике сохранения, строку:
printf(query); и скиньте результат сюда.

GodFather
19.05.2014, 18:24
Одну минуту.

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


[17:24:14] UPDATE `house` SET `hOwned` = '1', `hOwner` = 'Matty_Diamond', `hEnterX` = '2498.550048', `hEnterY` = '-1642.260009', `hEnterZ` = '14.113100', `hExitX` = '140.281005', `hExitY` = '1365.920043', `hExitZ` = '1083.859985', `hLevel` = '0', `hPrice` = '11', `h

Увеличить массив query?

wAx
19.05.2014, 18:26
Одну минуту.

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


[17:24:14] UPDATE `house` SET `hOwned` = '1', `hOwner` = 'Matty_Diamond', `hEnterX` = '2498.550048', `hEnterY` = '-1642.260009', `hEnterZ` = '14.113100', `hExitX` = '140.281005', `hExitY` = '1365.920043', `hExitZ` = '1083.859985', `hLevel` = '0', `hPrice` = '11', `h

Увеличить массив query?

Правильный ответ

GodFather
19.05.2014, 18:32
Ну что... Теперь дома сохраняются... Сохранили один дом в OnHouseSave(h);
Результат:
http://i.gyazo.com/ee273f7614062d9473588bb6260cabce.png

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

Ну и соответственно, после загрузки домов, все иконки, пикапы и 3D тексты на одни координаты.

wAx
19.05.2014, 18:35
У тебя hID везде = 0, замени строку в запросе:
format(string,sizeof(string),"WHERE `hID` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);
на мой вариант:

format(string,sizeof(string),"WHERE `newid` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);

И в функции загрузки, вместо hID, используй поле `newid`, понял?

GodFather
19.05.2014, 18:43
У тебя hID везде = 0, замени строку в запросе:
format(string,sizeof(string),"WHERE `hID` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);
на мой вариант:

format(string,sizeof(string),"WHERE `newid` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);

И в функции загрузки, вместо hID, используй поле `newid`, понял?

Да, да. Сейчас сделаю.

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

Невероятно, но факт! Теперь всё работает как швейцарские часы, и всё благодаря вам. Большой спасибо вам и вашему порталу. :drinks:
PS: И да, понял в чём было ошибка =)

Salvacore
19.05.2014, 18:52
closed.