PDA

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



_MegaMix_
11.01.2017, 17:22
Здравствуйте, возникла такая проблема - у меня есть массив в котором записаны иды и координаты пикапов, с него идёт создание для каждого игрока и собственно сохранение и считывание при дальнейшей загрузке:


При регистрации игрока :

new str[250];
for(new i = 0; i < ArtefaktPiCkUpS;i ++)
{
if( i < (ArtefaktPiCkUpS-1) ) strcat(str, "0 ");
else strcat(str, "0");
PlayerInfo[playerid][PlayerPickup][i] = CreateDynamicPickup(ArtZones[i][ObjID], 23, ArtZones[i][CoordPick][0], ArtZones[i][CoordPick][1], ArtZones[i][CoordPick][2], -1, -1, playerid);
}

сток

Pick_SaveInfo(playerid)
{
new string[350], str[256];
strcat(string, "UPDATE `Accounts` SET `Upped` = '");
for(new i = 0; i < ArtefaktPiCkUpS;i ++)
{
if( i < (ArtefaktPiCkUpS-1) ) format(str, sizeof(str), "%d ", UppedArtefaktPiCkUpS[playerid][i]);
else format(str, sizeof(str), "%d", UppedArtefaktPiCkUpS[playerid][i]);
strcat(string, str);
}
format(str, sizeof(str), "', `AllPick` = '%d' WHERE `Nickname` = '%s'", PlayerInfo[playerid][AllPick], PlayerInfo[playerid][pName]);
strcat(string, str);
mysql_tquery(MYSQL_ARG, string, "", "");
return true;
}

сам подбор:

public OnPlayerPickUpDynamicPickup(playerid, pickupid)
{
for(new i = 0; i < ArtefaktPiCkUpS; i++)
if(pickupid == PlayerInfo[playerid][PlayerPickup][i])
{
PlayerInfo[playerid][AllPick]++;
UppedArtefaktPiCkUpS[playerid][i] = 1;
DestroyDynamicPickup(PlayerInfo[playerid][PlayerPickup][i]);
Pick_SaveInfo(playerid);
new string[144];
if(PlayerInfo[playerid][AllPick] == ArtefaktPiCkUpS)
{
SendClientMessageToAll(0xCC6699FF,string);
GivePlayerMoney(playerid, 1000000*COMBO_PREDMER_EARN);
}
else
{
GivePlayerMoney(playerid, (ArtZones[i][ObjID]*random(7))*COMBO_PREDMER_EARN);
}
break;
}
return 1;
}

При коннекте и дисконнекте обнуляю:

PlayerInfo[playerid][AllPick] = 0;
for(new i = 0; i < ArtefaktPiCkUpS;i ++)
UppedArtefaktPiCkUpS[playerid][i] = 0;

И собственно сама загрузка:



if(PlayerInfo[playerid][AllPick] != ArtefaktPiCkUpS)
{
new result[ArtefaktPiCkUpS];//+1
cache_get_field_content(0, "Upped", result, MYSQL_ARG, sizeof(result));
sscanf(result, "a<i>[115]", UppedArtefaktPiCkUpS[playerid]);
for(new i = 0; i < ArtefaktPiCkUpS; i++)
if(UppedArtefaktPiCkUpS[playerid][i] == 0)
PlayerInfo[playerid][PlayerPickup][i] = CreateDynamicPickup(ArtZones[i][ObjID], 23, ArtZones[i][CoordPick][0], ArtZones[i][CoordPick][1], ArtZones[i][CoordPick][2], -1, -1, playerid);
}

Но дело в том, что можно подбирать уже собранные пикапы при перезаходе, что не так в коде?

qwezert
11.01.2017, 18:21
Но дело в том, что можно подбирать уже собранные пикапы при перезаходе, что не так в коде?
А нельзя обновлять информацию о поднятом пикапе запросом в БД прямо при его поднятии?

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

Я просто в этом коде чет вообще разобрать нормально ничего не могу, поэтому задам вопрос, а каким образом ты проверяешь тот или другой пикап был поднят и сохраняешь в БД если у тебя в БД id записей отличаются от id пикапа в моде + при создании они могут иметь отличающийся id .

_MegaMix_
11.01.2017, 18:50
А нельзя обновлять информацию о поднятом пикапе запросом в БД прямо при его поднятии?

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

Я просто в этом коде чет вообще разобрать нормально ничего не могу, поэтому задам вопрос, а каким образом ты проверяешь тот или другой пикап был поднят и сохраняешь в БД если у тебя в БД id записей отличаются от id пикапа в моде + при создании они могут иметь отличающийся id .

При подборе присваиваю единицу и сохраняю, а при загрузке загружает пикапы равные 0

UppedArtefaktPiCkUpS[playerid][i] = 1;
DestroyDynamicPickup(PlayerInfo[playerid][PlayerPickup][i]);
Pick_SaveInfo(playerid);

qwezert
11.01.2017, 20:04
Как ты потом проверяешь - какие пикапы были подобраны а какие нет?

_MegaMix_
11.01.2017, 20:30
Как ты потом проверяешь - какие пикапы были подобраны а какие нет?

При повторной загрузке аккаунта - код не должен дать загрузиться уже подобранным пикапам, поэтому проверка при подборе на то что подборал игрок или нет - отсутствует


new result[ArtefaktPiCkUpS];//+1
cache_get_field_content(0, "Upped", result, MYSQL_ARG, sizeof(result));
sscanf(result, "a<i>[115]", UppedArtefaktPiCkUpS[playerid]);
for(new i = 0; i < ArtefaktPiCkUpS; i++)
if(UppedArtefaktPiCkUpS[playerid][i] == 0)

qwezert
11.01.2017, 22:30
При повторной загрузке аккаунта - код не должен дать загрузиться уже подобранным пикапам, поэтому проверка при подборе на то что подборал игрок или нет - отсутствует


new result[ArtefaktPiCkUpS];//+1
cache_get_field_content(0, "Upped", result, MYSQL_ARG, sizeof(result));
sscanf(result, "a<i>[115]", UppedArtefaktPiCkUpS[playerid]);
for(new i = 0; i < ArtefaktPiCkUpS; i++)
if(UppedArtefaktPiCkUpS[playerid][i] == 0)

В том и вопрос, как ты узнаешь - какие пикапы были подобраны? Когда ты создаешь пикап на сервере через мод - он со своим id, в то же время загружаю из БД ты загружаешь id из БД которые не соответствуют id созданым на сервере.

_MegaMix_
12.01.2017, 19:26
В том и вопрос, как ты узнаешь - какие пикапы были подобраны? Когда ты создаешь пикап на сервере через мод - он со своим id, в то же время загружаю из БД ты загружаешь id из БД которые не соответствуют id созданым на сервере.

Эм, идёт цикл при котором создаются, в бд они записываются вот так:


0 0 0 0 1 0 1 0 0 0
0 0 0 1 0 0 0 0 0 1

Через sscanf я и загружаю их в дальнейшем по порядку проверяя равны ли они 0.

Но собственно если я не так делаю, то как нужно тогда?

qwezert
13.01.2017, 11:56
Эм, идёт цикл при котором создаются, в бд они записываются вот так:


0 0 0 0 1 0 1 0 0 0
0 0 0 1 0 0 0 0 0 1

Через sscanf я и загружаю их в дальнейшем по порядку проверяя равны ли они 0.

Но собственно если я не так делаю, то как нужно тогда?

Ты все равно не понял. Вот игрок встает на пикап, у пикапа на сервере id допустим 12. Ты хочешь сохранить в БД - что этот пикап подобран, но в бд у тебя лежит всего 11 пикапов и начинаются они с id 0. Как ты узнаешь - какому пикапу в БД присваивать что он подобран или не подобран?

_MegaMix_
13.01.2017, 14:28
Ты все равно не понял. Вот игрок встает на пикап, у пикапа на сервере id допустим 12. Ты хочешь сохранить в БД - что этот пикап подобран, но в бд у тебя лежит всего 11 пикапов и начинаются они с id 0. Как ты узнаешь - какому пикапу в БД присваивать что он подобран или не подобран?

И как тогда нужно узнавать?

qwezert
13.01.2017, 14:55
И как тогда нужно узнавать?

Ну насколько я понимаю - тут все попроще будет. При загрузке пикапов сохраняй в массив с пикапами - их ID из бд. Когда игрок будет вставать на пикап - доставай их БДшный ID из ячейки и отправляй запрос на изменение. И можно упростить тот код который ты написал)

_MegaMix_
13.01.2017, 17:26
Ну насколько я понимаю - тут все попроще будет. При загрузке пикапов сохраняй в массив с пикапами - их ID из бд. Когда игрок будет вставать на пикап - доставай их БДшный ID из ячейки и отправляй запрос на изменение. И можно упростить тот код который ты написал)

в паблик пикапов

for(new i = 0; i < ArtefaktPiCkUpS; i++)
if(pickupid == PlayerInfo[playerid][PlayerPickup][i])
{
new string[92];
format(string,sizeof(string), "SELECT * FROM `HideThings` WHERE `ID` = '%d' AND `Nick` = '%s'",PlayerInfo[playerid][PlayerPickup][i],PlayerInfo[playerid][pName]);
mysql_tquery(MYSQL_ARG, string, "CheckThings", "ds", i, playerid);
break;
}

проверка


forward CheckThings(i, playerid);
public CheckThings(i, playerid)
{
new rows, fields;
cache_get_data(rows, fields);
if(rows)
{
new check_id;
check_id = cache_get_field_content_int(i,"ID");
if(check_id == i)return SendClientMessage(playerid, 0xCC6699FF,"Вы уже собирали эту вещь!");
}
else
{
PlayerInfo[playerid][AllPick]++;
UppedArtefaktPiCkUpS[playerid][i] = 1;
DestroyDynamicPickup(PlayerInfo[playerid][PlayerPickup][i]);
Pick_SaveInfo(playerid);
new string[144];
if(PlayerInfo[playerid][AllPick] == ArtefaktPiCkUpS)
{
GivePlayerMoney(playerid, 1000000*COMBO_PREDMER_EARN);
}
else
{
GivePlayerMoney(playerid, (ArtZones[i][ObjID]*random(7))*COMBO_PREDMER_EARN);
new squery[512];
format(squery,sizeof(squery),"INSERT INTO `HideThings` (`ID`,`Nick`) VALUES ('%d','%s')",i,PlayerInfo[playerid][pName]);
mysql_tquery(MYSQL_ARG, squery, "", "");
}
}
return 1;
}

Как то так?)

qwezert
13.01.2017, 17:50
Просто если у тебя пикапы разных типов - то тебе нужно в бд хранить всю инфу о пикапе координаты, его тип, что бы ты потом мог проверить - на тот ли ты пикап встал.

_MegaMix_
14.01.2017, 16:31
Просто если у тебя пикапы разных типов - то тебе нужно в бд хранить всю инфу о пикапе координаты, его тип, что бы ты потом мог проверить - на тот ли ты пикап встал.

пикапы одного типа, иды пикапов и координаты берутся с массива, ну так по коду выше, всё верно или нет?

_MegaMix_
14.01.2017, 19:37
Собственно сделал по твоему способу, всё отлично работает, спасибо) тему можно закрыть!)