Крафт Diamond Crystal ( заточка ) |
Крафт Diamond Crystal ( заточка ) |
Сообщений: 3319 Рег. 19.11.2013 |
31 октября 2016 10:42
Сообщение #41
|
Shantaram, Общий вес камней не думаю что будет высок но лучше все таки добавить проверку на вес и на всякий скидывалку оставшихся камней (хотя в данном скрипте вроде не должно остаться запчастей после создания заточки). |
|
|
|
Сообщений: 282 Рег. 20.09.2015 |
31 октября 2016 12:08
Сообщение #42
|
Mirage, по поводу задержек на перемещение, я лишь вместо MoveDelay как в оригинале поставил её значение в 350 |
|
|
|
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 Использовать чеклаг в перемещении жесть еще та))) ПС: "нагромождение там где оно не очень нужно" в студию. Посмотрим, что там за "нагромождение" такое))) |
|
|
|
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 |
|
|
|
31 октября 2016 12:40
Сообщение #45
|
|
Zombie, как работает нужно указывать где то ящик с ресами и куда складывать? |
|
|
|
31 октября 2016 12:47
Сообщение #46
|
|
Цитата: Duplomat Zombie, как работает нужно указывать где то ящик с ресами и куда складывать? Работает из последнего открытого контейнера, отгружает туда же. |
|
|
|
Сообщений: 282 Рег. 20.09.2015 |
31 октября 2016 12:48
Сообщение #47
|
Zombie, а что значит вот это и вот это ? Цитата: Zombie UO.WaitMenu('Misc', '(1)') Цитата: Zombie until UO.GetFoundedTextID() <= 1 |
|
|
|
31 октября 2016 12:53
Сообщение #48
|
|
Shantaram, 1. ловушка на первый элемент крафт меню. 2. выход из цикла, если в журнале найдено "You put|You can't", либо не найдено ничего из "You put|You can't|fail|You broke|destroyed!" |
|
|
|
Сообщений: 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 Всего скорее последний инжект вместе со сломанным рендомайзером и эту строку как то не так обрабатывает. Но я в решении антимакроса использовал более понятный для юзера wait(5000+uo.random(100)*25) PS ушел строчить задание для Джусса... |
|
|
|
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. Такой вариант работает намного быстрее стандартного подхода, не говоря уже о варианте с чеклагом. А вот в луте не нужна проверка на удачное перемещение, просто дергаем предмет пока видим в трупе. |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
31 октября 2016 14:09
Сообщение #51
|
С уменьшением паузы потестировать надо, Джус заодно рендом подправить обещался. Цитата: Zombie просто дергаем предмет пока видим в трупе. бегая так около года заметил что хватает на час полтора. С изменяемыми со стороны Хосана паузами на перемещение (для трешера, для трешера в перчатках, для не трешера...) такой скрипт будет хуже чем мой вариант. Больше холостых действий, и инжект и сфера по своей натуре по моим наблюдениям этого не любят, а отражается это все на стабильности игрока. В общем я так делал, мне не понравилось, теперь я так не делаю. |
|
|
|
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мс, проблем не вызывает. |
|
|
|
Сообщений: 3319 Рег. 19.11.2013 |
31 октября 2016 16:11
Сообщение #53
|
Надо запилить эксперимент с вытаскиванием 50 предметов из 2 сундуков. Что бы 2 чара по голосовой команде начинают тягать предметы со своих сундуков, как закончат голосом говорят что все - судья отдавший команду на старт палит кто первее произносит что закончил. И сравнить скрипт с дерганием и с ожиданием перемещения |
|
|
|
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 варианте переключение на следующий предмет будет происходить быстрее. К примеру, при твоем варианте, если кто то рядом лутит из под хайда, при учете, что вы оба будете дергать одни и те же предметы, тебе не достанется практически ничего... |
|
|
|
Сообщений: 1656 Рег. 28.03.2015 |
1 ноября 2016 01:29
Сообщение #55
|
Цитата: Zombie Прекращу страдания, держите)) _craft_crystal.sc Супер, очередной прекрасный и удобный скриптик , спасибо ) |
|
|
|
Сообщений: 262 Рег. 18.06.2013 |
5 ноября 2016 11:30
Сообщение #56
|
Ещё раз большое спасибо ;) Подскажите случайно нету на мининг скриптика ? простенького что бы ходил копал бежал в банк выкидывал либо реколл. под одну шахту. |
|
|
|
Сообщений: 282 Рег. 20.09.2015 |
5 ноября 2016 13:50
Сообщение #57
|
Morgan La Fey, Ахах не похоже на простой)))) |
|
|
|
Сообщений: 262 Рег. 18.06.2013 |
5 ноября 2016 15:01
Сообщение #58
|
не простой это где он реколится от врагов,восстанавливает усталость, летает по трём четырём шахтам, добор рег, кирок , убийство елемов и так далее . |
|
|
|
Сообщений: 262 Рег. 18.06.2013 |
12 ноября 2016 21:00
Сообщение #59
|
_craft_crystal.sc Если фейлит ,то просто начинает макрос по новой. |
|
|
|
Сейчас: 22 ноября 2024 23:01 |