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

    Статус
    Оффлайн
    Регистрация
    21.08.2016
    Сообщений
    58
    Репутация:
    24 ±

    Проверка на координаты входа

    Делаю вход в бизнес через KEY_WALK в OnPlayerKeyStateChange и задался таким вопросом.
    Если игрок будет нажимать на L.Alt в любом месте, ему в OnPlayerKeyStateChange, будет циклом прогонять все координаты входа в бизнес, дабы проверить находится ли он возле бизнеса.
    Пример:
    1. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    2. {
    3. if(newkeys & KEY_WALK)
    4. {
    5. for(new b = 1; b <= gNumberBusiness; b++)
    6. {
    7. if(IsPlayerInRangeOfPoint(playerid, 2.0, BusinessInfo[b][bEnterX], BusinessInfo[b][bEnterY], BusinessInfo[b][bEnterZ]))
    8. {
    9. //Вход
    10. return 1;
    11. }
    12. }
    13. return 1;
    14. }
    15. }


    Будет ли лучше, если создать динамическую зону и проверять в ней?
    1. public OnPlayerEnterDynamicArea(playerid, areaid)
    2. {
    3. for(new b = 1; b <= gNumberBusiness; b++)
    4. {
    5. if(areaid == ar_BusinessEnter[b])
    6. {
    7. gPlayerBusinessID[playerid] = b;
    8. return 1;
    9. }
    10. }
    11. return 1;
    12. }
    13.  
    14. public OnPlayerLeaveDynamicArea(playerid, areaid)
    15. {
    16. for(new b = 1; b <= gNumberBusiness; b++)
    17. {
    18. if(areaid == ar_BusinessEnter[b])
    19. {
    20. gPlayerBusinessID[playerid] = 0;
    21. return 1;
    22. }
    23. }
    24. return 1;
    25. }
    26.  
    27. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    28. {
    29. if(newkeys & KEY_WALK)
    30. {
    31. if(gPlayerBusinessID[playerid] != 0)
    32. {
    33. SetPlayerPos(playerid,
    34. BusinessInfo[gPlayerBusinessID[playerid]][bEnterX],
    35. BusinessInfo[gPlayerBusinessID[playerid]][bEnterY],
    36. BusinessInfo[gPlayerBusinessID[playerid]][bEnterZ]
    37. );
    38. return 1;
    39. }
    40. return 1;
    41. }
    42. return 1;
    43. }
    Последний раз редактировалось Saibot; 07.11.2020 в 16:19.

  2. #2
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Лично я повсеместно использую динамические зоны, и советовал бы именно их, ибо проверка нахождения в зоне происходит быстрее чем проверка на нахождение в радиусе по координатам.
    Единственное что я бы сделал, то не стал бы создавать массив (gPlayerBusinessID[MAX_PLAYERS]) для этой реализации:
    1. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    2. {
    3. if(newkeys & KEY_WALK)
    4. {
    5. for(new b = 1; b <= gNumberBusiness; b++)
    6. {
    7. if(IsPlayerInDynamicArea(playerid, areaid))
    8. {
    9. //Вход
    10. return 1;
    11. }
    12. }
    13. return 1;
    14. }
    15. }
    Последний раз редактировалось punkochel; 07.11.2020 в 15:13.

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

    Статус
    Оффлайн
    Регистрация
    21.08.2016
    Сообщений
    58
    Репутация:
    24 ±
    Цитата Сообщение от punkochel Посмотреть сообщение
    Лично я повсеместно использую динамические зоны, и советовал бы именно их, ибо проверка нахождения в зоне происходит быстрее чем проверка на нахождение в радиусе по координатам.
    Единственное что я бы сделал, то не стал бы создавать массив (gPlayerBusinessID[MAX_PLAYERS]) для этой реализации:
    1. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    2. {
    3. if(newkeys & KEY_WALK)
    4. {
    5. for(new b = 1; b <= gNumberBusiness; b++)
    6. {
    7. if(IsPlayerInDynamicArea(playerid, areaid))
    8. {
    9. //Вход
    10. return 1;
    11. }
    12. }
    13. return 1;
    14. }
    15. }
    Но проблема в том, что цикл остается в OnPlayerKeyStateChange и при нажатие L.Alt (в любом месте), он будет каждый раз проверять все зоны.

    Мне нужно узнать, большая ли разница между первым и воторым вариантом, который я написал.

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

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    Дабы априори избежать циклов, можно, при создании динамической зоны, записывать некоторую дополнительную информацию о ней в отдельный массив данных (в данном случае - закреплена ли зона за каким-либо бизнесом и, если да - то является ли эта зона входом, либо выходом).

    Примерный вариант (не тестировал):
    PHP код:
    /*
        Definitions
    */

    #define INVALID_BUSINESS_ID             (-1)
    #define AREA_BUSINESS_STATUS_ENTRANCE   (0)
    #define AREA_BUSINESS_STATUS_EXIT       (1)

    /*
        Global variables
    */

    enum E_DYNAMIC_AREA_DATA
    {
        
    area_bussiness_id,
        
    area_bussiness_status
    }

    new
        
    gDynamicAreaExtraData[/*кол-во зон*/][E_DYNAMIC_AREA_DATA]; // заполнять информацию при создании зон

    new
        
    gPlayerCurrentDynamicAreaId[MAX_PLAYERS] = {INVALID_DYNAMIC_AREA_ID, ...};


    /*
        Publics
    */

    public OnPlayerEnterDynamicArea(playeridareaid)
    {
        
    gPlayerCurrentDynamicAreaId[playerid] = areaid;
        return 
    1;
    }

    public 
    OnPlayerLeaveDynamicArea(playeridareaid)
    {
        
    gPlayerCurrentDynamicAreaId[playerid] = INVALID_DYNAMIC_AREA_ID;
        return 
    1;
    }

    public 
    OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        if(
    newkeys KEY_WALK)
        {
            new
                
    player_dynamic_area_id gPlayerCurrentDynamicAreaId[playerid];

            if(
    player_dynamic_area_id != INVALID_DYNAMIC_AREA_ID)
            {
                if(
    gDynamicAreaExtraData[player_dynamic_area_id][area_bussiness_id] != INVALID_BUSINESS_ID)
                {
                    new
                        
    dynamic_area_business_status gDynamicAreaExtraData[player_dynamic_area_id][area_bussiness_status];

                    
    // ID бизнеса указан в структуре динамических зон, так что получать координаты входа/выхода не сосавит труда

                    
    if(dynamic_area_business_status == AREA_BUSINESS_STATUS_ENTRANCE)
                    {
                        
    // вход

                        
    return 1;
                    }
                    else if(
    dynamic_area_business_status == AREA_BUSINESS_STATUS_EXIT)
                    {
                        
    // elise if дабы избежать возможных ошибок в коде (присвоение значения отличного от 0 или 1)
                        // выход

                        
    return 1;
                    }
                }
            }
        }
        return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    21.08.2016
    Сообщений
    58
    Репутация:
    24 ±
    1. public OnPlayerEnterDynamicArea(playerid, areaid)
    2. {
    3. gPlayerCurrentDynamicAreaId[playerid] = areaid;
    4. return 1;
    5. }
    6.  
    7. public OnPlayerLeaveDynamicArea(playerid, areaid)
    8. {
    9. gPlayerCurrentDynamicAreaId[playerid] = INVALID_DYNAMIC_AREA_ID;
    10. return 1;
    11. }

    А разве оно запишет в gPlayerCurrentDynamicAreaId нужный ID зоны в которой находится игрок?
    Последний раз редактировалось Saibot; 07.11.2020 в 16:52.

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

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    Цитата Сообщение от Saibot Посмотреть сообщение
    1. public OnPlayerEnterDynamicArea(playerid, areaid)
    2. {
    3. gPlayerCurrentDynamicAreaId[playerid] = areaid;
    4. return 1;
    5. }
    6.  
    7. public OnPlayerLeaveDynamicArea(playerid, areaid)
    8. {
    9. gPlayerCurrentDynamicAreaId[playerid] = INVALID_DYNAMIC_AREA_ID;
    10. return 1;
    11. }

    А разве оно запишет в gPlayerCurrentDynamicAreaId нужный ID зоны в которой находится игрок?
    Запишется ID последней динамической зоны, в которую вошёл игрок.

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

    Статус
    Оффлайн
    Регистрация
    11.10.2020
    Сообщений
    59
    Репутация:
    2 ±
    Так правильно, стример каждый раз прогоняет все динамические зоны, что дает постоянную нагрузку, а не один раз когда нажали на клавишу. Но динамический зон может быть на сервере много, домов, бизнесов и т.п.

    Я предпочитаю использовать то, что выполняется один раз

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

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    На самом деле, было-бы неплохо сделать сделать вход через пикапы с помощью нажатия клавиши и всё

  11. Пользователь сказал cпасибо:
    Pro_Coder (07.11.2020)
  12. #9
    Аватар для Saibot
    Пользователь

    Статус
    Оффлайн
    Регистрация
    21.08.2016
    Сообщений
    58
    Репутация:
    24 ±
    Цитата Сообщение от execution Посмотреть сообщение
    На самом деле, было-бы неплохо сделать сделать вход через пикапы с помощью нажатия клавиши и всё
    В первом варианте. сделано через пикап по нажатию на Alt.
    Или, как ты имел введу?

  13. #10
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    В первом варианты показано нажатие на АЛЬТ по координатам входа

 

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

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

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

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

Ваши права

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