Проверка резки трупа
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
17 августа 2017 09:59
Сообщение #21
Я же писал. :)
Я тестировал на коне. Куда лошать смотрела ту координату и показывало, а не относительно положения чара.
Хотя не совсем ясно как было изначально. Это либо фишечка либо глюк. Уточню.

Вообще можно через формулу вычислить используя getdir. Если мы знаем расстояние до объекта, направление взгляда чара, направление лежащего объекта... Но имхо исключив всего 4 точки из 24 быстрее сделать.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
17 августа 2017 10:10
Сообщение #22
Не, я пытался использовать getdir(serial corpse), и как я протестировал, ку да бы чар не смотрел, и где бы не был относительно трупа, результат был один и тот же.
Следовательно я сделал вывод, что он показывает в каком направлении лежит труп, ну типа головой на восток.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
18 августа 2017 00:10
Сообщение #23
Последний вариант:
1. Чеклаг убран, работает быстрее, если из-за лагов не порезал, предусмотрено повторное действие.
2. Диагональ больше 1 тайла, тоже не режет, труп не игнорит.
Работал стабильно 3 часа фарма.


Sub Looting()
   UO.AddFindList('loot', 0x0F3F) ; arrow  
   UO.AddFindList('loot', 0x1078) ; pile of hides
   UO.AddFindList('loot', 0x0EED) ; golden coins
      
   var Ser
  
   if UO.FindType(0x2006, -1, 'ground', 2) <> '' then
      Ser=uo.GetSerial('finditem')
        
      if UO.GetDistance(Ser) <= 2 && coord(Ser) then      
         if not UO.WaitingForJournalText(Now(), 500, "You can't") && UO.Count(Nozhik) > 0 then
            UO.WaitTargetObject(Ser)
            UO.UseType(Nozhik)
            if not UO.WaitingForJournalText(Now(), 500, "You skin|You carve") then
               UO.Print( 'Повторно режим!' )
               UO.WaitTargetObject(Ser)
               UO.UseType(Nozhik)
               Wait(500)
            end if
            UO.UseObject(Ser)
            Wait(200)
         end if
         UO.FindList('loot', Ser)
         While UO.FindCount(finditem) > 0 && UO.GetDistance(Ser)<=2
            UO.MoveItem('finditem', -1, LootPack)
            wait(200)
            UO.FindList('loot', Ser)
         Wend
         UO.Print( 'Залутал!!!' )
         UO.Ignore(Ser)
      else
         uo.print('Not skin')
      endif
   end if
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
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
18 августа 2017 09:09
Сообщение #24
Если работает то конечно ничего но пару мест можно пооптимальнее расписать:
UO.UseObject(Ser)
Wait(200)

на

      timemove=UO.Timer()
      uo.useobject(Ser)
      repeat
         wait(lootwait); 100
      until (UO.GetSerial(Ser)<>uo.GetSerial('lastcontainer') && uo.GetSerial('lastcontainer')<>'0xFFFFFFFF') || timemove+10>UO.Timer() || Uo.GetDistance(Ser) <= LootDist


И вот тут паузу:
            UO.FindList('loot', Ser)
            While UO.FindCount(finditem) > 0 && UO.GetDistance(Ser)<=2
                UO.MoveItem('finditem', -1, LootPack)
                wait(200); <----- с такой скоростью не слутишь а будешь попусту гонять цикл и дергать предмет
                UO.FindList('loot', Ser)
            Wend


я примерно так расписал:
           timemove=UO.Timer()
            uo.MoveItem(itemID,0,uo.getGlobal('LootBag'))
            repeat
               wait(lootwait)
            until UO.ContainerOf(itemID)<>uo.getGlobal('LootBag') || timemove+30>UO.Timer() || Uo.GetDistance(corpse) <= LootDist

Ждать пока контейнер предмета не равен целевому контейнеру куда перемещаешь либо три секунды либо не отбежал от трупа.
Как только предмет переместился - цикл скидывается.
И на предмет тоже лучше константу повесить. Если учесть что в среднем предмет двигается за 0,6 секунды то вполне может прилететь какой нибудь новый finditem и скрипт будет двигать новый объект который может находиться где вне трупа.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
18 августа 2017 19:23
Сообщение #25
Отличные предложения, динамические паузы будут кстати, и константа тоже не лишней будет.
Но перемещение между контейнерами как по мне, слишком медленновато, я так понимаю ускорить не вариант, это настройка сферы?
13 лет
Ranger
Сообщений: 1043
Рег. 18.06.2011
18 августа 2017 20:20
Сообщение #26
По дефолту на сфере 300 мсек. Если не изменяет память то Хосан сделал 600 для всех и 300 для трешера

Мы как то с другом даже хотели написать скрипт когда трешер бегал ботом сзади и собирал лут за лучниками :)
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
19 августа 2017 09:45
Сообщение #27
Вариант с оптимизацией пауз при луте и открытии трупа.
2 часа фарма, работает как часы. Скорость лута невооруженным взглядом стала выше.


Sub Looting()
   UO.AddFindList('loot', 0x0F3F); arrow  
   UO.AddFindList('loot', 0x1078); pile of hides
   UO.AddFindList('loot', 0x0EED); golden coins
      
   var Ser, ItemID, TimeMove
   var LootWait    = 100        ; время в цикле динамической паузы лута
   var LootDist    = 2          ; расстояние лута трупа
  
if UO.FindType(0x2006, -1, 'ground', LootDist) <> '' then
      Ser=uo.GetSerial('finditem')
            
      if UO.GetDistance(Ser) <= LootDist && coord(Ser) then      
         if not UO.WaitingForJournalText(Now(), 500, "You can't") && UO.Count(Nozhik) > 0 then
            UO.WaitTargetObject(Ser)
            UO.UseType(Nozhik)
            if not UO.WaitingForJournalText(Now(), 500, "You skin|You carve") then
               UO.Print( 'Блин!!! Режем еще раз' )
               UO.WaitTargetObject(Ser)
               UO.UseType(Nozhik)
               Wait(500)
            end if
            TimeMove=UO.Timer()
            UO.UseObject(Ser)
            repeat
                  wait(LootWait)
            until (UO.GetSerial(Ser)<>uo.GetSerial('lastcontainer') && uo.GetSerial('lastcontainer')<>'0xFFFFFFFF') || TimeMove+10>UO.Timer() || Uo.GetDistance(Ser) <= LootDist
         end if
         UO.FindList('loot', Ser)
         While UO.FindCount('finditem') > 0 && UO.GetDistance(Ser)<=LootDist; Пока количество найденного больше 0
            ItemID = uo.GetSerial('finditem')
            TimeMove=UO.Timer()
            UO.MoveItem(ItemID, -1, LootPack); Забираем найденное в пак
            repeat
               wait(LootWait)
            until UO.ContainerOf(ItemID)<>uo.GetSerial(LootPack) || TimeMove+20>UO.Timer() || Uo.GetDistance(Ser) <= LootDist
            UO.FindList('loot', Ser)
         Wend
         UO.Print( 'Залутано!!!' )
         UO.Ignore(Ser)
      else
         uo.print('НЕ ПОРЕЗАЛ!!!')
      endif
   end if
end sub

Sub coord(id)
   var tX = str(uo.getx('self')-uo.getx(id))
   var tY = str(uo.gety('self')-uo.gety(id))
  ;UO.Print(tX+', '+tY)
   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


Желающие могут добавить после UO.Ignore(Ser) еще UO.Hide(Ser), для скрытия трупа, у меня он стоит в дополнительном скрипте.

Гости
Сообщений: 9
Рег. 5.09.2017
18 сентября 2017 00:32
Сообщение #28
vovan,
А где прописан ножик, контейнер и т.д.? точно полный скрипт?

и у меня инжа почему-то этот скрпит не видит
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
18 сентября 2017 01:05
Сообщение #29
Пропиши в начале скрипта до всех sub

VAR Nozhik = '0x0EC4';0x0F51 - dagger, 0x0EC2 - cleaver, 0x0EC4 - skinning knife, 0x13F6 - Butcher Knife
VAR LootPack = '0x40B61574'; Сумка для лута укажи свой ID сумки для лута, если ее нет то указать backpack

а чтобы скрипт был видет поменяй заглавную Sub на маленькую sub
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
18 сентября 2017 06:24
Сообщение #30
Это сткрипт для хоткея по этому заглавная S и по этому инжа «не видит» :)

Гости
Сообщений: 9
Рег. 5.09.2017
18 сентября 2017 10:40
Сообщение #31
чуть его доработал. Спасибо огромное, отличный скрипт
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
18 сентября 2017 11:56
Сообщение #32
vovan молодец, почти сам все сделал.
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
18 сентября 2017 15:43
Сообщение #33
Ты мне льстишь. Это результат совместных трудов, и Mirage внес существенный вклад в конечный результат.
7 лет
Trasher
Сообщений: 13
Рег. 4.05.2017
22 сентября 2017 23:49
Сообщение #34
в зомби скрипте же есть все нужные скрипты на лут !
Прапорщик (1724985)7 лет
Ranger
Сообщений: 275
Рег. 10.03.2017
23 сентября 2017 09:11
Сообщение #35
Все верно. Но этот отличается от тех что там есть.
Лейтенант (4548828)11 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
23 сентября 2017 20:40
Сообщение #36
End of the game,
Ты не считаешь что лучше разобраться самому чем тупо пользоваться непонятными скриптами? :) Даже мне, не плохо разбирающемуся в скриптах инжи иногда тяжело с наскока читать скрипты Зомбика. Тем более что там для общего пользования а тут уже более узконаправленный с дополнительными условиями. Если есть возможность и желание то лучше писать своё (в крайнем случае пользуясь доступными вариантами для костяка и обучения). Так проще будет что то поменять при необходимости.
Ефрейтор (159363)8 лет
Ranger
Сообщений: 1
Рег. 9.05.2016
28 сентября 2017 10:29
Сообщение #37
:agree: все работает супер
Последние посетители (0):

 
Сейчас: 23 ноября 2024 01:41