Вопросик

Ask for help

Moderators: Murderator+, Murderator

gmur
Posts: 141
Joined: 2004-07-18 13:01:15
Contact:

Post by gmur »

KrafteR wrote:Если можно, хочется услышать альтернативные примеры медитации в ваших скриптах.

Я конечно ньюб, но вот, может поможет :

Code: Select all

Var LastTimer
if UO.Mana < 30 then
while UO.Mana<UO.Int
LastTimer=UO.Timer()
UO.UseSkill('Meditation')
repeat
wait(100)
until UO.InJournal("You are") OR UO.InJournal("You lose") OR UO.Timer()>LastTimer+200
UO.DeleteJournal()
wait(200)
wend
endif

Просьба строго не судить, и ногами в живот не пинать.
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

gmur wrote:Я конечно ньюб, но вот, может поможет :

Code: Select all

UO.Timer()>LastTimer+200 

Просьба строго не судить, и ногами в живот не пинать.

Спасибо, но я не стал использовать этот способ на медитацию из-за этой строки, если ты мне пояснишь, что это значит, то буду очень признателен, вот что говорит Yoko про UO.Timer(): "Отсчитывает число, меняющееся 10 раз в секунду. Может быть использовано для условий выходов из зациклившихся кусков, отсчёта времени следующих действий и т.д."

Edred wrote:Та же проблема. Не забывай в начале вайла очистить журнал. То есть после While UO.Mana<UO.Int поставь UO.DeleteJournal()
Помогло, спасибо.
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

Code: Select all

While UO.Mana>=9 OR UO.NS==0
UO.Cast('Poison', 'self')
wait(3000)
wend


Code: Select all

Пока Мана больше или равна 9 или найдшайд равен 0
Кастовать пойзон на себя
ждать 3 секунды
конец цыкла

Вся проблемма в первой строке, он не видет ИЛИ и по-этому он пытается продолжать кастовать, даже когда нет найдшайда, как это исправить?
Worth
Posts: 51
Joined: 2004-10-04 04:50:03
Location: DRW
Contact:

Post by Worth »

KrafteR wrote:

Code: Select all

Пока Мана больше или равна 9 или найдшайд НЕ равен 0

Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Никогда не пользовался UO.NS - может она просто не работает? Попробуй поставить тестовый оператор

Code: Select all

UO.Print('ostalos ' + str( UO.NS ) +' nightshade')


в скрипт после каста и посмотри, правильно ли на экран выводится количество найтшэда. Если неправильно - заменяй UO.NS на UO.Count('тип найтшэда')

Вообще, возьми за правило если что-то не работает или работает не так, расставлять в скрипте тестовые выводы различной информации через UO.Print(), весьма помогает локализовать проблему. Это стандартная программистская практика. Я вообще когда пишу длинные скрипты сразу ставлю в начале главного модуля строки:

Code: Select all

UO.SetGlobal( 'Otladka', '0' )
UO.SetGlobal( 'NumOtladka', '0' )


И после каждого значимого действия в скриптах вставляю вызов функции

Code: Select all

pt()


Ну и добавляю в конец файла функцию:

Code: Select all

sub pt()
   VAR i
   If UO.GetGlobal( 'Otladka' ) == '1' Then
      i = val( UO.GetGlobal( 'NumOtladka' ) ) + 1
      UO.Print( 'step ' + str(i) )
      UO.SetGlobal( 'NumOtladka', str(i) )
   Endif
endsub


соответственно чтобы включить отладку с выводом сообщений в написанном скрипте достаточно вначале заменить 0 на 1 в установке глобальной переменной Otladka. Отключить - заменить обратно. Когда скрипт отлажен - вызовы функции удаляются из скрипта простым поиском с заменой.
Askaneli
Sphere expert
Posts: 1143
Joined: 2004-10-01 08:27:38
Location: Уфа

Post by Askaneli »

Code: Select all

Var Sunduk='0x40226380'

sub main()
uo.useobject(Sunduk)
wait(1000)
While uo.count('0x0F88','0x0000')>0

if uo.skillval('Magery',1)==1000 Then
uo.closeuo()
end if

UO.FindType('0x0F88',-1,'backpack')
While UO.GetQuantity('finditem')<5
UO.FindType('0x0F88','0x0000',Sunduk)
wait(1000)
UO.Grab('100','finditem')
wait(700)
Wend


cheklag()
uo.cast('Poison','self')
wait(3000)



Repeat
uo.deletejournal()
uo.useskill('Meditation')
Wait(3000)
Until UO.InJournal("You must wait to perform another action") or uo.mana >= uo.int

While uo.mana < uo.int
Wait(100)
Wend
Wait(100)

Wend
uo.closeuo()
end sub

sub cheklag()
uo.deletejournal()
uo.click('backpack')
Repeat
wait(100)
Until UO.InJournal("backpack")
end sub


Вот
Sunduk это ИД контейнера откуда брать реги !!!
Сделал дело - флуди смело !!!
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

Worth wrote:
KrafteR wrote:

Code: Select all

Пока Мана больше или равна 9 или найдшайд НЕ равен 0


<> -этот знак означает НЕ равно, а == означет именно то, что я написал.
Edred wrote:Никогда не пользовался UO.NS - может она просто не работает? Попробуй поставить тестовый оператор

Code: Select all

UO.Print('ostalos ' + str( UO.NS ) +' nightshade')



Попробовал, всё определяет правильно. Пишет именно то кол-во НС'a, которое осталось в паке. А с проверками это хорошая идея, тысячный раз сенк.
Askaneli wrote:Вот
Sunduk это ИД контейнера откуда брать реги !!!

Интересная медитация, спасибо, что откликнулся на прозьбу, буду знать новые способы.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Насчет не равно - тебе правильно написали: у тебя цикл должен выполняться пока количество найтшэда не равно нулю. То есть больше нуля. А ты ставишь проверку на равенство нулю. Это во-первых. Во-вторых надо писать в твоем случае не OR а AND - логику в школе изучал?

"Пока маны больше 9" И "найтшэда больше 0" - то есть цикл выполняется при одновременном соблюдении обоих условий. У тебя же ИЛИ - то есть если одно из условий истинно. Так что если маны больше 9 - это условие истинно и уже неважно сколько найтшэда.
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

Edred wrote:Насчет не равно - тебе правильно написали: у тебя цикл должен выполняться пока количество найтшэда не равно нулю. То есть больше нуля. А ты ставишь проверку на равенство нулю. Это во-первых. Во-вторых надо писать в твоем случае не OR а AND - логику в школе изучал?
Хм... а я где-то тут прочёл, что == это присвоить или что-то тип этого, вообщем слышал звон, а вот где он не засёк. Извиняюсь перед Wroth. Логику не проходил нигде, а если и проходил то мимо.
Edred wrote:"Пока маны больше 9" И "найтшэда больше 0" - то есть цикл выполняется при одновременном соблюдении обоих условий. У тебя же ИЛИ - то есть если одно из условий истинно. Так что если маны больше 9 - это условие истинно и уже неважно сколько найтшэда.
Вот теперь вехал в суть проблеммы. Тогда новый вопросик : Чем не приемлемая записать UO.NS=0 .
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

= это присвоить. Например i=2 - присвоить переменной i значение 2
== это сравнить на равенство, например i==2 - проверить, равно ли i двум.
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

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

Code: Select all

If UO.NS<1 Then
UO.FindType(NS, '-1', Sunduk)
UO.Grab(str(Kolvo), 'finditem')

В этой строке заключается загвоздка... Чар берёт не один раз 10 регов, а бесконечное кол-во раз, как сделать так что бы чар брал 1 раз 10 регов и переходил снова к кастам.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Во-первых, забыл Endif в конце, во-вторых, запости весь скрипт чтобы увидеть куда ты эту проверку впендюрил :)
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

Code: Select all

sub Magery()
VAR NS='0x0F88'
VAR Sunduk='0x400BFED4'
VAR Kolvo=10
While NOT UO.Dead()
While UO.Mana>=9 AND UO.NS>0
UO.DeleteJournal()
UO.Cast('Poison', 'self')
wait(3000)
wend
   If UO.Mana<9 Then
      While UO.Mana<UO.Int
      UO.DeleteJournal()
         UO.Useskill('Meditation')
         Repeat
         wait(100)
         until UO.InJournal("You are") OR UO.InJournal("You lose")
      Wend
   Else
      If UO.NS<1 Then
         UO.FindType(NS, '-1', Sunduk)
         UO.Grab(str(Kolvo), 'finditem')
endif
endif
Wend

end sub
Вот такая вот штука получилась!
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

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

Code: Select all

sub Magery()
   VAR NS='0x0F88'
   VAR Sunduk='0x400BFED4'
   VAR Kolvo=10
   While NOT UO.Dead()
      While UO.Mana>=9 AND UO.NS>0
         UO.DeleteJournal()
         UO.Cast('Poison', 'self')
         wait(3000)
      wend
      If UO.Mana<9 Then
         While UO.Mana<UO.Int
            UO.DeleteJournal()
            UO.Useskill('Meditation')
            Repeat
               wait(100)
            until UO.InJournal("You are") OR UO.InJournal("You lose")
         Wend
      Endif
      If UO.NS == 0 Then
         UO.FindType(NS, '-1', Sunduk)
         UO.Grab(str(Kolvo), 'finditem')
         wait(1000)
      Endif
   Wend
end sub


Что сделал:
1. Добавил паузу после граба. Иначе просто не успеет найтшэд попасть в пак, а у тебя уже начнутся новые попытки кастов.
2. Заменил конструкцию if...else...endif на два раздельных ифа. Опять же из-за логики. В ифе проверялось количество маны, если ее мало - медита, но реги уже не добираются. Если маны много - тогда только проверяются реги. Если же два раздельных ифа - проверяется каждое по отдельности.

Кстати, насчет того что логика прошла мимо. могу только пожалеть. Все программирование построено на логике.
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

Edred wrote:Поправил твой скрипт, заодно причесал структуру - не забывай строить правильные отступы табуляциями, гораздо легче читать.

Что сделал:
1. Добавил паузу после граба. Иначе просто не успеет найтшэд попасть в пак, а у тебя уже начнутся новые попытки кастов.
2. Заменил конструкцию if...else...endif на два раздельных ифа. Опять же из-за логики. В ифе проверялось количество маны, если ее мало - медита, но реги уже не добираются. Если маны много - тогда только проверяются реги. Если же два раздельных ифа - проверяется каждое по отдельности.

Кстати, насчет того что логика прошла мимо. могу только пожалеть. Все программирование построено на логике.

Так и не понял, свою ошибку в изыманее рега из сундучка. Спасибо за доработку, щас буду писть инструкцию к применению, после чего выложу в соседнем разделе на суд людей.
P.S. Ну не было у меня такого придмета как логика =), но мне всегда казалось, что у любого здравомыслющего человека не отсутствует логика.
Askaneli
Sphere expert
Posts: 1143
Joined: 2004-10-01 08:27:38
Location: Уфа

Post by Askaneli »

Почему многие считают что логика программиста немного другая, и не всегда здравомыслящая !!!
Вслух мне об этом никто не говорил, но по высказываниям это становится понятно !!!
Сделал дело - флуди смело !!!
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

Askaneli wrote:Почему многие считают что логика программиста немного другая, и не всегда здравомыслящая !!!
Вслух мне об этом никто не говорил, но по высказываниям это становится понятно !!!

Ну может она реально другая, ведь написание программы это постоянный мыслянный труд и труд нелёгкий. Я сам далёк от програмирования, в школе на паскале что-то по школьной программе делал, вот в инстетуте пока токо ворд проходим, и поэтому мне очень трудно ворочется в инжекте. Как сам убедился на примере того же скрипта на магери, что програмирование это не знание кучи команд, а именно постоянный поиск решения конкретной задачи, которая не всегда тревиальна.
KrafteR
Posts: 260
Joined: 2004-07-22 16:07:11
Contact:

Post by KrafteR »

Edred wrote:

Code: Select all

sub Magery()
   VAR NS='0x0F88'
   VAR Sunduk='0x400BFED4'
   VAR Kolvo=10
   While NOT UO.Dead()
      While UO.Mana>=9 AND UO.NS>0
         UO.DeleteJournal()
         UO.Cast('Poison', 'self')
         wait(3000)
      wend
      If UO.Mana<9 Then
         While UO.Mana<UO.Int
            UO.DeleteJournal()
            UO.Useskill('Meditation')
            Repeat
               wait(100)
            until UO.InJournal("You are") OR UO.InJournal("You lose")
         Wend
      Endif
      If UO.NS == 0 Then
         UO.FindType(NS, '-1', Sunduk)
         UO.Grab(str(Kolvo), 'finditem')
         wait(1000)
      Endif
   Wend
end sub


Что-то я рано обрадовался... собственно проблемма в том, что если маленький лаг во время взятия из сундука рега то берёт 20 вместо 10, а если сильный залаг, то вообще ошибка клиента из-за бесконечной попытке взятия рега. Как это можно исправить без помощи ChekLag().
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

во-первых, в чеклаге ничего плохого нету :)

во-вторых, замени вот этот блок:

Code: Select all

If UO.NS == 0 Then
   UO.FindType(NS, '-1', Sunduk)
   UO.Grab(str(Kolvo), 'finditem')
   wait(1000)
Endif


на такой:

Code: Select all

If UO.NS == 0 Then
   UO.FindType(NS, '-1', Sunduk)
   UO.Grab(str(Kolvo), 'finditem')
   repeat
      wait(100)
   until UO.NS>0
Endif
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

логика понятна? :)
Post Reply