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

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 25

Тема: IsPlayerInVehicle

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

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    117
    Репутация:
    13 ±

    IsPlayerInVehicle

    Всем привет, давно использую у себя в модах свою функцию IsPlayerInVehicle_Ex
    Её плюсы:
    • Работает быстрее нежели стандартный IsPlayerInVehicle
    • Заменяет native GetPlayerVehicleID
    • Заменяет native IsPlayerInAnyVehicle


    Параметры: ИД игрока.
    Возвращает: ИД т/с, в противном случае 0 (иды машин стартуют с 1, так что все очень удобно).

    Кстати, надеюсь я не изобрел велосипед, ибо на форумах такого не видел.

    Суть:
    В начало мода кидаем массивчик (обнуляйте его при выходе игрока).
    PHP код:
    new Player_Veh_ID[MAX_PLAYERS]; 
    Делаем дефайн для удобства:
    PHP код:
    #define IsPlayerInVehicle_Ex(%0) Player_Veh_ID[%0] 
    В OnPlayerStateChange
    PHP код:
    if(newstate == PLAYER_STATE_DRIVERPlayer_Veh_ID[playerid] = GetPlayerVehicleID(playerid);
    else if(
    oldstate == PLAYER_STATE_DRIVERPlayer_Veh_ID[playerid] = 0

    Тесты скорости:
    PHP код:
    public OnPlayerStateChange(playeridnewstateoldstate)
    {
        new 
    tick GetTickCount();
        if(
    newstate == PLAYER_STATE_DRIVER)
        {
            
    Player_Veh_ID[playerid] = GetPlayerVehicleID(playerid);
            for(new 
    ia1000000i++)
            {
                
    += IsPlayerInVehicle_Ex(playerid);
            }
            
    printf("IsPlayerInVehicle_Ex = %i"GetTickCount() - tick);
            
    tick GetTickCount();
            for(new 
    i1000000i++)
            {
                
    GetPlayerVehicleID(playerid);
            }
            
    printf("GetPlayerVehicleID = %i"GetTickCount() - tick);
            
    tick GetTickCount();
            for(new 
    i1000000i++)
            {
                
    IsPlayerInVehicle(playeridi);
            }
            
    printf("IsPlayerInVehicle = %i"GetTickCount() - tick);
            
    SCMTA(-1"ALL");
        }
        else if(
    oldstate == PLAYER_STATE_DRIVERPlayer_Veh_ID[playerid] = 0;
        return 
    1;

    Код:
    1)
    [14:45:55] IsPlayerInVehicle_Ex = 210
    [14:45:56] GetPlayerVehicleID = 593
    [14:45:57] IsPlayerInVehicle = 941
    2)
    [14:46:19] IsPlayerInVehicle_Ex = 168
    [14:46:20] GetPlayerVehicleID = 716
    [14:46:21] IsPlayerInVehicle = 957
    3)
    [15:49:42] IsPlayerInVehicle_Ex = 231
    [15:49:43] GetPlayerVehicleID = 945
    [15:49:44] IsPlayerInVehicle = 974
    Последний раз редактировалось Prolific; 22.04.2016 в 00:53.

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

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    204
    Репутация:
    38 ±
    if(!GetPlayerVehicleID(playerid)
    ???

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

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    117
    Репутация:
    13 ±
    Цитата Сообщение от TheMallard Посмотреть сообщение
    if(!GetPlayerVehicleID(playerid)
    ???
    Тесты скорости...

    Кстати функция не нужна, приду домой переделаю под define для правильности восприятия. Хотя можно напрямую работать с переменной.

  4. #4
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,662
    Репутация:
    2145 ±
    Цитата Сообщение от Prolific Посмотреть сообщение
    В начало мода кидаем массивчик (обнуляйте его при выходе игрока).
    Цитата Сообщение от Prolific Посмотреть сообщение
    В OnPlayerStateChange
    Цитата Сообщение от Prolific Посмотреть сообщение
    Сама функция
    Разбрасывать по моду прибитые друг к другу гвоздями отрывки кода - и всего лишь ради одной функции... Это такая мода ставить палки к себе в колёса?

    http://pro-pawn.ru/showthread.php?10447
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    117
    Репутация:
    13 ±
    Почему сразу палки, ради двух строк писать перехват...

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

    Статус
    Оффлайн
    Регистрация
    06.03.2016
    Адрес
    Moscow
    Сообщений
    161
    Репутация:
    44 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Разбрасывать по моду прибитые друг к другу гвоздями отрывки кода - и всего лишь ради одной функции... Это такая мода ставить палки к себе в колёса?

    http://pro-pawn.ru/showthread.php?10447
    Как по мне, "палки" - это когда ради одной мизерной проверки Вы перехватываете кэлбек)

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,360
    Репутация:
    113 ±
    ффф)) ну это хорошо что ты умный такой и написал это, но когда измеряешь скорость не забывай её измерять в общем везде.
    Потому что ты нагрузил калбэк и не измерил его новую медленную скорость и новую нагрузку.
    Функция то быстро выполнятся стала, но калбэк ты нагрузил.
    Это тоже самое что тебя в магазин послали, а ты послал брата или сестру, один чёрт кто то, но пойдёт в магазин ...
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    117
    Репутация:
    13 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    ффф)) ну это хорошо что ты умный такой и написал это, но когда измеряешь скорость не забывай её измерять в общем везде.
    Потому что ты нагрузил калбэк и не измерил его новую медленную скорость и новую нагрузку.
    Функция то быстро выполнятся стала, но калбэк ты нагрузил.
    Это тоже самое что тебя в магазин послали, а ты послал брата или сестру, один чёрт кто то, но пойдёт в магазин ...
    Улови суть. В коллбэке мы вызываем затратную функцию всего 1 раз. В цикле вызываеи 100тыс. То есть смотри, ты сел в авто, функция вызвалась. После в любых командах, циклах, короче в любых кусках кода тебе уже не нужно вызывать GetPlayerVehicleID, а всего лишь прочитать значение переменной. В этом и вся суть.

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,360
    Репутация:
    113 ±
    записать в переменную и есть вызвать один раз, что так ты раз записывал что получилось раз

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

    Хотя если так подумать и не смотря на увеличенный объём ты сделал разгрузку, у меня в моде так всё равно идёт вызов узнавания VehID
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    117
    Репутация:
    13 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    записать в переменную и есть вызвать один раз, что так ты раз записывал что получилось раз

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

    Хотя если так подумать и не смотря на увеличенный объём ты сделал разгрузку, у меня в моде так всё равно идёт вызов узнавания VehID
    У тебя например цикл в моде:
    PHP код:
    for(new iMAX_PLAYERSi++)
    {
        if(
    GetPlayerVehicleID(i)) return 1;

    Если все игроки сидят в авто, то функция GetPlayerVehicleID вызовется 1000 раз.
    А теперь мой код:
    PHP код:
    for(new iMAX_PLAYERSi++)
    {
        if(
    IsPlayerInVehicle_Ex(i)) return 1;

    Так же мы вызовем IsPlayerInVehicle_Ex 1000 раз, НО мы всего лишь будем читать значение переменной, а не посылать запрос, получать ответ...

    Я думал, что принцип тривиален и не нуждается в объяснениях.

 

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

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

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

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

Ваши права

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