Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Управление предметами в игре Небеса, Скрипт для продать, забрать, разобрать предметы
Jpr
сообщение 7.2.2017, 13:21
Сообщение #1


**

Neophyte
Сообщений: 10
Регистрация: 30.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.317



Доброго дня всем!
Прошу не судить строго за такой кривой скрипт. Программистом стал только вчера, а код собирал по видео с ютуба (IMG:style_emoticons/default/smile.gif) Прочие варианты скриптов без if почему-то отказываются работать
Пытаюсь написать универсальный скрипт, который бы не только бил, но и помогал по хозяйству.
Буду рад помощи в улучшении скрипта. Задача состоит в написании двух частей скрипта. Первая война с мобами, вторая - управление предметами. Хочу, чтобы одни предметы забирал, другие продавал или разбирал(при возможности их разобрать). В идеале еще объединял и складывал в сундук, но это пока не под силу мне. Подскажите, что изменить или улучшить можно в скрипте, чтобы не кликал в холостую, когда уже другие строки скрипта должны исполняться?
Небеса

Код
set #handleWin findwindow
set workwindow #handleWin
//UOPilot привяжется к последнему активному окну
//жмем остров 1011, 381 abs
set #x 1011 + random (10)
set #y 381 + random (10)
left #x #y abs
wait 1500 + random (200)

//тень воина
if  418, 641 930907
set #x 409 + random (12)
set #y 644 + random (12)
left #x #y abs
wait 1000 + random (300)
End_if
//нападение
if 446, 207 9816548
set #x 788 + random (12)
set #y 427 + random (3)
left #x #y abs
wait 1000 + random (300)
End_if

//бой
//нажать яд
while 531, 723 12373756
set #x 531 + random (5)
set #y 723 + random (5)
left #x #y abs
wait 500 + random (200)
End_while

//если победа
if 523, 464 80685

// если выпал предмет, то забрать
if 630, 440 2234229

//нажать дроп  631, 436  abs
set #x 631 + random (5)
set #y 436 + random (5)
left #x #y abs
wait 500 + random (200)

//нажать забрать во всплывшем окне 744, 474
set #x 744 + random (7)
set #y 474 + random (3)
left #x #y abs
wait 500 + random (200)
End_if

//если не выпал предмет, то продать
if_not 630, 440 2234229
//нажать выйти  775, 499
set #x 775 + random (10)
set #y 499 + random (5)
left #x #y abs
wait 1000 + random (200)
End_if

//продать, если вылезло окно предупреждение
if 519, 423 7498230
set #x 904 + random (10)
set #y 523 + random (4)
left #x #y abs
wait 1500 + random (200)
End_if

//выйти, ячейка с предметом пуста 774, 497
if 633, 436 2769506
set #x 774 + random (20)
set #y 497 + random (4)
left #x #y abs
wait 1500 + random (500)
End_if
end_if
end_if

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 7.2.2017, 15:38
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Цитата
не получается свернуть код

Код
[spoiler=название]
текст
[/spoiler]


Нажмите скрипт --> форматировать. Будет удобнее читать код. В конце лишний end_if.
Код
// если выпал предмет, то забрать
if 630, 440 2234229
//если не выпал предмет, то продать
if_not 630, 440 2234229

Это записывать лучше так:
Код
if 630, 440 2234229 
    // выпал предмет
else     // иначе
    // не выпал предмет
end_if


Код
set #x 409 + random (12)
set #y 644 + random (12)
left #x #y abs

left 409 644 12 12 abs - можно так записывать

Делайте скрипт через gosub http://uopilot.tati.pro/index.php?title=Gosub, 2й пример.
Получится что-то вроде:
код
Код
while 1 = 1
    gosub поиск_моба            // переход к метке 'поиск_моба'
    gosub бьём_моба
    gosub забираем_дроп
end_while

:поиск_моба
    // тут действия для поиска моба, например:
    while_not 418, 641 930907     // пока не найден моб
        // клик на остров
       // пауза чтоб остров прогрузился
    end_while
return            // вернуться к месту перенаправления

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

:забираем_дроп
    // нужные действия с дропом
return
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jpr
сообщение 7.2.2017, 17:53
Сообщение #3


**

Neophyte
Сообщений: 10
Регистрация: 30.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.317



Совсем запутался в этой структуре кода, где и как происходит переход от одного действия к другому?
Какая-то каша получилась, не понимаю в каком месте нападение. Все, что делает сейчас это просто листает острова, не находит никого и не нападает
код
Код
while 1 = 1
    gosub поиск_моба            // переход к метке 'поиск_моба'
    gosub бьём_моба
    gosub забираем_дроп
end_while

:поиск_моба
while_not 415, 635 9879244
left 1011 381 12 12 -12 -12 abs        // клик на остров
wait 5000 + random (200)       // пауза чтоб остров прогрузился
end_while
msg бьем монстра
return            // вернуться к месту перенаправления

:бьём_моба
if   420, 639 7709375     //если найден моб
left 419, 640 10 10 -10 -10 abs
wait 500 + random (200)
end_if

//нападение
while 454, 214 11129837 // тут действия для убийства моба, также через while
left 776, 429 12 3 -12 -3 abs   //напасть
wait 500 + random (200)
end_while

// бой
//нажать яд
while 607, 206 936748
left 447, 667 5 5 -5 -5 abs
500 + random (200)
end_while
// т. е. пока моб не убит, не выходим из этого блока
msg забираем дроп
return

:забираем_дроп

//если победа
if 526, 464 78630
wait 500 + random(200)
// нужные действия с дропом
if 630, 440 2234229  // если выпал предмет, то забрать, иначе продать
left 631,436 5 5 -5 -5 abs
wait 500 + random (200)
left 744,474 7 3 -7 -3 abs //нажать забрать во всплывшем окне
wait 500 + random (200)

//иначе продать
else
left 775,499 10,5 -10 -5 abs
wait 1000 + random (200)
End_if

//продать, если вылезло окно прредупреждение
if 519, 423 7498230
left 904,523 10 4 -10 -4 abs
wait 1500 + random (200)
End_if

//выйти, ячейка с предметом пуста 774, 497
if 633, 436 2769506
left 774,497 20 4 -20 -4 abs
wait 1500 + random (500)
End_if
end_if

return


Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 7.2.2017, 18:20
Сообщение #4


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21047
Пользователь №: 16.156



Верхушка кода - вызов меток.

Код
while 1 = 1
    gosub поиск_моба            // переход к метке 'поиск_моба'
    gosub бьём_моба
    gosub забираем_дроп
end_while


Метки начинаются с двоеточия, дальше следует ее имя.

Код
:поиск_моба


код этой метки располагается до ключевого слова

Код
return


Пример :

Код
:поиск_моба
//тут код
return            // вернуться к месту перенаправления


другие метки следуют тому же принципу.


А вообще, ознакомиться стоит. Пример 2 прям по ситуации.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jpr
сообщение 8.2.2017, 0:12
Сообщение #5


**

Neophyte
Сообщений: 10
Регистрация: 30.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.317



Цитата(Cockney @ 7.2.2017, 18:20) *

А вообще, ознакомиться стоит. Пример 2 прям по ситуации.

Именно по данному примеру пытаюсь понять как написать код.
Правильно ли я описал процесс сейчас? Можете ли выложить свой готовый пример работающего кода?
Многие вещи мне не понятны от начала до конца по описанию в Вики, но в конкретных примерах яснее.
Почему не происходит нужный процесс - кликнул остров, нашел моба, кликнул на него, напал, нажал заклинание, победил?
скрипт
Код
while 1 = 1
    gosub poisk            // переход к метке 'poisk'
    gosub napadenie
    gosub забираем_дроп
end_while

:poisk
left 973, 400 10 10 -10 -10  abs  // клик на остров
wait 2000 + random (500) // пауза чтоб остров прогрузился

while  390, 572 5695223  //ищем матазуу
goto napadenie
while 371, 635 263431 //ищем курлыка
goto napadenie
while 415, 560 12956589  //ищем солн.ведьму
goto napadenie

end_while
end_while
end_while
return            // вернуться к месту перенаправления

:napadenie
while 414, 270 11985401 //ждем открытия окна для нападения
wait 500 + random (200)
end_while

set #d findcolor (403, 138 973, 502 1 1 (3949430) %arr 2 -1 3)   //Жмем в бой  2 - это тип поиска   -1 - количество найденных пикселей (искать все)  3 - погрешность оттенка
if #d > 0           // если найден нужный цвет
move %arr [1 1] %arr [1 2] // переместит курсор на найденные точки
  left  739, 503 10 3 -10 -3 abs    // нажмет в бой
  wait 1000 + random (200)          // ждет боя
end_if

while  570, 231 607783 // Бой с монстром  ждем своего хода ориентир стрелка
left 409, 691 5 5 -5 -5  //Жмем яд
wait 500 + random (200)    // тут действия для убийства моба, также через while
end_while
return

:забираем_дроп
    // нужные действия с дропом
return
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 8.2.2017, 2:29
Сообщение #6


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Цитата
Почему не происходит нужный процесс

Код
while 1 = 1
    gosub poisk
    log Моб нашёлся        
    gosub napadenie
    log Моб убит
    gosub забираем_дроп
    log Дроп собран
end_while

Смотрим на какой стадии скрипт перестаёт правильно работать. Например, если в логе 'Моб нашёлся', значит моб находится, т. е. в блоке поиска нет проблем. Находим метку, в которой что-то не так, добавляем вывод в лог в метке и смотрим что в ней не работает.
Это сразу убираем:
Код
while  390, 572 5695223  //ищем матазуу
    goto napadenie
    while 371, 635 263431 //ищем курлыка
        goto napadenie
        while 415, 560 12956589  //ищем солн.ведьму
            goto napadenie
        end_while
    end_while
end_while

Про goto лучше забудьте. Можно так:
Код
:poisk
    while_not 112, 35 8188940 or 121, 132 16252886 or 118, 245 5848370   // пока не найден матазуу или курлык или ведьма
        left 973, 400 10 10 -10 -10  abs  // клик на остров
        wait 2000 + random (500) // пауза чтоб остров прогрузился
    end_while
return
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jpr
сообщение 8.2.2017, 11:09
Сообщение #7


**

Neophyte
Сообщений: 10
Регистрация: 30.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.317



Цитата(cirus @ 8.2.2017, 2:29) *

Про goto лучше забудьте. Можно так:


C goto мне понятно, где и как происходит переход от поиска мобов и кликами по острову к нажатию на найденного моба и нападения на него. Как происходит данный процесс при вашей версии кода? Возможно что-то нужно дописать? Если нужно, то что и в какую строку кода? Сейчас получается, что в коде без goto у меня написано "нажимать на остров пока не найдешь цвет в координатах", что и происходит у меня. Листает острова, пропускает мобов и листает дальше.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 8.2.2017, 11:38
Сообщение #8


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Цитата
C goto мне понятно, где и как происходит переход от поиска мобов

Пока в скрипте несколько goto ещё можно отследить ход скрипта, когда их будет штук 20 сами запутаетесь.
Цитата
Как происходит данный процесс при вашей версии кода?

Клик на остров, ожидание прогрузки, если моб найден выход из цикла. Вообще искать мобов по цвету можно только тех что не двигаются. Наведите курсор на Курлыка и понажимайте Ctrl + A, цвет в одной и той же точке разный будет. Поэтому поиск моба я делал через поиск его имени: https://forum.uokit.com/index.php?showtopic=30171
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jpr
сообщение 8.2.2017, 16:15
Сообщение #9


**

Neophyte
Сообщений: 10
Регистрация: 30.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.317



Цитата(cirus @ 8.2.2017, 11:38) *

Пока в скрипте несколько goto ещё можно отследить ход скрипта, когда их будет штук 20 сами запутаетесь.

Клик на остров, ожидание прогрузки, если моб найден выход из цикла. Вообще искать мобов по цвету можно только тех что не двигаются. Наведите курсор на Курлыка и понажимайте Ctrl + A, цвет в одной и той же точке разный будет. Поэтому поиск моба я делал через поиск его имени: https://forum.uokit.com/index.php?showtopic=30171


Спрашивал уже в вашей теме, но сам не понял, а ответы также не внесли ясности. Как сделать клик с рандомными координатами в вашем скрипте? А также как сделать в нем рандомные паузы? Либо это уже присутствует, но тогда в каком месте это описано в коде?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jpr
сообщение 8.2.2017, 19:35
Сообщение #10


**

Neophyte
Сообщений: 10
Регистрация: 30.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.317



Правильно ли я пытаюсь описать кодом то, что указал в комментариях строк кода?
Должно быть так - жмем остров, ищем картинку с мобом с девиацией 5% в цвете, если не нашли жмем остров и так пока не найдем моба. Если нашли, то навели курсов на центр картинки и нажали на моба с рандомными координатами от центра картинки? Почему-то нажимает на всех подряд, кто попадается.

Код
 gosub poisk   // начало скрипта
end_script

:poisk
left 1009, 376  10 10 -10 -10 abs   //Жмем остров
wait 500 + random(200)
//ищем мобов
set #a findimage (0 0 1920 1080 (C:\Users\user_4\Downloads\КартинкиНебеса\ten.bmp) %crds 2 80 20 5)
    if  #a > 0
        move %crds[1 3] %crds[1 4]     // переместить курсор на найденную картинку в центр
        wait 500 + random (200)         // ждать
               else
       left 1009, 376  10 10 -10 -10 abs   //Жмем остров
    end_if

left 415, 634 10 10 - 10 -10 abs   // нажимаем на моба по рандомным координатам
wait 500 + random(200)
return
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 9.2.2017, 2:45
Сообщение #11


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Цитата
Спрашивал уже в вашей теме

Ответил в той теме.
Код
Почему-то нажимает на всех подряд, кто попадается. 

Должно быть так:
Код
set #a findimage (0 0 1920 1080 (C:\Users\user_4\Downloads\КартинкиНебеса\ten.bmp) %crds 2 80 20 5)
if  #a > 0      // если моб нашёлся
    клик по мобу      // т. е. клик только если моб нашёлся
else
    клик на остров
end_if

У вас так:
Код
set #a findimage (0 0 1920 1080 (C:\Users\user_4\Downloads\КартинкиНебеса\ten.bmp) %crds 2 80 20 5)
if  #a > 0        // если моб нашёлся
    навести курсор на моба
else
    клик на остров
end_if
клик по мобу    // т. е. клик будет сделан в любом случае, нашёлся моб или нет

Кстати, искать мобов через findimage можно только если они не меняют цвет и форму, т. е. статичных. Либо искать часть моба, которая не меняется. Я же не просто так делал скрипт для поиска мобов через поиск имени.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jpr
сообщение 12.2.2017, 22:55
Сообщение #12


**

Neophyte
Сообщений: 10
Регистрация: 30.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.317



Цитата(cirus @ 9.2.2017, 2:45) *

Либо искать часть моба, которая не меняется. Я же не просто так делал скрипт для поиска мобов через поиск имени.

Вот что получилось и более менее работает у меня. Немного путает небесного духа с небесным василиском из-за слова "небесный", но это исправимо. В процессе работы прокручивает весь скрипт от начала до конца, а не в пределах одной метки. Как это исправить, чтобы он крутил код внутри метки, а когда все условия выполнены переходил к другой?
скрипт

Код
while 1 = 1
    gosub poisk            // переход к метке 'poisk'
    gosub napadenie
    gosub boy
    gosub drop
end_while

:poisk
left 971, 382  10 10 -10 -10  abs  // клик на остров
move 381, 636  10 10 -10 -10  abs  // навели на моба курсор
wait 1200 + random (300) // пауза чтоб остров прогрузился

set #a findimage (0 0 1366 768 (C:\Notepack\img\НебесныйДух.bmp) %crds 2 80 -1 5)
if  #a > 0        // если моб нашёлся
    left 384, 642  10 10 -10 -10  abs  // клик на моба
    wait 500 + random (300)
end_if
set #a findimage (0 0 1366 768 (C:\Notepack\img\ТеньВоина.bmp) %crds 2 80 -1 5)
if  #a > 0        // если моб нашёлся
    left 384, 642  10 10 -10 -10  abs  // клик на моба
    wait 500 + random (300)
end_if
return            // вернуться к месту перенаправления

:napadenie
set #b findimage (0 0 1366 768 (C:\Notepack\img\напасть.bmp) %crds 2 80 -1 5)
if  #b > 0        // если кнопка нашлась
    left 737, 427 15 3 -15 -3  abs  // клик напасть
    wait 1500 + random (300)  // ждем хода
end_if
return

:boy
// ход энергией
set #b findimage (0 0 1366 768 (C:\Notepack\img\энходдева.bmp) %crds 2 80 -1 5)
if  #b > 0        // если кнопка нашлась
    left 408, 667  5 3 -5 -3  abs  // клик нажать  энход
    wait 500 + random (200)  // ждем хода
end_if
//ход маной
set #b findimage (0 0 1366 768 (C:\Notepack\img\ходмана.bmp) %crds 2 80 -1 5)
if  #b > 0        // если кнопка нашлась
    left 724, 616  5 3 -5 -3  abs  // клик нажать
    wait 500 + random (200)  // ждем
end_if
//ход квадрат
set #с findimage (0 0 1366 768 (C:\Notepack\img\квадрат.bmp) %crds 2 80 -1 5)
if  #с > 0        // если кнопка нашлась
    left 463, 612 5 3 -5 -3  abs  // клик нажать
    wait 2500 + random (200)
    left 675, 364 50 50 -50 -50  abs  // клик на поле
    wait 500 + random (200)  // ждем хода
end_if
//ход крест
set #d findimage (0 0 1366 768 (C:\Notepack\img\крест.bmp) %crds 2 80 -1 5)
if  #d > 0        // если кнопка нашлась
    left 513, 612   5 3 -5 -3  abs  // клик нажать
    wait 2500 + random (200)
    left 675, 364  50 50 -50 -50  abs  // клик на поле
    wait 500 + random (200)  // ждем
end_if
//ход молния
set #e findimage (0 0 1366 768 (C:\Notepack\img\крест.bmp) %crds 2 80 -1 5)
if  #e > 0        // если кнопка нашлась
    left 407, 614   5 3 -5 -3  abs  // клик нажать
    wait 500 + random (200)  // ждем
end_if

return

:drop
//забрать предметы


    //выйти, если не найден предмет для забора
set #e findimage (0 0 1366 768 (C:\Notepack\img\выйти.bmp) %crds 2 80 -1 5)
if  #e > 0        // если кнопка нашлась
    left 738, 498 10 3 -10 -3 abs  // клик нажать
    wait 800 + random (200)  // ждем
end_if
set #j findimage (0 0 1366 768 (C:\Notepack\img\продать.bmp) %crds 2 80 -1 5)
if  #j > 0        // если кнопка нашлась
    left 873, 523 15 3 -15 -3 abs  // клик нажать
    wait 800 + random (200)  // ждем
end_if
set #g findimage (0 0 1366 768 (C:\Notepack\img\выйти.bmp) %crds 2 80 -1 5)
if  #g > 0        // если кнопка нашлась
    left %crds[1 1] %crds[1 2]  // клик нажать
    wait 800 + random (200)  // ждем
end_if

return
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 12.2.2017, 23:19
Сообщение #13


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Цитата
Как это исправить, чтобы он крутил код внутри метки, а когда все условия выполнены переходил к другой?

метка поиск
Код
:poisk
    while 1 = 1     // бесконечный цикл
        left 971, 382  10 10 -10 -10  abs  // клик на остров
        move 381, 636  10 10 -10 -10  abs  // навели на моба курсор
        wait 1200 + random (300) // пауза чтоб остров прогрузился

        set #a findimage (0 0 1366 768 (C:\Notepack\img\НебесныйДух.bmp) %crds 2 80 -1 5)
        if  #a > 0        // если моб нашёлся
            left 384, 642  10 10 -10 -10  abs  // клик на моба
            wait 500 + random (300)
            break      // выход из цикла
        end_if
        set #a findimage (0 0 1366 768 (C:\Notepack\img\ТеньВоина.bmp) %crds 2 80 -1 5)
        if  #a > 0        // если моб нашёлся
            left 384, 642  10 10 -10 -10  abs  // клик на моба
            wait 500 + random (300)
            break      // выход из цикла
        end_if
    end_while
return

Примеры по-проще:
Код
while 1 = 1
    set #a #a + 1
    log #a
    if  #a = 5  // если переменная #a равна 5, то выйти из цикла
        break
    end_if
end_while
end_script

Код
set #a 0
while #a = 0      // пока не нашлась картинка
    set #a findimage ...
    wait 10
end_while
end_script
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 20.4.2024, 8:02
Designed by Nickostyle