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

    Статус
    Оффлайн
    Регистрация
    21.08.2016
    Сообщений
    58
    Репутация:
    24 ±
    Цитата Сообщение от execution Посмотреть сообщение
    В первом варианты показано нажатие на АЛЬТ по координатам входа
    Я имею в виду, что там стоит пикап, что бы игрок видел где нажимать.
    Но, я так понял ты, имел ввиду, что нужно сделать так, что бы игрок ставал на пикап, присваивать ID бизнеса в переменную и потом делать проверку в KEY_WALK, как в другом моем варианте.

    Так?

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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Честно говоря, я не понимаю боязни использовать цикл при нажатии на клавишу. Если проблема в микро-нагрузке, то страшно представить как бы ты написал систему секундного таймера который обрабатывает игроков, если не брать в счет индивидуальные таймеры.
    Ладно когда у тебя несколько сотен тысяч динамических зон...
    Или быть может когда игрок встает на пикап, то его ID возвращается каким-то чудесным образом, без цикла?
    Последний раз редактировалось punkochel; 07.11.2020 в 18:18.

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

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

    - - - Добавлено - - -

    Цитата Сообщение от whale Посмотреть сообщение
    Запишется ID последней динамической зоны, в которую вошёл игрок.
    Твой варинт не практичен.
    if(gDynamicAreaExtraData[player_dynamic_area_id][area_bussiness_id] != INVALID_BUSINESS_ID)
    ID бизнеса указан в структуре динамических зон
    player_dynamic_area_id не всегда будет равен ID бизнесу.
    Можно сделать так, что бы динамические зоны для бизнаса создавать в OnGameModeInit первыми, да бы у них ID был равен бизнесу, т.е. с 1.
    Но, за этим нужно следить, потому что, если создать динам. зону перед зоною с бизнесами то, areaid вернет уже не первый ID, а второй.
    А, если создать 10 динам. зон перед, то вернем 11 ID.
    Последний раз редактировалось Saibot; 08.11.2020 в 02:17.

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

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

    #define TYPE_HOUSE_PICKUP_ENTER 1 // Пикапы входа
    #define TYPE_HOUSE_PICKUP_EXIT 2 // Пикапы выхода
    // и т.д. для бизнеса и все начиная с 3

    PHP код:
    enum e_Data_House {
        
    h_STP,
        
    h_House
    }; 
    Когда создаешь пикап, в данном случае у меня загрузка с БД
    PHP код:
    data[e_Data_House
    PHP код:
                House[j][h_PickupID] = CreateDynamicPickup(127223, ...
                
    data[h_STP] = TYPE_HOUSE_PICKUP_ENTER;
                
    data[h_House] = Ид дома;
                
    Streamer_SetArrayData(STREAMER_TYPE_PICKUPHouse[j][h_PickupID], E_STREAMER_EXTRA_IDdata); 
    Когда встаешь на пикап
    PHP код:
    public OnPlayerPickUpDynamicPickup(playeridpickupid)
    {

        new
            
    data[e_Data_House];
        
    Streamer_GetArrayData(STREAMER_TYPE_PICKUPpickupidE_STREAMER_EXTRA_IDdata);
        if (
    data[h_STP] == TYPE_HOUSE_PICKUP_ENTER) {
            
    // data[h_House] - ид дома
            
    return 1;
        }

        return 
    1;

    И естественно удаляем данные перед удалением пикапа
    PHP код:
        new
            
    data[e_Data_House];
        
    data[h_STP] = TYPE_HOUSE_PICKUP_ENTER;
        
    data[h_House] = Ид дома;
        
    Streamer_RemoveArrayData(STREAMER_TYPE_PICKUPHouse[id][h_PickupID], E_STREAMER_EXTRA_IDdata);
        
    DestroyDynamicPickup(House[id][h_PickupID]); 
    Последний раз редактировалось Pro_Coder; 07.11.2020 в 19:06.

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

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от Pro_Coder Посмотреть сообщение
    ...
    Тоже хотел предложить этот вариант, но в этом случае под капотом у стримера все равно будет цикл)

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

    Статус
    Оффлайн
    Регистрация
    08.11.2020
    Сообщений
    2
    Репутация:
    0 ±
    Помнится я уже создавал тему с подобным вопросом, и Deimos ответил мне, что всяко лучше использовать стандартный подход со связкой цикла for и IsPlayerInRangeOfPoint, так как это создаёт лишь временную нагрузку, в то время как стример каждые N миллисекунд проходится по массиву с Dynamic Area и сверяет их координаты с координатами игрока, что создаёт постоянную нагрузку, даже когда игрок не нажимает левый ALT.

    Всяко лучше смотреть при реальном онлайне и сверять нагрузку, не стоит спешить что-то оптимизировать, если в этом нет нужды.

  8. #17
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от punkochel Посмотреть сообщение
    Лично я повсеместно использую динамические зоны, и советовал бы именно их, ибо проверка нахождения в зоне происходит быстрее чем проверка на нахождение в радиусе по координатам.[/pawn]
    А ты не задавался вопросом о том, как стример определяет то, в какой динамической зоне находится игрок? :)

    Цитата Сообщение от punkochel Посмотреть сообщение
    Или быть может когда игрок встает на пикап, то его ID возвращается каким-то чудесным образом, без цикла?
    Не поверишь, но отлавливанием пикапов занимается движок игры. Дальше SAMP перехватывает это событие и игрок отправляет серверу информацию о том, какой пикап он взял. Никаких циклов или дополнительных проверок для сервера в этот момент не происходит.




    Цитата Сообщение от Saibot Посмотреть сообщение
    Делаю вход в бизнес через 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. }

    У тебя есть два варианта: либо оставить вариант с проверкой координат, так как каких-то критических нагрузок это не создаёт и особо переживать тут не о чем, либо можешь сделать вариант, при котором ты в OnPlayerPickUpDynamicPickup запоминаешь ID пикапа, на который встал игрок + время, когда он встал на него, а в OnPlayerKeyStateChange проверяешь, давно ли последний раз игрок вставал на пикап и если недавно - запускаешь цикл и проверяешь, равен ли ID сохранённого в OnPlayerPickUpDynamicPickup пикапа с одним из пикапов бизнесов. Такой цикл будет меньше загружать сервер, но для игроков кнопка, при взятии пикапа, может срабатывать с некоторой задержкой (так что лично я выбрал бы первый вариант).

    Всё остальное - это просто сокрытие нагрузки, которая, подчас, будет даже больше, чем от цикла с проверкой координат.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  9. Пользователь сказал cпасибо:
    Saibot (10.11.2020)
  10. #18
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Цитата Сообщение от DeimoS
    А ты не задавался вопросом о том, как стример определяет то, в какой динамической зоне находится игрок? :)
    Понятное дело что цикл, просто мне на порядок лучше работать с зонами, нежели с пикапами, обусловлено это тем, что не нужно изобретать какие-то анти-флуды пикапов, есть возможность работать с зонами в любой точке мода, а не только в колбэке, ну, и конечно, сама динамичность создания различного рода форм и размеров.

    Цитата Сообщение от DeimoS
    Не поверишь, но отлавливанием пикапов занимается движок игры. Дальше SAMP перехватывает это событие и игрок отправляет серверу информацию о том, какой пикап он взял. Никаких циклов или дополнительных проверок для сервера в этот момент не происходит.
    Не могу конечно утверждать, но интересно, как это движок идентифицирует пикапы, созданные мультиплеером? Ладно бы игроки качали ГТА, в которой уже созданы все пикапы по дефолту, там можно было бы перехватить его ID.

  11. #19
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от punkochel Посмотреть сообщение
    Понятное дело что цикл, просто мне на порядок лучше работать с зонами, нежели с пикапами, обусловлено это тем, что не нужно изобретать какие-то анти-флуды пикапов, есть возможность работать с зонами в любой точке мода, а не только в колбэке, ну, и конечно, сама динамичность создания различного рода форм и размеров.
    Так с нажатием на кнопку тоже не нужно заморачиваться с какими-то анти-флудами. И тоже можно реализовать возможность создания таких пикапов в виде отдельных функций (правда, с учётом количества пикапов в среднестатистическом моде, особого смысла в этом нет, ибо то же самое можно сделать, просто поместив код в функцию и вызывая эту функцию в коллбэке. Это будет даже оптимизированнее).

    Цитата Сообщение от punkochel Посмотреть сообщение
    Не могу конечно утверждать, но интересно, как это движок идентифицирует пикапы, созданные мультиплеером? Ладно бы игроки качали ГТА, в которой уже созданы все пикапы по дефолту, там можно было бы перехватить его ID.
    Точно так же, как движок идентифицирует автомобили, в которые игрок садится, или объекты, которые создаёт сервер, учитывая их коллизию - всё это делается через встроенные в движок функции и SAMP лишь вызывает их, передавая в них данные так же, как ты бы это сделал, если бы, например, написал модификацию для сингла. Ну и так же, как это делает сама игра в сингле.

      Открыть/закрыть
    Для тебя это, возможно, будет открытием, но даже другие игроки в поле твоего зрения - это на деле не игроки, а обычные NPC, которые так же управляются движком игры. Сервер лишь отправляет данные о том, в каком состоянии находится игрок, а уже твой SAMP-клиент вызывает функции движка, заставляя NPC выполнять действия. Например, когда игрок бежит, сервер лишь передаёт направление и скорость, а не фактическое местоположение. Из-за этого у тебя игроки на деле находятся не в тех точках, где они находятся на самом деле, хоть эти отличия и не будут особо существенными (собственно, можно поискать скрины с каких-нибудь эвентов на том или ином проекте и найти скрины от разных игроков, сделаенные в одно время. Или вообще через песочницу зайти в игру за двух персонажей и поиграться с этим. Особенно заметно это, если один из персонажей будет на короткие расстояния перемещаться).
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Цитата Сообщение от DeimoS
    Для тебя это, возможно, будет открытием, но даже другие игроки в поле твоего зрения - это на деле не игроки, а обычные NPC, которые так же управляются движком игры. Сервер лишь отправляет данные о том, в каком состоянии находится игрок, а уже твой SAMP-клиент вызывает функции движка, заставляя NPC выполнять действия. Например, когда игрок бежит, сервер лишь передаёт направление и скорость, а не фактическое местоположение. Из-за этого у тебя игроки на деле находятся не в тех точках, где они находятся на самом деле, хоть эти отличия и не будут особо существенными (собственно, можно поискать скрины с каких-нибудь эвентов на том или ином проекте и найти скрины от разных игроков, сделаенные в одно время. Или вообще через песочницу зайти в игру за двух персонажей и поиграться с этим. Особенно заметно это, если один из персонажей будет на короткие расстояния перемещаться).
    Про синхронизацию я читал, знаю) Просто никогда не задумывался что движок сам определяет какие-либо значения, созданные из вне.

 

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

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

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

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

Ваши права

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