Author Topic: Автокликер для minecraft  (Read 3541 times)

0 Members and 1 Guest are viewing this topic.

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
Автокликер для minecraft
« on: July 12, 2019, 12:51:35 PM »
Пишу я скрипт для пвп в игре майнкрафт))) В новой версии игры, максимальный урон оружие наносит, только после небольшого кулдауна - приблизительно 550мс. В идеале скрипт должен работать так: нажал я кнопку "V" на клавиатуре, скрипт включился, и если я зажимаю ЛКМ, то скрипт жмет на ЛКМ раз в 550мс, если отпускаю, то ничего не делает. Повторное нажатие "V" останавливает скрипт. Не знаю реализуема ли вообще фишка с тем, чтобы просто зажать кнопку мыши, но если нет,
то мне достаточно будет того, что если я нажму "V" скрипт прожимал ЛКМ раз в 550мс. Собственно, что я и пытался реализовать.

Code: (clickermann) [Select]
THREAD(t)
   IF(iskeydown(#V) = 1)
      WHILE(iskeydown(#V) = 1)
      END_CYC
 
      IF(iskeydown(#V) = 0)
         $a = 1
      END_IF
         // включение
      If(iskeydown(#V) = 1)
         $a = 0
         // выключение
      END_IF
   ELSE
 
   END_IF
END_THREAD
 
If($a = 1)
   lclick($_xmouse, $_ymouse)
   WAITMS(500)     
End_If

Когда запускаешь мою писанину, то кликерманн просто зависает. Скорее всего из-за While в начале, хотя фиг его знает. Этот While нужен был для того, чтобы тред не закончился сразу же как начался, ведь, когда выполняется проверка на нажатость кнопки, сразу за ней идет еще одна проверка зажатости этой кнопки. Сейчас я проверил, и поставил вместо While KeyUp(#V), и все равно кликерманн завис намертво. Так что проблема, думаю, не в While.

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
Re: Автокликер для minecraft
« Reply #1 on: July 12, 2019, 12:54:47 PM »
Есть у меня костыль, для того, чтобы это все работало: назначить на включение и выключение скриптов в настройках кликера кнопку "V", единственный минус - скрипт не запустится с зажатым шифтом.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Автокликер для minecraft
« Reply #2 on: July 12, 2019, 02:40:22 PM »
Немного другая логика должна быть.
В основном потоке следим за клавишей V, в дополнительным выполняем клики.
Для удобства добавил звуковой сигнал разной тональности для включения и выключения.
После запуска нужно нажать V для активации кликов.

Code: (clickermann) [Select]
THREAD(t,0)
   LCLICK($_xmouse, $_ymouse)
   WAITMS(500)
END_THREAD

IF(iskeydown(#V) = 1)
   WHILE(iskeydown(#V) = 1)
   END_CYC
   IF($t = 0)
      BEEP(2000,200) // звуковой сигнал
      $t = $t^1 // включение
      SETTHREAD (t, 1)
   ELSE
      BEEP(1000,200)
      $t = $t^1 // выключение
      SETTHREAD (t, 2)
   END_IF
END_IF
WAITMS(20)

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
Re: Автокликер для minecraft
« Reply #3 on: July 12, 2019, 07:44:50 PM »
Немного другая логика должна быть.
В основном потоке следим за клавишей V, в дополнительным выполняем клики.
Для удобства добавил звуковой сигнал разной тональности для включения и выключения.
После запуска нужно нажать V для активации кликов.

Code: (clickermann) [Select]
THREAD(t,0)
   LCLICK($_xmouse, $_ymouse)
   WAITMS(500)
END_THREAD

IF(iskeydown(#V) = 1)
   WHILE(iskeydown(#V) = 1)
   END_CYC
   IF($t = 0)
      BEEP(2000,200) // звуковой сигнал
      $t = $t^1 // включение
      SETTHREAD (t, 1)
   ELSE
      BEEP(1000,200)
      $t = $t^1 // выключение
      SETTHREAD (t, 2)
   END_IF
END_IF
WAITMS(20)

Для чего нужно делать waitms(20), и что значит выражение:
Code: (clickermann) [Select]
$t = $t^1 Если ^1 - значит возвести в первую степень, то это то же самое что и
Code: (clickermann) [Select]
$t = $t ?
Можете подробнее пройтись по своему алгоритму, а то что-то я не очень врубился, в то что делает переменная $t на протяжении своей работы.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Автокликер для minecraft
« Reply #4 on: July 12, 2019, 08:06:29 PM »
Для чего нужно делать waitms(20)

Чтобы разгрузить процессор. Без задержки будет бессмысленная высокая нагрузка на проц. 20 мс вполне достаточно, но для слабых компов можно и 30.

и что значит выражение: $t = $t^1

Это битовая операция. $t^1 за место себя возвращает либо 0 либо 1 в зависимости от того что находится $t
если там 0 вернет 1 и запишет это число в $t
Таким образом каждый раз вызывая эту строку $t = $t^1 мы меняем значение в $t то на 1 то на 0

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: Автокликер для minecraft
« Reply #5 on: July 12, 2019, 10:27:42 PM »
что значит выражение:
Code: (clickermann) [Select]
$t = $t^1

Объясню на упрощенном примере всю красоту этой конструкции.
Code: (clickermann) [Select]
IF($t = 0)
   $t = $t^1 // включение
ELSE
   $t = $t^1 // выключение
END_IF

Что в этом скрипте происходит:
1. Проверяем условие IF($t = 0), и сразу получаем ответ - это выражение истинно. Значит переменной $t можно смело присваивать значение 0.
2. Но нам этого мало, мы докучи производим битовую операцию сравнения - $t^1, как бы на всякий случай. Читается оно так: либо $t, либо 1, но не оба одновременно. Так как 0 это ложь, а 1 это истина, и при этом они не равны, не истинны и не ложны одновременно, то условие в целом истинно. Наконец присваиваем переменной $t значение 1 вот таким макаром  $t = $t^1. Тут типа и проверка и присваивание одновременно.
3. На следующем проходе по скрипту, переменная $t, как мы помним, содержит единицу. Значит наша первая проверка условия IF($t = 0) вернет ложь, потому, что единица не равна нулю. Курсор интерпретатора кликера при таком раскладе попадает в секцию ELSE...
4. Где еще раз проверяется ложность выражения $t = 0, но опять же по хитрому - через битовую логическую операцию $t^1. И, так как у нас переменная $t = 1,  и 1 = 1, то получается, что оба эти операнда истинны. Но, для истинности всего выражения $t^1 в целом, они не должны быть истинны одновременно, только по одному, за раз. Таким образом оператор ^ делает это выражение ложным. А если выражение ложно, то в переменную $t теперь попадает значение 0.

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

Весь твой скрипт можно написать так, в одном дочернем потоке:
Code: (clickermann) [Select]
THREAD(t)
   IF(iskeydown(#V))
      lclick($_xmouse, $_ymouse)
      WAITMS(550)
   ELSE
      WAITMS(50)
   END_IF
END_THREAD

WAIT(1000) // какие то действия в основном потоке