Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

/goto | /gethere | /teleport | /tpall

Статус
В этой теме нельзя размещать новые ответы.

MrJunior

Компетентный
Здравствуйте, гости и пользователи портала pawno-info.ru!
Я пишу мод с нуля и дошёл до команд телепортации, сделал 4 удобные команды. Давайте рассмотрим их использование!:​
PHP:
/goto [ID] - Телепортирует вас к игроку с указанным ID.
/gethere [ID] - Телепортирует игрока с указанным ID к вам.
/teleport [ID1] [ID2] - Телепортирует игрока с указанным ID1 к игроку с указанным ID2.
/tpall - Телепортирует всех игроков к вам
Мне лично достаточно и этих команд. Теперь сам код команд:
PHP:
CMD:goto(playerid, params[])
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, !"У вас недостаточно прав для выполнения данной команды!");
    if(isnull(params)) return SendClientMessage(playerid, 0xFF0000FF, !"Использование: /goto [ID] - телепортация к игроку.");
    if(isnums(params) == 0) return SendClientMessage(playerid, 0xFF0000FF, !"Введены должны быть только цифры!");
    new Float:x, Float:y, Float:z,
    	targetid = strval(params),
    	str[(34 + 3 + 1) char] = !"Вы успешно телепортировались к ID ";
    GetPlayerPos(targetid, x, y, z);
    SetPlayerPosFindZ(playerid, x + 2, y, z);
    SetPlayerInterior(playerid, GetPlayerInterior(targetid));
    SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(targetid));
    strcat(str, params);
    return SendClientMessage(playerid, -1, str);
}
PHP:
CMD:gethere(playerid, params[])
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, !"У вас недостаточно прав для выполнения данной команды!"); // Меняем на свою проверку!
    if(isnull(params)) return SendClientMessage(playerid, 0xFF0000FF, !"Использование: /gethere [ID] - телепортация игрока к вам");
    if(isnums(params) == 0) return SendClientMessage(playerid, 0xFF0000FF, !"Введены должны быть только цифры!");
    new Float:x, Float:y, Float:z,
        targetid = strval(params),
        str[(37 + 3 + 1) char] = !"Вы успешно телепортировали к себе ID ";
    GetPlayerPos(playerid, x, y, z);
    SetPlayerPosFindZ(targetid, x+2, y, z);
    SetPlayerInterior(targetid, GetPlayerInterior(playerid));
    SetPlayerVirtualWorld(targetid, GetPlayerVirtualWorld(playerid));
    strcat(str, params);
    return SendClientMessage(playerid, -1, str);
}
PHP:
CMD:teleport(playerid, params[])
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, !"У вас недостаточно прав для выполнения данной команды!"); // Меняем на свою проверку!
    new Float:x, Float:y, Float:z,
        tpid, targetid, tpid_str[4 char], targetid_str[4 char],
        str[(30 + 6 + 6) char] = !"Вы успешно телепортировали ID "; // %d к ID %d
    if(sscanf(params, "uu", tpid, targetid)) return SendClientMessage(playerid, 0xFF0000FF, !"Использование: /teleport [ID1] [ID2] - телепортация игрока к игроку");
    GetPlayerPos(targetid, x, y, z);
    SetPlayerPosFindZ(tpid, x+2, y, z);
    SetPlayerInterior(tpid, GetPlayerInterior(targetid));
    SetPlayerVirtualWorld(tpid, GetPlayerVirtualWorld(targetid));
    valstr(tpid_str, tpid);
	valstr(targetid_str, targetid);
    strcat(str, tpid_str);
    strcat(str, !" к ID ");
    strcat(str, targetid_str);
    return SendClientMessage(playerid, -1, str);
}
PHP:
CMD:tpall(playerid)
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, !"У вас недостаточно прав для выполнения данной команды!"); // Меняем на свою проверку!
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    foreach(new i: Player)
    {
        SetPlayerPosFindZ(i, x+2, y, 0.0);
        SetPlayerInterior(i, GetPlayerInterior(playerid));
        SetPlayerVirtualWorld(i, GetPlayerVirtualWorld(playerid));
    }
    return SendClientMessage(playerid, -1, !"Вы телепортировали к себе всех игроков");
}
Итак, обратим внимание на команды, все они однотипны и телепорт идёт на одни и те-же координаты (x+2). Конечно были возможны баги в начальных командах где использовался SetPlayerPos, если игрок к которому идёт телепорт возле горы то возможность телепортироватся в гору есть, для этого была произведена замена на SetPlayerPosFindZ. Так-же заметим что команда /tpall телепортирует всех игроков на одну точку. По идеи багов быть не должно, игрокам достаточно прыгнуть для выхода из 'ловушки'.
PHP:
И не забудем что в каждой команде есть проверка на 'админку'. Это строка 'if(IsPlayerAdmin(playerid)) ....', заменяйте на свою или оставляйте проверку на 'RCON-Админку'.
После обновления (30-го июня) - в командах /goto и /gethere используется функция isnums, без неё код не работает и возможны баги. Внесите это ко всем stock:
PHP:
isnums(const string[])
{
    for(new i, j = strlen(string); i < j; i++)
    {
        if(!('0' <= string[i] <= '9')) return 0;
    }
    return 1;
}
Просьба: кто найдёт ошибку, баг, опечатку, недоработку и подобное - напишите в тему, так-же оставляйте своё мнение о командах!

На этом у меня всё.
Автор: MrJunior aka .:MrJu[N]ior:.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу