Просмотр полной версии : [Вопрос] цикл + действие
Здравствуйте, возник такой вопрос, у меня есть система личного транспорта, есть команда /cars где циклом показываются все автомобили твои, и при нажатии на какую-то из них открывается диалог с действиями, так вот тут и случилась проблема, при клике на тачку мне нужно получить ид этой машины(именно на ту что кликнул), но непонятно как((
COMMAND:cars(playerid,params[])
{
new
veh_doors_status[8];
new string[(1 + 5 + 32 + sizeof(veh_doors_status[]) )*5];
string = "ID\tМодель\tДвери";
for(new i = 0; i < AllPrivateCars; i++)
{
switch(cInfo[i][vdoors])
{
case 0: veh_doors_status = "Закрыты";
case 1: veh_doors_status = "Открыты";
}
if(!strcmp(cInfo[i][cOwner],player[playerid][player_name],false))
{
if(i < 5)
{
format(string, sizeof(string), "%s\n№%d\t%s\t%s", string,i+1, VehicleNames[cInfo[i][cModel] - 400], veh_doors_status);
}
}
}
ShowPlayerDialog(playerid, 8888,DIALOG_STYLE_TABLIST_HEADERS,"тачки",string,"Выбрать", "Закрыть");
return true;
}
Я хочу получить например координату этой машины на которую кликнул, но какой параметр указывать тут: cInfo[параметр][xcx]?
Используйте listitem.
Использовал, не той тачки координаты выдал)
Использовал, не той тачки координаты выдал)
Упс... не полностью прочитал тему.
+- так можно попробовать
new buff[3];
strmid(buff, inputtext, 1, strfind(inputtext, " ", true, 1));
new id = strval(buff);
Только не уверен, что "\t" = пробел и нет возможности проверить
+- так можно попробовать
new buff[3];
strmid(buff, inputtext, 1, strfind(inputtext, " ", true, 1));
new id = strval(buff);
Только не уверен, что "\t" = пробел и нет возможности проверить
в inputtext запишет только символы до \t (не включительно)
в форматировании будет
124\tVehicleName\tEweparametr
т.е в диалоге в строчке будет
124 VehicleName Eweparametr
в inputtext при клике, выведет только 124
т.е разумно будет поместить ID автомобиля (необходимый для использования в переменной) на место первого столбца, либо записывать в перменную при показе диалога по типу
_listitem[0][playerid] = vInfo[ID][vID];
ShowPlayerDialog...
OnDialogResponse()
{
case nujniy_dialog:
{
//использование
new string[20];
format(string,sizeof(string), "ID авто %d", _listitem[listitem][playerid]);
SendClientMessage(playerid, -1, string);
return 1;
}
}
в inputtext запишет только символы до \t (не включительно)
в форматировании будет
124\tVehicleName\tEweparametr
т.е в диалоге в строчке будет
124 VehicleName Eweparametr
в inputtext при клике, выведет только 124
т.е разумно будет поместить ID автомобиля (необходимый для использования в переменной) на место первого столбца, либо записывать в перменную при показе диалога по типу
_listitem[0][playerid] = vInfo[ID][vID];
ShowPlayerDialog...
OnDialogResponse()
{
case nujniy_dialog:
{
//использование
new string[20];
format(string,sizeof(string), "ID авто %d", _listitem[listitem][playerid]);
SendClientMessage(playerid, -1, string);
return 1;
}
}
Сделал по такому принципу всё работает, но что если ты удалишь автомобиль например 2( всего три автомобиля), тогда он укажет не те координаты
показывай диалог заново после удаления
показывай диалог заново после удаления
COMMAND:vmenu(playerid,params[])
{
new
veh_doors_status[8];
new string[(1 + 5 + 32 + sizeof(veh_doors_status[]) )*5];
string = "ID\tМодель\tДвери";
for(new i = 0; i < AllPrivateCars; i++)
{
switch(cInfo[i][vdoors])
{
case 0: veh_doors_status = "Закрыты";
case 1: veh_doors_status = "Открыты";
}
if(!strcmp(cInfo[i][cOwner],player[playerid][player_name],false))
{
switch(i)
{
case 0: vehID[playerid][0] = cInfo[i][cCarID];
case 1: vehID[playerid][1] = cInfo[i][cCarID];
case 2: vehID[playerid][2] = cInfo[i][cCarID];
case 3: vehID[playerid][3] = cInfo[i][cCarID];
case 4: vehID[playerid][4] = cInfo[i][cCarID];
}
if(i == 0 || i < 6)
{
format(string, sizeof(string), "%s\n№%d\t%s\t%s", string,cInfo[i][cCarID], VehicleNames[cInfo[i][cModel] - 400], veh_doors_status);
}
else
{
ShowPlayerDialog(playerid, 8888,DIALOG_STYLE_TABLIST_HEADERS,"Список личного транспорта","ПУСТО","Выбрать", "Закрыть");
break;
}
}
}
ShowPlayerDialog(playerid, 8888,DIALOG_STYLE_TABLIST_HEADERS,"Список личного транспорта",string,"Выбрать", "Закрыть");
return true;
}
case 8888:
{
if(response == 0)
return 1;
switch(listitem)
{
case 0: SetPVarInt(playerid, "VehID", 1);
case 1: SetPVarInt(playerid, "VehID", 2);
case 2: SetPVarInt(playerid, "VehID", 3);
case 3: SetPVarInt(playerid, "VehID", 4);
case 4: SetPVarInt(playerid, "VehID", 5);
}
показ след диалога (8889)
}
case 8889:
{
if(response == 0)
return callcmd::vmenu(playerid,"");
new id = GetPVarInt(playerid, "VehID");
new idx = vehID[playerid][id];
switch(listitem)
{
case 0:
{
SetPlayerCheckpoint(playerid, cInfo[idx][xcx], cInfo[idx][xcy], cInfo[idx][xcz], 3.0);
printf("dialog8889 = %d", cInfo[idx][cCarID]);
}
}
}
Что не так в коде? Он не те машины определяет
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot