Ко всем new:
PHP код:
const
DLG_ARMY_TRANSPORT_LOCK = 11001, // если этот ID диалога уже занят, замените на свободный
MAX_ARMY_VEH_NAME = 12;
new
vehicle_info[4 char];
enum
e_ARMY_VEH_INFO
{
armyVehName[MAX_ARMY_VEH_NAME],
armyVehID
};
static const
ArmyVehicles[][e_ARMY_VEH_INFO] =
{
{{"Sea Sparrow"}, 447},
{{"Rhino"}, 432},
{{"Hydra"}, 520},
{{"Hunter"}, 425}
};
Всего транспортов, доступных для открытия / закрытия: 4. Вы можете добавить свою модель транспорта, если вам это нужно.
В диалоге будет показываться состояния транспортов, их всего два:
- Транспорт может быть [Закрыт]
- Транспорт может быть [Открыт]
Создадим функцию, которая будет открывать диалог игроку (так как диалог будет использоваться не один раз).
В конец мода:
PHP код:
ShowPlayerVehicleInfoDialog(const playerid)
{
static const
str_status[][] =
{
{"{ff0000}За"},
{"{00ff00}От"}
},
fmt_str[] = "1.\t%s\t[%sкрыт{FFFFFF}]\n2.\t%s\t\t[%sкрыт{FFFFFF}]\n3.\t%s\t\t[%sкрыт{FFFFFF}]\n4.\t%s\t\t[%sкрыт{FFFFFF}]";
new
str[sizeof(fmt_str) + ((-2 + MAX_ARMY_VEH_NAME - 1) + (-2 + sizeof(str_status[]) - 1)) * sizeof(VehicleInfo) * (cellbits / charbits)];
format(str, sizeof(str),
fmt_str,
ArmyVehicles[0][armyVehName], str_status[vehicle_info{0}],
ArmyVehicles[1][armyVehName], str_status[vehicle_info{1}],
ArmyVehicles[2][armyVehName], str_status[vehicle_info{2}],
ArmyVehicles[3][armyVehName], str_status[vehicle_info{3}]
);
return ShowPlayerDialog(playerid, DLG_ARMY_TRANSPORT_LOCK, 2, "Открытие / Закрытие военной техники", str, "Выбрать", "Закрыть");
}
Далее создадим команду для управления транспортом.
Если у вас стандартный командный процессор, то в public OnPlayerCommandText:
PHP код:
if(strcmp(cmdtext, "/vi", true) == 0)
{
if(IsPlayerAdmin(playerid) == 0)
return 1;
return ShowPlayerVehicleInfoDialog(playerid);
}
Если dc_cmd, zcmd, ..., к остальным командам, либо в конец мода
PHP код:
CMD:vi(playerid, params[])
{
if(IsPlayerAdmin(playerid) == 0)
return 1;
return ShowPlayerVehicleInfoDialog(playerid);
}
IsPlayerAdmin(playerid) замените своей проверкой на лидерку армии.
Создадим распознавание диалога. Примечание: Если вы в паблике используете switch(dialogid), то пишем case DLG_ARMY_TRANSPORT_LOCK:, если нет, то пишем if(dialogid == DLG_ARMY_TRANSPORT_LOCK).
В public OnDialogResponse:
PHP код:
case DLG_ARMY_TRANSPORT_LOCK:
{
if(response == 0)
return 1;
new
i = GetMaxPlayers();
if(vehicle_info{listitem} == 1)
{
vehicle_info{listitem} = 0;
do
{
--i;
if(IsPlayerConnected(i) && GetVehicleModel(GetPlayerVehicleID(i)) == ArmyVehicles[listitem][armyVehID])
RemovePlayerFromVehicle(i);
}
while(i);
}
else
vehicle_info{listitem} = 1;
static const
fmt_str[] = "%s (%d) %sкрыл транспорт: %s";
new
str[sizeof(fmt_str) + (-2 + MAX_PLAYER_NAME) + (-2 + 3) + (-2 + 2) + (-2 + (MAX_ARMY_VEH_NAME - 1))];
GetPlayerName(playerid, str, MAX_PLAYER_NAME);
format(str, sizeof(str), fmt_str, str, playerid, vehicle_info{listitem} == 1 ? ("от") : ("за"), ArmyVehicles[listitem][armyVehName]);
SendClientMessageToAll(-1, str);
return ShowPlayerVehicleInfoDialog(playerid);
}
Теперь перейдём к самой проверке на закрытость транспорта. В public OnPlayerStateChange:
PHP код:
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
{
new
i = sizeof(vehicle_info) * (cellbits / charbits),
vehicleid = GetPlayerVehicleID(playerid),
modelid = GetVehicleModel(vehicleid);
do
{
--i;
if(vehicle_info{i} == 0 && model == ArmyVehicles[i][armyVehID])
{
SendClientMessage(playerid, 0xFF0000FF, "Транспорт временно закрыт.");
RemovePlayerFromVehicle(playerid);
break;
}
}
while(i);
}
Скриншот диалога
Автор статьи: L0ndl3m
Специально для: Pro-Pawn.Ru
Копирование данной статьи без разрешения автора запрещено!