Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для Hello
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.08.2018
    Сообщений
    4
    Репутация:
    0 ±

    Снимание реактивного ранца (JetPack) нажатием клавиши F

    Добрый вечер. Возможно ли как-нибудь сделать так, чтобы джетпак не появлялся рядом с игроком после нажатия клавиши F=ENTER=16? Я пытался сделать что-то на подобии такого, но он все равно появляется:
    PHP код:
        if(newkeys == 16)
        {
          if(
    GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
          {
            
    ClearAnimations(playerid);
            return 
    1;
          }
        } 
    Последний раз редактировалось Hello; 18.08.2018 в 21:40.

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

    Статус
    Оффлайн
    Регистрация
    09.08.2017
    Сообщений
    37
    Репутация:
    3 ±
    Удалил до поиска решения (не те клавиши смотрел).
    Последний раз редактировалось ORLADOK; 18.08.2018 в 23:50.
    Пока я способен делать ошибки в своих словах/делах - я буду их делать. Никто мне не помешает краснеть и в то же время совершенствовать себя в понимании того вопроса!

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

    Статус
    Оффлайн
    Регистрация
    17.08.2018
    Сообщений
    4
    Репутация:
    0 ±
    Цитата Сообщение от ORLADOK Посмотреть сообщение
    1. Не используйте "магические числа", для них специально придумали макросы (замените 16 на KEY_SECONDARY_ATTACK).
    2. Стоит также внимательно почитать документацию по public OnPlayerKeyStateChange на wiki.
    3. Оттуда можно понять, что использование битовой операции &, вместо логического сравнения == дает право быстрее отреагировать скрипту, нежели игре снять реактивный ранец.

    Итого, все выглядит примерно так:
    1. // Вариант 1
    2. if(newkeys & KEY_SECONDARY_ATTACK){
    3. if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK){
    4. SetPlayerSpecialAction(playerid, SPECIAL_ACTION_NONE);
    5.  
    6. // Здесь мы задаем 0-ое действие, но на wiki описан баг, что
    7. // при таком варианте у игрока остается звук до первой смерти.
    8. }
    9. }
    10. // Вариант 2
    11. if(oldkeys & KEY_SECONDARY_ATTACK){
    12. if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK){
    13. ClearAnimations(playerid);
    14.  
    15. // Удаление какой-либо анимации у игрока.
    16. }
    17. }
    18. // Оба варианта рабочие, но конкретно я не помню преимущества каждого


    Прочитать стоит вики, ибо использование таких битовых операций может в последствие конфликтовать с другими назначениями.
    Все равно не успевает. Через раз работает. Не существует других вариантов?

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

    Проблема в ID клавишы. Нажал на ЛКМ и реактивный ранец исчез.

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

    Статус
    Оффлайн
    Регистрация
    09.08.2017
    Сообщений
    37
    Репутация:
    3 ±
    Костыль врезался в голову, правда, не столь удобный. (Тем более под анти-читы)
    Пока мы получаем нажатие клавиши Enter, Jet-Pack уже снимается.

    В общем, нужно объявить глобальную переменную, отвечающую за состояние права в надевании реактивного рюкзака.
    1. new bool:player_has_jetpack[MAX_PLAYERS] = false;
    2. // Не знаю, верна ли такая конструкция под массивы Pawn,
    3. // но сейчас проверка начала работать сразу.


    Затем:
    1. #define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
    2. // PRESSED можете заменить на любое другое удобное для Вас использование.
    3. // Его я откопал на <a href="http://forum.sa-mp.com/showthread.php?t=232410" target="_blank">форуме</a>, пока искал ответы на вопрос.
    4. // Я опустился даже до использования 8 раз SetPlayerPos, бегая персонажем по всем углам.
    5.  
    6. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    7. {
    8. if(PRESSED(KEY_FIRE)){
    9. // По строчкам в этом блоке, надеюсь, Вы поймете
    10. // как взаимодействовать с описанной выше переменной.
    11.  
    12. SetPlayerSpecialAction(playerid, SPECIAL_ACTION_USEJETPACK);
    13. player_have_jetpack[playerid] = true;
    14. } else if(PRESSED(KEY_SECONDARY_ATTACK))
    15. if(player_has_jetpack[playerid]) player_have_jetpack[playerid] = false;
    16.  
    17. return 1;
    18. }


    После проделанных операций мы ищем блок жизни игрока:
    1. // Если есть отдельный таймер подобного рода, то замечательно. Пихайте туда.
    2. public OnPlayerUpdate(playerid){
    3. if(player_have_jetpack[playerid] == false && GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK){
    4. // ClearAnimations(playerid); или:
    5. SetPlayerSpecialAction(playerid, SPECIAL_ACTION_NONE);
    6. }
    7. }


    Вывод: вероятно из Высшего членства люди помогут с перехватом JP до его удаления. Я же нашел такой способ.
    Последний раз редактировалось ORLADOK; 19.08.2018 в 01:03.
    Пока я способен делать ошибки в своих словах/делах - я буду их делать. Никто мне не помешает краснеть и в то же время совершенствовать себя в понимании того вопроса!

  5. Пользователь сказал cпасибо:
    Hello (20.08.2018)
  6. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Попробуй такой вариант:
    PHP код:
    public OnPlayerKeyStateChange(playeridnewkeysoldkeys
    {
        if(
    PRESSED(KEY_SECONDARY_ATTACK) && GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
        {
            new 
    Float:x
                
    Float:y
                
    Float:z;
            
    GetPlayerPos(playeridxyz);
            
    SetPlayerPos(playeridxyz);
            
    SetPlayerSpecialAction(playeridSPECIAL_ACTION_NONE);
        }
        return 
    1

    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  7. Пользователь сказал cпасибо:
    Hello (20.08.2018)
  8. #6
    Аватар для ORLADOK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.08.2017
    Сообщений
    37
    Репутация:
    3 ±
    Я его отрыл на forum.sa-mp.com, только он мне не помог.
    Но, смутила эта строка:
    1. if (PRESSED(KEY_SECONDARY_ATTACK)) && if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)

    http://forum.sa-mp.com/showthread.php?t=588785

    Хотя хз даже. Но, разве рационально так делать? По-моему срабатывание клавиши идет ранее, чем выполняется код верного условия.

    Была мысль использовать SetPlayerPos(..., z - 100) - тщетно.

    Я опустился даже до приведения 8 строк SetPlayerPos с таким ходом: координата +/- 1.5
    Но это было тщетно, не всегда он его подбирает.

    Уж проще моим окончательным методом.
    Последний раз редактировалось ORLADOK; 20.08.2018 в 14:47.
    Пока я способен делать ошибки в своих словах/делах - я буду их делать. Никто мне не помешает краснеть и в то же время совершенствовать себя в понимании того вопроса!

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

    Статус
    Оффлайн
    Регистрация
    17.08.2018
    Сообщений
    4
    Репутация:
    0 ±
    ORLADOK, спасибо за попытку помочь, но способ, который вы написали выше не совсем мне подходит. Он схож с принципом работы античита на реактивный ранец.
    DeimoS, к сожалению не работает.

    Я хотел сделать так, чтобы администраторы использовали эту команду вместо использования читов.
    Но получается так, что когда администратор захочет избавиться от реактивного ранца, то его сможет подобрать любой игрок. А если этот игрок не администратор, то мой античит сработает и кикнет его. Знаю, знаю, что можно просто забирать у игрока ранец и не кикать его. Или просто заставлять администраторов снимать ранец через повторное введение команды, но хз. Если нет перехвата, то очень жалко. Но все равно спасибо вам двоим за то, что попытались помочь.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, так "сброшенный" джетпак не виден другим игрокам. Он виден только тому, кто его сбросил
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  12. Пользователь сказал cпасибо:
    Hello (20.08.2018)
  13. #9
    Аватар для Hello
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.08.2018
    Сообщений
    4
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, так "сброшенный" джетпак не виден другим игрокам. Он виден только тому, кто его сбросил
    Не знал. Спасибо за пояснение.
    Тему можно закрывать

 

 

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

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

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

Ваши права

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