Несколько вопросов, "готовые скрипты"
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 00:59
Сообщение #1
Копаюсь в теме "Готовые скрипты" для интереса, решил подправить этот:

- медитация частенько прерывается, не закончившись нормально и не имея шанса прокачаться
- даблкасты непонятно откуда
- щит постоянно вываливается из рук

Доправил примерно до такого:

sub mmph()
   UO.SetArm('def')
   repeat      
      UO.Cast('Magic Arrow', 'self')
      UO.DeleteJournal()
      repeat
         wait(500)
      until UO.Life<UO.Str or UO.InJournal('The spell fizzles') or UO.InJournal('You parry the blow')
      wait(100)                          
      repeat
         while UO.Mana<UO.INT
            UO.UseSkill('Meditation')
            wait(500)
         wend
      until UO.InJournal('You are at peace')
      wait(100)
      Heal()
   until uo.dead()
end sub

sub Heal()
   while UO.Life<UO.STR
      UO.BandageSelf()
      wait(100)      
      uo.deletejournal()
      repeat
         wait(200)
      until UO.InJournal('Вы восстановили') or UO.InJournal('Попытка лечения')
      UO.Arm('def')
   wend
end sub


Собственно вопросы:


1.
      repeat
         while UO.Mana<UO.INT
            UO.UseSkill('Meditation')
            wait(500)
         wend
      until UO.InJournal('You are at peace')')


Если не вставлять проверку журнала - следующее по ходу скрипта действие отменяет медитацию на показателе в 100 маны, до надписи "You are at peace" и прокачки медитации. Wait(500) зафлуживает экран, бОльший wait - добавляет лишнее время на каждый цикл неудавшейся медитации. Да, это скрипт и на флуд пофиг, но нет ли какого либо оператора, умеющего а) послать скрипт напрямую на какую либо строку кода; б) отслеживающего удачное применение скилла?

2.
      repeat
         wait(500)
      until UO.Life<UO.Str or UO.InJournal('The spell fizzles') or UO.InJournal('You parry the blow')

Просто ожидание выполнения действия с подтверждением в журнале. Есть ли оператор, не дающий скрипту выполняться далее без соблюдения условия и искусственного зацикливания, вроде: ждем, пока (условие)

3.
В код насована куча коротких wait'ов, без которых начинаются подлагивания, периодические краши клиента и прочие даблкасты. Это "фишка" инжекта, или существует какой-нибудь антилаг-костыль?

4.
При стамине недостаточной для применения бинта клиент сразу крашится, это из-за зацикливания попытки лечения?

5.
Не могу поймать причину по которой скрипт периодически перестает работать, хотя числится запущенным и исправно работал несколько минут назад. Не вордлсейв.

p.s. в .chm копался долго но ничего этакого не нашел
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 01:22
Сообщение #2
5.
Поймал. При попытке лечения:
Выберите цель для наложения бинта
targeting cancelled
unexpected target info
Почему то отменяет таргет
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
19 сентября 2016 09:27
Сообщение #3
Тээээкс...
Ну для надо понимать что при отсутствии можератора (кроме как админа проекта) и запрете редактировать свои посты в "Готовых" скриптах не всегда бывают годные решения. И что самое важное (что собственно и видно на примере этого скрипта) многое зависит от уровня умения. Про это покажу ниже.
А теперь по вопросам:
1) Кусок на медитацию представлен простенький так как скрипт на уровне качнул-забыл. Нормальную медитацию можно поискать в автолоаде Зомби. Моя старая во время раскачки была типо того:

Sub Meditation()
    if uo.mana < uo.int/3 then
        uo.DeleteJournal()
        uo.UseSkill('Meditation')
        while uo.mana < uo.int
            If uo.injournal("lose|потеряли") then
                UO.WarMode(0)
                uo.DeleteJournal()
                repeat
                    uo.UseSkill('Meditation')
                    wait(100)
                until uo.injournal("meditative trance|вошли|должны|must wait")
            else
                wait(100)
            end if
        wend
    ;   wait(500)
    endif
end sub
Я тоже не особо запаривался всякими таймерами. Использовал скрипт пока не вошел в транс, и выходил когда набирал полную ману. При потере транса входил в него повторно. Но у меня по любасу войдет и домедитирует до полного столба.
2) "Есть ли оператор" Он уже есть в примере. until UO.Life<UO.Str. Пока жизнь меньше силы. Даже если проверка на журнал не сработает сработает этот выход из цикла.
3) Это не куча :))) Куча была раньше когда после каждого действия, каждой ловушки ставили wait (10)/(50). Вот тогда была реальная }|{опа. Пауза не должна быть меньше 100 и не обязательно больше 500. Но БЕЗ паузы любой цикл крашнет в течении ближайших миллисекунд. Самое лучшее решение - динамическая пауза - крутить в цикле паузу 100 с проверкой журнала И условия как у тебя в вопросе 2) Можно еще таймер добавить.
4) Надо брать троль серьги, какую нито броньку регенерирующую стамину и добавить пару строк перед UO.BandageSelf() вот таких :

            while UO.Stamina < 100
               wait(100)
            wend
           UO.BandageSelf()

Либо жрать тоннами рефрешки.
5.1) скрипт периодически перестает работать или начинает сбоить потому что не учитывается уровень скиллов. Например щит падает потому что паринга не ГМ, медитация часто слетает потому что она не ГМ, каст может филзануть или несколько раз пройти потому что умение не ГМ. Паузы при использовании умения или каста уменьшаются пропорционально росту умения. Например 30 магии - каст занимает 3 секунды. 100 магии и эвалюции каст пройдет за 2 секунды. У тебя не хватает уровня умения а пауза при использовании указана на более высокий уровень - вот и слетает.

5.2) У тебя после использования бинтов стоит несколько пауз. Перед делжурналом пауза не нужна кстати. Но вот после Арма если жизни не набрались скрипт перекидывает сразу опять на бинтование -> После арма как раз нужна пауза. Причем около 500-700. Но я бы вынес арм ниже wend - зачем пялить щит если ты не отлечился - ведь он слетит опять и тебе придется ждать пока он не переоденется?

ЗЫ Если качать не таким универсальным скриптом а более точечным - стрелка в себя/лечение/медитация кастеды/медитация то скиллы подрастут побыстрее. А паринг лучше вообще при старте выбрать и докачать в катакомбах на крысах или на кукле (втором чаре), вместе с хилингом и боевыми.
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 12:43
Сообщение #4
Мощно, спасибо )

sub mmph()
   UO.SetArm('def')
   repeat    
      UO.Cast('Magic Arrow', 'self')
      UO.DeleteJournal()
      repeat
         wait(100)
      until UO.Life < UO.STR or UO.InJournal('The spell fizzles|You parry the blow')
      wait(100)    
      UO.UseSkill('Meditation')    
      UO.DeleteJournal()                  
      repeat
             if UO.InJournal('You lose') then
                UO.UseSkill('Meditation')  
                UO.DeleteJournal()
                wait(100)
             else
                  wait(100)
             endif
      until UO.InJournal('You are at peace')
      if UO.Stamina<50 then
         UO.FindType(0x0E24, 0x064F, 2)
         UO.UseObject('finditem')
      endif
      Heal()
   until uo.dead()
end sub

sub Heal()
   wait(100)
   while UO.Life<UO.STR
      UO.BandageSelf()
      wait(100)      
      uo.deletejournal()
      repeat
         wait(100)
      until UO.InJournal('Вы восстановили|Попытка лечения|Targeting Cancelled|Unexpected target info|Не пытайтесь')
   wend
   UO.Arm('def')
   wait(300)
end sub


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

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

Цитата: Mirage
У тебя не хватает уровня умения а пауза при использовании указана на более высокий уровень - вот и слетает.
Я не так что-то понял, или как раз динамические паузы с условиями эту проблему полностью снимают? :)

Цитата: Mirage
Он уже есть в примере. until UO.Life<UO.Str
Нет, я имел ввиду что-то вроде бейсиковского GOTO, который при аккуратном использовании вне циклов очень жизнь упрощает.

Цитата: Mirage
Если качать не таким универсальным скриптом а более точечным
А он и не для кача собственно, просто оптимизация ради оптимизации, как интересную задачу решить. Перфекционизм )
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
19 сентября 2016 13:12
Сообщение #5
Про скилл я имел ввиду основу которую ты использовал
sub ProMed()
repeat
    UO.Cast('Magic Arrow', 'self')
    wait (2000)


2 секунды и неколышит. Лагануло, паузнуло, слетело. А не факт что 2 секунды тратится.

goto оператор есть, но его не очень удобно использовать - можно сбить циклы и инжект умрет.

1:
if что то там then
goto 1
else
goto 2
endif
2:

Как то исторически сложилось что из if и for выкинуть можно а из циклов лучше не выкидывать. ХЗ мне привычнее понаставлять условий.

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

И по эстетизме - я бы делал скрипт модулями.
sub main_kach()
repeat
medit()
четотамеще()
heal()
until пока не умер
endsub

а ниже уже кусочки составлял. А то у тебя лечилка вынесена амедитация раскидана по скрипту. никрасифо :no2:
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 13:24
Сообщение #6
Ясно, ну от двух секунд я избавился, там теперь тоже динамика стоит.

until UO.Life < UO.STR or UO.InJournal('The spell fizzles|You parry the blow')

Я предусматривал три варианта развития событий:
1. урон прилетел, хп уменьшилось
2. спелл зафизлился, хп не уменьшилось
3. урон прилетел в блок, хп уменьшилось или не уменьшилось

А ты значит вот так просто предлагаешь until UO.Mana < UO.Int после каста и все будет работать. Ну твою же мышь, ну я намудрил...

В хелпе инжекта не вижу информации о goto, шлет на номер строки?

Цитата: Mirage
а ниже уже кусочки составлял. А то у тебя лечилка вынесена амедитация раскидана по скрипту. никрасифо
Так лечилка не у меня вынесена, а в том скрипте, я ж его просто правил, феншуем с красивым форматированием пока не маялся.

p.s. три часа полета, ни одного сбоя
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 15:01
Сообщение #7
Mirage, лови красифость

; В паке: бинты, SA, рефреш банки
; На персе: фул мана, щит в руке, что-либо на реген стамины (тролль серьги и проч.)

sub mmph()
   UO.SetArm('def')
   repeat    
      Arrow()
      Med()
      StCheck()
      Heal()
   until uo.dead()
end sub

sub Arrow()      
    UO.Cast('Magic Arrow', 'self')
    UO.DeleteJournal()
    repeat
          wait(100)
    until UO.Mana < UO.INT
    wait(100)    
end sub

sub Med()    
    UO.UseSkill('Meditation')    
    UO.DeleteJournal()                  
    repeat
           if UO.InJournal('You lose') then
              UO.UseSkill('Meditation')  
              UO.DeleteJournal()
              wait(100)
           else
              wait(100)
           endif
    until UO.InJournal('You are at peace')
end sub

sub StCheck()
    if UO.Stamina<50 then
       UO.FindType(0x0E24, 0x064F, 2); тип банок, цвет банок на рефреш стамины
       UO.UseObject('finditem')
    endif
    while UO.Stamina < 20; если со стаминой совсем все плохо
          wait(100)
    wend
end sub

sub Heal()
   wait(100)
   while UO.Life<UO.STR
      UO.BandageSelf()
      wait(100)      
      uo.deletejournal()
      repeat
         wait(100)
      until UO.InJournal('Вы восстановили|Попытка лечения|Targeting Cancelled|Unexpected target info|Не пытайтесь')
   wend
   UO.Arm('def')
   wait(300)
end sub
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
19 сентября 2016 15:51
Сообщение #8
Почти но еще не совсем на 5 :) С работы приду покажу еще пару фишек. Подправишь и можно заливать в "готовые" :)
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 16:05
Сообщение #9
Указание бутылок на старте и добор из сундука? :D
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
19 сентября 2016 19:59
Сообщение #10
Указывать бутылки вроде ненужно. Сережек с бронькой хватить должно за уши.
Регов взять 2-3К - на ночь хватить должно.

Попробуй вот так скрипт как работать будет



Можно еще стопарей добавить - кончились реги, нет щита и т.д.
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 20:40
Сообщение #11
Цитата: Mirage
until UO.InJournal('You are at peace') or UO.Mana>=UO.Int
Нельзя, 100/100 маны это еще не удачное завершение медитации (you are at peace), а скрипт ее обрубит и она не прокачается.

Цитата: Mirage
UO.Timer()>LastTimer+80
Можно чуть поподробнее - что за стоп в 8 секунд и зачем? На текущий момент у меня сразу после каста (а значит маны стало меньше, даже в случае физзла) стартует следующий шаг, отслеживается динамической паузой, которой лаги не помеха, уже много часов оттарабанил "без единого разрыва".

Хилинг вырос в короткие сроки под 95, так что условие хила изменилось на UO.Life<75 (можно поменять автоматом, отслеживаю показатель хилинга, но это уже перебор), а хилит он на 40-60 хп, итого стамины за глаза с одних серьг, без всяких броников,

Можно еще заморочиться с вымачиванием бинтов в тазике, так они ж ничего не весят, так что черт с ними.
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
19 сентября 2016 20:52
Сообщение #12
Цитата: ShakS
она не прокачается

засчитывается ВХОД (когда мана пошла копиться), а не завершение :)
Таймер на предмет неожиданностей в журнале. Поменяется какое нибудь слово, или админ возьмет да руссифицирует игру :)).
Я тестил на кукле со всеми скиллами 30 - стамина улетает без дополнительных подкачек.
Бинты как и реги весят не много и стоят копейки. Если бы была боевая раскачка где хиты убегают быстрее -> хилишься чаще - > бинтов надо больше тогда имело бы смысл их полоскать. А так - пробежал по овечкам и магазинам и хватит на пару чаров раскачать.
Старший Сержант (867953)9 лет
Ranger
Сообщений: 43
Рег. 13.10.2015
19 сентября 2016 21:20
Сообщение #13
Цитата: Mirage
засчитывается ВХОД (когда мана пошла копиться), а не завершение :)
Да быть того не может, ап скилла идет в конце медитации же? Или что, можно слить ману в ноль, а потом врубать медитацию, обламывая ее через 2 секунд вармодом и прокачать за полчаса?
Цитата: Mirage
Я тестил на кукле со всеми скиллами 30 - стамина улетает без дополнительных подкачек.
Ну тут да, нечистый эксперимент, у моего подопытного анатомия гм
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
19 сентября 2016 21:40
Сообщение #14
ShakS,
Про рост в процессе я перепутал, это было на другом сервере. Пардонте :crazy:
Последние посетители (0):

 
Сейчас: 23 ноября 2024 22:57