OrionClient LumberjackingScript UORemedy: различия между версиями

 
Строка 3: Строка 3:
 
Необходим навык тинкеринга для успешного крафта топоров.<br>
 
Необходим навык тинкеринга для успешного крафта топоров.<br>
 
Из настроек - координаты у сундука, куда складывать стафф, Serial сундука, координаты полянок, где рубить<br>
 
Из настроек - координаты у сундука, куда складывать стафф, Serial сундука, координаты полянок, где рубить<br>
 +
В сундук закинуть железных слитков, из которых будут крафтится топоры <br>
 
Так же, нужно создать List с названием Elementals, и добавить туда типы всех элемов (по какой-то причине мне было лень это делать в скрипте). <br>
 
Так же, нужно создать List с названием Elementals, и добавить туда типы всех элемов (по какой-то причине мне было лень это делать в скрипте). <br>
 
<pre>
 
<pre>

Текущая версия на 13:09, 27 марта 2020

Походу таки стабильный, но 24\7 работу не гарантирую

Для старта - 5+ топоров в сумку и тинкер тулзы.
Необходим навык тинкеринга для успешного крафта топоров.
Из настроек - координаты у сундука, куда складывать стафф, Serial сундука, координаты полянок, где рубить
В сундук закинуть железных слитков, из которых будут крафтится топоры
Так же, нужно создать List с названием Elementals, и добавить туда типы всех элемов (по какой-то причине мне было лень это делать в скрипте).

var config = {
   "maxWeight"        : (Player.MaxWeight()-100),//Max Weight to cut wood   
   "axe"             : "0x0F43",    //Axe type
   "logs"            : 0x1BDD,      //Log type     
   "boards"          : "0x1BD7",
   "treesSearchOffset" : 20,         //Radius of tree search   
   "tinkerTools"      : "0x1EB8",
   "tinkerTools_keep" : 2,
   "tinkerTools_button": 128,  
   "axe_keep"     : 10,
   "axe_button"   : 135,
   "ingots"           : 0x1BF2,
   "ingots_keep"      : 100,
   "maxTry"           : 15,
   "home_chest"       : 0x4008C5A4 // <- Тут ID сундука на крыльце
};

var moreStuff = [
  0x1BDD,
  0x2F5F,
  0x3199,
  0x3191,
  0x318F,
  0x3190,
  0x0EED
];

var points = {  
  0 : {"x" : 1234, "y" : 123, "z" : 0},
  1 : {"x" : 1235, "y" : 123, "z" : 0}, // <- И так далее, 25-30 спотов должно хватить на нон-стоп рубку. Координаты - _infotile на землю
  

}; 

var bankCoords = {
  "x" : 3030, "y" : 213 // <- Координаты, с которых открывается сундук - т.е. возле сундука
};


function Autostart()
{   
  
  Orion.Exec("AutoHealSelf",true)
  Orion.Exec("ability",true)
   while(!Player.Dead())
   {
      for(point in points)
      {
         Orion.Print("Point #"+point)
         move_unstuck(points[point]['x'],points[point]['y'],points[point]['z']);
         /*while(!Orion.WalkTo(points[point]['x'],points[point]['y'],points[point]['z'],0))
         {
            Orion.WalkTo(points[point]['x'],points[point]['y'],points[point]['z'],0);
            Orion.Wait(500);
         }*/
         var splited = getTreeTiles(config['treesSearchOffset']);            
         if(splited)
         {
            var cnt=0;
             for(var i = 0; i<=splited.length-3; i+=3)
             {       
                cnt++;
                 var x = splited[i];
                 var y = splited[i+1];
                 var z = splited[i+2];
                  
               Orion.Print('0x0035','Point #'+point+' Tree #'+cnt+'/'+splited.length/3);      
               Orion.Print('0x0099','X = '+x+' Y = '+y+' Z = '+z);
               move_unstuck(x, y, z);
               /*var _tmp_x = 0;
               var _tmp_y = 0;
               while(!Orion.WalkTo(x,y,z,1))
               {             
                _tmp_x = Player.X();
                _tmp_y = Player.Y();   
                Orion.WalkTo(x,y,z,1);
                if(_tmp_x == Player.X() && _tmp_y == Player.Y())
                {
                  Orion.Print("Stuck?")
                  Orion.Step(1);
                  Orion.Step(1);
                  Orion.Step(1);
                }

                Orion.Wait(500);
               }*/
               chop(x,y,z,point);         
            }
         }
      }
      Orion.Wait(1000);
   }
}


function chop(x,y,z,point)
{
   var _try_count = 0;        
   //Orion.Print("[i] Chopping at  X+"+x+" Y+"+y);
   while(!Player.Dead())
   {       
       if(Player.Weight() >= config['maxWeight'] )                
          //unloadToBank(x,y+1,z,point)
          unloadToBank(Player.X(),Player.Y(),Player.Z())
              
       if(Orion.ValidateTargetTile('tree', x, y))
       {            
          if(Orion.HaveTarget())
             Orion.CancelTarget();
          if(Orion.ObjAtLayer(2) == null)
          {
            Orion.Say("[armtool 1");
            Orion.Wait(500);
          }
          cut();   

          var _enemy = Orion.FindList('Elementals',ground,'near|mobile', 18, )
          if(_enemy != null && _enemy.length > 0)
          {
            Orion.Print("Found enemy");
            Orion.Print(_enemy[0]);
              Orion.Attack(_enemy[0]);
              follow(_enemy[0], Player.X(), Player.Y());
              Orion.Wait(500);            
          }
          Orion.UseObject(Orion.ObjAtLayer(2).Serial());
          Orion.WaitTargetTile('tree', x, y, z);                          
          var result = Orion.WaitJournal("You hack at|You put|not enough|be seen|is too far|no line of|seen|You chop|You have worn|You cannot", Orion.Now(), (Orion.Now() + 7000), 'me|sys');
          Orion.Wait(500)          
          _try_count++;
          Orion.Print("Try #"+_try_count);
          if(_try_count > config["maxTry"])
          {
            Orion.Print("Try count exceeded, skipping tree.");
            break;
          }
          if(result && result.FindTextID()==2)
          {
             Orion.Print("[i] Tile depleted");
             Orion.Wait(300);
             break;
          }          

       }
       else
        break;
     Orion.Wait(1000);
   }//Main Loop
}

function cut()
{
  var _logs = Orion.FindType(config["logs"], -1, 'backpack');
  if(_logs.length)
  {
    _logs.forEach(function(_log){
     
      if(Orion.HaveTarget())
       Orion.CancelTarget();

      Orion.Print(_log);
      Orion.WaitTargetObject(_log);
      Orion.UseObject(Orion.ObjAtLayer(2).Serial());      
      //Orion.WaitTargetType(config["logs"], -1);      
      Orion.Wait(1000);
    });
  }
}

function getTreeTiles(offset)
{
    var validTiles=[];
    var cntValid = 0;
    for (var x = -offset; x <= offset; x++)
    {
        for (var y = -offset; y <= offset; y++)
        {
            if(Orion.ValidateTargetTileRelative('tree',x,y))
            {
                //Orion.Print("Valid tile! X="+x+" Y="+y);
                validTiles.push(Player.X()+x,Player.Y()+y,0);
                cntValid++;
            }
        }
    }

      

    Orion.Print("[getTreeTiles]Trees found = "+cntValid);
    if(cntValid>0)
        return validTiles;
    else
        return false;   
   
}

function unloadToBank(x, y, z)
{
  //while (Player.X() != bankCoords["x"] && Player.Y() != bankCoords["y"])
  move_unstuck(bankCoords["x"],bankCoords["y"]);
  /*while(!Orion.WalkTo(bankCoords["x"],bankCoords["y"],0,0))
  {   
    Orion.WalkTo(bankCoords["x"],bankCoords["y"],0,0)
    Orion.Wait(500);
  }*/
  Orion.UseObject(config['home_chest']);
  Orion.Wait(1000);
  var _boards = Orion.FindType(config['boards'], -1, 'backpack')
  if (_boards && _boards.length > 0)
  {      
      _boards.forEach(function(_item){
      Orion.Print("Moving...");
      Orion.MoveItem(_item, 0, config['home_chest']);
      Orion.Wait(1000);
    });
  }

  moreStuff.forEach(function(_item){
    var _item_found = Orion.FindType(_item, -1, 'backpack');
    if(_item_found)
    {     
      Orion.MoveItem(_item_found, 0, config['home_chest']);
      Orion.Wait(1000);   
    }
  });

  var _ingots = Orion.FindType(config['ingots'], 0x0000, 'backpack');
  if(!_ingots.length || Orion.FindObject(_ingots).Count() < config["ingots_keep"])
  {
    var _ingots_bank = Orion.FindType(config['ingots'], 0x0000, config['home_chest'])
    {
      if(_ingots_bank.length)
      {
        var _ingots_bank_object = Orion.FindObject(_ingots_bank);
        if(_ingots_bank_object && _ingots_bank_object.Count() > config["ingots_keep"])
        {
          Orion.MoveItem(_ingots_bank, config["ingots_keep"], 'backpack');
          Orion.Wait(1500);  
        }
        else
        {
          Orion.Print("No more ingots in bank!");
          Orion.PauseScript();
        }
        
      }
    }
  }
  check_and_craft(config["tinkerTools"], config["tinkerTools_keep"], config["tinkerTools_button"]);
  Orion.Wait(1000);
  check_and_craft(config["axe"], config["axe_keep"], config["axe_button"]);
  Orion.Wait(1000);

  

  /*while (Player.X() != x && Player.Y() != y)
  {  
    Orion.Print("Moving to fucking X "+x+ " Y "+y);
    Orion.WalkTo(x, y, z, 0)
    Orion.Wait(500);
  }*/
  move_unstuck(x, y, z);
   /*var _tmp_x = 0;
   var _tmp_y = 0;
   while(!Orion.WalkTo(x,y,z,1))
   {             
      _tmp_x = Player.X();
      _tmp_y = Player.Y();   
      Orion.WalkTo(x,y,z,1);
      if(_tmp_x == Player.X() && _tmp_y == Player.Y())
      {
        Orion.Print("Stuck?")
        Orion.Step(1);
        Orion.Step(1);
        Orion.Step(1);
      }

      Orion.Wait(500);
   }*/

}


function check_and_craft(_item, _qty, _button)
{
  while (Orion.FindType(_item).length < _qty)
  {
    Orion.Print("In While")
    craft(config["tinkerTools"],_button);
  }
  Orion.Print("Tools ok")
}

//_tools -> Crafting tools type 
//_button -> Gump response id
function craft(_tools, _button)
{
  Orion.UseType(_tools);
  Orion.WaitGump(Orion.CreateGumpHook(_button));
  if(Orion.WaitForGump(2000))
  {   
    Orion.WaitGump(Orion.CreateGumpHook(0));
    Orion.Print("Crafted -> Closed?");
    Orion.Wait(10000); // @TODO: Fix harcoded delay
  }
  else
  {
    Orion.Print("Error crafting item, WaitForGump timeout exceeded");
    Orion.PauseScript();
  }
}

function test()
{
  //2568, "y" : 277, "z" : 35}
  unloadToBank(2568, 277, 35, 17);
  //Orion.MoveItem(0x4005F8B1, 0, config['home_chest']);
}

function AutoHealSelf()
{ 
  while(!Player.Dead())
  {
    while(Player.Hits()<(Player.MaxHits()-20))
    {   
      Orion.ClearJournal();
      Orion.Say("[bandself");
      Orion.Wait(500);
      Orion.WaitJournal("You finish|not damaged|heal|barely help", Orion.Now(), Orion.Now()+20000);

      if(Orion.Count('0x0E21') < 10)
      {
        Orion.Print('33', ' [' + Orion.Count('0x0E21') + '] bandage left ! ');
      }
    }   
    Orion.Wait(100);                    
  }
  Orion.Wait(100);
  Orion.IgnoreReset();  
}

function ability()
{
  while(!Player.Dead())
  {
    if(!Orion.AbilityStatus('primary'))
    {
      if(Player.Mana()>28)
        Orion.UseAbility('primary');
    }
    Orion.Wait(500);
  }
}

function follow(_target_serial, _original_x, _original_y)
{   
  while (Orion.FindObject(_target_serial) != null )
  {
    var _target = Orion.FindObject(_target_serial);
    if(_target && _target != null)
    {
      Orion.WalkTo(_target.X(), _target.Y(), _target.Z(),1);
      Orion.Wait(100);
    }
  } 
  Orion.Wait(3000);
  Orion.Print("Returning to position");
  move_unstuck(_original_x, _original_y, Player.Z());
  //Orion.WalkTo(_original_x, _original_y, Player.Z(), 0);
}

function move_unstuck(x, y, z)
{
   var _tmp_x = 0;
   var _tmp_y = 0;
   while(!Orion.WalkTo(x, y, z, 1))
   {             
      _tmp_x = Player.X();
      _tmp_y = Player.Y();   
      Orion.WalkTo(x, y, z, 1);
      if(_tmp_x == Player.X() && _tmp_y == Player.Y())
      {
        Orion.Print("Stuck?")
        Orion.WalkTo(Player.X()+4, Player.Y(), Player.Z(), 1);
        Orion.WalkTo(Player.X(), Player.Y()+4, Player.Z(), 1);
        Orion.WalkTo(Player.X()+4, Player.Y()+4, Player.Z(), 1);
      }

      Orion.Wait(500);
   }
}