PDA

Просмотр полной версии : [CMD] /goto | /gethere | /teleport | /tpall



MrJu[N]ior
26.06.2016, 21:48
Здравствуйте, гости и пользователи портала pro-pawn.ru!
Я пишу мод с нуля и дошёл до команд телепортации, сделал 4 удобные команды. Давайте рассмотрим их использование!:



/goto [ID] - Телепортирует вас к игроку с указанным ID.
/gethere [ID] - Телепортирует игрока с указанным ID к вам.
/teleport [ID1] [ID2] - Телепортирует игрока с указанным ID1 к игроку с указанным ID2.
/tpall - Телепортирует всех игроков к вам


Мне лично достаточно и этих команд. Теперь сам код команд:




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





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





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





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 телепортирует всех игроков на одну точку. По идеи багов быть не должно, игрокам достаточно прыгнуть для выхода из 'ловушки'.

И не забудем что в каждой команде есть проверка на 'админку'. Это строка 'if(IsPlayerAdmin(playerid)) ....', заменяйте на свою или оставляйте проверку на 'RCON-Админку'.

После обновления (30-го июня) - в командах /goto и /gethere используется функция isnums, без неё код не работает и возможны баги. Внесите это ко всем stock:



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:.

Desulaid
26.06.2016, 22:13
:blush2:


http://pro-pawn.ru/showthread.php?5738
http://pro-pawn.ru/showthread.php?9968 (шестой пункт)

MrJu[N]ior
26.06.2016, 22:20
:blush2:


http://pro-pawn.ru/showthread.php?5738
http://pro-pawn.ru/showthread.php?9968 (шестой пункт)


Причём здесь команды эти команды? Вы выдали ссылку на тему ДК где он показал команды узнавание своих координат, и их установка? Если хотите указать на что-то в этой теме - делайте как во второй ссылке. По её поводу - поправил.

MrJu[N]ior
30.06.2016, 15:38
Перевёл всё на strcat + valstr(для скорости).
Запаковал всё(ибо формат больше не используется).
Убрал возможность некоторых багов.