PDA

Просмотр полной версии : [Вопрос] цикл + действие



Эдуард
10.04.2017, 20:46
Здравствуйте, возник такой вопрос, у меня есть система личного транспорта, есть команда /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]?

VVWVV
10.04.2017, 21:03
Используйте listitem.

Эдуард
10.04.2017, 21:23
Используйте listitem.

Использовал, не той тачки координаты выдал)

VVWVV
10.04.2017, 21:29
Использовал, не той тачки координаты выдал)

Упс... не полностью прочитал тему.

DeimoS
10.04.2017, 21:55
+- так можно попробовать

new buff[3];
strmid(buff, inputtext, 1, strfind(inputtext, " ", true, 1));
new id = strval(buff);
Только не уверен, что "\t" = пробел и нет возможности проверить

wAx
11.04.2017, 15:24
+- так можно попробовать

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;
}
}

Эдуард
11.04.2017, 16:49
в 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( всего три автомобиля), тогда он укажет не те координаты

wAx
11.04.2017, 17:16
показывай диалог заново после удаления

Эдуард
11.04.2017, 17:25
показывай диалог заново после удаления


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]);
}

}
}

Что не так в коде? Он не те машины определяет