Yoko

All sides of Injection
It is currently 2017-09-26 11:02:55

All times are UTC+02:00




Post new topic  Reply to topic  [ 23 posts ]  Go to page 1 2 Next
Author Message
PostPosted: 2012-01-16 14:28:59 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
Все-таки пересилил себя и довел до более менее конечного результата скрипт на лут.
Используются наработки и идеи большого количества людей с данного форума и не только. Извините, всех не буду перечислять - потерял в аналах истории авторов всех кусочков.
Идея перемещения предметов мне досталась от моего старого знакомого и коллеги по шарду Антарес - Максима.
Конечный вариант в том виде в котором выложил тут - моя сборка.
Скрипт тестировался на сферовых серверах 51, 55R и 56b. Основной полигон тестирования Антарес. Дополнительный подгоны - Бест. Немного на стандартной дефолтовой сфере 56b.

Чтобы скрипт работал как задумывалось необходимо произвести настройки:
1) Файл скрипта должен называться autoload.sc и находится в папке с инжектом (либо с клиентом - зависит от версии инжекта).
2) В MAIN окне инжекта должна быть включена галочка "Autostart" (в середине окна)
3) В паке игрока должны быть ножницы и кинжал. После резки тела в руки берется оружие которое было на момент запуска скрипта.
4) Запускать REZ - для порезки или Loot для лута тела.
5) Если лут прервать принудительно то нужно запускать Lootrunning() для обновления константы. Иначе резать будет, лутать - нет.
6) В планируемых доработках - сделать чтобы стакующиеся предметы складывались в кучу, не стакующиеся в рядок.

Описание процедур скрипта:
autostart() - автозапуск. Задает константу для защиты от повторного срабатывания скрипта на лут и добавляет фильтр фастлута.
REZ() - резка трупа кинжалом, после резки автоматически запускает лут.
Lootrunning() - назначает константу для защиты от повторного срабатывания скрипта на лут. Можно запускать руками при необходимости.
Loot() - основной скрипт лута. В нем используются все последующие функции.
findcorps() - определяет что будем лутить - скелет или труп животного.
IgnorHair(corpse) - игнорирует волосы в трупе игрока (баг на 55-56 сферах)
Ignor(corpse) - игнорирует реагенты в трупах (пример как добавлять не нужные для лута вещи)
GrabLoot(corps) - функция лута первоочередных предметов.
Scissors() - порезка кожи в рюкзаке персонажа. Срабатывает когда игрок в тени.
PUTLoot2(Type1, Type2, Color, SourceContainer, TargetContainer,X,Y,Z) - процедура перемещения массива объектов.
PUTLoot(Type, Color, SourceContainer, TargetContainer,X,Y,Z) - процедура перемещения одного объекта.
DeleteJournal(msg) - очищает журнал.
checklag() - чеклаг (динамическая пауза).

Code:
### Контейнеры ###
VAR Meshok   = '0x0E76';   тип мешка
VAR Deed     = '0x14EF';   свиток ресурсов
VAR body     = '0x2006';   труп (не разделанный)
##################

### Инструменты ###
VAR Dagger   = '0x0F51';   кинжал (резка трупа)
VAR Scissors = '0x0F9E';   ножницы
##################

### Сырье ###
VAR hides    = '0x1078';   шкура животного
VAR leather  = '0x1067';   готовая кожа
##################

### Вспомогательные константы ###
VAR lootwait = 50;         пауза
VAR printcolour  = '1069'; цвет сообщений
##################

### Переменные ###
VAR MeshSer, d, LastTimer, timemove
VAR Type, TType, Type1, Type2, Color, SourceContainer, TargetContainer
VAR corpse, a, hair, reg, colhides
##################

Sub autostart()
   Lootrunning()
   UO.filterspeech('clear')
   UO.filterspeech('add','[Surprize ! Fast loot detected!]')
   UO.filterspeech('on')
end sub
Sub REZ()
   UO.Set('quiet','1')
   uo.set('finddistance', '3')
   ;uo.ignorereset()
   uo.findtype(body, -1, 'ground')
   if uo.findcount() and Uo.GetDistance( 'finditem' ) < 3  then
      var x = uo.GetGraphic(uo.ObjAtLayer('Rhand'))
      var y = uo.GetGraphic(uo.ObjAtLayer('Lhand'))
      uo.warmode(0)
      wait(500)
      corpse = uo.getSerial("finditem")
      UO.WaitTargetObject(corpse)
      UO.UseType(dagger)
      wait(500)
      uo.Equipt('Rhand',x)
      uo.Equipt('Lhand',y)
      if x <> uo.GetGraphic(uo.ObjAtLayer('Rhand')) or y <> uo.GetGraphic(uo.ObjAtLayer('Lhand')) then
         UO.UseType(x)
         wait(100)
         UO.UseType(y)
         wait(100)
      endif
      Loot()
      uo.warmode(1)
   endif
   UO.Set('quiet','0')
end sub
sub Lootrunning()
   uo.setGlobal('running',1)
end sub
Sub Loot()
   ;uo.ignorereset()
   DIM G[7]
   G[1] = '0x0EED';   деньги
   G[2] = '0x0E76';   мешки
   G[3] = '0x09AA';   пандоры
   G[4] = '0x1BFB';   болты
   G[5] = '0x0F3F';   стрелы
   G[6] = '0x1087';   серьги
   G[7] = '0x108A';   кольца
   UO.Set('quiet','1')
   if val(uo.getGlobal('running'))==1 then
      uo.setGlobal('running',2)
      uo.set('finddistance', '3')
      corpse = '0x00000000'
      corpse = findcorps()
      if corpse<>'0xffffffff' and corpse<>'0x00000000' then
         IF uo.findcount() and Uo.GetDistance( 'finditem' ) <= 4 then
            uo.deletejournal()
            uo.useobject(corpse)
            wait(300)
            if NOT uo.injournal("You can't do it here") then
               GrabLoot(corpse)
               IgnorHair(corpse)
               ;Ignor(corpse)
               PUTLoot('-1', '-1', corpse, 'backpack','','','')
            endif
            UO.Hide(corpse)
            UO.Ignore(corpse)
         endif
      else
         For a=1 to 7
            PUTLoot(G[a], '-1', 'ground', 'backpack',30,150,0)
         next
      endif
      Scissors()
      uo.setGlobal('running',1)
   endif
   UO.Set('quiet','0')
end sub
Sub findcorps()
   DIM body[2]
   body[1] = '0x0ECA';
   body[2] = '0x2006';
   For a = 1 to 2
      UO.FindType(body[a], -1, 'ground')
      if UO.FindCount() then
         return uo.getSerial('finditem')
      endif
   next
end sub
Sub IgnorHair(corpse)
   For hair = 0x203B to 0x204D
      UO.FindType(hair, -1, corpse)
      if UO.FindCount() then
         UO.Ignore('finditem')
      endif
   next
end sub
Sub Ignor(corpse)
   For reg = 0xF7A to 0xF7B
      UO.FindType(reg, -1, corpse)
      if UO.FindCount() then
         UO.Ignore('finditem')
      endif
   next
   For reg = 0xF84 to 0xF86
      UO.FindType(reg, -1, corpse)
      if UO.FindCount() then
         UO.Ignore('finditem')
      endif
   next
   For reg = 0xF88 to 0xF88
      UO.FindType(reg, -1, corpse)
      if UO.FindCount() then
         UO.Ignore('finditem')
      endif
   next
   For reg = 0xF8C to 0xF8D
      UO.FindType(reg, -1, corpse)
      if UO.FindCount() then
         UO.Ignore('finditem')
      endif
   next
end sub
Sub GrabLoot(corps)
   var pack = 'backpack'
   ;uo.charprint(printcolour,'лутим типы')
   PUTLoot('0x1869', '0', corps, pack,'','','');   ЭНЧАНТ шарики
   PUTLoot('0x09AA', '0x0834', corps, pack,'','','');   Пандора 10 Лв.
   PUTLoot('0x09AA', '0x0833', corps, pack,'','','');   Пандора 9 Лв.
   PUTLoot('0x09AA', '0x0832', corps, pack,'','','');   Пандора 8 Лв.
   PUTLoot('0x09AA', '0x08EA', corps, pack,'','','');   Пандора 7 Лв.
   PUTLoot('0x09AA', '0x08C1', corps, pack,'','','');   Пандора 6 Лв.
   PUTLoot('0x13B1', '0x099F', corps, pack,'150','170','0');   Exc.Rangers Bow
   PUTLoot('0x13B1', '0x05D8', corps, pack,'150','160','0');   Rangers bow
   PUTLoot('0x0A3E', '0', corps, pack,'160','170','0');   шкатулка
   PUTLoot(-1, '0x086C', corps, pack,'','','');   хантер вещи
   PUTLoot(-1, '0x099F', corps, pack,'','','');   ренжер вещи
   PUTLoot(-1, '0x0358', corps, pack,'','','');   рат вещи
   PUTLoot2(0x1869, 0x1870, '-1', corps, pack,'','','');   шарики
   PUTLoot('0x0EED', '0', corps, pack,'','','');   золото
   PUTLoot2(0x1E88, 0x1E89, '-1', corps, pack,'','','');   мясо драконов и демонов
   PUTLoot2(0x1E8E, 0x1E8F, '-1', corps, pack,'','','');   жаренное мясо драконов и демонов
   PUTLoot('0x09B5', '0', corps, pack,'','','');   змеиные яйца
   PUTLoot('0x0EE3', '0', corps, pack,'','','');   паутинка
   PUTLoot2(0x1085, 0x108b, '-1', corps, pack,'','','');   бижутерия
   PUTLoot2(0x1f05, 0x1f0a, '-1', corps, pack,'','','');   бижутерия
   PUTLoot2(0xf0f, 0xf30, '-1', corps, pack,'','','');   камни
   PUTLoot2(0x1f5d, 0x1f6c, '0', corps, pack,'','','');   scroll 7-8
   PUTLoot(-1, '0x0991', corps, pack,'','','');   руины
   PUTLoot('0x9aa', '-1', corps, pack,10,170,0);   пандоры
   PUTLoot(-1, '0x0482', corps, pack,'','','');   серебрянные вещи
end sub
Sub Scissors()
   If UO.Hidden() and UO.Count ( Scissors ) > 0 Then
      UO.FindType(hides, -1, 'backpack')
      While UO.FindCount()
         colhides = uo.getColor('finditem')
         UO.WaitTargetObject('finditem')
         uo.usetype( Scissors )
         wait(300)
         UO.FindType(leather, colhides, 'backpack')
         if UO.FindCount() then
            UO.MoveItem('finditem', 0, 'backpack', 30, 150, 0)
            wait(300)
         endif
         UO.FindType(hides, -1, 'backpack')
      wend
   EndIf
end sub
Sub PUTLoot2(Type1, Type2, Color, SourceContainer, TargetContainer,X,Y,Z)
   ;uo.ignorereset()
   for TType = Type1 to Type2
      PUTLoot(TType, Color, SourceContainer, TargetContainer,X,Y,Z)
   next
end sub
Sub PUTLoot(Type, Color, SourceContainer, TargetContainer,X,Y,Z)
   ;uo.ignorereset()
   UO.FindType(Type, Color, SourceContainer)
   while UO.FindCount()
      if (TargetContainer=='ground') then
         uo.MoveItem('finditem',0,TargetContainer,uo.GetX('self'),uo.GetY('self'),uo.GetZ('self'))
      else
         timemove=UO.Timer()
         while UO.ContainerOf( UO.GetSerial('finditem') )==SourceContainer && timemove+20>UO.Timer()
            uo.MoveItem('finditem',0,TargetContainer,X,Y,Z)
            wait(lootwait)
         wend
      end if
      UO.FindType(Type, Color, SourceContainer)
   wend
end sub
Sub DeleteJournal(msg)
   While UO.InJournal(msg)
      UO.SetJournalLine(UO.InJournal(msg) - 1,'')
   wend
end sub
Sub checklag()
   DeleteJournal("ackpack")
   UO.Click("backpack")
   repeat
      wait(100)
   until UO.InJournal("ackpack")
end sub

Attachment:
File comment: для удобства нужно переименовать в
autoload.sc и поместить в папку с инжектом.

Loot.txt [6.68 KiB]
Downloaded 325 times


Сори за немного кривоватое форматирование - добавил с красивыми отступами в файл вложение.
Жду критики тестеров, вопросы и советы по оптимизации.
:roll:

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2012-01-16 15:05:27 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 698
Location: Москва
Хоть кто-то ещё делает что-то на инжекте.
Есть мнение, что лучше при резке трупа запоминать оружие по id :roll:

PS а никаких проверок, порезался ли труп нету
:twisted:


Top
   
PostPosted: 2012-01-16 18:06:48 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
Хм... Интуитивно понимаю что ты вроде как бы прав. И я как бы даже так изначально и делал. Но вот сейчас полчаса проверял с 3 луками в паке. Берет всегда именно тот который был в руках на момент запуска скрипта. Видимо какой-то не заметный глюк :)

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2012-01-16 19:30:03 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 698
Location: Москва
Я просто не знаю, как инжект хранит данные. Тот лук, что был в руках, его id меньше, чем у остальных?


Top
   
PostPosted: 2012-01-16 21:18:18 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
взял 3 разных лука. Но одного типа.
1) простой деревянный
2) с клада магический
3) профессиональный - ренджерский
беру 1, стреляю, режу. Взялся в руки первый.
беру 2 стреляю, режу, берет второй.
беру 3...
Хотя должен вроде как рендомно брать - TYPE одинаковые. Разные цвета только.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2012-01-16 22:51:50 
Offline

Joined: 2007-07-07 13:14:01
Posts: 90
а ты думаешь как массив предметов формируется? :!:
сидите тут уже 15 лет, а то что ваши игноры в циклах нахер не нужны не догадываетесь... :lol:


Top
   
PostPosted: 2012-01-17 06:28:00 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
Ну во первых не 15 :)
Во вторых если бы все было так как с луками то кожа порезанная всегда ложилась бы в угол, но иногда она соскакивает. Хотя может быть связанно с лагом.
В третьих игноры в циклах были нужны для 1 конкретного предмета, точнее набора предметов. Волос. Которые как бы есть в трупе (В теле 1 предмет), но передвинуть его нельзя. И инжект умирал.
Первично я лутил конкретный список требующихся предметов (чар был прокачан и не нуждался). После нескольких вайпов решил что собирать нужно все, оставляя необходимые вещи, остальные продавать. Но чтобы собрать все надо выкинуть то что НЕЛЬЗЯ изза криворукости админа слутать. Так и пришлось задействовать игноры :mrgreen:
Если бы инжект умел работать по нормальному с игнорами не пришлось бы так извращаться :) Но вот такая программа.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2012-03-02 01:30:25 
Offline

Joined: 2011-09-19 20:08:25
Posts: 10
Вопрос может ужасно глупый .. но Как сделать разовое действие на открытие всех трупов в зоне досягаемости ?


Top
   
PostPosted: 2012-03-02 07:15:22 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
Code:
Sub Loot()
      uo.set('finddistance', '3')
      corpse = '0x00000000'
      corpse = findcorps()
      if corpse<>'0xffffffff' and corpse<>'0x00000000' then
         IF uo.findcount() and Uo.GetDistance( 'finditem' ) <= 4 then
            uo.useobject(corpse)
            wait(300)
            UO.Ignore(corpse)
         endif
      endif
end sub

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2012-04-21 08:02:05 
Offline

Joined: 2005-02-08 18:39:50
Posts: 444
Location: Moscow
hello :)

Code:
sub ltscssrs()
    VAR hides= '0x1078'
   Var Scissors='0x0F9E'
   VAR leather='0x1067'
   If  UO.Count ( Scissors ) > 0 Then
      UO.FindType(hides, -1, '0x402C1257')
      While UO.FindCount()
         UO.WaitTargetObject('finditem')
         uo.usetype( Scissors )
         wait(300)
         UO.FindType(leather, '-1', 'backpack')
         if UO.FindCount() then
            UO.MoveItem('finditem', 0, '0x402C1257')
            wait(500)
         endif
      wend
   EndIf
end sub


Mirage, я тут твой срипт разбираю на части и вопрос по блоку резки кожи:

суть работы такова:
нашли кожу в трупе
перенесли ее в мешок
в мешке порезали и она упала в пак
из пака перенесли обратно в мешок

работает, но пытается 2 раза разрезать

Quote:
What do you want to use this on?
You put the Cut up Troll Leather in your pack.
What do you want to use this on?
Use scissors on hair or cloth to cut


не критично, конечно, т.к. работает, но напрягает играть, зная что есть косяк

п.с.
кожи для резки в паке нет, т.е. я так понимаю, что он пытается резать уже порезанную о.О


Top
   
PostPosted: 2012-04-21 09:42:45 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
у тебя очередность нарушилась. Смотри что делает твой скрипт:

Code:
      UO.FindType(hides, -1, '0x402C1257') 
      While UO.FindCount()
         UO.WaitTargetObject('finditem')
         uo.usetype( Scissors )
         wait(300)
         UO.FindType(leather, '-1', 'backpack')
         if UO.FindCount() then
            UO.MoveItem('finditem', 0, '0x402C1257')
            wait(500)
         endif
      wend

нашли кожу
пока кожа в контейнере *!!!!
ножницами по коже
ищем порезанную кожу (инжект запоминает объект!)
если найдено
передвигаем
конец если
конец цикла

Там где звездочка - цикл обрабатывает объект. Первый круг - не порезанная кожа, второй уже порезанная. Надо после endif добавить поиск не порезанной кожи. Посмотри как у меня сделано - ты потерял одну строку.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2012-04-21 12:47:36 
Offline

Joined: 2005-02-08 18:39:50
Posts: 444
Location: Moscow
да, спасибо. Не хватало строчки:
Code:
UO.FindType(hides, -1, 'backpack')


Top
   
PostPosted: 2012-07-01 07:13:31 
Offline

Joined: 2005-02-08 18:39:50
Posts: 444
Location: Moscow
а можно как-то задать правило лута вещей, т.е.
есть тип "0x13C7", а если мы укажем "0x13**", то будет лутать все, что начинается с этих знаков.

п.с. пытался "*" и "?" вместо значений поставить- не вышло.

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

другая мысль была по названию лутить(по части названия), и где что-то подобное на форуме видел, правда, пока не нашел.


Top
   
PostPosted: 2012-07-01 12:31:16 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
PUTLoot2(0x1f5d, 0x1f6c, '0', corps, pack,'','',''); scroll 7-8
свитки идущие подряд лутаются поочередно. задаются 2 крайние точки.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2013-01-07 18:41:06 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
В скрипте есть небольшой но малоприятный глюк который я не особо замечал потому что использовал скрипт без особого геноцида.
Если завалить сразу много монстров или игроков и они упадут в 1 тайл то ЕСТЬ МАЛЕНЬКИЙ ШАНС что скрипт порежет один труп, а лутить начнет другой. Придется ресендить и запускать скрипт несколько раз (если требуется собрать лут процесса порезки - кожу, мясо, кровь...).
Постараюсь исправить...

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2014-12-01 22:50:19 
Offline

Joined: 2014-12-01 22:44:46
Posts: 5
Увожаемые скриптёры пожалуйста помогите мне !!!! :(

Мне очень нужен скрипт простой на резку кожи !!!!

Режет труп
лутит кожу
режет кожу ножницами

За ранее благодарен !!!!


Top
   
PostPosted: 2014-12-01 23:06:49 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
надо кусок в Sub Loot() поправить вот так:
Code:
            if NOT uo.injournal("You can't do it here") then
               ;GrabLoot(corpse) ; <-----------  тут кавычки в начале
               IgnorHair(corpse)
               ;Ignor(corpse)
               PUTLoot('0x1078', '-1', corpse, 'backpack','','','') ; <-------------- тут тип кожи прописал
            endif

Будет резать и лутать только кожу.

Можно переделать под новый инжект, там пара штук оптимизировано. Надо собраться с духом и перебороть одну черту характера :roll:

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
PostPosted: 2014-12-01 23:45:41 
Offline

Joined: 2014-12-01 22:44:46
Posts: 5
Mirage wrote:
надо кусок в Sub Loot() поправить вот так:
Code:
            if NOT uo.injournal("You can't do it here") then
               ;GrabLoot(corpse) ; <-----------  тут кавычки в начале
               IgnorHair(corpse)
               ;Ignor(corpse)
               PUTLoot('0x1078', '-1', corpse, 'backpack','','','') ; <-------------- тут тип кожи прописал
            endif

Будет резать и лутать только кожу.

Можно переделать под новый инжект, там пара штук оптимизировано. Надо собраться с духом и перебороть одну черту характера :roll:


Инжа 1403.09 V
Пожалуйста пропиши целый готовый скрипт я в них практически не разбираюсь =\ просто резал с Лизардмэна кидал в пак и ножницами в Leather перерезал =\


Top
   
PostPosted: 2015-10-03 20:39:29 
Offline

Joined: 2005-02-08 18:39:50
Posts: 444
Location: Moscow
блин, банальный вопрос:

Code:
Sub ltscssrs() 
   VAR hides= '0x1078'
   Var Scissors='0x0F9E'
   VAR leather='0x1067'
   If  UO.Count ( Scissors ) > 0 Then
      UO.FindType(hides, -1, sumkaloot)
      While UO.FindCount()
         UO.WaitTargetObject('finditem')
         uo.usetype( Scissors )
         wait(700)
         UO.FindType(leather, '-1', 'backpack')
         if UO.FindCount() then
            UO.MoveItem('finditem', 0, sumkaloot)
            wait(500)
         endif
         UO.FindType(hides, -1, 'backpack')
      wend
   EndIf
end sub


можно зациклить одной строчкой, типо репит и тд, чтобы резало пока в сумке есть кожа?


Top
   
PostPosted: 2015-10-03 21:23:51 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2745
Location: Иваново
Gromiz wrote:
UO.FindType(hides, -1, sumkaloot)
While UO.FindCount()

резало пока в сумке есть кожа

:roll:

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 23 posts ]  Go to page 1 2 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited