Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 8 из 8
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

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

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

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

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

     код
    PHP код:
    CMD:getpos(playeridparams[]) // by Daniel_Cortez
    {
        
    // проверка на админа (если нужно, замените на свою)
        
    if(PlayerInfo[playerid][pAdmin] < 1)
            return 
    1;
        
    // форматные строки объявлены в виде констант
        // для автоматического подсчёта длины 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;
        
    // запись наибольшей длины в макрос size
        // (это и будет макс. размер переменной string)
        #if    size0>size1
            #define    size    size0
        #else
            #define    size    size1
        #endif
        #if    size2>size
            #undef    size
            #define    size    size2
        #endif
        // размер подсчитан, теперь можно
        // объявить и саму переменную
        
    new string[size];
        
    // удалить макрос size, он больше не понадобится
        #undef    size
        // получить и вывести координаты игрока
        // (вынесено в отдельный блок для уничтожения
        // переменных x, y и z после использования
        // и экономии места в стеке)
        
    {
            new 
    Float:xFloat:yFloat:z;
            
    GetPlayerPos(playeridxyz);
            
    format(stringsizeof(string), fmt_str0xyz);
        }
        
    SendClientMessage(playerid, -1string);
        
    // вывести угол поворота игрока
        
    {
            new 
    Float:f;
            
    GetPlayerFacingAngle(playeridf);
            
    format(stringsizeof(string), fmt_str1f);
        }
        
    SendClientMessage(playerid, -1string);
        
    // вывести ID интерьера и вирт. мира
        
    new
            
    GetPlayerInterior(playerid),
            
    GetPlayerVirtualWorld(playerid);
        
    format(stringsizeof(string), fmt_str2iw);
        return 
    SendClientMessage(playerid, -1string);
    }

    CMD:setpos(playeridparams[]) // by Daniel_Cortez (who cares anyway -_-)
    {
        
    // проверка на админа
        
    if(PlayerInfo[playerid][pAdmin] < 1)
            return 
    1;
        
    // константы, подсчёт и т.п.
        
    static const
            
    fmt_str0[] = "Вы телепортировались на координаты X: %.2f, Y: %.2f, Z: %.2f",
            
    fmt_str1[] = "Угол поворота: %.2f, интерьер: %d, вирт. мир: %d";
        const
            
    size0 sizeof(fmt_str0)+(-4+16)*3,
            
    size1 sizeof(fmt_str1)-4+6+(-2+11)*2;
        
    #if size0>size1
            #define    size    size0
        #else
            #define    size    size1
        #endif
        // ограничить размер строки в 144
        // (макс. длина для SendClientMessage)
        #if    size>144
            #undef    size
            #define    size    144
        #endif
        
    new
            
    string[size],
            
    Float:xFloat:yFloat:zFloat:fiw;
        
    #undef    size
        // считать значения из строки params,
        // если одно из необязательных значений (f, i, w)
        // будет пропущено, sscanf2 запишет -1
        
    if(sscanf(params"fffF(-1)D(-1)D(-1)"xyzfiw))
            return 
    SendClientMessage(playerid, -1"/gocord [x] [y] [z] {угол поворота} {интерьер} {вирт. мир}");
        new 
    veh GetPlayerVehicleID(playerid);
        if(
    == -1// если значение пропущено - получить текущий интерьер (для вывода в SCM)
            
    GetPlayerInterior(playerid);
        else
            
    SetPlayerInterior(playeridi);
        if(
    == -1// если значение пропущено - ...
            
    GetPlayerVirtualWorld(playerid);
        else
        {
            if(
    veh)
                
    SetVehicleVirtualWorld(vehw);
            
    SetPlayerVirtualWorld(playeridw);
        }
        if(
    floatcmp(f, -1.0) == 0// всё та же проверка на -1, только для вещ. чисел
        
    {
            if(
    veh)
                
    GetVehicleZAngle(vehf);
            else
                
    GetPlayerFacingAngle(playeridf);
        }
        else
        {
            
    360.0*floatfract(f/360.0);
            if(
    veh)
                
    SetVehicleZAngle(vehf);
            else
                
    SetPlayerFacingAngle(playeridf);
        }
        if(
    veh)
            
    SetVehiclePos(vehxyz);
        else
            
    SetPlayerPos(playeridxyz);
        
    // вывести сообщение о телепортации
        
    format(stringsizeof(string), fmt_str0xyz);
        
    SendClientMessage(playerid, -1string);
        
    format(stringsizeof(string), fmt_str1fiw);
        return 
    SendClientMessage(playerid, -1string);


    Автор: Daniel_Cortez
    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 07.01.2014 в 20:26. Причина: добавил больше комментариев к коду // DC
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  2. 10 пользователя(ей) сказали cпасибо:
    #ball (17.10.2014)DmX (11.02.2014)iWors (25.03.2016)Londlem (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
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,282
    Репутация:
    417 ±
    Спасибо!

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

    Статус
    Оффлайн
    Регистрация
    28.12.2013
    Сообщений
    6
    Репутация:
    0 ±
    Понт защитан

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

    Статус
    Оффлайн
    Регистрация
    29.10.2013
    Сообщений
    101
    Репутация:
    40 ±
    Ничего лишнего, отлично!
    Уважаю данных Людей:

    1. Osetin(Хороший Администратор)
    2.Daniel_Cortez(Классный скриптер)
    3.Londlem(Офигенный скриптер)
    4.#Carleone(Просто хороший человек)

  6. #5
    Аватар для Mr_David
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.04.2013
    Сообщений
    64
    Репутация:
    53 ±
    Класс

  7. #6
    Аватар для Osetin
    •Администратор•

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    Pro-Pawn.Ru
    Сообщений
    3,428
    Репутация:
    1079 ±
    Нужные команды многим новичкам.

  8. #7
    Аватар для 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.

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

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

 

 

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

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

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

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

Ваши права

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