От
Danny_Marcelo
Всех приветствую. Сегодня я решил обновить систему мероприятий, т.к. на самом проекте Advance RP уже давно видоизменили систему, добавили нового функционала. Мы не должны стоять на месте и я решил тоже свою систему доработать. Вы можете использовать данную систему как аналог Advance RP или же доработать для своего проекта. Все в ваших руках как говорится.
Что нового?
Итак приступим:
Находим свои переменные и вставляем:
new settp = 0; // Флаг включения/выключения телепортации
new Float:TeleportFloat[3]; // Координаты точки телепортации
new TeleportInfo[2]; // Интерьер и виртуальный мир
new Float:PlayerLastPos[MAX_PLAYERS][3]; // Последние координаты игрока
new PlayerLastInt[MAX_PLAYERS]; // Последний интерьер игрока
new PlayerLastVW[MAX_PLAYERS]; // Последний виртуальный мир игрока
new PlayerWeapons[MAX_PLAYERS][13][2]; // Оружие игрока (слот и патроны)
new PlayerUsedTP[MAX_PLAYERS]; // Флаг для отслеживания использования /tp
Далее идём в команды, мой случай на Pawn.CMD, но +/- везде одинаково, разве что меняется шапка
CMD:settp(playerid, params[])
{
if (PlayerInfo[playerid][pAdmin] < 4) return 1;
new string[95];
if (settp == 0)
{
GetPlayerPos(playerid, TeleportFloat[0], TeleportFloat[1], TeleportFloat[2]);
TeleportInfo[0] = GetPlayerInterior(playerid);
TeleportInfo[1] = GetPlayerVirtualWorld(playerid);
settp = 1;
format(string, sizeof(string), "[A] %s[%d] установил точку телепорта для игроков. {00CC00}ТП включен.", PlayerInfo[playerid][pName], playerid);
SendAdminMessage(0x52B2B5FF, string);
}
else
{
format(string, sizeof(string), "[A] %s[%d] удалил точку телепорта для игроков. {FF6600}ТП отключен.", PlayerInfo[playerid][pName], playerid);
SendAdminMessage(0x52B2B5FF, string);
settp = 0;
}
return 1;
}
CMD:tp(playerid, params[])
{
if (settp == 0) return SendClientMessage(playerid, 0xCECECEFF, !"Функция отключена администратором.");
if (PlayerInfo[playerid][pJailed] >= 1) return SendClientMessage(playerid, 0xCECECEFF, !"Арестованным не разрешено покидать камеру.");
if (PlayerInfo[playerid][pRabota] != 0) return SendClientMessage(playerid, 0xCECECEFF, !"Необходимо завершить все начатые работы и активные действия.");
if (bolkam[playerid] == true) return SendClientMessage(playerid, 0xCECECEFF, !"Необходимо завершить все начатые работы и активные действия.");
GetPlayerPos(playerid, PlayerLastPos[playerid][0], PlayerLastPos[playerid][1], PlayerLastPos[playerid][2]);
PlayerLastInt[playerid] = GetPlayerInterior(playerid);
PlayerLastVW[playerid] = GetPlayerVirtualWorld(playerid);
for (new i = 0; i < 13; i++)
{
GetPlayerWeaponData(playerid, i, PlayerWeapons[playerid][i][0], PlayerWeapons[playerid][i][1]);
}
PlayerUsedTP[playerid] = 1;
ShowPlayerDialog(playerid, 22, DIALOG_STYLE_MSGBOX, !"{6699FF}Телепортация",
!"{FFFFFF}Вы уверены, что хотите попасть на место проведения мероприятия?\n{FFCD00}Ваше оружие будет изъято для хранения и возвращено позже.", !"Да", !"Нет");
return 1;
}
CMD:back(playerid, params[])
{
if (!PlayerUsedTP[playerid])
{
return SendClientMessage(playerid, 0xCECECEFF, !"Эту функцию можно использовать после {FF9933}/tp, /go {CECECE}или по окончании {FF9933}мероприятий");
}
SetPlayerPos(playerid, PlayerLastPos[playerid][0], PlayerLastPos[playerid][1], PlayerLastPos[playerid][2]);
SetPlayerInterior(playerid, PlayerLastInt[playerid]);
SetPlayerVirtualWorld(playerid, PlayerLastVW[playerid]);
ResetPlayerWeapons(playerid);
for (new i = 0; i < 13; i++)
{
if (PlayerWeapons[playerid][i][0] != 0)
{
GivePlayerWeapon(playerid, PlayerWeapons[playerid][i][0], PlayerWeapons[playerid][i][1]);
}
}
PlayerUsedTP[playerid] = 0;
SendClientMessage(playerid, 0x3399FFFF, !"Вы вернулись туда, где были до телепортации");
return 1;
}
Ну и в OnDialogResponse:
case 22: // Не забудьте проверить и при надобности изменить id диалога на вашу цифру или ID_NAME
{
if (response)
{
SetPlayerPos(playerid, TeleportFloat[0], TeleportFloat[1], TeleportFloat[2]);
SetPlayerInterior(playerid, TeleportInfo[0]);
SetPlayerVirtualWorld(playerid, TeleportInfo[1]);
ResetPlayerWeapons(playerid);
SendClientMessage(playerid, 0x66CCFFFF, "Вы были доставлены на место проведения мероприятия");
SendClientMessage(playerid, 0x66CCFFFF, "Чтобы вернуться обратно, введите {FF9900}/back");
}
}
Скриншоты:
Если игрок сидит в КПЗ и вводит /tp:
При включенном /tp:
При выключенном /tp:
Сообщение администраторам:
Если работаешь или лечишься в больнице:
Текст после телепортации:
При вводе /back 1 и более раз:
P.S. Команду /tp на Advance можно нажимать бесконечно, по этому я не стал сюда пихать аналогичную проверку как в /back.
Если что, не сложно будет добавить 1 строчку проверки. Просто имейте ввиду, что это не баг. Просто нужно же соответствовать названию темы "На 100% КОПИЯ"))
Автор: Danny_Marcelo
Размещая на другие порталы, обязательно указать автора