PDA

Просмотр полной версии : [Мануал] Закрытие / Открытие военного транспорта в диалоге



L0ndl3m
24.11.2013, 00:00
Ко всем new:


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. Вы можете добавить свою модель транспорта, если вам это нужно.

В диалоге будет показываться состояния транспортов, их всего два:

Транспорт может быть [Закрыт]
Транспорт может быть [Открыт]


Создадим функцию, которая будет открывать диалог игроку (так как диалог будет использоваться не один раз).
В конец мода:


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:


if(strcmp(cmdtext, "/vi", true) == 0)
{
if(IsPlayerAdmin(playerid) == 0)
return 1;

return ShowPlayerVehicleInfoDialog(playerid);
}


Если dc_cmd, zcmd, ..., к остальным командам, либо в конец мода


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:


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:


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


http://ihost.pro-pawn.ru/image.php?di=YL75


Автор статьи: L0ndl3m (http://pro-pawn.ru/member.php?2057)

Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено!

Salvacore
24.11.2013, 00:02
Лучший!

[Koteyka]
24.11.2013, 00:03
Лови спасибку :)

Wesley
24.11.2013, 06:16
+ Тебе!

Salvacore
24.11.2013, 06:30
Еще и с комментариями для новичков:)