Page 2 of 3
Posted: 2005-01-18 04:39:33
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
Просьба строго не судить, и ногами в живот не пинать.
Posted: 2005-01-18 11:03:27
by KrafteR
gmur wrote:Я конечно ньюб, но вот, может поможет :
Просьба строго не судить, и ногами в живот не пинать.
Спасибо, но я не стал использовать этот способ на медитацию из-за этой строки, если ты мне пояснишь, что это значит, то буду очень признателен, вот что говорит Yoko про UO.Timer(): "Отсчитывает число, меняющееся 10 раз в секунду. Может быть использовано для условий выходов из зациклившихся кусков, отсчёта времени следующих действий и т.д."
Edred wrote:Та же проблема. Не забывай в начале вайла очистить журнал. То есть после While UO.Mana<UO.Int поставь UO.DeleteJournal()
Помогло, спасибо.
Posted: 2005-01-18 11:30:41
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 секунды
конец цыкла
Вся проблемма в первой строке, он не видет ИЛИ и по-этому он пытается продолжать кастовать, даже когда нет найдшайда, как это исправить?
Posted: 2005-01-18 12:35:34
by Worth
KrafteR wrote:Code: Select all
Пока Мана больше или равна 9 или найдшайд НЕ равен 0
Posted: 2005-01-18 12:51:59
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
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. Отключить - заменить обратно. Когда скрипт отлажен - вызовы функции удаляются из скрипта простым поиском с заменой.
Posted: 2005-01-18 13:27:37
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 это ИД контейнера откуда брать реги !!!
Posted: 2005-01-18 20:58:51
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 это ИД контейнера откуда брать реги !!!
Интересная медитация, спасибо, что откликнулся на прозьбу, буду знать новые способы.
Posted: 2005-01-18 22:54:22
by Edred
Насчет не равно - тебе правильно написали: у тебя цикл должен выполняться пока количество найтшэда не равно нулю. То есть больше нуля. А ты ставишь проверку на равенство нулю. Это во-первых. Во-вторых надо писать в твоем случае не OR а AND - логику в школе изучал?
"Пока маны больше 9" И "найтшэда больше 0" - то есть цикл выполняется при одновременном соблюдении обоих условий. У тебя же ИЛИ - то есть если одно из условий истинно. Так что если маны больше 9 - это условие истинно и уже неважно сколько найтшэда.
Posted: 2005-01-18 23:12:23
by KrafteR
Edred wrote:Насчет не равно - тебе правильно написали: у тебя цикл должен выполняться пока количество найтшэда не равно нулю. То есть больше нуля. А ты ставишь проверку на равенство нулю. Это во-первых. Во-вторых надо писать в твоем случае не OR а AND - логику в школе изучал?
Хм... а я где-то тут прочёл, что == это присвоить или что-то тип этого, вообщем слышал звон, а вот где он не засёк. Извиняюсь перед Wroth. Логику не проходил нигде, а если и проходил то мимо.
Edred wrote:"Пока маны больше 9" И "найтшэда больше 0" - то есть цикл выполняется при одновременном соблюдении обоих условий. У тебя же ИЛИ - то есть если одно из условий истинно. Так что если маны больше 9 - это условие истинно и уже неважно сколько найтшэда.
Вот теперь вехал в суть проблеммы. Тогда новый вопросик : Чем не приемлемая записать UO.NS=0 .
Posted: 2005-01-18 23:28:07
by Edred
= это присвоить. Например i=2 - присвоить переменной i значение 2
== это сравнить на равенство, например i==2 - проверить, равно ли i двум.
Posted: 2005-01-18 23:34:26
by KrafteR
Ну что же вот почти и подошё конец написания этого скрипта. И у меня последний вопрос, на который хотелось бы услышать ответ.
Code: Select all
If UO.NS<1 Then
UO.FindType(NS, '-1', Sunduk)
UO.Grab(str(Kolvo), 'finditem')
В этой строке заключается загвоздка... Чар берёт не один раз 10 регов, а бесконечное кол-во раз, как сделать так что бы чар брал 1 раз 10 регов и переходил снова к кастам.
Posted: 2005-01-18 23:39:55
by Edred
Во-первых, забыл Endif в конце, во-вторых, запости весь скрипт чтобы увидеть куда ты эту проверку впендюрил

Posted: 2005-01-18 23:50:33
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
Вот такая вот штука получилась!
Posted: 2005-01-19 14:50:44
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 на два раздельных ифа. Опять же из-за логики. В ифе проверялось количество маны, если ее мало - медита, но реги уже не добираются. Если маны много - тогда только проверяются реги. Если же два раздельных ифа - проверяется каждое по отдельности.
Кстати, насчет того что логика прошла мимо. могу только пожалеть. Все программирование построено на логике.
Posted: 2005-01-19 15:54:21
by KrafteR
Edred wrote:Поправил твой скрипт, заодно причесал структуру - не забывай строить правильные отступы табуляциями, гораздо легче читать.
Что сделал:
1. Добавил паузу после граба. Иначе просто не успеет найтшэд попасть в пак, а у тебя уже начнутся новые попытки кастов.
2. Заменил конструкцию if...else...endif на два раздельных ифа. Опять же из-за логики. В ифе проверялось количество маны, если ее мало - медита, но реги уже не добираются. Если маны много - тогда только проверяются реги. Если же два раздельных ифа - проверяется каждое по отдельности.
Кстати, насчет того что логика прошла мимо. могу только пожалеть. Все программирование построено на логике.
Так и не понял, свою ошибку в изыманее рега из сундучка. Спасибо за доработку, щас буду писть инструкцию к применению, после чего выложу в соседнем разделе на суд людей.
P.S. Ну не было у меня такого придмета как логика =), но мне всегда казалось, что у любого здравомыслющего человека не отсутствует логика.
Posted: 2005-01-19 16:25:31
by Askaneli
Почему многие считают что логика программиста немного другая, и не всегда здравомыслящая !!!
Вслух мне об этом никто не говорил, но по высказываниям это становится понятно !!!
Posted: 2005-01-19 16:46:56
by KrafteR
Askaneli wrote:Почему многие считают что логика программиста немного другая, и не всегда здравомыслящая !!!
Вслух мне об этом никто не говорил, но по высказываниям это становится понятно !!!
Ну может она реально другая, ведь написание программы это постоянный мыслянный труд и труд нелёгкий. Я сам далёк от програмирования, в школе на паскале что-то по школьной программе делал, вот в инстетуте пока токо ворд проходим, и поэтому мне очень трудно ворочется в инжекте. Как сам убедился на примере того же скрипта на магери, что програмирование это не знание кучи команд, а именно постоянный поиск решения конкретной задачи, которая не всегда тревиальна.
Posted: 2005-01-19 17:28:38
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().
Posted: 2005-01-19 17:37:42
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
Posted: 2005-01-19 17:38:18
by Edred
логика понятна?
