Проверка резки трупа
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
13 августа 2017 09:32
Сообщение #1
Имеется скрипт лута с резкой.
Периодически, по тем или иным причинам, пропускает резку трупа и лутает, с последующим игнором.
Есть идея добавить что то типа проверки резки, но есть проблемы, не все трупы одинаково режутся, где то кожа появляется, где то нет, где то крови нет и т.п.
Может кто подскажет в каком направлении двигаться?
Сам скрипт

Sub Looting1()
   UO.AddFindList('loot', 0x0F3F) ; arrow  
   UO.AddFindList('loot', 0x1078) ; pile of hides
   UO.AddFindList('loot', 0x0EED) ; golden coins
    
   var count=0
   var i,kol,Ser
  
   if UO.FindType(0x2006, -1, 'ground', 2) <> '' then
      Ser=uo.GetSerial('finditem')
      
      if not UO.WaitingForJournalText(Now(), 500, "You can't") && UO.Count(Nozhik) > 0 then
         UO.WaitTargetObject(Ser)
         checklag()
         UO.UseType(Nozhik)
         Wait(500)
         UO.UseObject(Ser)
         Wait(200)
      end if
      UO.FindList('loot', Ser)
      While UO.FindCount(finditem) > 0 && UO.GetDistance(Ser)<=2  ; Пока количество найденного больше 0
         UO.MoveItem('finditem', -1, LootPack)  ; Забираем найденное в пак
         wait(200)
         UO.FindList('loot', Ser)
      Wend
      UO.Print( 'The loot was finished' )
      UO.Ignore(Ser)
   end if
end sub
Лейтенант (3770810)8 лет
Urukhay
Сообщений: 654
Рег. 23.09.2016
13 августа 2017 10:19
Сообщение #2
Когда ты режешь труп, появляется сообщение:
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
13 августа 2017 11:48
Сообщение #3
Премного благодарен, буду реализовывать и тестировать.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
14 августа 2017 06:10
Сообщение #4
Организовал повтор резки, стало получше, но иногда дальние трупы просто не достает. Не понятно, вроде на 2 тайла должен резать, иногда вроде режет иногда нет. На 1 тайл делал, не удобно, слишком узко.
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
14 августа 2017 09:49
Сообщение #5
Специфика 6 клиента что он не квадратов вокруг чара достает а кругом. Вообще чар достает на 3 тайла, но диагональные точки только на 2.
не знаю как сейчас но раньше у меня резал почти всегда (по крайней мере на пауках отрабатывал). Возможно сообщение проверка стоит расширить.
Sub REZall(Type_Cleaver,Colour_Cleaver); в функцию залетали параметры для нуби или простого кливера
   uo.findtype(body, -1, 'ground', LootDist); LootDist = 2 тайла, задана выше в var
   if uo.findcount() then
      corpse = uo.getSerial("finditem")
      if CheckFlag('Carve') then
         UO.DeleteJournal()
         UO.WaitTargetObject(corpse)
         UO.UseType(Type_Cleaver, Colour_Cleaver)
         LastTimer=UO.Timer()
         repeat
            wait(100)
         until UO.InJournal('ou carve') or UO.Timer()>LastTimer+2; пауза ожидания сообщения порезки или 2 секунды
      endif
      if UO.Weight > str(uo.str*3.66) then
         Loot(corpse)
      else
         uo.charprint('self', printcolour, 'Перегруз!')
      endif
   endif
end sub
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
14 августа 2017 17:26
Сообщение #6
Ну я думал с паузой, в принципе можно попробовать. Но только тогда нужно через 1 сек сообщение, типа не порезал, чтобы подвинуться к трупу, если не достает и дорезать его пока не проигнорился. Но вот удобно ли будет так, надо потестировать.

BANNED
Сообщений: 85
Рег. 14.05.2017
14 августа 2017 18:05
Сообщение #7
братишка руками реж и не прогадаешь!
13 лет
Ranger
Сообщений: 1043
Рег. 18.06.2011
14 августа 2017 20:35
Сообщение #8
vovan,
Ты реально заморачиваешься :) Ну не порезал ресендни и порежб еще раз :)
Маршал (60157892)14 летИнквизитор
Inquisitor
Сообщений: 6208
Рег. 27.11.2009
14 августа 2017 21:36
Сообщение #9
Цитата: vovan
UO.WaitTargetObject(Ser)
checklag()
UO.UseType(Nozhik)


Не слушай никого, просто переставь чеклаг после юзтайпа:

UO.WaitTargetObject(Ser)
UO.UseType(Nozhik)
checklag()


Вот и весь фокус.

У меня вот такой кусок скрипта:

         UO.waittargetobject(corpse)
         uo.usetype('0x1EBA') # 0x1EBA - victorinoxkit # 0x0EC3 - butcher
         wait(75)
         checklag()


Никогда не бывает такого, чтобы труп не порезал.
А дальность резки тут - по прямой и под небольшим углом = 2 тайла.
По диагонали только 1 тайл.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
15 августа 2017 07:57
Сообщение #10
С чеклагом надо попробовать, а вот с диагональю просто засада, именно она в куче мобов периодически видимо и выплывает.
Если так, то тут начего не поделать, остается лишь добавть условие на игнор трупа, если не порезал то не игнорить.
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
15 августа 2017 08:57
Сообщение #11
Цитата: Ggthxbye
А дальность резки тут - по прямой и под небольшим углом = 2 тайла.

Перепутал с лутом :Р
Я вообще без чеклага делаю. От него спама много на постоянно используемом действии.
Можно заморочиться конечно проверкой на направление трупа - если труп находится в 20 доступных клеточках то режем. Если в 4 недоступных то пишем/подходим/вырубаем комп (нужное подчеркнуть).
Но проще не заморачиваться ;)
Маршал (60157892)14 летИнквизитор
Inquisitor
Сообщений: 6208
Рег. 27.11.2009
15 августа 2017 19:18
Сообщение #12
Цитата: vovan
остается лишь добавть условие на игнор трупа


Можно добавить проверку не на дистанцию, а на диагональ, мол если труп в 2-х тайлах по диагонали, то открывать, лутать и писать над головой "для резки сделайте шаг на 'NW' (тут направление), если дистанция изменилась до доступной для резки, то режет. Но это к Зомби лучше.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
16 августа 2017 07:49
Сообщение #13
Проверку на диагональ на 2 тайла идея хорошая, только лучше не лутать их вообще, максимум сообщение какое нибудь. После лута в скрипте предусмотреть Hide трупа, и когда вся куча будет порезана и залутана и спрятана, останутся все остальные к которым надо подойти ближе.
Буду пробовать придумать проверку на диагональ на 2 тайла.
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
16 августа 2017 11:46
Сообщение #14
Костыль, шамань.


var test_id = '0x404DFB9A'; пофигуче на земле

sub main()
   if UO.GetDistance(test_id) <= 2 && coord(test_id) then
      uo.print('Skin')
   else
      uo.print('Not skin')
   endif
end sub

Sub coord(id)
   var tX = str(uo.getx('self')-uo.getx(id))
   var tY = str(uo.gety('self')-uo.gety(id))
   if (val(tX)==-2 && val(tY)==-2) || (val(tX)==2 && val(tY)==-2) || (val(tX)==2 && val(tY)==2) || (val(tX)==-2 && val(tY)==2) then
      return 0
   else
      return 1
   endif
endsub
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
16 августа 2017 12:09
Сообщение #15
Спасибо!! Но почему костыль??
Правда у меня в голове был немного другой вариант, буду пробовать и твой и свой, потом отпишусь.
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
16 августа 2017 13:47
Сообщение #16
Костыль потому что помогает играть игроку у которого не очень получается играть :Р

Свой вариант какой был, алгоритм опиши.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
16 августа 2017 21:21
Сообщение #17
Ну почему не получается, все получается, просто немного бесит когда труп недорезается, приходится ножиком вручную тыкать, не люблю рутину, давно мысли роились доработать, вот решился.
Мой вариант попробовать условие с uo.GetDir и UO.GetDistance в одном флаконе, если выполняется по диагональному ориентиру и расстоянию, то просто не резать.
Когда все что порезанные захайдятся, останутся эти лежать, сразу видно куда перемещаться для следующей резки.
Немного разгребусь с делами буду пробовать.
13 лет
Ranger
Сообщений: 1043
Рег. 18.06.2011
16 августа 2017 21:32
Сообщение #18
через getdir мне кажется будет сложнее реализовать. Она показывает направление взгляда объекта не относительно чара а относительно мира. Тоесть объект повернут на северовосток.

В моем варианте тоже есть небольшой косяк. Иногда (на 203 клиенте чаще) не верно отображаются координаты чара. Я добавлял resend. Хотя пока полчаса тестил скрипт вроде не сбивалось. Но если вдруг имей ввиду.
Можно еще трековую стрелку прилепить для извращенного эстетизму. Типо того
uo.track(tx,ty)
wait(700)
uo.track(0)
на 0,7 секунды будет появляться стрелка указывающая на труп который лутишь :)

PS ©Mirage
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
17 августа 2017 00:28
Сообщение #19
Исходя из описания функции getdir, она возвращает направление на объект с заданным сериалом, относительно чара. И лишь, без указания сериала показывает направления взгляда чара, относительно координат мира. Если я не правильно понял описание функции, тогда действительно будет сложнее. Но тут, я не уверен. Надо пробовать.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
17 августа 2017 08:50
Сообщение #20
Я сильно ошибался, оказалось что getdir указывает направление положения трупа относительно координат мира.
Ну тогда вариант предложенный Mirage, подходит как никогда лучше. Буду тестить.
Последние посетители (0):

 
Сейчас: 23 ноября 2024 05:33