Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Не заводится.

тут можно задать вопрос по скриптингу
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Благодарствую! Завелся мининг. Надо было автохил какой-нить написать сначала
Вот скрипт... роет в минок шахте.

Code: Select all

Program Mining;

Const
  id_OreContainer = $4003951F;
  id_JewelContainer = $40069428;
  id_Forge = $40006283;
  UseStealth = false;
  UseSmelt = true;
  t_Pickaxe = $0E85;
var k : Integer; TilesX, TilesY : Array of Word;
 
Procedure Reload;
var t_Ore : Array of Word;
  i, moveDelay : Integer;
  id_RecContainer : Cardinal;
  Quit : Boolean;
  
Begin
  moveDelay := 1100; t_Ore := [$1BEF, $19B9, $19B8, $19BA, $19B7, $0F0F, $0F10, $0F11, $0F13, $0F15, $0F16, $0F18, $0F25, $0F26];
  For i := 0 to 13 do
  Begin
    Quit := false;
    Repeat
      If FindType(t_Ore[i], BackPack) > 0 then
      Begin
        If i < 5 then id_RecContainer := id_OreContainer else id_RecContainer := id_JewelContainer;
        Repeat
          Wait(100);
        Until CheckLag(10000);
        MoveItem(FindItem, -1, id_RecContainer, 0, 0, 0);
        Wait(moveDelay);
      End
      else Quit := true;
    Until Quit;
  End;
  If Count(t_Pickaxe) < 4 then
  Begin
    For i := 1 to 4 - Count(t_Pickaxe) do
    Begin
      If FindType(t_Pickaxe, id_JewelContainer) > 0 then
      Begin
        Repeat
          Wait(100);
        Until CheckLag(10000);
        MoveItem(FindItem, -1, BackPack, 0, 0, 0);
        Wait(moveDelay);
      End
      else
      Begin
        AddToSystemJournal('Закончились кирки');
        Break;
      End;
    End;
  End;          
End;

Procedure GoToDest(dest : String);
var BtoCX, BtoCY : Array of Integer;
    i, a, b : Integer;
Begin
  BtoCX := [2512, 2515, 2521, 2528, 2528, 2553, 2556, 2558, 2558, 2567];
  BtoCY := [553, 544, 538, 538, 501, 501, 504, 503, 496, 483];
  If dest = 'bank' then
  Begin
    a := -9; b := -1;
  End
  else
  Begin
    a := 1; b := 9;
  End;
  For i := a to b do
  Begin
    newMoveXY(BtoCX[ABS(i)], BtoCY[ABS(i)], false, 1, true);
  End;
End;

Procedure Smelt;
var t_Ore : Array of Word;
    i : Integer;
    rQuit : Boolean;
Begin
  t_Ore := [$19B9, $19B8, $19BA, $19B7]
  For i := 0 to 3 do
  Begin
    rQuit := false
    Repeat
      If FindType(t_Ore[i], BackPack) > 0 then
      Begin
        UseObject(FindItem);
        Wait(100);
      End
      else
      Begin
        rQuit := true;
      End;
    Until rQuit;
  End;
End;

Procedure DelJournal(msg : String);
Begin
  While InJournal(msg) > 0 do SetJournalLine(InJournal(msg), ' ')
End;

Procedure MiningAround;
var i, j, mx, my, d : Integer; 
    Delay : Cardinal;
    msg : Array of String;
Begin
  msg := ['loosen some', 'put the', 'here is no', 'far away', 'mining', 'so close', 'line of sight', 't use']; 
  For i := -2 to 2 do
  Begin
    For j := -2 to 2 do
    Begin
      AddToSystemJournal('Копаю на ' + IntToStr(i) + ' ' + IntToStr(j));
      mx := GetX(self); my := GetY(self);
      Repeat
        If Weight >= 700 then
        Begin
          If UseSmelt then
          Begin
            NewMoveXY(GetX(id_Forge), GetY(id_Forge), false, 1, true);
            Smelt;
          End;
          AddToSystemJournal('Иду к банку');
          GoToDest('bank');
          AddToSystemJournal('Разгружаюсь');
          Reload;
          AddToSystemJournal('Иду в шахту');
          GoToDest('cave');
        End;
        If TargetPresent then
          CancelTarget;
        If WarMode = true then
          SetWarMode(false);
        Repeat
          Wait(100);
        Until CheckLag(10000);
        AddToSystemJournal('Дебаг 1');        
        Delay := Timer;
        AddToSystemJournal('Дебаг 2');
        For d := 0 to 7 do DelJournal(msg[d]);
        AddToSystemJournal('Журнал очищен');
        WaitTargetTile(1342, GetX(self) + i, GetY(self) + j, GetZ(self));
        UseType(t_Pickaxe, 0);
        Repeat
          Wait(100)
        Until (InJournal(msg[0]) > 0) or (InJournal(msg[1]) > 0) or (InJournal(msg[2]) > 0) or (InJournal(msg[3]) > 0) or (InJournal(msg[4]) > 0) or (InJournal(msg[5]) > 0) or (InJournal(msg[6]) > 0) or (InJournal(msg[7]) > 0) or (Delay + 15000 <= Timer);
      Until (InJournal(msg[2]) > 0) or (InJournal(msg[3]) > 0) or (InJournal(msg[4]) > 0) or (InJournal(msg[5]) > 0) or (InJournal(msg[6]) > 0) or (InJournal(msg[7]) > 0);
    End;
  End;
End;

Begin
  TilesX := [2559, 2560, 2560, 2564, 2565, 2568, 2573, 2578, 2578, 2578, 2573, 2574, 2569, 2568, 2571, 2570, 2565, 2564];
  TilesY := [496, 491, 487, 484, 479, 476, 476, 476, 481, 485, 485, 481, 481, 486, 489, 489, 489, 493];
  While true do
  Begin
    For k := 0 to 17 do
    Begin
      AddToSystemJournal('Пошёл к точке ' + IntToStr(k));
      newMoveXY(TilesX[k], TilesY[k], false, 1, true);
      AddToSystemJournal('Копаю')
      MiningAround;
    End;
  End;
End.
Не нравится, что DelJournal стирает из журнала, и в стелсе, на вкладке журнал, он постоянно дергается.
Что-то не могу догнать как работает InJournalBetweenTimes
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Не заводится.

Post by Vizit0r »

очень плохая привычка инжектеров работать напрямую с журналом через удаление. ну очень плохая.
разбирайся с имеющимися. вот пример

Code: Select all

program ArmsLore;
var     stime : TDateTime;
        
Begin  // Main program start!!!
while true do
  begin  
     stime := Now;
     WaitTargetObject($5EA22CAE);
     UseSkill('Arms Lore');
     repeat 
       CheckSave; 
       InJournalBetweenTimes('...|Вещь|already', stime, Now); 
       wait(100); 
     until (LineCount > 0) or (Now > stime + (1.5/1440));
     wait(10000);
  end;
End.
1.5/1440 - полторы минуты. если захочешь получить секунды - то знаменатель *60.
скрипт деревянный, но для демонстрации пойдет.

P.S. Молодец, пытаешься разобраться сам, причем успешно.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Мне как-то питон больше по душе... например на инжекте такой мининг занимает 660 строк кода. в основном из-за ходилки, но это тоже считается. На паскале получилось 160 строк, можно и меньше. на питоне 70...
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Не заводится.

Post by Vizit0r »

так дело хозяйское, в паскаль никто не гонит. разве что пишут на питоне мало (пока?).
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Оно же на питоне. Запостил не выпендреться, а если кому-то будет интересно.

Code: Select all

from datetime import datetime as dt

id_OreContainer = 0x4003951F; id_ToolsContainer = 0x40069428; id_Forge = 0x40006283; t_Pickaxe = 0x0E85; moveDelay = 1100; MaxWeight = 700; UseSmelt = 1

def Reload():
  UOSay('Bank!')
  for i in [0x1BEF, 0x19B9, 0x19B8, 0x19BA, 0x19B7, 0x0F0F, 0x0F10, 0x0F11, 0x0F13, 0x0F15, 0x0F16, 0x0F18, 0x0F25, 0x0F26]:
    MoveItems(Backpack(), i, -1, id_OreContainer, 0, 0, 0, moveDelay)
  while Count(t_Pickaxe) < 4:
    if MoveItem(FindType(t_Pickaxe, id_ToolsContainer), -1, Backpack(), 0, 0, 0):
      Wait(moveDelay)
    else:
      break

def Smelt():
  newMoveXY(GetX(id_Forge), GetY(id_Forge), 0, 1, 1)
  for i in [0x19B9, 0x19B8, 0x19BA, 0x19B7]:
    while Count(i) > 0:
      UseObject(FindType(i, Backpack()))
      Wait(100)

def MiningAround():
  msg_t, msg_e = 'put the|loosen some rocks', 'There is no|far away|mining|so close|line of sight|t use'
  mx, my = GetX(Self()), GetY(Self())
  for x in range(-2, 3,):
    for y in range(-2, 3,):
      Now = dt.now()
      while InJournalBetweenTimes(msg_e, Now, dt.now()) < 0:
        if Weight() >= MaxWeight:
          if UseSmelt > 0:
            Smelt()
          newMoveXY(2512, 553, 0, 1, 1)
          Reload()
          newMoveXY(mx, my, 0, 1, 1)
        if TargetPresent():
          CancelTarget()
        if WarMode:
          SetWarMode(0)
        WaitTargetTile(1342, GetX(Self()) + x, GetY(Self()) + y, GetZ(Self()))
        UseType(t_Pickaxe, -1)
        WaitJournalLine(dt.now(), msg_t + '|' + msg_e, 15000)

while not Dead():
  for x, y in [(2559, 496),(2560, 491), (2560, 487), (2564, 484), (2565, 479), (2568, 476), (2573, 476), (2578, 476), (2578, 481), (2578, 485), (2573, 485), (2574, 481), (2569, 481), (2568, 486), (2571, 489), (2570, 489), (2565, 489), (2564, 493)]:
    newMoveXY(x, y, 0, 1, 1)
    MiningAround()
Last edited by nah nah on 21.12.2011 23:19, edited 9 times in total.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Не заводится.

Post by Vizit0r »

твой питон:
nah nah wrote:

Code: Select all

id_OreContainer = 0x4003951F; id_JewelContainer = 0x40069428; id_Forge = 0x40006283; t_Pickaxe = 0x0E85; moveDelay = 1100; MaxWeight = 700; UseSmelt = 1
твой паскаль:
nah nah wrote:

Code: Select all

  id_OreContainer = $4003951F;
  id_JewelContainer = $40069428;
  id_Forge = $40006283;
  UseStealth = false;
  UseSmelt = true;
  t_Pickaxe = $0E85;
а потом говорят, мол в паскале скрипты длиннее :lol:
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

А я писал что можно сделать покороче.... 8)
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: Не заводится.

Post by CFA »

nah nah wrote:А я писал что можно сделать покороче.... 8)
можно еще кое что сократить:

Code: Select all

def Smelt():
  for ore in [0x19B9, 0x19B8, 0x19BA, 0x19B7]:
    while Count(ore) > 0:
      UseObject(FindType(ore, Backpack()))
      Wait(100)
потом вот это -

Code: Select all

def GoToDest(dest):
  TilesX, TilesY = [2512, 2515, 2521, 2528, 2528, 2553, 2556, 2558, 2558, 2567], [553, 544, 538, 538, 501, 501, 504, 503, 496, 483]
нет нужды разбивать маршрут на промежуточные точки - стелс ищет путь вплоть до 300 тайлов, обходит препятствия (даже неожиданно возникшие на пути) и все такое.
Но если где то надо задать именно кучу точек, то лучше сделать так :

Code: Select all

TilesXY = [(2512, 553), ...] # или еще лучше  ((2512, 553), ...)
for x,y in TilesXY:
  ...
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Спасибо! Попровил в посте со скриптом. Тот мануал по питону, который я читал, много не описывает...
ЗЫ Где бы ещё строчку срезать, чтобы 50 было? :roll:
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Ещё немного сократил кол-во строк. Только теперь не все инги выгружает и кирки не добирает :?
Но кирки я знаю почему, а вот почему в паке осталось 2 стил ингота после разгрузки для меня загадка...
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Вот сейчас так скрипт выглядит (чё я сюда пишу каждые 5 мин посреди ночи?)

Code: Select all

from datetime import datetime as dt

id_OreContainer = 0x4003951F; id_ToolsContainer = 0x40069428; id_Forge = 0x40006283; t_Pickaxe = 0x0E85; moveDelay = 1100; MaxWeight = 700; UseSmelt = 1

def Reload():
  UseObject(id_ToolsContainer)
  UOSay('Bank!')
  for i in [0x1BEF, 0x19B9, 0x19B8, 0x19BA, 0x19B7, 0x0F0F, 0x0F10, 0x0F11, 0x0F13, 0x0F15, 0x0F16, 0x0F18, 0x0F25, 0x0F26]:
    MoveItems(Backpack(), i, -1, id_OreContainer, 0, 0, 0, moveDelay)
  while Count(t_Pickaxe) < 4:
    if MoveItem(FindType(t_Pickaxe, id_ToolsContainer), -1, Backpack(), 0, 0, 0):
      Wait(moveDelay)
    else:
      break

def Smelt():
  newMoveXY(GetX(id_Forge), GetY(id_Forge), 0, 1, 1)
  for i in [0x19B9, 0x19B8, 0x19BA, 0x19B7]:
    while Count(i) > 0:
      UseObject(FindType(i, Backpack()))
      Wait(100)

def MiningAround():
  msg_t, msg_e = 'put the|loosen some rocks', 'There is no|far away|mining|so close|line of sight|t use'
  mx, my = GetX(Self()), GetY(Self())
  for x in range(-2, 3,):
    for y in range(-2, 3,):
      Now = dt.now()
      while InJournalBetweenTimes(msg_e, Now, dt.now()) < 0:
        if Weight() >= MaxWeight:
          if UseSmelt > 0:
            Smelt()
          newMoveXY(2512, 553, 0, 1, 1)
          Reload()
          newMoveXY(mx, my, 0, 1, 1)
        if TargetPresent():
          CancelTarget()
        if WarMode:
          SetWarMode(0)
        WaitTargetTile(1342, GetX(Self()) + x, GetY(Self()) + y, GetZ(Self()))
        UseType(t_Pickaxe, -1)
        WaitJournalLine(dt.now(), msg_t + '|' + msg_e, 15000)

while not Dead():
  for x, y in [(2559, 496),(2560, 491), (2560, 487), (2564, 484), (2565, 479), (2568, 476), (2573, 476), (2578, 476), (2578, 481), (2578, 485), (2573, 485), (2574, 481), (2569, 481), (2568, 486), (2571, 489), (2570, 489), (2565, 489), (2564, 493)]:
    newMoveXY(x, y, 0, 1, 1)
    MiningAround()
Кирки он не добирает, выкладывает все. Что с кирками я хз. Мешок с ними не открывается... А сейчас падлюка не пошёл к форже, но стоит и пытается плавить. Выключил скрипт, дошёл до форжи руками, включил. Чар побежал на точку 1, затем побежал к форже и нормально сплавил. Глюк?
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: Не заводится.

Post by CFA »

Code: Select all

  UseObject(id_ToolsContainer)
  UOSay('Bank!')
Тут неплохо бы вставить задержки/чеклаги (и вообще поменять местами - сначала открыть банк, потом конт в нем), тк контейнеры открываются не мгновенно, и если положить в закрытый контейнер чар обычно может без проблем, то найти/взять из него не получится, тк итемов в нем не видно.
К плавилке мог не подойти, потому что кто-то/что-то блокировало точки рядом с ней.
Вобщем скрипт очень оптимистичный, рассчитанный на тепличные условия. В действительности надо больше проверок, на неожиданные ситуации.
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Да как-то провтыкал, куда поставил открывашку мешка... :oops:
Скрипт под шард сделан =) Меня там ни кто не трогает
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Иногда не ходит к плавилке, но считает, что подошёл... Это баг какой-то?

Code: Select all

def Smelt():
  newMoveXY(GetX(id_Forge), GetY(id_Forge), 0, 1, 1)
  for i in [0x19B9, 0x19B8, 0x19BA, 0x19B7]:
    while Count(i) > 0:
      UseObject(FindType(i, Backpack()))
      Wait(100)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Не заводится.

Post by Vizit0r »

а с чего ты взял, что
считает, что подошёл
?
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply