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

Тема: MasPickups

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±

    MasPickups

    MasPickups

    Удобнее, функциональнее, проще





    Описание:


    Данный инклуд писался мной давно для своих личных целей, я не заметил похожих библиотек, разве что некоторые другие подобия, которые мне показались не достаточно удобными и функциональным да и их поддержка уже закончилась, поэтому я решил заняться этим. Инклуд находится в данный момент в режиме тестирования, обо всех багах прошу сообщать мне на гитхаб или в эту тему, постараюсь фиксить оперативно.


    Зависимости:
    Streamer


    Совместим с:

    YSF
    ePickups
    YSI




    Функции:



    Код:
    PickupCreate(pick_Function[23], pick_Model, pick_Type, Float:pick_X, Float:pick_Y, Float:pick_Z, pick_VirtualWorld = 0, pick_Interior = 0, pick_Playerid = 0, Float:streamdistance = STREAMER_PICKUP_SD)
    Создает динамический пикап, все аргументы, кроме pick_Function, взяты именно с функции создания пикапов, поэтому их объяснять не буду.
    pick_Function - функция, которая будет вызвана при взятии пикапа.
    Возвращает: id созданного пикапа



     пример
    Пример:

    Код:
    PickupCreate("testPickup", 19197, 23, 0.0, 0.0, 0.0, 0);


    * Примечание Функцию, которую Вы укажете при создании пикапа нужно использовать следующим образом:

    Код:
    new PolicePickup;
    OnGamemodeInit() {
    	PolicePickup = PickupCreate("dynPoliceDetective", 19197, 23, 2545.0198, -2114.5449, 11.0047, 0);
    	PickupSetAntiFlood(PolicePickup, 10);
    
    	return 1;
    }
    
    Pickup:dynPoliceDetective(playerid, pickupid) { // указывать Pickup: обязательно
    	return 1;
    }

    Код:
    DeletePickup(id)
    Удаляет пикап
    id - id пикапа
    Возвращает: 0, если пикап не был найден, в остальных случаях 1



    Код:
    PickupSetAntiFlood(id, interval)
    Устанавливает антифлуд для пикапа
    id - id пикапа
    interval - количество времени в секундах для действия антифлуда после подбора пикапа
    Возвращает: в любом случае 1


     пример
    Пример:


    Код:
    new test = PickupCreate("testPickup", 19197, 23, 0.0, 0.0, 0.0, 0);
    PickupSetAntiFlood(test , 3);



    Код:
    GetPickupTypeEx(id)
    Узнает тип пикапа
    id - id пикапа
    Возвращает: id типа пикапа


     пример
    Пример:


    Код:
    new test = PickupCreate("testPickup", 19197, 23, 0.0, 0.0, 0.0, 0);
    new model = GetPickupTypeEx(test); // в данном случае 23




    Код:
    GetPickupVirtualWorldEx(id)
    Узнает виртуальный мир пикапа
    id - id пикапа
    Возвращает: id виртуального мира


     пример
    Пример:


    Код:
    new test = PickupCreate("testPickup", 19197, 23, 0.0, 0.0, 0.0, 0);
    new vw = GetPickupVirtualWorldEx(test ); // в данном случае 0




    Код:
    GetPickupPlayerid(id)
    Узнает id игрока для которого был создан пикап
    id - id пикапа
    Возвращает: id игрока


     пример
    Пример:


    Код:
    new test = PickupCreate("testPickup", 19197, 23, 0.0, 0.0, 0.0, 0);
    new playerid = GetPickupPlayerid(test ); // в данном случае 0



    Код:
    PickupEmitate(playerid, id)
    Эмитирует взятие пикапа игроком
    playerid - id игрока
    id - id пикапа
    Возвращает: 0, если функция не была найдена


     пример
    Пример:


    Код:
    new test = PickupCreate("testPickup", 19197, 23, 0.0, 0.0, 0.0, 0);
    PickupEmitate(playerid, test );



    Код:
    SetPickupModel(&id, model)
    Устанавливает пикапу новую модель
    id - пикап
    model - модель
    Возвращает: всегда 1


    Код:
    SetPickupType(&id, type)
    Устанавливает пикапу новый тип
    id - пикап
    type - тип
    Возвращает: всегда 1


    Код:
    SetPickupVirtualWorld(&id, world)
    Устанавливает пикапу новый мир
    id - пикап
    world - мир
    Возвращает: всегда 1


    Код:
    SetPickupInterior(&id, interior)
    Устанавливает пикапу новый интерьер
    id - пикап
    interior - тип
    Возвращает: всегда 1


    Код:
    PickupSetTag(bool:is_on_key = false, antiflood = 0, sync = INVALID_PICKUP)
    Устанавливает последнему созданному пикапу определенные значения для работы
    is_on_key - пикап на кнопку или нет,
    antiflood - секунд антифлуда,
    sync - синхронизация с другим пикапом
    Возвращает: всегда 1




    Теперь переходим к интересному:




    Синхронизания двух пикапов
    Нужно для пикапов входа и выхода из здания/в здание. Один пикап телепортирует игрока на другой пикап, также и наоборот. Виртуальный мир и интерьеры также синхронизированы.

    Код:
    SyncPickup(syncid, withid)
    Синхронизирует два пикапа
    syncid - первый пикап
    withid - второй пикап
    Возвращает: всегда 1


    Пример синхронизации:
    Код:
    new tcd = PickupCreate("", 19197, 23, 2507.3115, -2125.3401, 11.0047, 0);
    PickupSetAntiFlood(tcd, 3);
    new tsd = PickupCreate("", 19197, 23, 2507.3115, -2130.3401, 11.0047, 0);
    PickupSetAntiFlood(tsd, 3);
    SyncPickup(tcd, tsd);
    Внимание! По умолчанию, для того, чтобы игрок не катался по пикапам, анти флуд у синхронизированных пикапов стоит 3 секунды, поэтому устанавливать антифлуд в этом случае не обязательно.


    Код:
    OnPlayerUseSyncPickup(playerid, pickupid, syncpickupid)
    Вызывается, когда игрок телепортируется по синхронизированному пикапу.
    playerid - id игрока
    pickupid - id пикапа
    syncpickupid - id пикапа, к которому игрок телепортировался


    Пикап на клавишу
    Пикап будет срабатывать только при нажатии на клавишу, которую можно поменять.


    Код:
    PickupSetOnKey(id)
    Пикап будет срабатывать только при нажатой клавише
    id - пикап
    Возвращает: всегда 1


    По умолчанию клавиша - левый альт, ее можно поменять вставив перед #include:

    Код:
    #define MAS_PCK_KEY 1024 // вместо 1024 код вашей клавиши

    Также можно поменять текст, который будет показываться как подсказка в таких пикапах, для этого в инклуде поменяйте строчку:

    Код:
    static const _mas_KEY_PRESS_TEXT[] = "{ADFF2F}Нажмите левый альт";

    Код:
    PickupSetOnPickup(id)
    Противоположен прошлой функции, пикап будет срабатывать как обычно
    id - пикап
    Возвращает: 0, если не был найден, в остальных случаях 1




    Текущая версия: 0.7 (Финальный релиз)

    - Добавлены функции DeletePickup, PickupSetOnPickup, PickupSetTag
    - Исправлены баги, а также небольшая оптимизация
    - Добавлена совместимость с foreach, если он подключен, то будет дополнительная оптимизация.
    - Отредактирована совместимость с YSF, теперь если он подключен, то будет дополнительная оптимизация.
    - Изменен стандартный размер динамической зоны для срабатывания пикапа, теперь он меньше и работает лучше.



    Прошлая версия: 0.6

    - Добавлены функции SetPickupModel, SetPickupType, SetPickupVirtualWorld и SetPickupInterior
    - Добавлена возможность сделать пикап работающим только по нажатию клавиши через функцию PickupSetOnKey
    - Добавлена возможность полной настройки данных:
    Можно задефайнить MAS_PCK_TEXT_KEY до подключения инклуда, это заменит текст-подсказку возле пикапа, работающем только по клавише.
    Аналогично с PICKUP_SYNC_STANDART_ANTIFLOOD. Задефайнив новое значение, можно изменить стандартный антифлуд у синхронизированных пикапов (он добавляется к тому, что указан в PickupSetAntiFlood)




    Скачать последнюю версию
    GitHub


    Автор: Masson
    Публикация в иных источниках без согласия автора запрещена.
    Последний раз редактировалось MassonNN; 05.06.2020 в 09:27.

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    1) Некоторые функции объявлены без ключевого слова stock, если я не буду вызывать (например: SetPickupModel), то компилятор сообщит, что я не использовал функцию
    2) MAX_PICKUPS - довольно часто встречаемое название. Советую добавить префикс (например: MASPKP_)
    3) Какой смысл от continue?
    1. for(new i; i < MAX_PICKUPS; i++) {
    2. if(IsPlayerInDynamicArea(playerid, getPickup[i][pickArea])) {
    3. PickupEmitate(playerid, i);
    4. } else continue;
    5. }

    4) getPickup - как-то неоч?

    P.S: это быстрым взглядом, то что увидел.
    P.S.S: есть tdw_pickup. Почему не устроил?

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    1) Некоторые функции объявлены без ключевого слова stock, если я не буду вызывать (например: SetPickupModel), то компилятор сообщит, что я не использовал функцию
    2) MAX_PICKUPS - довольно часто встречаемое название. Советую добавить префикс (например: MASPKP_)
    3) Какой смысл от continue?
    1. for(new i; i < MAX_PICKUPS; i++) {
    2. if(IsPlayerInDynamicArea(playerid, getPickup[i][pickArea])) {
    3. PickupEmitate(playerid, i);
    4. } else continue;
    5. }

    4) getPickup - как-то неоч?

    P.S: это быстрым взглядом, то что увидел.
    P.S.S: есть tdw_pickup. Почему не устроил?
    1). никогда не встречался с такими варнингами, если честно, проверить это не могу в данный момент, если это вызывает проблемы на обычном компиляторе, то могу исправить, у меня все ок

    2). Я использую именно MAX_PICKUP, так как это встроенная в самп константа, соответственно, чтобы не создавать отдельный идентификатор и в будущем заморачиваться с этим, я оставил как есть и использую системные id.

    3). ну смысла, наверное, никакого, просто привычка.

    4). могу поменять, но если честно какая разница, типа может быть использован?

    по поводу tdw, не видел вообще такой библиотеки ранее, но пробежавшись по коду могу сказать, что, наверное, моя библиотека предназначена более для практического использования (те же синхронизированные пикапы, антифлуд и т.д.), остальной функционал в целом одинаковый. И да, сейчас обнаружил, что библиотека старая и в ней нет поддержки динамических пикапов
    Последний раз редактировалось MassonNN; 03.06.2020 в 21:47.

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Текущая версия: 0.7 (Финальный релиз)
    - Добавлены функции DeletePickup, PickupSetOnPickup, PickupSetTag
    - Исправлены баги, а также небольшая оптимизация
    - Добавлена совместимость с foreach, если он подключен, то будет дополнительная оптимизация.
    - Отредактирована совместимость с YSF, теперь если он подключен, то будет дополнительная оптимизация.
    - Изменен стандартный размер динамической зоны для срабатывания пикапа, теперь он меньше и работает лучше.

    Основная разработка окончена, буду работать только над оптимизацией, фиксами и т.д.

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Посмотрел ещё раз код.

    1) Для "L.ALT" есть константа: KEY_WALK
    1. #if !defined MAS_PCK_KEY
    2. #define MAS_PCK_KEY 1024 // L.ALT
    3. #endif


    2) Точно тут не должно быть так?

    1. // Optionall
    2. #if !defined _mas_KEY_PRESS_TEXT
    3. static const _mas_KEY_PRESS_TEXT[] = !"{ADFF2F}Press alt";
    4. #endif


    3)
    1. if(strlen(pick_Function) > MAX_PICK_FUNC_NAME) return 1;
    2. if(strlen(pick_Function))


    ?
    1. new len = strlen(pick_Function);


    Участок кода

    4) Почему тут отрицание перед "членом" перечисления?

    1. if(getPickup[id][!pickModel]) return 0;


    5) Параметры лучше пропускать через именованные параметры (через .)

    6) Параметры у функции, лучше всего указывать через const (которые дальше не должны изменятся во время работы функции)

    7) Зачем ты делаешь дополнительные блоки кода (условия), когда можно без них?

    Что мешает сделать так:

    1. IsPickupCreated(id) {
    2. if (getPickup[id][pickClass] > 0) {
    3. return 1;
    4. }
    5. return 0;
    6. }

    1. if (newkeys == MAS_PCK_KEY && IsPlayerInAnyDynamicArea(playerid)) {
    2. for (new i = 0; i < MAX_PICKUPS; i++) {
    3. if (IsPlayerInDynamicArea(playerid, getPickup[i][pickArea])) {
    4. PickupEmitate(playerid, i);
    5. }
    6. }
    7. }

    Или так:
    1. if (newkeys == MAS_PCK_KEY && IsPlayerInAnyDynamicArea(playerid)) {
    2. for (new i = 0; i < MAX_PICKUPS; i++) {
    3. if (IsPlayerInDynamicArea(playerid, getPickup[i][pickArea]) == INVALID_STREAMER_ID) {
    4. continue;
    5. }
    6. PickupEmitate(playerid, i);
    7. }
    8. }

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Посмотрел ещё раз код.

    1) Для "L.ALT" есть константа: KEY_WALK
    1. #if !defined MAS_PCK_KEY
    2. #define MAS_PCK_KEY 1024 // L.ALT
    3. #endif


    2) Точно тут не должно быть так?

    1. // Optionall
    2. #if !defined _mas_KEY_PRESS_TEXT
    3. static const _mas_KEY_PRESS_TEXT[] = !"{ADFF2F}Press alt";
    4. #endif


    3)
    1. if(strlen(pick_Function) > MAX_PICK_FUNC_NAME) return 1;
    2. if(strlen(pick_Function))


    ?
    1. new len = strlen(pick_Function);


    Участок кода

    4) Почему тут отрицание перед "членом" перечисления?

    1. if(getPickup[id][!pickModel]) return 0;


    5) Параметры лучше пропускать через именованные параметры (через .)

    6) Параметры у функции, лучше всего указывать через const (которые дальше не должны изменятся во время работы функции)

    7) Зачем ты делаешь дополнительные блоки кода (условия), когда можно без них?

    Что мешает сделать так:

    1. IsPickupCreated(id) {
    2. if (getPickup[id][pickClass] > 0) {
    3. return 1;
    4. }
    5. return 0;
    6. }

    1. if (newkeys == MAS_PCK_KEY && IsPlayerInAnyDynamicArea(playerid)) {
    2. for (new i = 0; i < MAX_PICKUPS; i++) {
    3. if (IsPlayerInDynamicArea(playerid, getPickup[i][pickArea])) {
    4. PickupEmitate(playerid, i);
    5. }
    6. }
    7. }

    Или так:
    1. if (newkeys == MAS_PCK_KEY && IsPlayerInAnyDynamicArea(playerid)) {
    2. for (new i = 0; i < MAX_PICKUPS; i++) {
    3. if (IsPlayerInDynamicArea(playerid, getPickup[i][pickArea]) == INVALID_STREAMER_ID) {
    4. continue;
    5. }
    6. PickupEmitate(playerid, i);
    7. }
    8. }
    1 - не вижу разницы особо
    2 - исправим
    3 - исправим
    4 - потому что значение в нем принимается противоположным
    5 - чем? Если только тем, что просто можно переставить, то для меня удобнее так, как уже привык
    6 - таких параметров почти нет, если говорить о строках, для целочисленных разницы вроде нет
    7 - уже отвечал на этот вопрос, просто привычка, в некоторых языках условные конструкции надёжнее

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от MassonNN Посмотреть сообщение
    1 - не вижу разницы особо
    представим, что Kalcor в следующих версиях сменить значение, то вам придется паттчить инклуд, а если будет константа, то ничего не нужно будет менять.
    Цитата Сообщение от MassonNN Посмотреть сообщение
    4 - потому что значение в нем принимается противоположным
    Эмм?
    Цитата Сообщение от MassonNN Посмотреть сообщение
    5 - чем? Если только тем, что просто можно переставить, то для меня удобнее так, как уже привык
    Так видно, какие параметры пропущены (потому что они именованные)
    Цитата Сообщение от MassonNN Посмотреть сообщение
    6 - таких параметров почти нет, если говорить о строках, для целочисленных разницы вроде нет
    Есть SyncPickup, например и подобные вспомогательные функции
    7 - уже отвечал на этот вопрос, просто привычка, в некоторых языках условные конструкции надёжнее[/QUOTE]

    WTF? В каких таких языках? Это просто не нужно. Усложняешь код

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    представим, что Kalcor в следующих версиях сменить значение, то вам придется паттчить инклуд, а если будет константа, то ничего не нужно будет менять.

    Эмм?

    Так видно, какие параметры пропущены (потому что они именованные)

    Есть SyncPickup, например и подобные вспомогательные функции
    7 - уже отвечал на этот вопрос, просто привычка, в некоторых языках условные конструкции надёжнее
    WTF? В каких таких языках? Это просто не нужно. Усложняешь код[/QUOTE]

    Ага, калкор садится и меняет значение, судя по его статусу, обновлений сампа вообще больше не будет, а даже если будут, то значение поменять ничего не стоит.

    SyncPickup не принимает строковых параметров, а про целочисленные я уже сказал, разницы не особо вижу


    Инструкции, входящие в программу, могут исполняться как последовательно, одна за другой, так и одновременно; как однократно, так и многократно; последовательность исполнения инструкций может совпадать с последовательностью их расположения в записи программы или не совпадать, а также зависеть как от текущего состояния вычислителя, исполняющего программу, так и от внешних событий, образовывая, таким образом, разнообразные порядки выполнения инструкций.

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от MassonNN Посмотреть сообщение
    WTF? В каких таких языках? Это просто не нужно. Усложняешь код

    Ага, калкор садится и меняет значение, судя по его статусу, обновлений сампа вообще больше не будет, а даже если будут, то значение поменять ничего не стоит.

    SyncPickup не принимает строковых параметров, а про целочисленные я уже сказал, разницы не особо вижу


    Инструкции, входящие в программу, могут исполняться как последовательно, одна за другой, так и одновременно; как однократно, так и многократно; последовательность исполнения инструкций может совпадать с последовательностью их расположения в записи программы или не совпадать, а также зависеть как от текущего состояния вычислителя, исполняющего программу, так и от внешних событий, образовывая, таким образом, разнообразные порядки выполнения инструкций.
    Зачем ты делаешь дополнительное условие? Ты можешь объяснить это? Если и так цикл пойдет дальше и не зайдет в блок кода под if'ом, но ты все равно делаешь continue / return. На счет Калкора: это частный случай, лучше всегда использовать константы.

    Мне интересно: ты и в переменных, где хранится ник используешь 24 + 1, вместо MAX_PLAYER_NAME + 1?

    P.S: Я не вижу смысла продолжать дальше доказывать, если ты все равно не примешь информацию.

  10. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (07.06.2020) execution (06.06.2020)
  11. #10
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

 

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

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

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

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

Ваши права

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