PDA

Просмотр полной версии : [CMD] /getpos, /setpos - работа с координатами



Daniel_Cortez
24.12.2013, 19:30
Недавно просили набросать пару команд для работы с координатами игрока, изменения интерьера и вирт. мира.
Надеюсь, кому-нибудь они пригодятся.

Описание:

/getpos - вывести текущие координаты, угол поворота, интерьер и виртуальный мир

/setpos [x] [y] [z] {поворот} {интерьер} {вирт. мир} - телепортироваться на указанные координаты
(в фигурных скобках "{}" идут необязательные параметры)

Для работы требуется командный процессор DC_CMD или ZCMD.


CMD:getpos(playerid, params[]) // by Daniel_Cortez \ pro-pawn.ru
{
// Проверка на админа (если нужно, замените на свою).
if (PlayerInfo[playerid][pAdmin] < 1)
return 1;

new string[62];
static Float:x, Float:y, Float:z, Float:f, i, w;
GetPlayerPos(playerid, x, y, z);
format(string, sizeof(string), "Координаты: X = %8.2f, Y = %8.2f, Z = %8.2f", x, y, z);
SendClientMessage(playerid, -1, string);

GetPlayerFacingAngle(playerid, f);
format(string, sizeof(string), "Угол поворота: %8.2f°", f);
SendClientMessage(playerid, -1, string);

i = GetPlayerInterior(playerid);
w = GetPlayerVirtualWorld(playerid);
format(string, sizeof(string), "Интерьер: %d, вирт. мир: %d", i, w);
return SendClientMessage(playerid, -1, string);
}

CMD:setpos(playerid, params[]) // by Daniel_Cortez \ pro-pawn.ru
{
// Проверка на админа.
if (PlayerInfo[playerid][pAdmin] < 1)
return 1;

new string[97];
static Float:x, Float:y, Float:z, Float:f, i, w;
if (sscanf(params, "fffF(-1)D(-1)D(-1)", x, y, z, f, i, w))
return SendClientMessage(playerid, -1, "/setpos [x] [y] [z] {угол поворота} {интерьер} {вирт. мир}");
new veh = GetPlayerVehicleID(playerid);
if (i == -1) // Если значение пропущено - получить текущий интерьер (для вывода в SCM).
i = GetPlayerInterior(playerid);
else
SetPlayerInterior(playerid, i);
if (w == -1) // Если значение пропущено - ...
w = GetPlayerVirtualWorld(playerid);
else
{
if (veh != 0)
SetVehicleVirtualWorld(veh, w);
SetPlayerVirtualWorld(playerid, w);
}
if (floatcmp(f, -1.0) == 0) // Всё та же проверка на -1, только для вещ. чисел.
{
if (veh != 0)
GetVehicleZAngle(veh, f);
else
GetPlayerFacingAngle(playerid, f);
}
else
{
f = 360.0*floatfract(f/360.0);
if (veh != 0)
SetVehicleZAngle(veh, f);
else
SetPlayerFacingAngle(playerid, f);
}
if (veh != 0)
SetVehiclePos(veh, x, y, z);
else
SetPlayerPos(playerid, x, y, z);

format(string, sizeof(string), "Вы телепортировались на координаты X: %.2f, Y: %.2f, Z: %.2f", x, y, z);
SendClientMessage(playerid, -1, string);
format(string, sizeof(string), "Угол поворота: %.2f, интерьер: %d, вирт. мир: %d", f, i, w);
return SendClientMessage(playerid, -1, string);
}

Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)

Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

Giffka
09.10.2014, 19:58
Интересует принцип вычисления размера string.
Конкретней интересует это вычисление



static const
fmt_str0[] = "Координаты: X = %8.2f, Y = %8.2f, Z = %8.2f",
fmt_str1[] = "Угол поворота: %8.2f°",
fmt_str2[] = "Интерьер: %d, вирт. мир: %d";
// подсчёт максимальной длины для каждой
// из строк после форматирования
const
size0 = sizeof(fmt_str0)+(-5+11)*3,
size1 = sizeof(fmt_str1)-5+11,
size2 = sizeof(fmt_str2)+(-2+11)*2;

Avertus
13.11.2014, 19:52
Интересует принцип вычисления размера string.
Конкретней интересует это вычисление

Ну тут простой принцип. Например для строки fmt_str0, считаем длину самой строки как таковой, затем вычитаем количество знаков форматирования коих пять (%8.2f), затем добавляем количество символов которое может добавить в текст это форматирование, а именно 8 символов до точки,2 после и сама точка, того получается 11 символов. И т. к. в строке три форматирования делаем так трижды. Вот и получается длинна строки минус пять символов форматирования плюс 11 символов результат форматирования три раза, т.к форматирование встречается три раза.

Daniel_Cortez
24.02.2019, 20:36
Обновил код, убрал подсчёт размера строк (для таких простых команд он был только лишним, ибо занимал места больше, чем весь остальной код в командах).

DeimoS
24.02.2019, 20:42
В описании команды указано имя "gocord", а не "setpos"