Крафт Diamond Crystal ( заточка )
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
31 октября 2016 10:42
Сообщение #41
Shantaram,
Общий вес камней не думаю что будет высок но лучше все таки добавить проверку на вес и на всякий скидывалку оставшихся камней (хотя в данном скрипте вроде не должно остаться запчастей после создания заточки).
Старший Прапорщик (2421139)9 лет
Dragonstalker
Сообщений: 282
Рег. 20.09.2015
31 октября 2016 12:08
Сообщение #42
Mirage,
по поводу задержек на перемещение, я лишь вместо MoveDelay как в оригинале поставил её значение в 350
Маршал (73319389)14 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
31 октября 2016 12:21
Сообщение #43
Цитата: Mirage
Всегда любил подход Зомби за нагромождение там где оно не очень нужно.
Нафига использовать:
Wait((500 - 350) * (500 > 350))
если оно всегда равно
Wait(150)

А в Sub AddItems наоборот после MoveItem хотя бы чеклаг поставить надо. в случае фейла если ресов останется мало скрипту поплохеть может.

PS само собой если это обороты Зомби а не автора скрипта :)

Этот макрос из автолоада и заточен на максимальную скорость перемещения, в оригинале выглядит так:
var MoveDelay    = 350
Sub MoveItem(Item, Count, Dest, x, y, z)
var Source      = UO.ContainerOf(Item)
  while Source == UO.ContainerOf(Item) && UO.GetSerial(Dest) <> UO.ContainerOf(Item) && not UO.Dead()
    UO.MoveItem(Item, Count, Dest, x, y, z)
    Wait(MoveDelay)
    if UO.InJournalBetweenTimes('World save ', Now() - MoveDelay) > 0 then
      UO.ReceiveObjectName('backpack', 30000)
    end if
    if Source <> UO.ContainerOf(Item) || UO.GetSerial(Dest) == UO.ContainerOf(Item) then
      Wait((500 - MoveDelay) * (500 > MoveDelay))
    end if
  wend
end sub

Простой вариант, при MoveDelay=550 иногда залипает:
Sub MoveItem(Item, Count, Container)
  UO.MoveItem(Item, Count, Container)
  while UO.ContainerOf(Item) <> UO.GetSerial(Container)
    Wait(100)
  wend
  Wait(MoveDelay)
end sub

Наверное оптимальный вариант:
var MoveDelay    = 550
Sub MoveItem(Item, Count, Container)
var EndTime     = Now() + 2000
  repeat
    UO.MoveItem(Item, Count, Container)
    while (UO.ContainerOf(Item) <> UO.GetSerial(Container)) and (Now() < EndTime)
      Wait(100)
    wend
    Wait(MoveDelay)
  until UO.ContainerOf(Item) == UO.GetSerial(Container)
end sub

Использовать чеклаг в перемещении жесть еще та)))

ПС: "нагромождение там где оно не очень нужно" в студию. Посмотрим, что там за "нагромождение" такое)))
Маршал (73319389)14 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
31 октября 2016 12:34
Сообщение #44
Прекращу страдания, держите))
_craft_crystal.sc
;----------------------------------------------------------------------------
; by VeL                                                            The Best
;----------------------------------------------------------------------------
; Изготовление заточек "Dimond Crystal"
;----------------------------------------------------------------------------

var Container   = UO.GetSerial('lastcontainer')

sub DimondCrystal()

var Names       = 'Granates|Ambers|Rubys|Sapphires|Tourmalines|Citrines|Emeralds|Amethysts|Diamonds'
var Types       = '0x0F26|0x0F25|0x0F13|0x0F11|0x0F18|0x0F15|0x0F10|0x0F16|0x0F26'
var Colors      = '0x0492|0x0000|0x0000|0x0000|0x0000|0x0000|0x0000|0x0000|0x0000'

var Index, Count

  while not UO.Dead()
    MoveItems(0x1F19, 0x0920, 'backpack', Container)
    if not AddItems(0x1869, 0x0991, 1, Container, 'backpack') && UO.Count(0x1F19) == 0 then
      UO.ColorPrint(0x0026, '"Weapon Enchant" закончились!')
      Break
    end if
    Count = 20
    for Index = 1 to 9
      repeat
        if UO.Count(0x1EBC) == 0 then
          UO.ColorPrint(0x0026, 'Инструмент "Tinker Tools" не найден!')
          return
        end if
        if not AddItems(GetWord(Types, Index, '|'), GetWord(Colors, Index, '|'), Count, Container, 'backpack') then
          UO.ColorPrint(0x0026, 'Нехватает "' + GetWord(Names, Index, '|') + '" ' + str(Count - UO.Count(GetWord(Types, Index, '|'), GetWord(Colors, Index, '|'))) + 'шт.')
          return
        end if
        Wait(550)
        UO.WaitMenu('Misc', '(1)')
        UO.UseType(0x1EBC)
        UO.WaitingForJournalText(Now(), 60000, "You put|You can't|fail|You broke|destroyed!")
        Wait(50)
      until UO.GetFoundedTextID() <= 1
      Count = Count - 2
    next
  wend
  UO.ColorPrint(0x0446, 'Изготовление "Dimond Crystal" завершено.')

end sub

Sub MoveItem(Item, Count, Container)
  UO.MoveItem(Item, Count, Container)
  while UO.ContainerOf(Item) <> UO.GetSerial(Container)
    Wait(100)
  wend
  Wait(550)
end sub

Sub MoveItems(Type, Color, Source, Dest)
  while UO.FindType(Type, Color, Source) <> ''
    MoveItem('finditem', -1, Dest)
  wend
end sub

Sub AddItems(Type, Color, Count, Source, Dest)
  while UO.Count(Type, Color, Dest) < Count
    if UO.FindType(Type, Color, Source) <> '' then
      MoveItem('finditem', Count - UO.Count(Type, Color, Dest), Dest)
    else
      return False
    end if
  wend
  return True
end sub

Гости
Сообщений: 45
Рег. 24.09.2016
31 октября 2016 12:40
Сообщение #45
Zombie, как работает нужно указывать где то ящик с ресами и куда складывать?
Маршал (73319389)14 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
31 октября 2016 12:47
Сообщение #46
Цитата: Duplomat
Zombie, как работает нужно указывать где то ящик с ресами и куда складывать?

Работает из последнего открытого контейнера, отгружает туда же.
Старший Прапорщик (2421139)9 лет
Dragonstalker
Сообщений: 282
Рег. 20.09.2015
31 октября 2016 12:48
Сообщение #47
Zombie, а что значит вот это и вот это ?
Цитата: Zombie
UO.WaitMenu('Misc', '(1)')

Цитата: Zombie
until UO.GetFoundedTextID() <= 1
Маршал (73319389)14 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
31 октября 2016 12:53
Сообщение #48
Shantaram,
1. ловушка на первый элемент крафт меню.
2. выход из цикла, если в журнале найдено "You put|You can't", либо не найдено ничего из "You put|You can't|fail|You broke|destroyed!"
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
31 октября 2016 13:02
Сообщение #49
Zombie,
Смотри. При перемещении один хрен будет пауза как минимум 100-300 мсек. Следовательно должна быть кратная 100-300 + пинг. Так же while подходит чуть менее чем repeat. И тискать в цикле перемещения (я так делал раньше но заметил что сбиваемость повышается у скрипта) не обязательно - рано или поздно все равно подвинет |=> на примере лутовой перемещалки
var lootwait = 125
               uo.MoveItem(itemID,0,'backpack')
               repeat
                  wait(lootwait)
               until UO.ContainerOf(itemID)<>'backpack' || timemove+30>UO.Timer() || Uo.GetDistance(corpse) <= LootDist

Прекрасно себя чувствует в условии фарма около 3-4 часов подряд. Таким вариантом и в крафтах пользуюсь.

По награмождению.
Wait((500 - MoveDelay) * (500 > MoveDelay))

sub main()
var MoveDelay = 350
   uo.Print(str(((500 - MoveDelay) * (500 > MoveDelay))))
end sub
Результат 20 замеров 150. 150 мало для перемещения. И если оно всегда равно 150 зачем такая формула расчета кроме как запутывания пользователя?
Всего скорее последний инжект вместе со сломанным рендомайзером и эту строку как то не так обрабатывает. Но я в решении антимакроса использовал более понятный для юзера wait(5000+uo.random(100)*25)


PS ушел строчить задание для Джусса...
Маршал (73319389)14 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
31 октября 2016 13:36
Сообщение #50
Mirage,
Величина MoveDelay не постоянная и подбирается методом тыка, а формула нужна для подсчета остатка от задержки в 500 и если MoveDelay > 500, то остаток будет всегда 0.
var MoveDelay    = 350
Sub MoveItem(Item, Count, Dest, x, y, z)
var Source      = UO.ContainerOf(Item)
  while Source == UO.ContainerOf(Item) && UO.GetSerial(Dest) <> UO.ContainerOf(Item) && not UO.Dead()
    UO.MoveItem(Item, Count, Dest, x, y, z)
    Wait(MoveDelay)
    if UO.InJournalBetweenTimes('World save ', Now() - MoveDelay) > 0 then
      UO.ReceiveObjectName('backpack', 30000)
    end if
    if Source <> UO.ContainerOf(Item) || UO.GetSerial(Dest) == UO.ContainerOf(Item) then
      Wait((500 - MoveDelay) * (500 > MoveDelay))
    end if
  wend
end sub

Что получаем... Дергаем предмет и ждем MoveDelay, если предмет на месте или в "полете", ждем остаток от 500 (500-MoveDelay), уменьшая значение MoveDelay, мы увеличиваем число попыток дернуть предмет, при удачном перемещении задержка всегда будет 500.
Такой вариант работает намного быстрее стандартного подхода, не говоря уже о варианте с чеклагом.

А вот в луте не нужна проверка на удачное перемещение, просто дергаем предмет пока видим в трупе.
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
31 октября 2016 14:09
Сообщение #51
С уменьшением паузы потестировать надо, Джус заодно рендом подправить обещался.
Цитата: Zombie
просто дергаем предмет пока видим в трупе.
бегая так около года заметил что хватает на час полтора. С изменяемыми со стороны Хосана паузами на перемещение (для трешера, для трешера в перчатках, для не трешера...) такой скрипт будет хуже чем мой вариант. Больше холостых действий, и инжект и сфера по своей натуре по моим наблюдениям этого не любят, а отражается это все на стабильности игрока. В общем я так делал, мне не понравилось, теперь я так не делаю.
Маршал (73319389)14 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
31 октября 2016 15:27
Сообщение #52
Mirage,
Вообще такой вариант MoveItem, я написал для подбора оптимальных значений задержек. Задержка в 500, при отсутствии лагов, дает гарантию почти 100%, поэтому можно выкинуть лишнее:
Sub MoveItem(Item, Count, Dest, x, y, z)
var Source      = UO.ContainerOf(Item)
  while Source == UO.ContainerOf(Item) && UO.GetSerial(Dest) <> UO.ContainerOf(Item) && not UO.Dead()
    UO.MoveItem(Item, Count, Dest, x, y, z)
    Wait(500)
    if UO.InJournalBetweenTimes('World save ', Now() - 500) > 0 then
      UO.ReceiveObjectName('backpack', 30000)
    end if
  wend
end sub

бегая так около года заметил что хватает на час полтора. С изменяемыми со стороны Хосана паузами на перемещение (для трешера, для трешера в перчатках, для не трешера...) такой скрипт будет хуже чем мой вариант.

Раньше я делал тоже самое, но при луте в ПВП понял ошибочность такого подхода))) Сейчас стоит статичная задержка в 100мс, проблем не вызывает.
Лейтенант (4548828)10 лет
Dragonstalker
Сообщений: 3319
Рег. 19.11.2013
31 октября 2016 16:11
Сообщение #53
Надо запилить эксперимент с вытаскиванием 50 предметов из 2 сундуков. Что бы 2 чара по голосовой команде начинают тягать предметы со своих сундуков, как закончат голосом говорят что все - судья отдавший команду на старт палит кто первее произносит что закончил. И сравнить скрипт с дерганием и с ожиданием перемещения :crazy:
Маршал (73319389)14 летИнквизитор
Inquisitor
Сообщений: 1693
Рег. 19.06.2010
31 октября 2016 17:10
Сообщение #54
Mirage,
Кстати, тут не правильно:
until UO.ContainerOf(itemID)<>'backpack' || timemove+30>UO.Timer() || Uo.GetDistance(corpse) <= LootDist

Правильно:
until UO.ContainerOf(itemID)<>UO.GetSerial('backpack') || timemove+30>UO.Timer() || Uo.GetDistance(corpse) <= LootDist


Проверять лучше на одном чаре с одним и тем же пингом.

var Container = UO.GetSerial('lastcontainer')

; вариант со статичной задержкой в 100мс
sub Test1()
var OldTime = Now()
  while UO.FindType(-1, -1, Container) <> ''
    UO.MoveItem('finditem', 0, 'backpack')
    wait(100)
  wend
  UO.Print('время: ' + Str(Now() - OldTime))
end sub

; твой вариант
sub Test2()
var timemove, OldTime = Now()
  while UO.FindType(-1, -1, Container) <> ''
    timemove = UO.Timer()
    UO.MoveItem('finditem', 0, 'backpack')
    repeat
      wait(125)
    until UO.ContainerOf('finditem')<>UO.GetSerial('backpack') || timemove+30>UO.Timer()
  wend
  UO.Print('время: ' + Str(Now() - OldTime))
end sub

Не совсем подходит для тестирования лута, там есть свои нюансы. Если лутит несколько персонажей, в 1 варианте переключение на следующий предмет будет происходить быстрее. К примеру, при твоем варианте, если кто то рядом лутит из под хайда, при учете, что вы оба будете дергать одни и те же предметы, тебе не достанется практически ничего...
Старший Прапорщик (2489597)9 лет
Dragonstalker
Сообщений: 1656
Рег. 28.03.2015
1 ноября 2016 01:29
Сообщение #55
Цитата: Zombie
Прекращу страдания, держите))
_craft_crystal.sc


Супер, очередной прекрасный и удобный скриптик , спасибо )
Сержант (551834)11 лет
Urukhay
Сообщений: 262
Рег. 18.06.2013
5 ноября 2016 11:30
Сообщение #56
Ещё раз большое спасибо ;)
Подскажите случайно нету на мининг скриптика ? простенького что бы ходил копал бежал в банк выкидывал либо реколл. под одну шахту.
Старший Прапорщик (2421139)9 лет
Dragonstalker
Сообщений: 282
Рег. 20.09.2015
5 ноября 2016 13:50
Сообщение #57
Morgan La Fey,
Ахах не похоже на простой))))
Сержант (551834)11 лет
Urukhay
Сообщений: 262
Рег. 18.06.2013
5 ноября 2016 15:01
Сообщение #58
не простой это где он реколится от врагов,восстанавливает усталость, летает по трём четырём шахтам, добор рег, кирок , убийство елемов и так далее .
Сержант (551834)11 лет
Urukhay
Сообщений: 262
Рег. 18.06.2013
12 ноября 2016 21:00
Сообщение #59
_craft_crystal.sc
Если фейлит ,то просто начинает макрос по новой.
Последние посетители (0):

 
Сейчас: 11 ноября 2024 05:52