Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 20

Тема: PlayerToActor

  1. #1
    Аватар для id228fanta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.07.2015
    Сообщений
    19
    Репутация:
    2 ±

    PlayerToActor

    Описание:
    Данная функция определяет, находится ли игрок в определённом радиусе от актёра.

    Параметры:
    Float:radi - радиус
    playerid - ID игрока
    actorid - ID актёра

    PHP код:
    stock PlayerToActor(Float:radiplayeridactorid)
    {
            if(
    IsPlayerConnected(playerid))
            {
                    new 
    Float:posxFloat:posyFloat:posz,Float:oldposxFloat:oldposyFloat:oldposz,Float:tempposxFloat:tempposyFloat:tempposz;
                    
    GetPlayerPos(playeridoldposxoldposyoldposz);
                    
    GetActorPos(actoridposxposyposz);
                    
    tempposx = (oldposx -posx); tempposy = (oldposy -posy); tempposz = (oldposz -posz);
                    if (((
    tempposx radi) && (tempposx > -radi)) && ((tempposy radi) && (tempposy > -radi)) && ((tempposz radi) && (tempposz > -radi))) return true;
            }
            return 
    false;

    Пример использования:
    PHP код:
    // Создаём актёра в OnGameModeInit
    public OnGameModeInit()
    {
            new 
    actorlool CreateActor(.....);
    }
    // По команде узнаём расстояние от игрока до актёра.
    CMD:itoactor(playeridparams[])
    {
            if(!
    PlayerToActor(10.00actorlool)) return SendClientMessage(playerid, -1"Вы далеко от актёра!");
            else 
    SendClientMessage(playerid, -1"Вы рядом с актёром!");
            return 
    true;


    Автор: Oleg_Petrow
    Последний раз редактировалось id228fanta; 05.09.2015 в 12:19. Причина: Исправил описание | Спасибо Cortez'y

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от id228fanta Посмотреть сообщение
    PHP код:
    return 1
    Цитата Сообщение от id228fanta Посмотреть сообщение
    PHP код:
    return false
    Цитата Сообщение от id228fanta Посмотреть сообщение
    Пример использования:
    PHP код:
    // PlayerToActor(радиус, ид игрока, ид актёра);
    new actorlool CreateActor(.....);
    PlayerToActor(10.00actorlool); 
    Цитата Сообщение от id228fanta Посмотреть сообщение
    Данная функция узнаёт расстояние между игроком и актёром.
    Вы это серьёзно?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. Пользователь сказал cпасибо:
    Unreal (05.09.2015)
  4. #3
    Аватар для id228fanta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.07.2015
    Сообщений
    19
    Репутация:
    2 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Вы это серьёзно?
    Извиняюсь, просто ночь была, спать хотелось. Исправил.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от id228fanta Посмотреть сообщение
    Извиняюсь, просто ночь была, спать хотелось. Исправил.
    Одну проблему исправили, остальные так и остались.
    Цитата Сообщение от id228fanta Посмотреть сообщение
    PHP код:
    return 1
    Цитата Сообщение от id228fanta Посмотреть сообщение
    PHP код:
    return false
    Цитата Сообщение от id228fanta Посмотреть сообщение
    Данная функция узнаёт расстояние между игроком и актёром.
    Тут одно из трёх.
    Либо вы сами не понимаете, как работает функция, но уже спешите запостить куда-нибудь так понравившийся кусок кода (такое чаще всего можно видеть на govno-info).
    Либо вы не знаете русский язык и не умеете правильно изъяснять свои мысли.
    Либо у вас до сих пор ночь.

    И да, в чём профит возарата true/false вместо 1/0?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    18.07.2015
    Сообщений
    19
    Репутация:
    2 ±
    Ночь прошла, я просто мысль свою не так изъяснил. Исправил описание. Спасибо большое. И ещё раз извините.

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Реализация ужасная, когда только увидел название темы подумал, что функция поворачивает игрока к актёру.
    Например это можно было таким способом:
    PHP код:
    boolIsPlayerInRangeOfActor(playeridactoridFloatrange)
    {
        new
            
    Floatx,
            
    Floaty,
            
    Floatz;

        
    GetActorPos(actoridxyz);
        return 
    IsPlayerInRangeOfPoint(playeridrangexyz);

    , использовав стандартную функцию IsPlayerInRangeOfPoint, либо же так:
    PHP код:
    boolIsPlayerInRangeOfActor(playeridactoridFloatrange)
    {
        new
            
    Floatx,
            
    Floaty,
            
    Floatz;

        
    GetActorPos(actoridxyz);
        return 
    GetPlayerDistanceFromPoint(playeridxyz) <= range;

    , использовав также, стандартную функцию GetPlayerDistanceFromPoint.

    А проверки на то, подключён ли игрок или же актёр к серверу нужно делать за границами функции.
    Например:
    PHP код:
    if(IsPlayerConnected(0) && IsValidActor(1))
    {
        if(
    IsPlayerInRangeOfActor(015.0))
            
    // актёр №1 рядом с игроком №0
        
    else
            
    // актёр №1 не находится рядом с игроком №0

    дабы если вызывать данную функцию в цикле, будет много однотипных проверок, а это лишнее время на выполнение операции.
    Последний раз редактировалось L0ndl3m; 05.09.2015 в 12:27.

  8. Пользователь сказал cпасибо:
    id228fanta (05.09.2015)
  9. #7
    Аватар для id228fanta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.07.2015
    Сообщений
    19
    Репутация:
    2 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Реализация ужасная, когда только увидел название темы подумал, что функция поворачивает игрока к актёру.
    Например это можно было таким способом:
    PHP код:
    boolIsPlayerInRangeOfActor(playeridactoridFloatrange)
    {
        new
            
    Floatx,
            
    Floaty,
            
    Floatz;

        
    GetActorPos(actoridxyz);
        return 
    IsPlayerInRangeOfPoint(playeridrangexyz);

    , использовав стандартную функцию IsPlayerInRangeOfPoint, либо же так:
    PHP код:
    boolIsPlayerInRangeOfActor(playeridactoridFloatrange)
    {
        new
            
    Floatx,
            
    Floaty,
            
    Floatz;

        
    GetActorPos(actoridxyz);
        return 
    GetPlayerDistanceFromPoint(playeridxyz) <= range;

    , использовав также, стандартную функцию GetPlayerDistanceFromPoint.

    А проверки на то, подключён ли игрок или же актёр к серверу нужно делать за границами функции.
    Например:
    PHP код:
    if(IsPlayerConnected(0) && IsValidActor(1))
    {
        if(
    IsPlayerInRangeOfActor(015.0))
            
    // актёр №1 рядом с игроком №0
        
    else
            
    // актёр №1 не находится рядом с игроком №0

    дабы если вызывать данную функцию в цикле, будет много однотипных проверок, а это лишнее время на выполнение операции.
    Учту в дальнейшем. Спасибо.
    Последний раз редактировалось L0ndl3m; 05.09.2015 в 12:30.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от id228fanta Посмотреть сообщение
    Ночь прошла, я просто мысль свою не так изъяснил. Исправил описание. Спасибо большое. И ещё раз извините.
    Вы так и не ответили на мой вопрос.
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    в чём профит возарата true/false вместо 1/0?


    Цитата Сообщение от Londlem Посмотреть сообщение
    А проверки на то, подключён ли игрок или же актёр к серверу нужно делать за границами функции (...) дабы если вызывать данную функцию в цикле, будет много однотипных проверок, а это лишнее время на выполнение операции.
    Во-первых, функции, прежде всего, нужны для удобства.
    Если выносить какие-то проверки за пределы функции, то как ты вообще представляешь поддержку такого кода?
    Вот представь себе, в SA:MP изменились детали работы функции GetActorPos и тебе придётся переписывать не только функцию PlayerToActor, но и смотреть все случаи её использования, ведь код проверок тоже придётся менять!
    Поэтому просто глупо выносить какие-то куски кода за пределы функции ради пары микросекунд. Больше времени потратишь на поддержку.

    Во-вторых, пренебрежение защитой может быть оправдано только если в рассматриваемом участке кода очень нужна производительность.
    А если так нужна производительность, то зачем тогда вообще пользоваться сторонними функциями? Ведь в них тратится время на создание и уничтожение локальных переменных, да и на сам вызов функции с передачей аргументов через стек.
    Можно обойтись одними лишь нативными функциями Pawn/SA:MP. Заодно и больше пространства для оптимизации: например, не придётся заново создавать переменные при каждой проверке актёра.

    В-третьих, в SA:MP иногда даже не нужно вызывать отдельные функции для проверки аргументов.
    Например, не нужно проверять ID игрока с помощью IsPlayerConnected - функция GetPlayerPos вернёт 0, если указан неправильный ID игрока.

    В итоге, если у нас есть мега-критичный участок, на котором нужно проверить, находится ли игрок рядом с каким-то актёром, алгоритм можно реализовать так:
    PHP код:
    new actorid INVALID_ACTOR_ID;
    new 
    Float:xFloat:yFloat:z;
    for (new 
    0MAX_ACTORS; ++i)
    {
        if(
    GetActorPos(ixyz))
        {
            if(
    IsPlayerInRangeOfPoint(playeridxyz))
            {
                
    actorid i;
                break;
            }
        }
    }
    if(
    actorid == INVALID_ACTOR_ID)
        return 
    SendClientMessage(playerid, -1"Поблизости никого нет."); 
    Но только не вздумайте делать так везде - ваш проект может очень быстро превратиться в кашу из трудноподдерживаемого говнокода, в котором каждое элементарное действие расписано на 100 строк.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. #9
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Автор: Oleg_Petrow
    Ты серьезно?

     PlayerToPoint
    PHP код:
    stock PlayerToPoint(Float:radiplayeridFloat:xFloat:yFloat:z)
    {
         if(
    IsPlayerConnected(playerid))
         {
          new 
    Float:oldposxFloat:oldposyFloat:oldposz;
          new 
    Float:tempposxFloat:tempposyFloat:tempposz;
          
    GetPlayerPos(playeridoldposxoldposyoldposz);
          
    tempposx = (oldposx -x);
          
    tempposy = (oldposy -y);
          
    tempposz = (oldposz -z);
           if (((
    tempposx radi) && (tempposx > -radi)) && ((tempposy radi) && (tempposy > -radi)) && ((tempposz radi) && (tempposz > -radi))) return 1;
         }
    return 
    0;



     Типо твоя функция
    PHP код:
    stock PlayerToActor(Float:radiplayeridactorid)
    {
            if(
    IsPlayerConnected(playerid))
            {
                    new 
    Float:posxFloat:posyFloat:posz,Float:oldposxFloat:oldposyFloat:oldposz,Float:tempposxFloat:tempposyFloat:tempposz;
                    
    GetPlayerPos(playeridoldposxoldposyoldposz);
                    
    GetActorPos(actoridposxposyposz);
                    
    tempposx = (oldposx -posx); tempposy = (oldposy -posy); tempposz = (oldposz -posz);
                    if (((
    tempposx radi) && (tempposx > -radi)) && ((tempposy radi) && (tempposy > -radi)) && ((tempposz radi) && (tempposz > -radi))) return true;
            }
            return 
    false;



    Для тех, кто не в курсе: функция PlayerToPoint имеет большое признание среди аборигенов клана "Программисты Pawno", которые считают, что их ТРУ функции лучше нативных, в данном случае IsPlayerInRangeOfPoint.
    Последний раз редактировалось Seregamil; 05.09.2015 в 20:09.

  12. Пользователь сказал cпасибо:
    Daniel_Cortez (05.09.2015)
  13. #10
    Аватар для id228fanta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.07.2015
    Сообщений
    19
    Репутация:
    2 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Вы так и не ответили на мой вопрос.
    true/false от 1/0 ничем не отличаются
    Если только true/false используются в bool

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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