Всем привет! В общем, работаю над survival-модом.
Столкнулся со следующей проблемой. Есть функция, определяющая ID ближайшего "лута".
Код:
stock GetIDLoot(playerid)
{
for(new i=0; i<MAX_LOOT; i++)
{
if(IsPlayerInRangeOfPoint(playerid,1.1, LootInfo[i][xLoot],LootInfo[i][yLoot],LootInfo[i][zLoot]))
{
return i;
}
}
return 0;
}
Она определяет [!] только 1 ближайший ID лута. Идем далее.
Функция подбора лута
Код:
if(newkeys & KEY_NO)
{
if(!IsPlayerInAnyVehicle(playerid))
{
if(IsPlayerInRangeOfPoint(playerid,1.1,LootInfo[GetIDLoot(playerid)][xLoot],LootInfo[GetIDLoot(playerid)][yLoot],LootInfo[GetIDLoot(playerid)][zLoot]))
{
DisplayLootDialogForPlayer(playerid);
}
}
}
Само форматирование диалога
Код:
public DisplayLootDialogForPlayer(playerid)
{
new fmt[MAX_LOOT_NAME];
format(fmt,sizeof(fmt),"1\t%s",LootInfo[GetIDLoot(playerid)][nameLoot]);
ShowPlayerDialog(playerid,DIALOG_LOOT,DIALOG_STYLE_LIST,"Подбор предмета",fmt,"Взять","Не взять");
return 1;
}
Ну и вот в чем суть. Среди кучи айтемов (20+) довольно сложно угадать координаты нужного лута и встать к нему близко. Я решил сделать подбор всего лежащего поблизости лута (т.е чтобы в диалоге форматировались и отображались все близлежайшие предметы). Я решил немного поменять логику функций (лучше бы свою логику как-то можно было поменять). Создав переменную, отвечающую за хранение ИДа предыдущего лута, я проверял , совпадает ли этот ид с полученным в рез-тате работы функции (знаю,что быдлокод и можно лучше, но мне нужен был хоть какой-нибудь результат для того чтобы получить возможность переписать функцию)
Код:
if(lootid[playerid] == i) continue;
и пропускал итерацию в случае этого. Это дало возможность просмотреть 2 близлежаших лута, но не больше. Т.к функция просто переходила к прошлому айдишнику , т.к он не равен записанному в переменную. И таким образом, содержание списка просто дублировалось по типу: Аптечка М4 Аптечка М4 Аптечка М4.
Уже попробовал все различные способы. Прошу помочь в решении проблемы. Надеюсь, все ясно объяснил