Как бы определить объекты вокруг себя

Anything and all.

Moderators: Murderator+, Murderator

Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Как бы определить объекты вокруг себя

Post by Rijo »

Чар кастует вокруг себя стенки огня, как бы определить есть ли стена огня в тех тайлах куда оно колдовалось, дабы не колдовать постоянно эти стенки вокруг себя и не тратить реги :). я пишу свои перый скрипт и делаю маленький шаг в программировании вообще :). Так что не шлите меня по ссылкам. Заранее благодарю
Last edited by Rijo on 2006-05-02 13:03:55, edited 1 time in total.
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post by Rijo »

Появилась новая проблемка. В уроках ничего нужного не нашел или просто не заметил. Как найти в журнале то что я вижу что кто то погиб. uo.InJournal() не помогает.. или я не так делаю. Я пишу UO.InJournal('you see:')
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

если не ошибаюсь , в журнале отписывается

Code: Select all

Body( items)
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post 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
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post 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()


ищет,как нашел-забивает в переменную труп, и запускает скрипт лута, затем игнорит труп, чтобы в следующий раз не видеть его =\ -эт грубый пример
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Rijo wrote:UO.InJournal('you see:')


"You see" - чисто клиентовская фишка, в журнале инжекта эта надпись не появляется.
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post by Rijo »

Ну скрипт у меня запахал, вроде бы даже без ошибок. Но проверку на труп, после которой бы начинался лут я не придумал, наверно моск еще мыслит не в том направлении :). Если кто сможет предложить что нибудь интересное, я посмотрю ;).
Моя проверка через инжектовский журнал, когда проверяется надпись "Body of" почему то не хочет пахать :(
И вот только что заметил после продолжительного теста, что проверка на количество огня тоже не пашет :(
while not UO.FindType(0x398C ,-1,'ground') > 6 - это может быть похоже на правду, где 0x398C-тип одного тайла стены огня
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Финдтайп возвращает указатель на объект, чтобы исследовать количество найденных итемов надо потом юзануть UO.FindCount()

По поводу боди и трупов, попробуй ввести ,set injectecho 1 и ,saveconfig так же у трупов разных мастей один тип 0x2006, можно делать поиск по нему и потом применять некоторую логику. То есть если труп уже был найден, игнорить его или нечто подобное.
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post 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

Если подскажите способ скриптования полегче, то буду рад впитать в себя информацию
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Это точно работает?
Дело в том что ты объявляешь массив из 10 элементов а используешь 11. Должна быть ошибка выхода за границы массива, что ведет к довольно неожиданным результатам :)

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

Более того, а впроцессе формулировки вопроса ты сам построешь линейный алгоритм решения своей задачи ;)
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post by Rijo »

Ты говоришь про масси функции лута? Хм, кстати да. А я думаю, че то он у меня поттупливает. Скрпит в общем кое как да работает. Массив я щас исправлю. А принцип действия скрипта таков. Я стою на крыше здания и кидаю стену огня сковзь пол крыши на пол который находится под крышей. НПСники видя меня начинают бежать на меня и атачить, и тем самым попадают в мой огонь. После того как они умерают я их лучу и все :).
Огноь я пускаю вокруг себя, но на координата Z ниже своих на 20.
Вот меня интересует такие вопросы:
1.Как бы поточнее сделать проверку на то что вокруг меня огня хватает. Я использую такой способ, не очень точный и вообще на мой взгляд ничего не делающий :) :
UO.FindType(0x398C ,-1,'ground')
if UO.FindCount() < 6 then
2.Как запускать лут трупа с появления строки в журнале. И как бы сделать так чтобы он не оставлял на трупах ничего нужного, псейчас, когда падают сразу 2 нпс он лутит только с одного
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

1. С проверкой на огонь париться не стоит, кастуешь стену, засекаешь время как первый из 7 сполохов огня погас значит пора ставить новую. Потом проверяешь свое время на простеньком скрипте который кастует стенку, ждет, кастует снова.

2. Тебе нужно лутить в цикле с последующим игнором полутанного трупа.
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post by Rijo »

Savage wrote:1. С проверкой на огонь париться не стоит, кастуешь стену, засекаешь время как первый из 7 сполохов огня погас значит пора ставить новую. Потом проверяешь свое время на простеньком скрипте который кастует стенку, ждет, кастует снова.

2. Тебе нужно лутить в цикле с последующим игнором полутанного трупа.

Ну вот с игнором я немного не допонял, хотя в принципе сильно не разбарался, потому что щас ночь у меня и мозг уже спит. Может приведешь пример, тока с поясняловом. Заранее благодарю ;)
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post 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
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post 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
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post by Rijo »

Ну видно пальцы еще не выпрямились чтобы нормально скрипты писать ;). Нада у You Must Die спросить где можно скачать ruki.exe. Я думаю это хорошая программка по выпрямлению пальцев рук ;)
Last edited by Rijo on 2006-05-02 02:09:10, edited 1 time in total.
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post by Rijo »

Savage wrote:Это точно работает?
Дело в том что ты объявляешь массив из 10 элементов а используешь 11. Должна быть ошибка выхода за границы массива, что ведет к довольно неожиданным результатам :)

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

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

Немного не понял. Где я использую 11 элементов массива? Я объявил от 0 до 10, вот и использую... Наверно я чего то недопонял тебя или не доразгялядел в скрипте :)
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post 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 тейлов огня
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

DIM loot[10]

это хорошо, но посчитай пальцем )

0.1.2.3...10 = 11 элементов, а ты задал тока 10.
Post Reply