Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,134
    Репутация:
    2509 ±

    /getpos, /setpos - работа с координатами

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

    Описание:
    Код:
    /getpos - вывести текущие координаты, угол поворота, интерьер и виртуальный мир
    
    /setpos [x] [y] [z] {поворот} {интерьер} {вирт. мир} - телепортироваться на указанные координаты
    (в фигурных скобках "{}" идут необязательные параметры)
    Для работы требуется командный процессор DC_CMD или ZCMD.

     код
    1. CMD:getpos(playerid, params[]) // by Daniel_Cortez \ pro-pawn.ru
    2. {
    3. // Проверка на админа (если нужно, замените на свою).
    4. if (PlayerInfo[playerid][pAdmin] < 1)
    5. return 1;
    6.  
    7. new string[62];
    8. static Float:x, Float:y, Float:z, Float:f, i, w;
    9. GetPlayerPos(playerid, x, y, z);
    10. format(string, sizeof(string), "Координаты: X = %8.2f, Y = %8.2f, Z = %8.2f", x, y, z);
    11. SendClientMessage(playerid, -1, string);
    12.  
    13. GetPlayerFacingAngle(playerid, f);
    14. format(string, sizeof(string), "Угол поворота: %8.2f°", f);
    15. SendClientMessage(playerid, -1, string);
    16.  
    17. i = GetPlayerInterior(playerid);
    18. w = GetPlayerVirtualWorld(playerid);
    19. format(string, sizeof(string), "Интерьер: %d, вирт. мир: %d", i, w);
    20. return SendClientMessage(playerid, -1, string);
    21. }
    22.  
    23. CMD:setpos(playerid, params[]) // by Daniel_Cortez \ pro-pawn.ru
    24. {
    25. // Проверка на админа.
    26. if (PlayerInfo[playerid][pAdmin] < 1)
    27. return 1;
    28.  
    29. new string[97];
    30. static Float:x, Float:y, Float:z, Float:f, i, w;
    31. if (sscanf(params, "fffF(-1)D(-1)D(-1)", x, y, z, f, i, w))
    32. return SendClientMessage(playerid, -1, "/setpos [x] [y] [z] {угол поворота} {интерьер} {вирт. мир}");
    33. new veh = GetPlayerVehicleID(playerid);
    34. if (i == -1) // Если значение пропущено - получить текущий интерьер (для вывода в SCM).
    35. i = GetPlayerInterior(playerid);
    36. else
    37. SetPlayerInterior(playerid, i);
    38. if (w == -1) // Если значение пропущено - ...
    39. w = GetPlayerVirtualWorld(playerid);
    40. else
    41. {
    42. if (veh != 0)
    43. SetPlayerVirtualWorld(playerid, w);
    44. }
    45. if (floatcmp(f, -1.0) == 0) // Всё та же проверка на -1, только для вещ. чисел.
    46. {
    47. if (veh != 0)
    48. else
    49. GetPlayerFacingAngle(playerid, f);
    50. }
    51. else
    52. {
    53. f = 360.0*floatfract(f/360.0);
    54. if (veh != 0)
    55. else
    56. SetPlayerFacingAngle(playerid, f);
    57. }
    58. if (veh != 0)
    59. SetVehiclePos(veh, x, y, z);
    60. else
    61. SetPlayerPos(playerid, x, y, z);
    62.  
    63. format(string, sizeof(string), "Вы телепортировались на координаты X: %.2f, Y: %.2f, Z: %.2f", x, y, z);
    64. SendClientMessage(playerid, -1, string);
    65. format(string, sizeof(string), "Угол поворота: %.2f, интерьер: %d, вирт. мир: %d", f, i, w);
    66. return SendClientMessage(playerid, -1, string);
    67. }

    Автор: Daniel_Cortez
    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 24.02.2019 в 20:54. Причина: update
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 10 пользователя(ей) сказали cпасибо:
    #ball (17.10.2014) DmX (11.02.2014) iWors (25.03.2016) L0ndl3m (24.12.2013) MaximP (15.05.2016) Osetin (24.12.2013) Salvacore (24.12.2013) seriu (12.01.2016) TimoXa32 (28.12.2013) Unreal (14.11.2014)
  3. #2
    Аватар для Giffka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.08.2014
    Сообщений
    19
    Репутация:
    1 ±
    Интересует принцип вычисления размера string.
    Конкретней интересует это вычисление
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    PHP код:
        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
    Последний раз редактировалось Giffka; 09.10.2014 в 20:46.

  4. #3
    Аватар для Avertus
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.12.2013
    Сообщений
    86
    Репутация:
    17 ±
    Цитата Сообщение от Giffka Посмотреть сообщение
    Интересует принцип вычисления размера string.
    Конкретней интересует это вычисление
    Ну тут простой принцип. Например для строки fmt_str0, считаем длину самой строки как таковой, затем вычитаем количество знаков форматирования коих пять (%8.2f), затем добавляем количество символов которое может добавить в текст это форматирование, а именно 8 символов до точки,2 после и сама точка, того получается 11 символов. И т. к. в строке три форматирования делаем так трижды. Вот и получается длинна строки минус пять символов форматирования плюс 11 символов результат форматирования три раза, т.к форматирование встречается три раза.

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,134
    Репутация:
    2509 ±
    Обновил код, убрал подсчёт размера строк (для таких простых команд он был только лишним, ибо занимал места больше, чем весь остальной код в командах).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. Пользователь сказал cпасибо:
    DmitriyVasilev (25.02.2019)
  7. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,415
    Репутация:
    1908 ±
    В описании команды указано имя "gocord", а не "setpos"
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    Daniel_Cortez (24.02.2019)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •