PDA

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



Skyline
14.05.2017, 15:55
Здравствуйте, подскажите пожалуйста, при продаже дома игроку, не обновляется информация, не обновляются иконки у игроков сразу, текст с ником владельца такой же остается. Иконка после продажи где находится его дом так же остается у игрока который продал дом.

Само действие купли/продажи:


new houseid = pInfo[playerid][pHouse] = pInfo[sellpl][pHouse];
pInfo[sellpl][pHouse] = HouseInfo[houseid][hOwner][0] = 0;
strmid(HouseInfo[pInfo[playerid][pHouse]][hOwner], pInfo[playerid][pName], 0, strlen(pInfo[playerid][pName]), 255);

format(string, sizeof(string), "UPDATE `accounts` SET `house` = '0' WHERE `id` = '%i'", pInfo[sellpl][pHouse], pInfo[sellpl][pID]);
mysql_tquery(mysql_connect_ID, string, "", "");

format(string, sizeof(string), "UPDATE `accounts` SET `house` = '%d' WHERE `id` = '%i'", pInfo[playerid][pHouse], pInfo[playerid][pID]);
mysql_tquery(mysql_connect_ID, string, "", "");

format(string, sizeof(string), "UPDATE `house` SET `owner` = '%s', `owned` = '1' WHERE `id` = '%i'",pInfo[playerid][pName], HouseInfo[houseid][hID]-1);
mysql_tquery(mysql_connect_ID, string, "", "");

UpdateHouse(houseid);

DeletePVar(playerid, "SellHouse_Currency");


stock UpdateHouse(houseid)
{
if(!(0 <= houseid < sizeof(HouseInfo)))
return 0;

static const h_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}Нет\n{FFDEAD}Стоимость: {FFFFFF}%d\n{FFDEAD}Уровень: {FFFFFF}%d";
static const h_not_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}%s\n{FFDEAD}Уровень: {FFFFFF}%d";

new h_buff[sizeof(h_null) + ((3-2) + (24-2) + (20-2) + (5-2))];
DestroyDynamicMapIcon(HouseInfo[houseid][hMapicon]);
DestroyPickup(HouseInfo[houseid][hPickup]);
Delete3DTextLabel(HouseInfo[houseid][hText]);
if(!HouseInfo[houseid][hOwned])
{
format(h_buff, sizeof(h_buff), h_null, HouseInfo[houseid][hID], HouseInfo[houseid][hPrice],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1273, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0x008080FF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7, 0);
HouseInfo[houseid][hMapicon] = CreateDynamicMapIcon(HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 31, COLOR_WHITE, 0, -1, -1, 100.0);
}
else
{
format(h_buff, sizeof(h_buff), h_not_null, HouseInfo[houseid][hID], HouseInfo[houseid][hOwner],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1272, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0xFFFFFF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7.0, 0);
}
return 1;
}

Данные при логировании записываются верные, не знаю почему не обновляется ничего:

[14:51:28] UPDATE `accounts` SET `house` = '0' WHERE `id` = '0'
[14:51:28] UPDATE `accounts` SET `house` = '3' WHERE `id` = '24'
[14:51:28] UPDATE `house` SET `owner` = 'Kentavr', `owned` = '1' WHERE `id` = '4'

DeimoS
14.05.2017, 16:26
У тебя вот в этом запросе ошибка. Точнее в форматировании (смотри на число спецификаторов и количество переменных)

format(string, sizeof(string), "UPDATE `accounts` SET `house` = '0' WHERE `id` = '%i'", pInfo[sellpl][pHouse], pInfo[sellpl][pID]);
mysql_tquery(mysql_connect_ID, string, "", "");

Как я понимаю, ID владельца дома находится в sellpl. Можно сделать так:

new houseid = pInfo[playerid][pHouse] = pInfo[sellpl][pHouse];
pInfo[sellpl][pHouse] = HouseInfo[houseid][hOwner][0] = 0;

format(HouseInfo[houseid][hOwner], MAX_PLAYER_NAME, pInfo[playerid][pName]);

format(string, sizeof(string), "UPDATE accounts AS owner, accounts AS buyer SET buyer.house = owner.house, owner.house = 0 WHERE owner.id = %i AND buyer.id = %i", pInfo[sellpl][pID], pInfo[playerid][pID]);
mysql_tquery(mysql_connect_ID, string, "", "");

format(string, sizeof(string), "UPDATE house SET owner = '%s', owned = 1 WHERE id = %i",pInfo[playerid][pName], HouseInfo[houseid][hID]-1);
mysql_tquery(mysql_connect_ID, string, "", "");

UpdateHouse(houseid);

DeletePVar(playerid, "SellHouse_Currency");
Сократив число запросов.

И это норма, что в аккаунт покупателя записывается 3-ий ID, а в таблице домов обновляется дом под ID 4?

Skyline
14.05.2017, 17:00
В том то и дело, запросом все обновляется в таблице, ник игрока меняется, а в игре ничего.

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




format(string, sizeof(string), "UPDATE accounts AS owner, accounts AS buyer SET buyer.house = owner.house, owner.house = 0 WHERE owner.id = %i AND buyer.id = %i", pInfo[sellpl][pID], pInfo[playerid][pID]);


Я впервые вижу форму подобных запросов, ничего не понял конечно тут :smile:

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

Сейчас сделал как ты написал, в логах:


[15:56:17] UPDATE accounts AS owner, accounts AS buyer SET buyer.house = owner.house, owner.house = 0 WHERE owner.id = 21 AND buyer.id
[15:56:17] UPDATE house SET owner = 'Kentavr', owned = 1 WHERE id = 4

В таблице:
http://i013.radikal.ru/1705/7b/f133b66861ac.png

В игре - ничего не изменилось.

DeimoS
14.05.2017, 19:35
Я впервые вижу форму подобных запросов, ничего не понял конечно тут :smile:

В MySQL гораздо больше функционала, чем обычно используют в SA-MP. В SA-MP вообще MySQL используют как какой-то непонятный набор функций который, как говорят, позволяет оптимизировать мод. И часто используют крайне неправильно
(БД и мод - это, по сути, два разных сервера, которые могут выполнять кучу разных функций на своей стороне и лишь потом обмениваться результатами. Но сейчас большинство используют БД как обычное хранилище информации, ограничиваясь записью/чтением, делая все те операции, что легко сделать посредством SQL, на стороне мода. Это как купить автомобиль чтоб в итоге приходить в гараж и пользоваться лишь зеркалами).
На деле же SQL даже сложнее Pawn будет :) И его так же нужно изучать, дабы работать с ним правильно. Благодаря углубленному изучению можно не только сделать работу с данными реально оптимизированней, но и упростить себе жизнь, ибо возможностей там хватает.

Касаемо лейблов можно прочесть тут (http://forum.sa-mp.com/showpost.php?p=2878737).
Касаемо того, что в пределах одного запроса можно работать с неограниченным числом таблиц - это нужно теорию читать.
Касаемо того, где можно найти теорию по MySQL - эт сюда (https://dev.mysql.com/doc/). Можно, конечно, и на русском кучу статей найти в гугле, но за качество информации в них никто ответа не держит.


Сейчас сделал как ты написал, в логах:


[15:56:17] UPDATE accounts AS owner, accounts AS buyer SET buyer.house = owner.house, owner.house = 0 WHERE owner.id = 21 AND buyer.id
[15:56:17] UPDATE house SET owner = 'Kentavr', owned = 1 WHERE id = 4

В таблице:
http://i013.radikal.ru/1705/7b/f133b66861ac.png

В игре - ничего не изменилось.

Ну значит дело либо в UpdateHouse, либо в ID, который ты туда передаёшь. Проверь сначала последнее, путём логирования ID дома при начале продажи и потом уже смотри какой ID приходит в функцию. Скорее всего просто где-то отнял/забыл отнять единицу (не понимаю кто вообще придумал так делать. Идиотская реализация) и обновляется не тот дом, что нужно

Skyline
14.05.2017, 21:50
В MySQL гораздо больше функционала, чем обычно используют в SA-MP. В SA-MP вообще MySQL используют как какой-то непонятный набор функций который, как говорят, позволяет оптимизировать мод. И часто используют крайне неправильно
(БД и мод - это, по сути, два разных сервера, которые могут выполнять кучу разных функций на своей стороне и лишь потом обмениваться результатами. Но сейчас большинство используют БД как обычное хранилище информации, ограничиваясь записью/чтением, делая все те операции, что легко сделать посредством SQL, на стороне мода. Это как купить автомобиль чтоб в итоге приходить в гараж и пользоваться лишь зеркалами).
На деле же SQL даже сложнее Pawn будет :) И его так же нужно изучать, дабы работать с ним правильно. Благодаря углубленному изучению можно не только сделать работу с данными реально оптимизированней, но и упростить себе жизнь, ибо возможностей там хватает.

Касаемо лейблов можно прочесть тут (http://forum.sa-mp.com/showpost.php?p=2878737).
Касаемо того, что в пределах одного запроса можно работать с неограниченным числом таблиц - это нужно теорию читать.
Касаемо того, где можно найти теорию по MySQL - эт сюда (https://dev.mysql.com/doc/). Можно, конечно, и на русском кучу статей найти в гугле, но за качество информации в них никто ответа не держит.



Ну значит дело либо в UpdateHouse, либо в ID, который ты туда передаёшь. Проверь сначала последнее, путём логирования ID дома при начале продажи и потом уже смотри какой ID приходит в функцию. Скорее всего просто где-то отнял/забыл отнять единицу (не понимаю кто вообще придумал так делать. Идиотская реализация) и обновляется не тот дом, что нужно

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

DeimoS
14.05.2017, 23:43
Скорее всего в UpdateHouse, потому что ID верный. Что именно в UpdateHouse, к сожалению не пойму)
Ладно спасибо, тему закрыть тогда.

Покажи весь код продажи дома вместе с UpdateHouse

Skyline
15.05.2017, 00:00
Команда покупки:

CMD:buyhouse(playerid, params[])
{
if(!player_is_authorized{playerid})
return SendClientMessage(playerid, COLOR_GREY, !"Вы не авторизировались.");

new house = -1;
for(new h = 0; h < TOTALHOUSE; h++)
{
if(!IsPlayerInRangeOfPoint(playerid, 2.0, HouseInfo[h][henter_pos_x],HouseInfo[h][henter_pos_y], HouseInfo[h][henter_pos_z]) && HouseInfo[h][hOwned] == 0)
continue;

if(HouseInfo[h][hOwned] == 1)
return SendClientMessage(playerid,COLOR_GREY,!"Этот дом уже куплен.");
house = h;
}
if(house == -1)
return SendClientMessage(playerid,COLOR_GREY,!"Ты не рядом с иконкой дома.");

if(pInfo[playerid][pHouse] > 0)
return SendClientMessage(playerid,COLOR_GREY,!"У вас уже есть дом.");

if(pInfo[playerid][pLevel] < HouseInfo[house][hLevel])
return SendClientMessage(playerid,COLOR_GREY,!"У вас маленький уровень.");

if(pInfo[playerid][pMoney] < HouseInfo[house][hPrice])
return SendClientMessage(playerid,COLOR_GREY,!"У вас не хватает денег.");

strmid(HouseInfo[house][hOwner], pInfo[playerid][pName], 0, strlen(pInfo[playerid][pName]), 255);
pInfo[playerid][pMoney] -= HouseInfo[house][hPrice];
GivePlayerMoney(playerid, -HouseInfo[house][hPrice]);

SetPlayerInterior(playerid,HouseInfo[house][hInt]);
SetPlayerPos(playerid,HouseInfo[house][hexit_pos_x],HouseInfo[house][hexit_pos_y],HouseInfo[house][hexit_pos_z]);
SetPlayerVirtualWorld(playerid,house+50);
HouseCar[house] = CreateVehicle(HouseInfo[house][hHouse_Car],HouseInfo[house][hcar_pos_x],HouseInfo[house][hcar_pos_y],HouseInfo[house][hcar_pos_z],HouseInfo[house][hcar_pos_angle],HouseInfo[house][hCar_Color_1],HouseInfo[house][hCar_Color_2], -1);
HouseInfo[house][hOwned] = 1;
pInfo[playerid][pHouse] = house+1;
SendClientMessage(playerid, COLOR_WHITE, !"Поздравляем с покупкой дома.");

new string[50];
format(string, sizeof(string), "UPDATE accounts SET house = '%d' WHERE id = %i",pInfo[playerid][pHouse]+1, pInfo[playerid][pID]);
mysql_tquery(mysql_connect_ID, string, "", "");

UpdateHouse(house);
SaveHouse(house);
return true;
}

Команда продажи:

CMD:sellhouse(playerid, params[])
{
if(!player_is_authorized{playerid})
return SendClientMessage(playerid, COLOR_GREY, !"Вы не авторизировались.");

if(pInfo[playerid][pHouse] == 0)
return SendClientMessage(playerid, COLOR_GREY, !"У тебя нет дома.");

if(isnull(params))
{
new house = pInfo[playerid][pHouse]-1;
static const fmt_str[] = "Ты точно хочешь продать дом штату за $%d? Введи /accept sh для подтверждения или /cancel sh для отмены.";
new string[sizeof(fmt_str) - 2 + 25];
format(string, sizeof string, fmt_str, HouseInfo[house][hPrice]);
SendClientMessage(playerid, COLOR_LBLUE, string);
Prodaga{playerid} = true;
}
else
{
new giveplayerid,
currency,
price,
money[25];

if(sscanf(params, "uci", giveplayerid, currency, price))
return SendClientMessage(playerid, COLOR_GREY, !"/sellhouse [id] [$/M/D] [Цена]");

if(giveplayerid == INVALID_PLAYER_ID)
return SendClientMessage(playerid, COLOR_GREY, !"Указан неверный ID игрока.");

if(pInfo[giveplayerid][pHouse] != 0)
return SendClientMessage(playerid, COLOR_GREY, !"У этого игрока есть дом.");

if(HouseInfo[pInfo[playerid][pHouse]][hLevel] > pInfo[giveplayerid][pLevel])
return SendClientMessage(playerid, COLOR_GREY, !"Уровень игрока не позволяет ему купить ваш дом.");

if(pInfo[giveplayerid][pMoney] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У игрока нет данной суммы.");

if(GetPVarType(giveplayerid, "SellHouse_Currency") != PLAYER_VARTYPE_NONE)
return SendClientMessage(playerid, COLOR_GREY, !"Данному игроку уже сделали предложение по продаже дома.");

ConvertNumber(price, money);

switch(currency)
{
case '$':
{
if(!(1 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от $1.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за $%s. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
SetPVarInt(giveplayerid, "SellHouse_Currency", '$');

format(string, sizeof string,"Ты предложил купить дом игроку %s за $%s.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);

}
case 'м', 'М', 'm', 'M':
{
if(!(100 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 100 материалов.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s материалов. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
SetPVarInt(giveplayerid, "SellHouse_Currency", 'M');

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s материалов.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
}
case 'd', 'D':
{
if(!(1 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 1 грамма наркотиков");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s грамм нарко. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
SetPVarInt(giveplayerid, "SellHouse_Currency", 'D');

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s грамм нарко.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
}
}
SetPVarInt(giveplayerid, "BUYHOME", playerid);
SetPVarInt(giveplayerid, "BUYCENA", price);
}
return true;
}

Подтверждение покупки:

if(strcmp(accept, "house", true) == 0)
{
if(GetPVarType(playerid, "BUYHOME") == PLAYER_VARTYPE_NONE)
return SendClientMessage(playerid, COLOR_GREY, !"Вам не кто не предлогал купить дом.");

new price = GetPVarInt(playerid, "BUYCENA"),
sellpl = GetPVarInt(playerid,"BUYHOME");
DeletePVar(playerid,"BUYHOME");
DeletePVar(playerid,"BUYCENA");

if(pInfo[playerid][pMoney] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно средств.");

if(pInfo[playerid][pMats] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно материалов.");

if(pInfo[playerid][pDrugs] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно наркотиков.");

switch(GetPVarInt(playerid, "SellHouse_Currency"))
{
case '$':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d$.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d$.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMoney] -= price;
pInfo[sellpl][pMoney] += price;
}
case 'M':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d материалов.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d материалов.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMats] -= price;
pInfo[sellpl][pMats] += price;
}
case 'D':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d грамм нарко.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d грамм нарко.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pDrugs] -= price;
pInfo[sellpl][pDrugs] += price;
}
}
new houseid = pInfo[playerid][pHouse] = pInfo[sellpl][pHouse];
pInfo[sellpl][pHouse] = HouseInfo[houseid][hOwner][0] = 0;

format(HouseInfo[houseid][hOwner], MAX_PLAYER_NAME, pInfo[playerid][pName]);

format(string, sizeof(string), "UPDATE accounts AS owner, accounts AS buyer SET buyer.house = owner.house, owner.house = 0 WHERE owner.id = %i AND buyer.id = %i", pInfo[sellpl][pID], pInfo[playerid][pID]);
mysql_tquery(mysql_connect_ID, string, "", "");
printf(string);

format(string, sizeof(string), "UPDATE house SET owner = '%s', owned = 1 WHERE id = %i",pInfo[playerid][pName], HouseInfo[houseid][hID]-1);
mysql_tquery(mysql_connect_ID, string, "", "");
printf(string);

UpdateHouse(pInfo[playerid][pHouse]);

DeletePVar(playerid, "SellHouse_Currency");
}

UpdateHouse

stock UpdateHouse(houseid)
{
if(!(0 <= houseid < sizeof(HouseInfo)))
return 0;

static const h_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}Нет\n{FFDEAD}Стоимость: {FFFFFF}%d\n{FFDEAD}Уровень: {FFFFFF}%d";
static const h_not_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}%s\n{FFDEAD}Уровень: {FFFFFF}%d";

new h_buff[sizeof(h_null) + ((3-2) + (24-2) + (20-2) + (5-2))];
DestroyDynamicMapIcon(HouseInfo[houseid][hMapicon]);
DestroyPickup(HouseInfo[houseid][hPickup]);
Delete3DTextLabel(HouseInfo[houseid][hText]);
if(!HouseInfo[houseid][hOwned])
{
format(h_buff, sizeof(h_buff), h_null, HouseInfo[houseid][hID], HouseInfo[houseid][hPrice],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1273, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0x008080FF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7, 0);
HouseInfo[houseid][hMapicon] = CreateDynamicMapIcon(HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 31, COLOR_WHITE, 0, -1, -1, 100.0);
}
else
{
format(h_buff, sizeof(h_buff), h_not_null, HouseInfo[houseid][hID], HouseInfo[houseid][hOwner],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1272, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0xFFFFFF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7.0, 0);
}
return 1;
}

DeimoS
15.05.2017, 04:10
Ну смотри. При покупке дома ты делаешь следующее:

pInfo[playerid][pHouse] = house+1;
При том, что обновление происходит так

UpdateHouse(house);

А при продаже ты делаешь так:

UpdateHouse(pInfo[playerid][pHouse]);

Всё ещё уверен, что ID указан верно?

Skyline
15.05.2017, 11:29
Сейчас сделал, все ID записываются, выводит все верно, но название изменяется все так же, только после рестарта..

[10:44:19] UPDATE accounts SET house = '3' WHERE id = 24
[10:44:19] UPDATE accounts SET house = '0' WHERE id = 21
[10:44:19] UPDATE house SET owner = 'Kentavr' WHERE id = 3
[10:44:19] 3

Изменил на:

UpdateHouse(HouseInfo[houseid][hID]-1);

При логировании данным образом, изменяется тоже нужный ID.

Я уже не знаю за что цепляться :D ID везде верный записывается, ник записывается, но как говорится, не проигрывается сразу) Все происходит только после рестарта.

DeimoS
15.05.2017, 13:39
А с чего ты так уверен, что ID дома на сервере идентичен ID дома в таблице?
Не нужно ни к чему цепляться. Нужно просто логировать и смотреть какие данные появляются на входе и к каким данным ты обращаешься на выходе.

Короче, залогируй загрузку дома по принципу

printf("%i) %s", id_дома, владелец);
Продай дом и скинь логи вместе с кодом загрузки домов

Skyline
15.05.2017, 15:27
Вот первый запуск с логами:

[14:21:58] ID дома 1 | Владелец None
[14:21:58] ID дома 2 | Владелец None
[14:21:58] ID дома 3 | Владелец Kentavr
[14:21:58] ID дома 4 | Владелец None
[14:21:58] [ЗАГРУЖЕНО ДОМОВ]: <4>

Сделал продажу:

[14:24:37] UPDATE accounts SET house = '3' WHERE id = 21
[14:24:37] UPDATE accounts SET house = '0' WHERE id = 24
[14:24:37] UPDATE house SET owner = 'Kent_No' WHERE id = 3
[14:24:37] ID дома 3

Ну и после рестарта сервера:

[14:24:51] ID дома 1 | Владелец None
[14:24:51] ID дома 2 | Владелец None
[14:24:51] ID дома 3 | Владелец Kent_No
[14:24:51] ID дома 4 | Владелец None
[14:24:51] [ЗАГРУЖЕНО ДОМОВ]: <4>

Код загрузки:

forward LoadHouse();
public LoadHouse()
{
new rows;
cache_get_row_count(rows);
if(rows)
{
static const h_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}Нет\n{FFDEAD}Стоимость: {FFFFFF}%d\n{FFDEAD}Уровень: {FFFFFF}%d";
static const h_not_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}%s\n{FFDEAD}Уровень: {FFFFFF}%d";

new h_buff[sizeof(h_null) + ((3-2) + (24-2) + (20-2) + (5-2))];

for(new h = 0; h < rows; h++)
{
cache_get_value_name_int(h,"id",HouseInfo[h][hID]);
cache_get_value_name(h,"owner",HouseInfo[h][hOwner],MAX_PLAYER_NAME);
cache_get_value_name_int(h, "owned", HouseInfo[h][hOwned]);
cache_get_value_name_float(h, "enter_pos_x", HouseInfo[h][henter_pos_x]);
cache_get_value_name_float(h, "enter_pos_y", HouseInfo[h][henter_pos_y]);
cache_get_value_name_float(h, "enter_pos_z", HouseInfo[h][henter_pos_z]);
cache_get_value_name_float(h, "exit_pos_x", HouseInfo[h][hexit_pos_x]);
cache_get_value_name_float(h, "exit_pos_y", HouseInfo[h][hexit_pos_y]);
cache_get_value_name_float(h, "exit_pos_z", HouseInfo[h][hexit_pos_z]);
cache_get_value_name_int(h, "price", HouseInfo[h][hPrice]);
cache_get_value_name_int(h, "level", HouseInfo[h][hLevel]);
cache_get_value_name_int(h, "interer", HouseInfo[h][hInt]);
cache_get_value_name_float(h, "car_pos_x", HouseInfo[h][hcar_pos_x]);
cache_get_value_name_float(h, "car_pos_y", HouseInfo[h][hcar_pos_y]);
cache_get_value_name_float(h, "car_pos_z", HouseInfo[h][hcar_pos_z]);
cache_get_value_name_float(h, "car_pos_angle", HouseInfo[h][hcar_pos_angle]);
cache_get_value_name_int(h, "vehicle", HouseInfo[h][hHouse_Car]);
cache_get_value_name_int(h, "veh_color_1", HouseInfo[h][hCar_Color_1]);
cache_get_value_name_int(h, "veh_color_2", HouseInfo[h][hCar_Color_2]);

TOTALHOUSE++;

printf("ID дома %i | Владелец %s", HouseInfo[h][hID], HouseInfo[h][hOwner]);
if(!HouseInfo[h][hOwned])
{
format(h_buff, sizeof(h_buff), h_null, HouseInfo[h][hID], HouseInfo[h][hPrice],HouseInfo[h][hLevel]);
HouseInfo[h][hPickup] = CreatePickup(1273, 1, HouseInfo[h][henter_pos_x], HouseInfo[h][henter_pos_y], HouseInfo[h][henter_pos_z], -1);
HouseInfo[h][hText] = Create3DTextLabel(h_buff, 0x008080FF, HouseInfo[h][henter_pos_x], HouseInfo[h][henter_pos_y], HouseInfo[h][henter_pos_z], 7, 0);
HouseInfo[h][hMapicon] = CreateDynamicMapIcon(HouseInfo[h][henter_pos_x], HouseInfo[h][henter_pos_y], HouseInfo[h][henter_pos_z], 31, COLOR_WHITE, 0, -1, -1, 100.0);
}
else
{
format(h_buff, sizeof(h_buff), h_not_null, HouseInfo[h][hID], HouseInfo[h][hOwner],HouseInfo[h][hLevel]);
HouseInfo[h][hPickup] = CreatePickup(1272, 1, HouseInfo[h][henter_pos_x], HouseInfo[h][henter_pos_y], HouseInfo[h][henter_pos_z], -1);
HouseInfo[h][hText] = Create3DTextLabel(h_buff, 0xFFFFFF, HouseInfo[h][henter_pos_x], HouseInfo[h][henter_pos_y], HouseInfo[h][henter_pos_z], 7.0, 0);
}
}
}
printf("[ЗАГРУЖЕНО ДОМОВ]: <%d>", TOTALHOUSE);
return 1;
}

DeimoS
15.05.2017, 15:43
А посмотреть на код обновления информации о доме никак?
При загрузке тебя должно интересовать значение переменной h, а не hID. Переделай логирование на эту информацию

Skyline
15.05.2017, 15:52
printf("ID дома %i | Владелец %s", h, HouseInfo[h][hOwner]);

[14:52:20] ID дома 0 | Владелец None
[14:52:20] ID дома 1 | Владелец None
[14:52:20] ID дома 2 | Владелец Kent_No
[14:52:20] ID дома 3 | Владелец None

После продажи:

[14:53:42] ID дома 0 | Владелец None
[14:53:42] ID дома 1 | Владелец None
[14:53:42] ID дома 2 | Владелец Kentavr
[14:53:42] ID дома 3 | Владелец None
[14:53:42] [ЗАГРУЖЕНО ДОМОВ]: <4>

DeimoS
15.05.2017, 16:01
А сам лог продажи? Ну запрос и то, какой ID в UpdateHouse пришёл.
Заодно и код UpdateHouse скинь ещё раз

Skyline
15.05.2017, 16:08
Ну лог такой же как и был:

[14:53:21] UPDATE accounts SET house = '3' WHERE id = 24
[14:53:21] UPDATE accounts SET house = '0' WHERE id = 21
[14:53:21] UPDATE house SET owner = 'Kentavr' WHERE id = 3
[14:53:21] ID дома 3

И код:

stock UpdateHouse(houseid)
{
if(!(0 <= houseid < sizeof(HouseInfo)))
return 0;

static const h_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}Нет\n{FFDEAD}Стоимость: {FFFFFF}%d\n{FFDEAD}Уровень: {FFFFFF}%d";
static const h_not_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}%s\n{FFDEAD}Уровень: {FFFFFF}%d";

new h_buff[sizeof(h_null) + ((3-2) + (24-2) + (20-2) + (5-2))];
DestroyDynamicMapIcon(HouseInfo[houseid][hMapicon]);
DestroyPickup(HouseInfo[houseid][hPickup]);
Delete3DTextLabel(HouseInfo[houseid][hText]);
if(!HouseInfo[houseid][hOwned])
{
format(h_buff, sizeof(h_buff), h_null, HouseInfo[houseid][hID], HouseInfo[houseid][hPrice],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1273, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0x008080FF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7, 0);
HouseInfo[houseid][hMapicon] = CreateDynamicMapIcon(HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 31, COLOR_WHITE, 0, -1, -1, 100.0);
}
else
{
format(h_buff, sizeof(h_buff), h_not_null, HouseInfo[houseid][hID], HouseInfo[houseid][hOwner],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1272, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0xFFFFFF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7.0, 0);
}
return 1;
}

DeimoS
15.05.2017, 16:18
Ну так тебя ничего не напрягает?


[14:52:20] ID дома 0 | Владелец None
[14:52:20] ID дома 1 | Владелец None
[14:52:20] ID дома 2 | Владелец Kent_No
[14:52:20] ID дома 3 | Владелец None


[14:53:21] UPDATE accounts SET house = '3' WHERE id = 24
[14:53:21] UPDATE accounts SET house = '0' WHERE id = 21
[14:53:21] UPDATE house SET owner = 'Kentavr' WHERE id = 3
[14:53:21] ID дома 3

Skyline
15.05.2017, 16:20
Да я уже понял, но при загрузке не пойму как сделать чтобы с 1 ID начинался цикл.

DeimoS
15.05.2017, 16:35
Эмм, что? Зачем трогать загрузку, когда дело в данных, что ты передаёшь при продаже?
Пробуй

if(strcmp(accept, "house", true) == 0)
{
if(GetPVarType(playerid, "BUYHOME") == PLAYER_VARTYPE_NONE)
return SendClientMessage(playerid, COLOR_GREY, !"Вам не кто не предлогал купить дом.");

new price = GetPVarInt(playerid, "BUYCENA"),
sellpl = GetPVarInt(playerid,"BUYHOME");
DeletePVar(playerid,"BUYHOME");
DeletePVar(playerid,"BUYCENA");

if(pInfo[playerid][pMoney] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно средств.");

if(pInfo[playerid][pMats] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно материалов.");

if(pInfo[playerid][pDrugs] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно наркотиков.");

switch(GetPVarInt(playerid, "SellHouse_Currency"))
{
case '$':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d$.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d$.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMoney] -= price;
pInfo[sellpl][pMoney] += price;
}
case 'M':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d материалов.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d материалов.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMats] -= price;
pInfo[sellpl][pMats] += price;
}
case 'D':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d грамм нарко.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d грамм нарко.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pDrugs] -= price;
pInfo[sellpl][pDrugs] += price;
}
}
new houseid = HouseInfo[(pInfo[playerid][pHouse] = pInfo[sellpl][pHouse])][hID]-1;//Нереальное порно
pInfo[sellpl][pHouse] = HouseInfo[houseid][hOwner][0] = 0;

format(HouseInfo[houseid][hOwner], MAX_PLAYER_NAME, pInfo[playerid][pName]);

format(string, sizeof(string), "UPDATE accounts AS owner, accounts AS buyer SET buyer.house = owner.house, owner.house = 0 WHERE owner.id = %i AND buyer.id = %i", pInfo[sellpl][pID], pInfo[playerid][pID]);
mysql_tquery(mysql_connect_ID, string, "", "");
printf(string);

format(string, sizeof(string), "UPDATE house SET owner = '%s', owned = 1 WHERE id = %i",pInfo[playerid][pName], houseid);
mysql_tquery(mysql_connect_ID, string, "", "");
printf(string);

UpdateHouse(houseid);

DeletePVar(playerid, "SellHouse_Currency");
}

Skyline
15.05.2017, 16:45
Работает) Спасибо, но иконки на карте так и не обновляются.
Ну с этим думаю разберусь)

DeimoS
15.05.2017, 16:52
Ты не создаёшь иконку, если дом куплен :)

stock UpdateHouse(houseid)
{
if(!(0 <= houseid < sizeof(HouseInfo)))
return 0;

static const h_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}Нет\n{FFDEAD}Стоимость: {FFFFFF}%d\n{FFDEAD}Уровень: {FFFFFF}%d";
static const h_not_null[] = "{FFDEAD}ID: {FFFFFF}[%d]\n{FFDEAD}Владелец: {FFFFFF}%s\n{FFDEAD}Уровень: {FFFFFF}%d";

new h_buff[sizeof(h_null) + ((3-2) + (24-2) + (20-2) + (5-2))];
DestroyDynamicMapIcon(HouseInfo[houseid][hMapicon]);
DestroyPickup(HouseInfo[houseid][hPickup]);
Delete3DTextLabel(HouseInfo[houseid][hText]);
if(!HouseInfo[houseid][hOwned])
{
format(h_buff, sizeof(h_buff), h_null, HouseInfo[houseid][hID], HouseInfo[houseid][hPrice],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1273, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0x008080FF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7, 0);
HouseInfo[houseid][hMapicon] = CreateDynamicMapIcon(HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 31, COLOR_WHITE, 0, -1, -1, 100.0);
}
else
{
format(h_buff, sizeof(h_buff), h_not_null, HouseInfo[houseid][hID], HouseInfo[houseid][hOwner],HouseInfo[houseid][hLevel]);
HouseInfo[houseid][hPickup] = CreatePickup(1272, 1, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], -1);
HouseInfo[houseid][hText] = Create3DTextLabel(h_buff, 0xFFFFFF, HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 7.0, 0);
HouseInfo[houseid][hMapicon] = CreateDynamicMapIcon(HouseInfo[houseid][henter_pos_x], HouseInfo[houseid][henter_pos_y], HouseInfo[houseid][henter_pos_z], 32, COLOR_WHITE, 0, -1, -1, 100.0);
}
return 1;
}

С ID модели мог ошибиться