Page 1 of 3
Как бы определить объекты вокруг себя
Posted: 2006-05-01 04:50:01
by Rijo
Чар кастует вокруг себя стенки огня, как бы определить есть ли стена огня в тех тайлах куда оно колдовалось, дабы не колдовать постоянно эти стенки вокруг себя и не тратить реги

. я пишу свои перый скрипт и делаю маленький шаг в программировании вообще

. Так что не шлите меня по ссылкам. Заранее благодарю
Posted: 2006-05-01 06:05:19
by Scripts Writer
Posted: 2006-05-01 07:56:19
by Rijo
Появилась новая проблемка. В уроках ничего нужного не нашел или просто не заметил. Как найти в журнале то что я вижу что кто то погиб. uo.InJournal() не помогает.. или я не так делаю. Я пишу UO.InJournal('you see:')
Posted: 2006-05-01 07:58:39
by Scripts Writer
если не ошибаюсь , в журнале отписывается
Posted: 2006-05-01 07:59:33
by Rijo
Я хочу вот этот код запихать, чтобы он врубался когда находился труп. Может в коде можно что тосделать, чтобы он по кругу проверял новые трупы на нужные вещи.
Code: Select all
sub Loot2()
VAR i
DIM Loot[20]
Loot[0]=0x1089 ;
Loot[1]=0x1F0A ;
Loot[2]=0x1F07 ;
Loot[3]=0x1F06 ;
Loot[4]=0x1F09 ;
Loot[5]=0x108A ;
Loot[6]=0x0EED ;
Loot[7]=0x1086 ;
Loot[8]=0x1087 ;
Loot[9]=0x1F08 ;
Loot[10]=0x1088 ;
UO.UseObject('lastcorpse')
if UO.GetQuantity('lastcorpse') then
UO.SetArm('temp')
UO.WaitTargetObject('lastcorpse')
UO.UseType('0x000') ;dagger
wait(500)
UO.Arm('temp')
wait(500)
endif
UO.SetReceivingContainer('0x40099AA2') ; loot store bag
For i=0 to 10
UO.FindType(Loot[i],-1,'ground')
if UO.GetQuantity('finditem') then
UO.Grab(STR(0),'finditem')
wait(1000)
endif
if UO.GetQuantity('lastcorpse') then
UO.FindType(Loot[i],-1,'lastcorpse')
if UO.GetQuantity('finditem') then
if Loot[i]==0x1078 then
UO.WaitTargetObject('finditem')
UO.UseType('0x0F9E')
else
UO.Grab(STR(0),'finditem')
endif
wait(1000)
endif
endif
next
UO.UnSetReceivingContainer()
else
wait(1000)
endif
end sub
Posted: 2006-05-01 08:02:05
by Scripts Writer
ну так зацыкли его ввиде:
Code: Select all
whle not uo.Dead()
while not uo.InJournal('Body')
wait(500)
wend
. . .
это к примеру, а так-сам продумай и отредактируй. Или же опиши точнее,что и как.
п.с. Loot[
20] = это ты замудрил конешно
могу пример привести :
Code: Select all
var tryp
var body
var color
uo.Set('finddistance','5')
while not uo.Dead()
if uo.InJournal('Body') then
uo.FindType(body,color,'ground')
tryp=uo.GetSerial('finditem')
Loot()
uo.Ignore(tryp)
else
wait(500)
end if
wend
uo.IgnoreReset()
ищет,как нашел-забивает в переменную труп, и запускает скрипт лута, затем игнорит труп, чтобы в следующий раз не видеть его =\ -эт грубый пример
Posted: 2006-05-01 12:13:49
by Edred
Rijo wrote:UO.InJournal('you see:')
"You see" - чисто клиентовская фишка, в журнале инжекта эта надпись не появляется.
Posted: 2006-05-01 13:56:51
by Rijo
Ну скрипт у меня запахал, вроде бы даже без ошибок. Но проверку на труп, после которой бы начинался лут я не придумал, наверно моск еще мыслит не в том направлении

. Если кто сможет предложить что нибудь интересное, я посмотрю

.
Моя проверка через инжектовский журнал, когда проверяется надпись "Body of" почему то не хочет пахать
И вот только что заметил после продолжительного теста, что проверка на количество огня тоже не пашет
while not UO.FindType(0x398C ,-1,'ground') > 6 - это может быть похоже на правду, где 0x398C-тип одного тайла стены огня
Posted: 2006-05-01 14:11:15
by Savage
Финдтайп возвращает указатель на объект, чтобы исследовать количество найденных итемов надо потом юзануть UO.FindCount()
По поводу боди и трупов, попробуй ввести ,set injectecho 1 и ,saveconfig так же у трупов разных мастей один тип 0x2006, можно делать поиск по нему и потом применять некоторую логику. То есть если труп уже был найден, игнорить его или нечто подобное.
Posted: 2006-05-01 15:46:02
by Rijo
ну вот он собсно скрипт, не забудьте что первый мной написанный, хотя много что просто стырино у других, копирайты не ставил потому что не знаю кто их написал

. Добваьте пожалуста проверок. Коменты как токовые не ставил, думаю там все понятно, для тех кто может мне помочь

. Переменные добваил, но не использовал, потом сриптик маленький на АнтиПк добавлю. Скрипт для очень узкой функциональности
Code: Select all
var PKMagArr = "In Por Ylem"
var PKTeleport = "Rel Por"
var PKParaliz = "An Ex Por"
var PKpf = "In Ex Grav"
var PKPoison = "In Nox"
var Apk = 0
var RecallHome = 0
var Chest='0x401AE9BA'
var fire = 1
var tryp = '0x2006'
var color
var WaitTime = 5000
#################################################################
sub DetectForLoot()
while not uo.Dead()
Loot()
wait(500)
wend
end sub
#################################################################
sub ForFire()
while not uo.Dead()
if uo.mana < uo.int then
Medit()
wait(500)
else
DetectFire()
wait(500)
endif
wend
wait(500)
end sub
#################################################################
sub DetectFire()
uo.Set('finddistance','0')
UO.FindType(0x398C ,-1,'ground')
if UO.FindCount() < 6 then
FireAround()
wait(500)
endif
wait(500)
end sub
#################################################################
sub FireAround()
uo.waittargettile("400",str(uo.getx("self")),str(uo.gety("self")+1),str(uo.getz("self")-20))
uo.cast("Fire Field")
wait(WaitTime)
uo.waittargettile("400",str(uo.getx("self")),str(uo.gety("self")-1),str(uo.getz("self")-20))
uo.cast("Fire Field")
wait(WaitTime)
uo.waittargettile("400",str(uo.getx("self")-1),str(uo.gety("self")),str(uo.getz("self")-20))
uo.cast("Fire Field")
wait(WaitTime)
uo.waittargettile("400",str(uo.getx("self")+1),str(uo.gety("self")),str(uo.getz("self")-20))
uo.cast("Fire Field")
wait(WaitTime)
uo.waittargettile("400",str(uo.getx("self")),str(uo.gety("self")),str(uo.getz("self")-20))
uo.cast("Fire Field")
wait(WaitTime)
wait(500)
end sub
#################################################################
sub Medit()
UO.DeleteJournal()
wait(1000)
UO.Useskill('Meditation')
Repeat
wait(100)
until UO.InJournal("You are") OR UO.InJournal("Ìåäèòàöèÿ")
wait(500)
end sub
#################################################################
sub Loot()
VAR i
DIM Loot[10]
Loot[0]=0x1089 ;
Loot[1]=0x1F0A ;
Loot[2]=0x1F07 ;
Loot[3]=0x1F06 ;
Loot[4]=0x1F09 ;
Loot[5]=0x108A ;
Loot[6]=0x0EED ;
Loot[7]=0x1086 ;
Loot[8]=0x1087 ;
Loot[9]=0x1F08 ;
Loot[10]=0x1088 ;
UO.UseObject('lastcorpse')
if UO.GetQuantity('lastcorpse') then
UO.WaitTargetObject('lastcorpse')
UO.UseType('0x000') ;dagger
wait(500)
endif
UO.SetReceivingContainer('0x40099AA2') ; loot store bag
For i=0 to 10
UO.FindType(Loot[i],-1,'ground')
if UO.GetQuantity('finditem') then
UO.Grab(STR(0),'finditem')
wait(1000)
endif
if UO.GetQuantity('lastcorpse') then
UO.FindType(Loot[i],-1,'lastcorpse')
if UO.GetQuantity('finditem') then
if Loot[i]==0x1078 then
UO.WaitTargetObject('finditem')
UO.UseType('0x0F9E')
else
UO.Grab(STR(0),'finditem')
endif
wait(1000)
endif
endif
next
UO.UnSetReceivingContainer()
wait(500)
end sub
Если подскажите способ скриптования полегче, то буду рад впитать в себя информацию
Posted: 2006-05-01 15:57:27
by Savage
Это точно работает?
Дело в том что ты объявляешь массив из 10 элементов а используешь 11. Должна быть ошибка выхода за границы массива, что ведет к довольно неожиданным результатам
Если ты подробно объяснищь чего хочешь достичь в своем скрипте, то возможно тут объяснят как это сделать правильно, красиво и коротко
Более того, а впроцессе формулировки вопроса ты сам построешь линейный алгоритм решения своей задачи

Posted: 2006-05-01 16:50:05
by Rijo
Ты говоришь про масси функции лута? Хм, кстати да. А я думаю, че то он у меня поттупливает. Скрпит в общем кое как да работает. Массив я щас исправлю. А принцип действия скрипта таков. Я стою на крыше здания и кидаю стену огня сковзь пол крыши на пол который находится под крышей. НПСники видя меня начинают бежать на меня и атачить, и тем самым попадают в мой огонь. После того как они умерают я их лучу и все

.
Огноь я пускаю вокруг себя, но на координата Z ниже своих на 20.
Вот меня интересует такие вопросы:
1.Как бы поточнее сделать проверку на то что вокруг меня огня хватает. Я использую такой способ, не очень точный и вообще на мой взгляд ничего не делающий

:
UO.FindType(0x398C ,-1,'ground')
if UO.FindCount() < 6 then
2.Как запускать лут трупа с появления строки в журнале. И как бы сделать так чтобы он не оставлял на трупах ничего нужного, псейчас, когда падают сразу 2 нпс он лутит только с одного
Posted: 2006-05-01 17:12:36
by Savage
1. С проверкой на огонь париться не стоит, кастуешь стену, засекаешь время как первый из 7 сполохов огня погас значит пора ставить новую. Потом проверяешь свое время на простеньком скрипте который кастует стенку, ждет, кастует снова.
2. Тебе нужно лутить в цикле с последующим игнором полутанного трупа.
Posted: 2006-05-01 17:16:25
by Rijo
Savage wrote:1. С проверкой на огонь париться не стоит, кастуешь стену, засекаешь время как первый из 7 сполохов огня погас значит пора ставить новую. Потом проверяешь свое время на простеньком скрипте который кастует стенку, ждет, кастует снова.
2. Тебе нужно лутить в цикле с последующим игнором полутанного трупа.
Ну вот с игнором я немного не допонял, хотя в принципе сильно не разбарался, потому что щас ночь у меня и мозг уже спит. Может приведешь пример, тока с поясняловом. Заранее благодарю

Posted: 2006-05-01 17:22:14
by Savage
Code: Select all
VAR Exit=0
UO.IgnoreReset()
While Exit<>1
UO.FindType(Trup, -1,'ground')
If Uo.FindCount() Then
Loot()
Else
Exit=1
Endif
UO.IgnoreItem('finditem')
Wend
Posted: 2006-05-02 00:25:24
by Edred
Почему же у тебя через сообщение 'Body of' не работает? Вот простой и надежный скрипт, я когда играл и зоннерил, постоянно его в фон запускал:
Code: Select all
#####################################################################
; BackgroundZonner. v.1.02b (c) Edred
;
; Ожидание сообщения 'Body of' и автоматический лут последнего трупа.
;
sub BackgroundZonner()
VAR msg1 = 'Body of'
VAR flag = 1
If UO.Targeting() Then
UO.CancelTarget()
Endif
DeleteJournal( msg1 )
While NOT UO.Dead()
If UO.InJournal( msg1 ) Then
DeleteJournal( msg1 )
AutoLoot()
Else
wait(300)
Endif
Wend
endsub
Posted: 2006-05-02 00:43:35
by Rijo
Ну видно пальцы еще не выпрямились чтобы нормально скрипты писать

. Нада у You Must Die спросить где можно скачать ruki.exe. Я думаю это хорошая программка по выпрямлению пальцев рук

Posted: 2006-05-02 01:53:54
by Rijo
Savage wrote:Это точно работает?
Дело в том что ты объявляешь массив из 10 элементов а используешь 11. Должна быть ошибка выхода за границы массива, что ведет к довольно неожиданным результатам

Если ты подробно объяснищь чего хочешь достичь в своем скрипте, то возможно тут объяснят как это сделать правильно, красиво и коротко

Более того, а впроцессе формулировки вопроса ты сам построешь линейный алгоритм решения своей задачи

Немного не понял. Где я использую 11 элементов массива? Я объявил от 0 до 10, вот и использую... Наверно я чего то недопонял тебя или не доразгялядел в скрипте

Posted: 2006-05-02 02:28:30
by Rijo
Проверка на огонь работает у меня подобным образом
Code: Select all
#################################################################
sub DetectFire()
uo.Set('finddistance','1')
UO.FindType(0x398C ,-1,'ground')
if UO.FindCount() < 9 then
FireAround()
wait(500)
else
wait(10000)
endif
wait(500)
end sub
Проверяется каждые 10 секнуд, есть ли вокруг меня 9 тейлов огня
Posted: 2006-05-02 07:52:35
by Scripts Writer
DIM loot[10]
это хорошо, но посчитай пальцем )
0.1.2.3...10 = 11 элементов, а ты задал тока 10.