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
если не ошибаюсь , в журнале отписывается

Code: Select all

Body( items)

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.