Union Client Scripts

Forum for alternative clients, mods & discussions on the same.

Moderator: Phades

Re: Union Client Scripts

Postby slipper » Sat Apr 19, 2014 12:08 am

Code: Select all
//#! name = le summoner
//#! tooltip = by slipper
//#! icon = gfx/invobjs/clue-murder

inventory = checkInventory();
waitFor = 500;
var position = jMyCoords();
check();

function checkInventory() {
   if(!jHaveWindow("Inventory")) {
      jToggleInventory();
      while(!jHaveWindow("Inventory")) jSleep(100);
   }
   return jGetWindow("Inventory").getInventories()[0];
}

function check() {
   var scents = inventory.getItems("invobjs/clue-battery","invobjs/clue-theft", "invobjs/clue-nurder","invobjs/clue-vandal");
   var sc = scents[0].coord();
   scents[0].take();
   jWaitDrag();
   jAbsInteractClick (jCoord(position.x+0, position.y+50), 3);
      if (jWaitPopup(waitFor)) {
      jSelectContextMenu("Force Summon")
      jWaitProgress(5000);} else {
      jGetWindow("Inventory").getInventories()[0].drop(sc);
      jWaitDrop();
      }
   check();
}


proof tested
User avatar
slipper
 
Posts: 816
Joined: Sat Oct 02, 2010 4:28 pm

Re: Union Client Scripts

Postby Lordtimo » Sat Apr 19, 2014 12:48 am

This bot reminds me of W5 lol.
User avatar
Lordtimo
 
Posts: 437
Joined: Wed Jun 01, 2011 12:00 pm

Re: Union Client Scripts

Postby NOOBY93 » Sat Apr 19, 2014 1:17 am

slipper wrote:
Code: Select all
//#! name = le summoner
//#! tooltip = by slipper
//#! icon = gfx/invobjs/clue-murder

inventory = checkInventory();
waitFor = 500;
var position = jMyCoords();
check();

function checkInventory() {
   if(!jHaveWindow("Inventory")) {
      jToggleInventory();
      while(!jHaveWindow("Inventory")) jSleep(100);
   }
   return jGetWindow("Inventory").getInventories()[0];
}

function check() {
   var scents = inventory.getItems("invobjs/clue-battery","invobjs/clue-theft", "invobjs/clue-nurder","invobjs/clue-vandal");
   var sc = scents[0].coord();
   scents[0].take();
   jWaitDrag();
   jAbsInteractClick (jCoord(position.x+0, position.y+50), 3);
      if (jWaitPopup(waitFor)) {
      jSelectContextMenu("Force Summon")
      jWaitProgress(5000);} else {
      jGetWindow("Inventory").getInventories()[0].drop(sc);
      jWaitDrop();
      }
   check();
}


proof tested

The murder scent is called clue-nurder? With an "n"? Weird.
Jalpha wrote:I believe in my interpretation of things.
User avatar
NOOBY93
 
Posts: 6528
Joined: Tue Aug 09, 2011 1:12 pm

Re: Union Client Scripts

Postby talon00302 » Mon Apr 21, 2014 5:03 am

A few things that might be helpful to some players that I've found over the last few years.
Made by APX, Kerrigan, and some made by CDev :D

Code: Select all
//#! uniq = pumpkineater_apxproductions
//#! name = CarrotEater
//#! tooltip = Eat Carrot DL east plot
//#! icon = gfx/invobjs/pumpkinflesh

include("jBotAPI");

//var foodWait = 1000 * 60 * 1;

// function checkBuff()
// {
//    var buffs = jGetBuffs();
//    var need_update = true;
//    for (var i = 0; i < buffs.length; i++) {
//       if (buffs[i].name().indexOf("In the Fog") >= 0) {
//          if (buffs[i].time() > 25) {
//             need_update = false;
//          }
//       }
//    }
//    if (need_update)
//    {
//       var hemps = inventory.getItems("hemp-cured");
//       if (hemps.length > 0) {
//          inventory.sortItems(hemps, "amount", true);
//          var hemp = hemps[0];
//          var equip = checkEquipment();
//          if (equip.resName(1).indexOf("pipe") >= 0) {
//             hemp.take();
//             jWaitDrag(actionTimeout);
//             equip.itemact(1);
//             jWaitDrop(actionTimeout);
//             equip.iact(1);
//             if (jWaitPopup(actionTimeout)) {
//                jSelectContextMenu("Light");
//             }
//          }
//       }
//    }
// }

// function prepareToEat()
// {
//    var chair = jFindObjectByName("furniture/chair", 55);
//    jDoClick(chair, 3, 0);
//    while (!jObjectPos(chair).equals(jMyCoords())) jSleep(100);
//    jSleep(2000);
// }

// function eatFromTable()
// {
//    var table = jFindObjectByName("table", 11);   
//    jDoClick(table, 3, 0);
//    jDropLastWindow();
//    var table_wnd = jWaitNewWindow("Table", actionTimeout);
//    waitInventory(table_wnd, 0);
//    var table_inv = table_wnd.getInventories()[1];
//    table_wnd.pushButton("Feast!");
//    while (!jIsCursor("eat")) jSleep(100);
//    while (true) {
//       var food = table_inv.getItems("");
//       if (jGetHungry() > 95) return;
//       if (food.length == 0) jSleep(foodWait);
//       for (var i = 0; i < food.length; i++) {
//          if (food[i].isActual()) {
//             food[i].take();
//             jWaitProgress(actionTimeout);
//             if (jGetHungry() > 95) return;
//          }
//       }
//    }
// }

function GotoWellOffset()
{
   var well = jFindObjectByName("terobjs/well", 30);
   var pos = well.position().add(jCoord(1*11, 2*11));
   MoveToPosSafe(pos);
}

function FillBuckets()
{
   var inventory = checkInventory();
   var buckets = inventory.getItems("buckete");
   var well = jFindObjectByName("terobjs/well", 30);      
   for (var i = 0; i < buckets.length; i++)
   {
      var bucket_coord = buckets[i].coord();
      buckets[i].take();
      jWaitDrag(actionTimeout);
      well.interactClick(0);
      var bucket = jGetDraggingItem();
      while (bucket.resName().indexOf("bucket-water") <= 0) jSleep(100);
      inventory.drop(bucket_coord);
      jWaitDrop(actionTimeout);
   }
}

function ProceedStarv()
{
   while (jGetHungry() > 58)
   {
      jSetSpeed(3);
      FillBuckets();

      GotoWellOffset();
   
      jMoveStep(jCoord(0, 52));
      jWaitStartMove(actionTimeout);
      drinkWater();
      jWaitEndMove(actionTimeout);
      
      jMoveStep(jCoord(0, -52));
      jWaitStartMove(actionTimeout);
      drinkWater();
      jWaitEndMove(actionTimeout);   
   }
}

function DropFromCursor()
{
   while (jIsDragging())
   {
      jDropObject(0);
      jSleep(300);
   }
}
function TakeCarrot()
{
   while (true)
   {
      if (jIsDragging())
      {
         DropFromCursor();
         return true;
      }
      var shitId = jFindObjectByName("gfx/terobjs/items/carrot", 30);
      if (shitId == null)
      {
         return false;
      }
      MoveToPosSafe(shitId.position());
      if (shitId.isActual()) shitId.doClick(3, 0);
      jSleep(100);
   }
}
function EatCarrot()
{
   var inventory = checkInventory();
   while (true)
   {
      var food = inventory.getItems("gfx/invobjs/carrot");
      if (jGetHungry() > 95) return false;
      if (food.length == 0) return true;
      for (var i = 0; i < food.length; i++)
      {
         if (food[i].isActual())
         {
            food[i].iact();
            jWaitPopup();
            jSelectContextMenu("Eat")
            waitUnActual(food[i]);
            if (jGetHungry() > 95) return false;
         }
      }
   }
}

function Eat()
{
   while (true)
   {
      var isMore = TakeCarrot();
      if (!EatCarrot()) break;
      if (!isMore)
      {
         jPrint("No more carrot");
         jExit();
      }
   }   
}

function main()
{
   var startPos = jMyCoords();

   while (true)
   {
//      checkBuff();
//       prepareToEat();
//       eatFromTable();
//      resetCursor();

      Eat();

      MoveToPosSafe(startPos);

      GotoWellOffset();
      ProceedStarv();
      GotoWellOffset();

      MoveToPosSafe(startPos);
   }
}

main();


Code: Select all
//#! uniq = CELLARDIGGERBOT
//#! tooltip = Digs cellars
//#! name = Cellar digger
//#! icon = paginae/build/cellardoor

include("jBotAPI");

function main()
{
   checkInventory();
   while(1)
   {
      if(jGetHungry() < 55) return;

      var cd = jFindObjectByName("door-cellar", 5);
      if(cd == null) break;
      cd.doClick(3, 0);

      var digged = false;
      while(1)
      {
         if(jFindObjectByName("bumlings/02", 3) != null) break;
         if(jFindObjectByName("stairs", 0) != null) // 3)
         {
            digged = true;
            break;
         }
         jSleep(500);
      }
      if(digged) return;
      jOffsetClick(jCoord(1, 0), 3, 0);
      jWaitMove();
      if(jGetStamina() < 40) drinkWater();

      var bum = jFindObjectByName("bumlings/02", 5);
      jSendDoubleAction("swrk", "runestone");
      jWaitCursor("chi", 20000);
      bum.doClick(1, 0);
      while(jFindObjectByName("bumlings/02", 3) != null) jSleep(3000);
      if(jGetStamina() < 40) drinkWater();
      while(jFindObjectByName("runestone", 3) != null)
      {
         jSendAction("destroy");
         jWaitCursor("mine", 20000);
         var rs = jFindObjectByName("runestone", 3);
         rs.doClick(1, 0);
         jWaitProgress(90000);
         if(jGetStamina() < 40) drinkWater();
         jSleep(500);
      }
   }
}

main();


Code: Select all
//#! uniq = CURIOEATER
//#! tooltip = Puts curios in study, drinks tea. Multiple chars.
//#! name = Curio Eater
//#! icon = gfx/invobjs/tinyabacus

include("jBotAPI");

//// Set your account and character names - ["accName", "charName"], ////////////
var accCharNames =
[
   ["abc", "xyz"],
   // ...
];

//// Delay between eating, minutes
var eatingDelay = 30;

//// Curios list with priority. Upper - more priority, lower - less. ////////////
var curioList =
[
   "pearl",
   "bluebell",
   "tinyabacus",
   "flotsam",
   "edelweiss",
   "glimmermoss",

   "stuffedbear",
   "bronzesteed",
   "entronedtoad",
   "strawdoll",
   "seerstealeaves",

   "ants-empress",
   "ants-queen",
   "ants-soldiers",
   "emerald",

   "itsyweb",
   "bloatedbolete",
   "frogscrown",
   "toadstool",
   "conecow",
   "barkboat",
   "stalagoom",

   "ladysmantle",
   "seersbowl",
   "tinsoldier",
];


function InsertCurio()
{
   if(!jHaveWindow("Character Sheet"))
   {
      jToggleSheet();
      while (!jHaveWindow("Character Sheet"))
      {
         jSleep(100);
      }
   }

   for (var n = 0; n < curioList.length; n++)
   {
      var items = checkInventory().getItems(curioList[n]);

      var quality = -1;
      var num = -1;
      for (var i = 0; i < items.length; i++)
      {
         if (items[i].quality() > quality)
         {
            quality = items[i].quality();
            num = i;
         }
      }
      if (num == -1) continue;

      var curio = items[num];
      curio.transfer();
      jSleep(200);
   }

   jSleep(15*1000);
}

function DrinkTea()
{
   var needDrink = false;
   var buffs = jGetBuffs();
   for (i = 0; i < buffs.length; i++)
   {
      jPrint(buffs[i].name());
      if (buffs[i].name() == "The Warmth of Tea")
      {
         needDrink = (buffs[i].time() < 20);
         break;
      }
   }
   if (!needDrink) return;

   var flasks = checkInventory().getItems("mug-hot");
   if (flasks.length > 0)
   {
      var flask = flasks[0];
      if (flask.isActual())
      {
         flask.iact();
         if (jWaitPopup(actionTimeout))
         {
            jSelectContextMenu("Drink");
            jWaitProgress();
         }
      }
   }
}
 
function main()
{
   jLogout();
   jSleep(5*1000);

   while (true)
   {
      for (var i = 0; i < accCharNames.length; i++)
      {
         Login(accCharNames[i][0], accCharNames[i][1]);

         InsertCurio();
         DrinkTea();

         jLogout();
      }
      jSleep(eatingDelay*60*1000);
   }
}

main();


Code: Select all
//#! uniq = ForagingBotMaker
//#! name = Foraging Bot Maker
//#! tooltip = Learning bots to move right way.
//#! icon = gfx/hud/skills/srv

include("jBotAPI");

// rabbit jackalope
// "gfx/invobjs/jackalope"
// "gfx/kritter/hare/body/standing/standing-0"

function main()
{
   // select forager type
   var modeList = ["Mountain", "Swamp", "Cave", "Forest", "Lake", "OmgWipe!", "Guard"]; //, "ChaoticCreature"];
   var modeWnd = jGUIWindow(jCoord(250, 250), jCoord(220, 20 + modeList.length*30+30), "Forager bot maker");
   for (var n = 0; n < modeList.length; n++)
   {
      jGUIButton(modeWnd, jCoord(10, 10 + n*30), 200, modeList[n]);
   }   
   jGUIButton(modeWnd, jCoord(10, 10 + modeList.length*30 + 10), 200, "Exit");
   var modeText = modeWnd.waitButtonClick();
   modeWnd.destroy();
   if (modeText == "Exit") return;

   // tune forager
   var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(280, 440), "Forager bot maker");
   var regionNameEnt = jGUIEntry(selectWindow, jCoord(10, 10), jCoord(260, 20), "Region name [coords]");
   var accNameEnt = jGUIEntry(selectWindow, jCoord(10, 40), jCoord(260, 20), "Account name");
   var charNameEnt = jGUIEntry(selectWindow, jCoord(10, 70), jCoord(260, 20), "Character name");

   var curiosAllNm = []; // name
   var curiosAllId = []; // world id
   var curiosAllPk = []; // pack id
   var curiosAllCollDef = []; // collect default
   var curiosAllDropDef = []; // keep default min quality
   var modeNum = -1;
   if (modeText == modeList[0]) // mountain
   {
      curiosAllNm = ["Edelweiss", "Frog's crown", "Glimmermoss", "Feldspar"];
      curiosAllId = ["edelweiss", "frogscrown", "glimmermoss", "feldspar"];
      curiosAllPk = ["edelweiss", "frogscrown", "glimmermoss", "feldspar"];
      curiosAllCollDef = [true, true, false, false];
      curiosAllDropDef = [20, 20, 20, 50];
      modeNum = 0;
   }
   if (modeText == modeList[1]) // swamp
   {
      curiosAllNm = ["Bluebell", "Toadstool", "Lady's Mantle", "Bloated bolete"];
      curiosAllId = ["bluebell", "toadstool", "ladysmantle", "bloatedbolete"];
      curiosAllPk = ["bluebell", "toadstool", "ladysmantle", "bloatedbolete"];
      curiosAllCollDef = [true, true, false, true];
      curiosAllDropDef = [1, 25, 100, 15];
      modeNum = 1;
   }
   if (modeText == modeList[2]) // cave
   {
      curiosAllNm = ["Glimmermoss", "Stalagoom", "Cavebulb", "Cave clay"];
      curiosAllId = ["glimmermoss", "stalagoom", "cavebulb", "caveclay"];
      curiosAllPk = ["glimmermoss", "stalagoom", "cavebulb", "clay-cave"];
      curiosAllCollDef = [true, true, false, false];
      curiosAllDropDef = [20, 20, 1, 65];
      modeNum = 2;
   }
   if (modeText == modeList[3]) // forest
   {
      curiosAllNm = ["Bloated bolete", "Blueberries", "Chantrelles", "Rustroot"];
      curiosAllId = ["bloatedbolete", "blueberry", "chantrelle", "rustroot"];
      curiosAllPk = ["bloatedbolete", "blueberry", "chantrelle", "rustroot"];
      curiosAllCollDef = [true, false, false, false];
      curiosAllDropDef = [20, 1, 1, 1];
      modeNum = 3;
   }
   if (modeText == modeList[4]) // lake
   {
      curiosAllNm = ["Flotsam", "Mussel", "Gray clay"];
      curiosAllId = ["flotsam", "mussel", "grayclay"];
      curiosAllPk = ["flotsam", "mussel", "clay-gray"];
      curiosAllCollDef = [true, false, false];
      curiosAllDropDef = [1, 1, 1];
      modeNum = 4;
   }
   if (modeText == modeList[5]) // noobs   (spindlytaproot - spindlytaproot)
   {
      curiosAllNm = ["WWW", "Nettle", "Clover", "Candleberry"];
      curiosAllId = ["windweed", "stingingnettle", "fourleafclover", "candleberry"];
      curiosAllPk = ["windweed", "stingingnettle", "fourleafclover", "candleberry"];
      curiosAllCollDef = [true, false, false, false];
      curiosAllDropDef = [1, 1, 1, 1];
      modeNum = 5;
   }
   if (modeText == modeList[6]) // shocked
   {
      curiosAllNm = [];
      curiosAllId = [];
      curiosAllPk = [];
      curiosAllCollDef = [];
      curiosAllDropDef = [];
      modeNum = 6;
   }
   if (modeText == modeList[7]) // shocked
   {
      curiosAllNm = ["Bluebell also"];
      curiosAllId = ["bluebell"];
      curiosAllPk = ["bluebell"];
      curiosAllCollDef = [true];
      curiosAllDropDef = [1];
      modeNum = 7;
   }

   var curiosBoxesColl = [];
   var curiosBoxesDrop = [];
   for (var n = 0; n < curiosAllNm.length; n++)
   {
      curiosBoxesColl[n] = jGUICbox(selectWindow, jCoord(10, 100 + n*30), "Collect "+curiosAllNm[n]);
      curiosBoxesColl[n].setChecked(curiosAllCollDef[n]);
      curiosBoxesDrop[n] = jGUIEntry(selectWindow, jCoord(160, 100 + n*30 + 14), jCoord(50, 20), curiosAllDropDef[n].toString());
   }

   var startBtn = "Start";
   var addPointBtn = "AddPoint";
   var saveBtn = "Save";
   var exitBtn = "Exit";

   jGUIButton(selectWindow, jCoord(10, 250), 260, startBtn);
   jGUIButton(selectWindow, jCoord(10, 305), 260, addPointBtn);
   jGUIButton(selectWindow, jCoord(10, 360), 260, saveBtn);
   jGUIButton(selectWindow, jCoord(220, 410), 50, exitBtn);

   selectWindow.toggleCloseButton();


   var uniqName = ["Mountain_Forager_", "Swamp_Forager_", "Cave_Forager_", "Forest_Forager_", "Lake_Forager_", "OmgWipe_Forager_", "Guard_", "Shocked_Forager_"];
   var tooltipText   =   ["Collects curios at mountain", "Collects curios at swamp", "Collects curios in cave", "Collects curios it the forest", "Collects curios at lake", "Collects noobs items", "Oversees your area for rams and enemy activity", "Collects Shocked frogs"];
   var iconName = ["gfx/invobjs/herbs/edelweiss", "gfx/invobjs/herbs/chimingbluebell", "gfx/invobjs/herbs/cavebulb", "gfx/invobjs/herbs/bloatedbolete", "gfx/invobjs/herbs/flotsam", "gfx/invobjs/herbs/fourleafclover", "gfx/hud/skills/ranger", "gfx/invobjs/frog"];
   var mainFunctionName = ["CollectMount2", "CollectSwamp2", "CollectMount2", "CollectSwamp2", "CollectLake2", "CollectSwamp2", "CheckRams", "CollectShocked"];

   var wpts = [];

   var startPos = jMyCoords(0, 0);
   var isStarted = false;
   while (true)
   {
      var btext = selectWindow.waitButtonClick();
      if (btext == startBtn)
      {
         jSendDoubleAction("theTrav", "hearth");
         jInGamePrint("Teleporting to HF. Wait.");
         jWaitProgress(actionTimeout);
         startPos = jMyCoords();
         isStarted = true;
         wpts = [];
         jInGamePrint("Started!");
      }
      if (btext == addPointBtn)
      {
         var pos = jMyCoords();
         wpts.push(jCoord((pos.x-startPos.x)/11, (pos.y-startPos.y)/11));
         jInGamePrint("New waypoint, offset = "+(pos.x-startPos.x)/11+", "+(pos.y-startPos.y)/11);
      }

      if (btext == saveBtn)
      {
         var regionName = regionNameEnt.getText();
         var accName = accNameEnt.getText();
         var charName = charNameEnt.getText();

         var f = new java.io.FileWriter("New_Forager.jbot");

         f.write("//#! uniq = "+uniqName[modeNum]+Random(10000000, 100000000)+"\n");
         f.write("//#! name = "+charName+" - "+regionName+"\n");
         f.write("//#! tooltip = "+tooltipText[modeNum]+"\n");
         f.write("//#! icon = "+iconName[modeNum]+"\n");

         f.write("\n");
         f.write('include(\"jBotAPI\");'+"\n");
         f.write("\n");
         f.write('// Before start set camera mode "Fixed" or "Borderizer"'+"\n");
         f.write("\n");
         f.write('var accName = "'+accName+'"; // account name'+"\n");
         f.write('var charName = "'+charName+'"; // character name'+"\n");
         f.write("\n");

         var collectStr = "";
         var nonCollectStr = "";
         var dropStr = "";
         var nonDropStr = "";
         var dropQualityStr = "";
         var nonDropQualityStr = "";
         for (var n = 0; n < curiosAllId.length; n++)
         {
            if (curiosBoxesColl[n].isChecked())
            {
               collectStr = collectStr + '"' + curiosAllId[n] + '", ';
               dropStr = dropStr + '"' + curiosAllPk[n] + '", ';
               dropQualityStr = dropQualityStr + curiosBoxesDrop[n].getInt() + ', ';
            }
            else
            {
               nonCollectStr = nonCollectStr + '"' + curiosAllId[n] + '", ';
               nonDropStr = nonDropStr + '"' + curiosAllPk[n] + '", ';
               nonDropQualityStr = nonDropQualityStr + curiosBoxesDrop[n].getInt() + ', ';
            }
            curiosBoxesDrop[n].setText(curiosBoxesDrop[n].getInt().toString());
         }
         f.write('collectCurios = ['+collectStr+']; // '+nonCollectStr+"\n");
         f.write('dropCurios = ['+dropStr+']; // '+nonDropStr+"\n");
         f.write('dropQuality = ['+dropQualityStr+']; // '+nonDropQualityStr+"\n");

         f.write("\n");
         f.write("// Path depends on the marsh mountain or lake etc"+"\n");
         f.write("var startPos = jCoord(0, 0);"+"\n");
         f.write("var waypoints ="+"\n");
         f.write("["+"\n");
         for (var i = 0; i < wpts.length; i++)
         {
            f.write("   ["+wpts[i].x+", "+wpts[i].y+"],"+"\n");
         }
         f.write("];"+"\n");
         f.write("\n");
         f.write("function main()"+"\n");
         f.write("{"+"\n");
         f.write("   "+mainFunctionName[modeNum]+"(accName, charName, collectCurios, dropCurios, dropQuality, startPos, waypoints);"+"\n");
         f.write("}"+"\n");
         f.write("\n");
         f.write("main();"+"\n");

         f.close();

         jInGamePrint("Script file <New_Forager.jbot> created. Rename and put it to /Scripts directory");
      }

      if (btext == exitBtn)
      {
         break;
      }
   }
   selectWindow.destroy();
}

main();


Code: Select all
//#! uniq = WOODCUTTER
//#! tooltip = Cut trees and tp logs to totem
//#! name = Woodcutter22
//#! icon = gfx/invobjs/small/log

include("jBotAPI(2)");

//// Logs need ////////////////////////////////////
var logsMax = 550;

//// Where to drop logs, offset from totem ////////
var waypoints =
[
   [6, 0],
//   [-6, 0],
//   [-47, -35],
//   [-55, 2],
];

///////////////////////////////////////////////////
function Finish(itext)
{
   jPrint("Exit - "+itext);
   jExit();
}

function DropFromCursor()
{
   while (jIsDragging())
   {
      jDropObject(0);
      jSleep(300);
   }
}
function DropWoodBlocksFromInv()
{
   var inv = checkInventory();
   var items = inv.getItems("wood");
   if (items.length > 0)
   {   
      items[0].dropSuchAll();
      //waits dropping
      while (inv.getItems("wood").length > 0) jSleep(300);
   }
}
function DropFromInv(resName)
{
   var inv = checkInventory();
   var items = inv.getItems(resName);
   if (items.length > 0)
   {   
      items[0].dropSuchAll();
      //waits dropping
      while (inv.getItems(resName).length > 0) jSleep(300);
   }
}
function FromCursorToInv(resName)
{
   DropFromCursor();
   var res = jFindObjectByName(resName, 1);
   if (res != null)
   {
      res.doClick(3, 0);
      jSleep(500);
      if (jIsDragging()) DropFromCursor();
   }
}
function GetInvFree()
{
   var inv = checkInventory();
   return inv.freeSlots();
}
function GetInvResCount(resName)
{
   var inv = checkInventory();
   var invItems = inv.getItems(resName);
   return invItems.length;
}
function GetWindow(objWndName)
{
   var wnd;
   while (true)
   {
      wnd = jGetWindow(objWndName);
      if (wnd != null) return wnd;
      jSleep(300);
   }
}

//---------------------------------------------------------------------
// chop trees
//---------------------------------------------------------------------
function TakeAxe()
{
   var inv = checkInventory();
   var equip = checkEquipment();
   if (equip.name(6) == "Stone Axe") return;
   if (equip.name(7) == "Stone Axe") return;
   while (true)
   {
      equip.transfer(6);
      equip.transfer(7);
      if (equip.name(6) == "") break;
      if (equip.name(7) == "") break;
      jSleep(300);
   }

   DropFromCursor();

   var axe = inv.getItems("axe");
   if (axe.length == 0) Finish("no axe");
   while (!jIsDragging())
   {
      axe[0].take();
      jSleep(300);
   }
   while (jIsDragging())
   {
      equip.dropTo(6);
      jSleep(300);
   }
}
function TakeShovel()
{
   var inv = checkInventory();
   var equip = checkEquipment();
   if (equip.name(6) == "Shovel") return;
   if (equip.name(7) == "Shovel") return;
   while (true)
   {
      equip.transfer(6);
      equip.transfer(7);
      if (equip.name(6) == "") break;
      if (equip.name(7) == "") break;
      jSleep(300);
   }

   DropFromCursor();

   var shovel = inv.getItems("shovel");
   if (shovel.length == 0) Finish("no shovel");
   while (!jIsDragging())
   {
      shovel[0].take();
      jSleep(300);
   }
   while (jIsDragging())
   {
      equip.dropTo(6);
      jSleep(300);
   }
}

function RemoveStump(stump)
{
   resetCursor();
   DropFromCursor();
   DropWoodBlocksFromInv();

   drinkWater();

   TakeShovel();

   stump.doClick(3, 0);
   jWaitPopup(actionTimeout);
   if (jHavePopup())
   {
      jSelectContextMenu("Remove");
      jWaitProgress(actionTimeout);
   }

   DropFromCursor();
   DropWoodBlocksFromInv();
}

function ChopTree(tree)
{
   resetCursor();
   DropFromCursor();
   DropWoodBlocksFromInv();

   //drinkWater();

   TakeAxe();

   tree.doClick(3, 0);
   jWaitPopup(actionTimeout);
   if (jHavePopup())
   {
      jSelectContextMenu("Chop");
      jWaitProgress(actionTimeout);
   }
   jSleep(500);
}

function TakeLog()
{
   var offsetAround = [[11, 11], [11, 0], [11, -11], [0, 11], [0, -11], [-11, 11], [-11, 0], [-11, -11]];
   var treesList = ["/stump", "/trees/fir", "/trees/pine"];

   while (true)
   {
      jSleep(1000);

      if (!MoveRandomDirection(3)) return false;

      if (!noMoreWine())
      {      
         var logsAll = jGetObjects(45, jCoord(0, 0), "/trees/log");
         for (var i = 0; i < logsAll.length; i++)
         {
            var log = logsAll[i];
            if (!jIsPathFree(log.position()))   continue;

            // debug
            //MoveToPos(log.position());
            MoveToPosSafe(log.position());

            resetCursor();
            DropFromCursor();
         
            var me = jGob(jGetMyID());
            jSendAction("carry");
            jWaitCursor("chi", actionTimeout);
            log.doClick(1, 0);
            while (!me.isCarrying())
            {
               jSleep(1000);
            }
            return true;
         }
      }

      // no log avaliable - chop tree and remove stumps
      treeEnd:
      for (var k = 0; k < treesList.length; k++)
      {
         var treesAll = jGetObjects(75, jCoord(0, 0), treesList[k]);
         for (var i = 0; i < treesAll.length; i++)
         {
            var tree = treesAll[i];

            var num = -1;   
            for (var n = 0; n < offsetAround.length; n++)
            {
               var pos = jCoord(tree.position().x + offsetAround[n][0], tree.position().y + offsetAround[n][1]);
               if (jIsPathFree(pos))
               {
                  num = n;
                  break;
               }
            }   
            if (num == -1) continue;

            var startPos = jMyCoords();

            var pos = jCoord(tree.position().x + offsetAround[num][0], tree.position().y + offsetAround[num][1]);
            // debug
            //MoveToPos(pos);
            MoveToPosSafe(pos);
      
            // debug
            //if (CheckHostile()) return false;

            if ((tree.name() == "gfx/terobjs/trees/pine/stump") || (tree.name() == "gfx/terobjs/trees/fir/stump"))
            {
               RemoveStump(tree);
            }
            else
            {
               ChopTree(tree);
            }

            // debug
            //MoveToPos(startPos);
            MoveToPosSafe(startPos);

            break treeEnd;
         }
      }
   }
   Finish("no more trees in range");
   return true;
}

function UnloadWoodLog()
{
   // ïðèâÿçêà
   var totem = jFindObjectByName("vclaim", 10);
   if (totem == null) Finish("no totem O_o");

   // move to factory
   var initPos = totem.position();
   var startPos = jCoord(0, 0);
   for (var i = 0; i < waypoints.length; i++)
   {
      MoveToPosSafe(jCoord(initPos.x + (waypoints[i][0] - startPos.x)*11, initPos.y + (waypoints[i][1] - startPos.y)*11));
   }

   // drop
   var me = jGob(jGetMyID());
   if (me == null) Finish("no me? O_o");
   if(me.isCarrying())
   {
      jAbsClick(jMyCoords(), 3, 0);
      while (me.isCarrying())
      {
         jSleep(1000);
      }
   }

   // print count
   var logsList = jGetObjects(2, jCoord(0, 0), "/trees/log");
   jPrint("logs count = "+logsList.length);
   return logsList.length;
}

function ChopAndDeliverTrees()
{
   var equip = checkEquipment();
   var axeEquipped = false;
   if (equip.name(6) == "Stone Axe") axeEquipped = true;
   if (equip.name(7) == "Stone Axe") axeEquipped = true;
   var shovelEquipped = false;
   if (equip.name(6) == "Shovel") shovelEquipped = true;

   var inv = checkInventory();
   var axe = inv.getItems("axe");
   var shovel = inv.getItems("shovel");
   var buckets = inv.getItems("bucket-wine");
   var glass = inv.getItems("glass-wine");
   if (((axe.length == 0)&&(!axeEquipped))||((shovel.length == 0)&&(!shovelEquipped))||(buckets.length == 0)||(glass.length == 0))
   {
      sayArea("Need axe, shovel, bucket with wine and wine glass!");
      Finish("Must be equipped with axe, shovel, bucket with wine and wine glass.");
   }

   jSetSpeed(1);
   TeleportHF();
   while (true)
   {
      DropFromCursor();
      DropWoodBlocksFromInv();
      if (!TakeLog())
      { // hostile spotted!
         jPrint("fukin bear!");
         TeleportToTotem();
         sayArea("fukin bear!");
         WaitRespawn();
         continue;
      }
      if (!TeleportToTotem())
      {
         jLogout();
         Finish("finished. cannot teleport to totem. possibly no wine.")
      }
      var logsCount = UnloadWoodLog();
      if (logsCount > logsMax)
      {
         Finish("work done. "+logsMax+" logs ready.");
      }
      TeleportHF();
   }
}

//---------------------------------------------------------------------
function main()
{
   jDropLastWindow();

   ChopAndDeliverTrees();
}

main();



jBotAPI(2)

Code: Select all
include("jClusters");

var actionTimeout = 1000 * 60 * 1;

function waitUnActual(item) {
   while (item.isActual()) {
      jSleep(100);
   }
}

function resetCursor() {
   if (!jIsCursor("arw")) {
      jAbsClick(jCoord(0, 0), 3, 0);
      jWaitCursor("arw", actionTimeout);
   }
}

function checkInventory() {
   if(!jHaveWindow("Inventory")) {
      jToggleInventory();
      while(!jHaveWindow("Inventory"))
         jSleep(100);
   }
   return jGetWindow("Inventory").getInventories()[0];
}

function checkEquipment() {
   if(!jHaveWindow("Equipment")) {
      jToggleEquipment();
      while(!jHaveWindow("Equipment"))
         jSleep(100);
   }
   return jGetJSEquip();
}

function waitInventoryObject(inv, objname) {
   while (true) {
      var objs = inv.getItems(objname);
      if (objs.length > 0) break;
      else jSleep(100);
   }   
}

function drinkWater() {
   var inventory = checkInventory();
   var buckets = inventory.getItems("bucket-water");
   if (buckets.length > 0) {
      inventory.sortItems(buckets, "amount", false);
      var bucket = buckets[0];
      var bucket_coord = bucket.coord();
      if (bucket.isActual()) {
         bucket.take();
         jWaitDrag();
         var flasks = inventory.getItems("waterflask", "waterskin", "kuksa");
         if (flasks.length > 0) {
            var flask = flasks[0];
            if (flask.isActual()) {
               flask.itemact(0);
               jSleep(500);
               inventory.drop(bucket_coord);
               jWaitDrop();
            }
         }
      }
   }
   var flasks = inventory.getItems("waterflask", "waterskin", "kuksa");
   if (flasks.length > 0) {
      var flask = flasks[0];
      if (flask.isActual()) {
         flask.iact();
         if (jWaitPopup(actionTimeout)) {
            jSelectContextMenu("Drink");
            jWaitProgress();
         }
      }
   }
}

function dropItem(coord) {
   var items = checkInventory().getItems("");
   for (var i = 0; i < items.length; i++) {
      if (items[i].coord().x == coord.x && items[i].coord().y == coord.y) {
         items[i].drop();
         break;
      }
   }   
}

function waitDragName(name) {
   while (true) {
      // Unsafe
      try {
         var item = jGetDraggingItem();
         if (item != null && item.isActual()) {
            if (item.resName() != null) {
               if (item.resName().indexOf(name) >= 0) {
                  break;
               } else {
                  jSleep(100);
               }
            } else jSleep(100);
         } else {
            break;
         }
      } catch (ex) {
         jSleep(200);
      }
   }
}

function waitPFEndMove() {
   while (true) {
      jWaitEndMove();
      jSleep(500);
      if (!jIsMoving()) {
         return;
      }
   }
}

function travelCount() {
   var buffs = jGetBuffs();
   for (var i = 0; i < buffs.length; i++) {
      if (buffs[i].name().indexOf("Travel Weariness") >= 0) {
         return buffs[i].meter();
      }
   }
   return 0;
}

function noMoreWine() {
   var buffs = jGetBuffs();
   for (var i = 0; i < buffs.length; i++) {
      if (buffs[i].name().indexOf("Drunk and Riotous") >= 0) {
         return true;
      }
   }
   return false;
}

function _pf_click(id) {
   if (!jIsPathFree(jGob(id).position())) {
      resetCursor();
      if (jPFClick(id) > 0) {
         if (jWaitStartMove(1000)) {
            waitPFEndMove();
            while (jIsMoving() || jMyCoords().dist(jGob(id).position()) > 33) {
               jSleep(100);
            }
            return true;
         }
      }
   } else {
      resetCursor();
      jGob(id).doClick(3, 0);
   }
   return false;
}

function _pf_move(coord) {
   if (!jIsPathFree(coord)) {
      resetCursor();
      if (jPFMove(coord) > 0) {
         if (jWaitStartMove(1000)) {
            waitPFEndMove();
            while (jIsMoving() || jMyCoords().dist(coord) > 1) {
               jSleep(100);
            }
            return true;
         }
      }
   } else {
      resetCursor();
      jAbsClick(coord, 1, 0);
      if (jWaitStartMove(1000)) {
         jWaitEndMove();
         return true;
      }
   }
   return false;
}

function dropAll() {
   if (jIsDragging()) {
      jDropObject(0);
      jWaitDrop(actionTimeout);
   }
}

function waitChat(name, timeout) {
   var time = 0;
   while (true) {
      var chats = haven.getChats();
      for (var i = 0; i < chats.length; i++) {
         if (chats[i].chatName().indexOf(name) >= 0) {
            return true;
         }
      }
      jSleep(100);
      time += 100;
      if (time > timeout) return false;
   }
}

// Ãîâîðèò òåêñò â àðåà ÷àò
function sayArea(text)
{
   var chats = jGetChats();
   for (var i = 0; i < chats.length; i++)
   {
      if (chats[i].chatName().indexOf("Area Chat") >= 0)
      {
         chats[i].sendMessage(text);
         break;
      }
   }
}
// Ãîâîðèò òåêñò â äåðåâåíñêèé ÷àò
function sayVillage(text)
{
   var chats = jGetChats();
   for (var i = 0; i < chats.length; i++)
   {
      if (chats[i].chatName().indexOf("Village") >= 0)
      {
         chats[i].sendMessage(text);
         break;
      }
   }
}

function dropAll() {
   if (jIsDragging()) {
      jDropObject(0);
      jWaitDrop(actionTimeout);
   }
}

function dropItem(coord) {
   var inventory = checkInventory();
   var items = inventory.getItems("");
   for (var i = 0; i < items.length; i++) {
      if (items[i].coord().x == coord.x && items[i].coord().y == coord.y) {
         items[i].drop();
         break;
      }
   }   
}

function moveFromObject(objid, tiles) {
   var direction = jGob(objid).position().sub(jMyCoords());
   var direction_normal = direction.div(direction.abs());
   resetCursor();
   jAbsClick(jGob(objid).position().sub(direction_normal.mul(tiles, tiles)), 1, 0);
   jWaitMove(actionTimeout);
}

function travelCount() {
   var buffs = jGetBuffs();
   for (var i = 0; i < buffs.length; i++) {
      if (buffs[i].name().indexOf("Travel Weariness") >= 0) {
         return buffs[i].meter();
      }
   }
   return 0;
}

function noMoreWine() {
   var buffs = jGetBuffs();
   for (var i = 0; i < buffs.length; i++) {
      if (buffs[i].name().indexOf("Drunk and Riotous") >= 0) {
         return true;
      }
   }
   return false;
}

function drinkWine() {
   var inventory = checkInventory();
   var buckets = inventory.getItems("bucket-wine");
   if (buckets.length > 0) {
      inventory.sortItems(buckets, "amount", false);
      var bucket = buckets[0];
      var bucket_coord = bucket.coord();
      if (bucket.isActual()) {
         bucket.take();
         jWaitDrag(actionTimeout);
         var flasks = inventory.getItems("glass-wine");
         if (flasks.length > 0) {
            var flask = flasks[0];
            if (flask.isActual()) {
               flask.itemact(0);
               jSleep(500);
               inventory.drop(bucket_coord);
               jWaitDrop(actionTimeout);
            }
         }
      }
   }
   var flasks = inventory.getItems("glass-wine");
   if (flasks.length > 0) {
      var flask = flasks[0];
      if (flask.isActual()) {
         flask.iact();
         if (jWaitPopup(actionTimeout)) {
            jSelectContextMenu("Drink");
            jWaitProgress(actionTimeout);
            return true;
         }
      }
   }
   return false;
}

// IGNORE
var _ignore_array = new Array();

function addIgnoreId(id) {
   _ignore_array.push(id);
}

function removeIgnoreId(id) {
   
}

function clearIgnoreList() {
   _ignore_array = [];
}

function iGetObjects(radius, offset, name) {
   var objs = jGetObjects(radius, offset, name);
   var ret = new Array();
   for (var i = 0; i < objs.length; i++) {
      if (_ignore_array.indexOf(objs[i]) == -1) {
         ret.push(objs[i]);
      }
   }
   return ret;
}

function iGetNearestObject(radius, name) {
   var objs = iGetObjects(radius, jCoord(0, 0), name);
   var min_len = 100500; var obj = 0;
   for (var i = 0; i < objs.length; i++) {
      if (jGob(objs[i]).position().dist(jMyCoords()) < min_len) {
         obj = objs[i];
         min_len = jGob(objs[i]).position().dist(jMyCoords());
      }
   }
   return obj;
}





//////////////////////////////////////////////
// Bunin Flameforge
//////////////////////////////////////////////

///////////////////////////////////////////////////////////////////
// Test function
//////////////////////////////////////////////////////////////////

function dropEverything() {
   if (apiCheckInventory().getItems("mussel", "flotsam", "itsybitsy", "itsyweb").length > 0) {
      var self = apiSelf();
      var pos = self.position();
      var containers = new ContainerCluster(Direction.South);
      containers.update(30, "cclosed");
      //containers._containers = sortClusterObjs(containers._containers);

      containers.putItems(function () {
         var _myinv = apiCheckInventory();
         return _myinv.getItems("mussel", "flotsam", "itsybitsy", "itsyweb");
      });
      apiAbsMove(pos);
   }
}

function waitPFEndMove() {
   while (true) {
      jWaitEndMove();
      jSleep(500);
      if (!jIsMoving()) {
         return;
      }
   }
}

function chestMus(){
var chest = jFindObjectByName("lchest", 39);
   _pf_click(chest.position());
   waitPFEndMove();
   jDoClick(chest.getID(), 3, 0); jWaitMove(actionTimeout );
   jWaitWindow("Chest", actionTimeout);
   if (jGetWindow("Inventory").getInventories()[0].getItems("mussel")[0] != undefined){
      jGetWindow("Inventory").getInventories()[0].getItems("mussel")[0].transferSuchAll();     
   }
}

function TpAndDrop() {
   TeleportHF();
   PutBoat();
   TeleportToTotem();
   chestMus();
   TeleportHF();
}

///////////////////////////////////////////////////////////////////
// Test END
//////////////////////////////////////////////////////////////////

function DropMuss() {
   if (jGetWindow("Inventory").getInventories()[0].getItems("mussel")[0] != undefined){

      jGetWindow("Inventory").getInventories()[0].getItems("mussel")[0].dropSuchAll();     
   }
}

function TeleportToTotem()
{
   // drink wine
   if (travelCount() > 85)
   {
      while (noMoreWine())
      {
         jSleep(2*1000);
         return false;
      }
      drinkWine();
   }
   
   // teleport
   jSendDoubleAction("theTrav", "village");
   jWaitProgress(actionTimeout);

   while (true)
   {
      if (jFindObjectByName("vclaim", 10) != null) break;
      jSleep(1000);
   }
   return true;
}


// village unload
function VillageUnload()
{
   // drink wine
   // tp totem
   // hunger from overstuffed
   // find all chests in 20 sq
   // get random
   // go with patfinding
   // if failed - go next or tp to totem
   // unload
   // repeat until all unloaded
   // if no chests - stop
   // logoff
}

function CheckHostile()
{
   if (jFindObjectByName("kritter/bear", 75) != null) return true;
   if (jFindObjectByName("kritter/boar", 65) != null) return true;

   // humans
   var objList = jGetObjects(75, jCoord(0, 0), "gfx/borka/s");
   for (var n = 0; n < objList.length; n++)
   {
      var enemy = objList[n];
      if (!enemy.isActual()) continue;

      var isPlayer = enemy.isPlayer();
      var inVillage = enemy.isInYourVillage();
      var isKin = enemy.isKin();
      var kinGroup = enemy.getKinGroup();

      if (enemy.getID() == jGetMyID()) continue;
      if (!isPlayer) continue;
      if (inVillage) continue;
      if (isKin)
      {
         if (kinGroup == 1) continue; // green kin
      }
      return true;
   }
   return false;
}

function Random(min, max)
{
   return Math.floor((Math.random()*(max-min)) + min);
}

var moveTimeout = 60*1000;

function WaitMoveAndCheckHostile()
{
   if (CheckHostile())   return false;
//   jWaitMove(actionTimeout);
   jWaitMove(moveTimeout);
   if (CheckHostile())   return false;
   return true;
}

function MoveRandomDirection(dist)
{
   dx = Random(-dist, dist);
   dy = Random(-dist, dist);
   jMoveStep(jCoord(dx, dy));
   return WaitMoveAndCheckHostile();
}
function MoveToPosDelta(pos, delta)
{
   while (true)
   {
      jAbsClick(pos, 1, 0);
      if (!WaitMoveAndCheckHostile()) return false;
      var curPos = jMyCoords();
      if ((Math.abs(curPos.x-pos.x) <= delta)&&(Math.abs(curPos.y-pos.y) <= delta)) break;

      // to enter claim
      jAbsClick(pos, 1, 0);
      if (!WaitMoveAndCheckHostile()) return false;
      curPos = jMyCoords();
      if ((Math.abs(curPos.x-pos.x) <= delta)&&(Math.abs(curPos.y-pos.y) <= delta)) break;

      jSleep(300);
      if (!MoveRandomDirection(4)) return false;
   }
   return true;
}
function MoveToPos(pos)
{
   return MoveToPosDelta(pos, 3);
}

function MoveRandomDirectionSafe(dist)
{
   dx = Random(-dist, dist);
   dy = Random(-dist, dist);
   jMoveStep(jCoord(dx, dy));
//   jWaitMove(actionTimeout);
   jWaitMove(moveTimeout);
}
function MoveToPosSafeDelta(pos, delta)
{
   while (true)
   {
      jAbsClick(pos, 1, 0);
//      jWaitMove(actionTimeout);
      jWaitMove(moveTimeout);
      var curPos = jMyCoords();
      if ((Math.abs(curPos.x-pos.x) <= delta)&&(Math.abs(curPos.y-pos.y) <= delta)) break;

      // to enter claim
      jAbsClick(pos, 1, 0);
//      jWaitMove(actionTimeout);
      jWaitMove(moveTimeout);
      curPos = jMyCoords();
      if ((Math.abs(curPos.x-pos.x) <= delta)&&(Math.abs(curPos.y-pos.y) <= delta)) break;

      jSleep(300);
      MoveRandomDirectionSafe(4);
   }
}
function MoveToPosSafe(pos)
{
   MoveToPosSafeDelta(pos, 3);
}

function CollectCurio(curio)
{
   if (curio == null) return;

   var startPos = jMyCoords();

   // move to curio
   if (!MoveToPos(curio.position())) return false;

   // take
   curio.doClick(3, 0);
   jWaitPopup(actionTimeout);
   if (jHavePopup())
   {
      jSelectContextMenu("Pick");
      jWaitProgress(actionTimeout);
   }

   // return
   if (!MoveToPos(startPos)) return false;
   return true;
}

function DropCurios(curioName, minKeepQuality)
{
   var inventory = checkInventory();
   var items = inventory.getItems(curioName);
   for (var i = 0; i < items.length; i++)
   {
      if (items[i].quality() < minKeepQuality) items[i].drop();
   }   
}

function TeleportHF()
{
   jSendDoubleAction("theTrav", "hearth");
   jWaitProgress(actionTimeout);
   while (true)
   {
      if (jFindObjectByName("hearth-play", 1) != null) break;
      jSleep(1000);
   }
}

function WaitRespawn()
{
//   jSleep(17*60*1000 + 30*1000 + 6*60*1000);
   jSleep(20*60*1000);
}

function Login(iaccName, icharName)
{
   while (true)
   {
      jLogin(iaccName);
      jSleep(2000);
      if (jHaveCharlist()) break;
   }

   while (true)
   {
      if (jSelectChar(icharName)) break;
      jSleep(2000);
   }

   while (!jHaveWindow(icharName))
   {
      jSleep(2000);
      if (jHaveWindow("Menu"))
      {
         jSleep(1000);
        return;
      }
   }
   jSleep(1000);

   jGetWindow(icharName).pushButton("Your hearth fire");

   while (!jHaveWindow("Menu"))
   {
      jSleep(2000);
   }
   jSleep(1000);
}

function CollectSwamp(iaccName, icharName, icollectCurios, idropCurios, istartPos, iwaypoints)
{ // legacy
   var dropQuality = [];
   for (var i = 0; i < idropCurios; i++)
   {
      dropQuality[i] = 200;
   }
   CollectSwamp2(iaccName, icharName, icollectCurios, idropCurios, dropQuality, istartPos, iwaypoints);
}
function CollectSwamp2(iaccName, icharName, icollectCurios, idropCurios, idropQuality, istartPos, iwaypoints)
{
   while(1)
   {
      jDropLastWindow();

      jSendAction("crime");
      jSetSpeed(0);
      TeleportHF();

      var initPos = jMyCoords();

      evacuate:
      for (var i = 0; i < iwaypoints.length; i++)
      {
         if (!MoveToPos(jCoord(initPos.x + (iwaypoints[i][0] - istartPos.x)*11, initPos.y + (iwaypoints[i][1] - istartPos.y)*11))) break evacuate;

         //////////////////////////////////////////////////////////
         while (true)
         {
            var curio;
            for(var n = 0; n < icollectCurios.length; n++)
            {
               curio = jFindObjectByName(icollectCurios[n], 40);
               if (curio != null) break;
            }

            if (curio == null) break;
            if (!CollectCurio(curio)) break evacuate;

            for(var k = 0; k < idropCurios.length; k++)
            {
               DropCurios(idropCurios[k], idropQuality[k]);
            }

            var inventory = checkInventory();
            if (inventory.freeSlots() == 0)
            {
               // TODO: maybe unload   to cupboards here
               jLogout();
               jExit();
            }
         }
         //////////////////////////////////////////////////////////

      }

      jLogout();
      WaitRespawn();
      Login(iaccName, icharName);
   }
}

function CollectMount(iaccName, icharName, icollectCurios, idropCurios, istartPos, iwaypoints)
{ // legacy
   var dropQuality = [];
   for (var i = 0; i < idropCurios; i++)
   {
      dropQuality[i] = 200;
   }
   CollectMount2(iaccName, icharName, icollectCurios, idropCurios, dropQuality, istartPos, iwaypoints);
}
function CollectMount2(iaccName, icharName, icollectCurios, idropCurios, idropQuality, istartPos, iwaypoints)
{
   while(1)
   {
      jDropLastWindow();

      jSendAction("crime");
      jSetSpeed(0);
      TeleportHF();

      var initPos = jMyCoords();

      evacuate:
      for (var i = 0; i < iwaypoints.length; i++)
      {
         if (!MoveToPos(jCoord(initPos.x + (iwaypoints[i][0] - istartPos.x)*11, initPos.y + (iwaypoints[i][1] - istartPos.y)*11))) break evacuate;

         //////////////////////////////////////////////////////////
         for(var n = 0; n < icollectCurios.length; n++)
         {
            // get all visible curios list
            var curiosList = jGetObjects(40, jCoord(0, 0), icollectCurios[n]);
            for (var s = 0; s < curiosList.length; s++)
            {
               var curio = curiosList[s];

               // check curio path
               if (curio == null) break;
               var isPathFree = jIsPathFree(curio.position());
               if (!isPathFree) continue;

               if (curio == null) break;
               if (!CollectCurio(curio)) break evacuate;

               for(var k = 0; k < idropCurios.length; k++)
               {
                  DropCurios(idropCurios[k], idropQuality[k]);
               }

               var inventory = checkInventory();
               if (inventory.freeSlots() == 0)
               {
                  // TODO: maybe unload   to cupboards here
                  jLogout();
                  jExit();
               }
            }
         }
         //////////////////////////////////////////////////////////

      }

      jLogout();
      WaitRespawn();
      Login(iaccName, icharName);
   }
}

var myBoat = null;

function PutBoat()
{
   var me = jGob(jGetMyID());
   if(me == null) return;
   if(!me.isCarrying()) return;
   jAbsClick(jMyCoords().add(0, 22), 3, 0);
   while(me.isCarrying())
   {
      jSleep(1000);
   }
}
function TakeBoat()
{
   var me = jGob(jGetMyID());
   var boat = jFindObjectByName("boat", 10);
   if (boat == null) return false;
   jSendAction("carry");
   jWaitCursor("chi", actionTimeout);
   boat.doClick(1, 0);
   while (!me.isCarrying())
   {
      jSleep(1000);
   }
   myBoat = boat;
   return true;
}

function PutBoatOnLake(ipos)
{
   var me = jGob(jGetMyID());
   jAbsClick(ipos, 3, 0);
   while (me.isCarrying())
   {
      jSleep(1000);
   }
   myBoat = jFindObjectByName("boat", 2);
}
function GetIntoBoat()
{
   myBoat.doClick(3, 0);
   jWaitPopup(actionTimeout);
   jSelectContextMenu("Avast!");
   var me = jGob(jGetMyID());
   while (!me.isSitting())
   {
      jSleep(1000);
   }
}

function GetFromBoatAndTakeIt()
{
   jAbsClick(jMyCoords().add(0, -33), 1, 2);
   var me = jGob(jGetMyID());
   while (me.isSitting())
   {
      jSleep(1000);
   }
   jSendAction("carry");
   jWaitCursor("chi", actionTimeout);
   myBoat.doClick(1, 0);
   while (!me.isCarrying())
   {
      jSleep(1000);
   }
}

function CollectCurioLake(icurio)
{
   if (icurio == null) return;
   var startPos = jMyCoords();

   jAbsClick(icurio.position(), 1, 0);
   jWaitMoveGob(myBoat.getID(), actionTimeout);
   
   var curPos = jMyCoords();
   if ((Math.abs(curPos.x-icurio.position().x) <= 2)&&(Math.abs(curPos.y-icurio.position().y) <= 2))
   {
      icurio.doClick(3, 0);
      jWaitPopup(actionTimeout);
      if (jHavePopup())
      {
         jSelectContextMenu("Pick");
         jWaitProgress(actionTimeout);
      }
   }

   jAbsClick(startPos, 1, 0);
   jWaitMoveGob(myBoat.getID(), actionTimeout);
}

function CollectLake(iaccName, icharName, icollectCurios, idropCurios, istartPos, iwaypoints)
{ // legacy
   var dropQuality = [];
   for (var i = 0; i < idropCurios; i++)
   {
      dropQuality[i] = 200;
   }
   CollectLake2(iaccName, icharName, icollectCurios, idropCurios, dropQuality, istartPos, iwaypoints);
}
function CollectLake2(iaccName, icharName, icollectCurios, idropCurios, idropQuality, istartPos, iwaypoints)
{
   if (iwaypoints.length < 2)
   {
      jLogout();
      jExit();
   }

   while(1)
   {
      jDropLastWindow();

      if(!TakeBoat())
      {
         jLogout();
         jExit();
      }

      TeleportHF();

      initPos = jMyCoords();
      var shoreBeginPos = jCoord(initPos.x + (iwaypoints[0][0] - istartPos.x)*11, initPos.y + (iwaypoints[0][1] - istartPos.y)*11);

      PutBoatOnLake(shoreBeginPos);

      GetIntoBoat();

      for(var i = 1; i < iwaypoints.length; i++)
      {
         jAbsClick(jCoord(initPos.x + (iwaypoints[i][0] - istartPos.x)*11, initPos.y + (iwaypoints[i][1] - istartPos.y)*11), 1, 0);
         jWaitMoveGob(myBoat.getID(), actionTimeout);


         //////////////////////////////////////////////////////////
         for(var n = 0; n < icollectCurios.length; n++)
         {
            // get all visible curios list
            var curiosList = jGetObjects(45, jCoord(0, 0), icollectCurios[n]);
            for (var s = 0; s < curiosList.length; s++)
            {
               var inventory = checkInventory();
               if (inventory.freeSlots() == 0) break;

               var curio = curiosList[s];

               if (curio == null) break;
               CollectCurioLake(curio);

               for(var k = 0; k < idropCurios.length; k++)
               {
                  DropCurios(idropCurios[k], idropQuality[k]);
               }
            }
         }
         //////////////////////////////////////////////////////////
      }

      GetFromBoatAndTakeIt();
      
      TeleportHF();
      PutBoat();
      
      TeleportToTotem();
      
      dropEverything();
      
      TeleportHF();

      var inventory = checkInventory();
      if (inventory.freeSlots() == 0)
      {
         // TODO: maybe unload   to cupboards here
         jLogout();
         jExit();
      }

      jLogout();
      WaitRespawn();
      Login(iaccName, icharName);
   }
}

function CollectShocked(iaccName, icharName, icollectCurios, idropCurios, idropQuality, istartPos, iwaypoints)
{
   var droppedToadsCount = 0;

   while(1)
   {
      jDropLastWindow();

      jSendAction("crime");
      jSetSpeed(0);
      TeleportHF();

      var initPos = jMyCoords();

      evacuate:
      for (var i = 0; i < iwaypoints.length; i++)
      {
         if (!MoveToPos(jCoord(initPos.x + (iwaypoints[i][0] - istartPos.x)*11, initPos.y + (iwaypoints[i][1] - istartPos.y)*11))) break evacuate;

         //////////////////////////////////////////////////////////
         while (true)
         {
            var curio;
            for(var n = 0; n < icollectCurios.length; n++)
            {
               curio = jFindObjectByName(icollectCurios[n], 40);
               if (curio != null) break;
            }

            if (curio == null) break;
            if (!CollectCurio(curio)) break evacuate;

            for(var k = 0; k < idropCurios.length; k++)
            {
               DropCurios(idropCurios[k], idropQuality[k]);
            }

            var inventory = checkInventory();
            if (inventory.freeSlots() == 0)
            {
               // TODO: maybe unload   to cupboards here
               jLogout();
               jExit();
            }
         }
         //////////////////////////////////////////////////////////

         //////////////////////////////////////////////////////////
         var startPos = jMyCoords();

         var frogsList = jGetObjects(40, jCoord(0, 0), "rat");
         var frogsCount = frogsList.length;
         while (true)
         {
            //if (frogsCount == 0) break;
            var hasActual = false;
            for (var s = 0; s < frogsCount; s++)
            {
               if (frogsList[s] == null) continue;
               if (!frogsList[s].isActual()) continue;
               hasActual = true;
               break;
            }
            if (!hasActual) break;
   
            var curPos = jMyCoords();
            var minDist = 1000000000;
            var nearestFrog = -1;
            for (var s = 0; s < frogsCount; s++)
            {
               if (frogsList[s] == null) continue;
               if (!frogsList[s].isActual()) continue;
               var frogPos = frogsList[s].position();
               var frogDist = (curPos.x-frogPos.x)*(curPos.x-frogPos.x) + (curPos.y-frogPos.y)*(curPos.y-frogPos.y);
               if (frogDist < minDist)
               {
                  minDist = frogDist;
                  nearestFrog = s;
               }
            }
            if (nearestFrog == -1) break;
            var frog = frogsList[nearestFrog];
            frogsCount = frogsCount - 1;
            frogsList[nearestFrog] = frogsList[frogsCount];

            if (!frog.isActual()) continue;
            if (frog.isMoving()) continue;

            var startFrogPos = frog.position();

            // move to frog
            if (!MoveToPos(startFrogPos)) break evacuate;
            
            if (!frog.isActual()) continue;
            if ((frog.position().x == startFrogPos.x)&&(frog.position().y == startFrogPos.y))
            {
               // take
               if (!frog.isActual()) continue;
               frog.doClick(3, 0);
               jSleep(1000);
            }
            else
            {
               if (!frog.isActual()) continue;
               if ((Math.abs(frog.position().x - startFrogPos.x) < 8*11) && (Math.abs(frog.position().y - startFrogPos.y) < 8*11)) //  && (!frog.isMoving())
               {
                  // take
                  if (!frog.isActual()) continue;
                  frog.doClick(3, 0);
                  jSleep(8000);
               }
            }

            // drop toads, keep shockeds
            var inventory = checkInventory();
            var items = inventory.getItems("frog");
            for (var s = 0; s < items.length; s++)
            {
               if (items[s].name() == "Toad")
               {
                  droppedToadsCount = droppedToadsCount + 1;
                  jPrint("toads dropped = "+droppedToadsCount);

                  items[s].drop();
               }
            }   
            // drop rats, dragonflies
            //DropCurios("rat", 200);

            if (inventory.freeSlots() == 0)
            {
               // TODO: maybe unload   to cupboards here
               jLogout();
               jExit();
            }
         }

         // return
         if (!MoveToPos(startPos)) break evacuate;
         //////////////////////////////////////////////////////////
      }

      jLogout();
      WaitRespawn();
      Login(iaccName, icharName);
   }
}

function CheckRams(iaccName, icharName, icollectCurios, idropCurios, idropQuality, istartPos, iwaypoints)
{
   jDropLastWindow();

   jSendAction("crime");
   jSetSpeed(1);
   TeleportHF();

   var allClear = true;
   var initPos = jMyCoords();
   for (var i = 0; i < iwaypoints.length; i++)
   {
      MoveToPosSafe(jCoord(initPos.x + (iwaypoints[i][0] - istartPos.x)*11, initPos.y + (iwaypoints[i][1] - istartPos.y)*11));

      var objList = jGetObjects(75, jCoord(0, 0), "/");
      for (var n = 0; n < objList.length; n++)
      {
         var enemy = objList[n];
         if (!enemy.isActual()) continue;
         if (enemy.name() == "gfx/kritter/bram/s")
         {
            allClear = false;
            var hfOffsetTiles = jCoord((enemy.position().x - initPos.x)/11, (enemy.position().y - initPos.y)/11);
            var hfOffsetMMaps = jCoord(hfOffsetTiles.x/100, hfOffsetTiles.y/100);
            jPrint("RAM DETECTED !!! Offset from hf = "+hfOffsetMMaps+" minimaps");
             sayVillage("ALARM !!! ALARM !!! ALARM !!!");
             sayVillage("RAM DETECTED !!! RAM DETECTED !!!");
             sayVillage("Offset from hf <"+icharName+"> = "+hfOffsetMMaps+" minimaps");
             sayVillage("ALARM !!! ALARM !!! ALARM !!!");
         }
         if (enemy.name() == "gfx/borka/s")
         {
            var isPlayer = enemy.isPlayer();
            var inVillage = enemy.isInYourVillage();
            var isKin = enemy.isKin();
            var kinGroup = enemy.getKinGroup();
            var isAggroed = jYouAggroedId(enemy.getID());

            if (enemy.getID() == jGetMyID()) continue;
            if (!isPlayer) continue;
            if (inVillage) continue;
            if (isKin)
            {
               if (kinGroup == 1) continue; // green kin
            }

            allClear = false;

            var hfOffsetTiles = jCoord((enemy.position().x - initPos.x)/11, (enemy.position().y - initPos.y)/11);
            var hfOffsetMMaps = jCoord(hfOffsetTiles.x/100, hfOffsetTiles.y/100);

            jPrint("Suspicious guy detected!!! Offset from hf = "+hfOffsetMMaps+" minimaps");

             sayVillage("WARNING !!!");
            sayVillage("Suspicious guy detected!!!");
             sayVillage("Offset from hf <"+icharName+"> = "+hfOffsetMMaps+" minimaps");

            if (isAggroed)
            {
               jPrint("He aggroed me!!!");
               sayVillage("He aggroed guard <"+icharName+"> !!!");
            }
             sayVillage("WARNING !!!");
         }
      }
   }

   if (allClear)
   {
      jPrint("Check finished. All clear.");
   }
   else
   {
      jPrint("WARNING! Check finished. RAM OR ENEMIES DETECTED!!!");
   }
}

//////////////////////////////////////////////
// Bunin Flameforge
//////////////////////////////////////////////
Last edited by talon00302 on Tue Apr 22, 2014 11:59 pm, edited 2 times in total.
User avatar
talon00302
 
Posts: 516
Joined: Sun Apr 15, 2012 8:30 pm

Re: Union Client Scripts

Postby talon00302 » Mon Apr 21, 2014 5:03 am

Name this Jclusters


Code: Select all
function apiError(msg) {
   jPrint(msg);
   throw new java.lang.Exception("Script Exception");
}

function apiTeleportHF() {
   jSendDoubleAction("theTrav", "hearth");
   jWaitProgress();
   while (true) {
      if (jFindObjectByName("hearth-play", 1) != null) break;
      jSleep(1000);
   }
}

function apiWaitIdle(prewait, timeout) {
   jSleep(prewait);
   var _self = jGob(jGetMyID());
   var _timer = 0;
   while (_self.isMoving()) {
      jSleep(50);
      _timer += 50;
      if (_timer >= timeout) return false;
   }
   return true;
}

function apiWaitMultiCraft() {
   jWaitStartProgress();
   while (true) {
      while (jHaveHourglass()) {
         jSleep(100);
      }
      jSleep(250);
      if (!jHaveHourglass()) break;
   }
}

function apiWaitResName(item, name, timeout) {
   var _timer = 0;
   while (item == null || item.resName().indexOf(name) < 0) {
      jSleep(50);
      _timer += 50;
      if (_timer >= timeout) return false;
   }
   return true;
}

function apiWaitResOtherName(item, name, timeout) {
   var _timer = 0;
   while (item == null || item.resName().indexOf(name) >= 0) {
      jSleep(50);
      _timer += 50;
      if (_timer >= timeout) return false;
   }
   return true;
}

function apiWaitUnActual(item) {
   while (item.isActual()) {
      jSleep(100);
   }
}

function apiGetTravelWeariness() {
   var buffs = jGetBuffs();
   for (var i = 0; i < buffs.length; i++) {
      if (buffs[i].name().indexOf("Travel Weariness") >= 0) {
         return buffs[i].meter();
      }
   }
   return 0;
}

function apiCheckInventory() {
   if (!jHaveWindow("Inventory")) {
      jToggleInventory();
      while (!jHaveWindow("Inventory")) jSleep(50);
   }
   var _wnd = jGetWindow("Inventory");
   while (_wnd.getInventories().length == 0) jSleep(50);
   return _wnd.getInventories()[0];
}

function apiAbsMoveStraight(coord, waitCallback) {
   apiResetCursor();
   var self = jGob(jGetMyID());
   var moved = false;
   while (!self.position().equals(coord)) {
      if (self.isMoving()) {
         jSleep(100);
         if (waitCallback) waitCallback();
      } else {
         if (!moved) {
            moved = true;
            jAbsClick(coord, 1, 0);
         } else {
            jSleep(250);
            apiAbsMoveStraight(coord, waitCallback);
         }
      }
   }
}

function apiSelf() {
   return jGob(jGetMyID());
}

function apiAbsMove(coord, waitCallback) {
   apiResetCursor();
   var self = jGob(jGetMyID());
   var moved = false;
   if (jIsPathFree(coord)) {
      while (!self.position().equals(coord)) {
         if (self.isMoving()) {
            jSleep(100);
            if (waitCallback) waitCallback();
         } else {
            if (!moved) {
               moved = true;
               jAbsClick(coord, 1, 0);
            } else {
               jSleep(250);
               apiAbsMove(coord, waitCallback);
            }
         }
      }
      jSleep(100);
      return true;
   } else {
      var stayTimer = 0;
      if (jPFMove(jTilify(coord)) > 0) {
         var self = jGob(jGetMyID());
         while (!(self.position().dist(jTilify(coord)) <= 1) || self.isMoving()) {
            if (!self.isMoving()) {
               stayTimer += 100;
            } else stayTimer = 0;
            if (stayTimer > 5000) apiAbsMove(coord, waitCallback);
            jSleep(100);
         }
      } else {
         return false;
      }
   }
}

function apiWaitMove(coord, callback) {
   var self = jGob(jGetMyID());
   while (self.isMoving() || !(self.position().dist(coord) <= 1)) {
      jSleep(100);
      if (callback) callback();
   }
}

function apiResetCursor() {
   if (!jIsCursor("arw")) {
      jAbsClick(jCoord(0, 0), 3, 0);
      jWaitCursor("arw", actionTimeout);
   }
}

function apiDrinkWater(inventory) {
   var buckets = inventory.getItems("bucket-water");
   if (buckets.length > 0) {
      inventory.sortItems(buckets, "amount", false);
      var bucket = buckets[0];
      var bucket_coord = bucket.coord();
      if (bucket.isActual()) {
         bucket.take();
         jWaitDrag();
         var flasks = inventory.getItems("waterflask", "waterskin");
         if (flasks.length > 0) {
            var flask = flasks[0];
            if (flask.isActual()) {
               flask.itemact(0);
               jSleep(250);
               inventory.drop(bucket_coord);
               jWaitDrop();
            }
         }
      }
   }
   var flasks = inventory.getItems("waterflask", "waterskin");
   if (flasks.length > 0) {
      var flask = flasks[0];
      if (flask.isActual()) {
         flask.iact();
         if (jWaitPopup(actionTimeout)) {
            jSelectContextMenu("Drink");
            jWaitProgress();
         }
      }
   }
}

// =================================================================
// ========================   DIRECTION API   ========================
// =================================================================
var Direction = { };
Direction.North = jCoord(0, -11);
Direction.East = jCoord(11, 0);
Direction.South = jCoord(0, 11);
Direction.West = jCoord(-11, 0);

// =================================================================
// ========================   DEFAULT API   ============================
// =================================================================
/*function extend(Child, Parent) {
    var F = function() { }
   F.prototype = Parent.prototype
    Child.prototype = new F()
    Child.prototype.constructor = Child
    Child.superclass = Parent.prototype
}

function protoObject(gob) {
   this._gob = gob;
   this._position = gob.position();
}

protoObject.prototype.come = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMove(offset);
}

protoObject.prototype.near = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMoveStraight(offset);
}

function protoObjectCluster(direction) {
   this._objects = [ ];
   this._direction = direction;
}

protoObjectCluster.prototype.update = function(radius, objNames) {
   this._objects = [ ];
   for (var i = 0; i < objNames.length; i++) {
      var _objs = jGetObjects(radius, jCoord(0, 0), objNames[i]);
      for (var j = 0; j < _objs.length; j++) {
         this._objects.push(new protoObject(_objs[j]));
      }
   }
}
// =================================================================
// ========================   CONTAINER API   ========================
// =================================================================
function protoContainer(gob) {
   
}

extend(protoContainer, protoObject);

protoContainer.prototype.sync = function(_window) {
   while (_window.getInventories().length <= 0) jSleep(25);
   var _inv = _window.getInventories()[0];
   this._elements = [ ];
   this._freeSlots = _inv.freeSlots();
   var _itembuf = _inv.getItems("/");
   for (var i = 0; i < _itembuf.length; i++) {
      this._elements[i] = { };
      this._elements[i].resName = _itembuf[i].resName();
      this._elements[i].quality = _itembuf[i].quality();
      this._elements[i].amount = _itembuf[i].currentAmount();
   }
}

function protoContainerCluster(direction) {
   
}

extend(protoContainerCluster, protoObjectCluster);

protoContainerCluster.prototype.update = function(radius, name) {
   this._objects = [ ];
   for (var i = 0; i < objNames.length; i++) {
      var _objs = jGetObjects(radius, jCoord(0, 0), objNames[i]);
      for (var j = 0; j < _objs.length; j++) {
         this._objects.push(new protoObject(_objs[j]));
      }
   }
}

ContainerCluster.prototype._searchFunction = function(name, quality) {
   var _search = [];
   for (var i = 0; i < this._containers.length; i++) {
      var _buf = this._containers[i];
      _search[i] = 0;
      for (var j = 0; j < _buf._items.length; j++) {
         if (_buf._items[j].resName.indexOf(name) >= 0) {
            _search[i]++;
         }
      }
   }
   return _search;
}

ContainerCluster.prototype.findFreeSpace = function(quantity) {
   var _notupdated = [ ];
   for (var i = 0; i < this._containers.length; i++) {
      if (this._containers[i]._freeslots >= quantity) return this._containers[i];
      if (this._containers[i]._freeslots == -1) _notupdated.push(this._containers[i]);
   }
   if (_notupdated.length == 0) {
      for (var i = 0; i < this._containers.length; i++) {
         _notupdated.push(this._containers[i]);
      }
   }
   // Nothing found, update cluster
   for (var i = 0; i < _notupdated.length; i++) {
   
      _notupdated[i].come(this._direction);
      var _inv = _notupdated[i].open("Chest");
      _notupdated[i].sync(_inv);
      _notupdated[i].near(this._direction);
      
      if (_notupdated[i]._freeslots >= quantity) return _notupdated[i];
   }
   return false;
}

ContainerCluster.prototype.find = function(name, quantity, quality) {
   var _search = this._searchFunction(name, quality);
   var _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
   
   if (_total < quantity) {
      // Update cluster
      for (var c = 0; c < this._containers.length; c++) {
         this._containers[c].come(this._direction);
         // TODO multicont
         var _inv = this._containers[c].open("Chest");
         this._containers[c].sync(_inv);
         this._containers[c].near(this._direction);
         
         _search = this._searchFunction(name, quality);
         _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
         if (_total >= quantity) break;
      }
   }
   var _best = 0; var _bestid = 0;
   for (var i = 0; i < this._containers.length; i++) {
      if (_search[i] > _best) {
         _best = _search[i];
         _bestid = i;
         if (_best >= quantity) break;
      }
   }
   return this._containers[_bestid];
}

ContainerCluster.prototype.utilNeedItems = function(inventory, name, quality, amount) {
   var _currentItems = inventory.getItems(name);
   var _have = 0;
   for (var i = 0; i < _currentItems.length; i++) {
      if (_currentItems[i].quality() >= quality) _have++;
   }
   while (_have != amount) {
      var _need = amount - _have;
      var _container = this.find(name, quality, 1);
      _container.come(this._direction);
      // TODO multicont
      var _inv = _container.open("Chest");
      var _citems = _inv.getItems(name);
      for (var i = 0; i < _citems.length; i++) {
         if (_citems[i].quality() >= quality) {
            _citems[i].transfer();
            apiWaitUnActual(_citems[i]);
            _have++;
            if (_have == amount) break;
         }
      }
      _container.sync(_inv);
      _container.near(this._direction);
   }
   return true;
}

ContainerCluster.prototype.putItems = function(fn_itemfilter) {
   var _items = fn_itemfilter();
   while (_items.length > 0) {
      var _nexttable = this.findFreeSpace(1);
      _nexttable.come(this._direction);
      var _inv = _nexttable.open("Chest");
      for (var i = 0; i < _items.length; i++) {
         if (_inv.freeSlots() == 0) break;
         _items[i].transfer();
         apiWaitUnActual(_items[i]);
      }
      _nexttable.sync(_inv);
      _nexttable.near(this._direction);
      _items = fn_itemfilter();
   }
}*/
// =================================================================
// ========================   HERBALIST TABLE   ========================
// =================================================================
function Table(gob) {
   this._gob = gob;
   this._position = gob.position();
   this._elements = [];
   this._freeslots = -1;
}

Table.prototype.sync = function(inv) {
   while (true) {
      try {
         this._freeslots = inv.freeSlots();
         break;
      } catch (ex) {
         
      }
   }
   this._elements = [ ];
   var _itembuf = inv.getItems("/");
   for (var i = 0; i < _itembuf.length; i++) {
      this._elements[i] = { };
      this._elements[i].resName = _itembuf[i].resName();
      this._elements[i].quality = _itembuf[i].quality();
      this._elements[i].amount = _itembuf[i].currentAmount();
   }
}

Table.prototype.come = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMove(offset);
}

Table.prototype.near = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMoveStraight(offset);
}

Table.prototype.open = function() {
   var _window = null;
   while (true) {
      this._gob.doClick(3, 0);
      jDropLastWindow();
      _window = jWaitNewWindow("Herbalist Table", actionTimeout);
      if (_window != null) break;
      jSleep(50);
   }
   var _inv = null;
   while (true) {
      _inv = _window.getInventories();
      if (_inv.length == 1) break;
      jSleep(50);
   }
   return _inv[0];
}

function TableCluster(direction) {
   this._tables = [];
   this._direction = direction;
}

TableCluster.prototype.update = function(radius) {
   var _objs = jGetObjects(radius, jCoord(0, 0), "gfx/terobjs/htable");
   this._tables = [];
   for (var i = 0; i < _objs.length; i++) {
      this._tables[i] = new Table(_objs[i]);
   }
   jPrint("Found " + this._tables.length + " tables");
}

TableCluster.prototype.findFreeSpace = function(quantity) {
   var _notupdated = [ ];
   for (var i = 0; i < this._tables.length; i++) {
      if (this._tables[i]._freeslots >= quantity) return this._tables[i];
      if (this._tables[i]._freeslots == -1) _notupdated.push(this._tables[i]);
   }
   if (_notupdated.length == 0) {
      for (var i = 0; i < this._tables.length; i++) {
         _notupdated.push(this._tables[i]);
      }
   }
   // Nothing found, update cluster
   for (var i = 0; i < _notupdated.length; i++) {
   
      _notupdated[i].come(this._direction);
      var _inv = _notupdated[i].open();
      _notupdated[i].sync(_inv);
      _notupdated[i].near(this._direction);
      
      if (_notupdated[i]._freeslots >= quantity) return _notupdated[i];
   }
   return false;
}

TableCluster.prototype.putItems = function(fn_itemfilter) {
   var _items = fn_itemfilter();
   while (_items.length > 0) {
      var _nexttable = this.findFreeSpace(1);
      _nexttable.come(this._direction);
      var _inv = _nexttable.open();
      for (var i = 0; i < _items.length; i++) {
         try {
            if (_inv.freeSlots() == 0) break;
         } catch (ex) {
            // Dat java :(
            break;
         }
         _items[i].transfer();
         apiWaitUnActual(_items[i]);
      }
      _nexttable.sync(_inv);
      _nexttable.near(this._direction);
      _items = fn_itemfilter();
   }
}

TableCluster.prototype._searchFunction = function(name, quality) {
   var _search = [];
   for (var i = 0; i < this._tables.length; i++) {
      var _buf = this._tables[i];
      _search[i] = 0;
      for (var j = 0; j < _buf._elements.length; j++) {
         if (_buf._elements[j].resName.indexOf(name) >= 0) {
            _search[i]++;
         }
      }
   }
   return _search;
}

TableCluster.prototype.find = function(name, quantity, quality) {
   var _search = this._searchFunction(name, quality);
   var _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
   
   if (_total < quantity) {
      // Update cluster
      for (var c = 0; c < this._tables.length; c++) {
         if (this._tables[c]._freeslots != -1) continue;
         this._tables[c].come(this._direction);
         // TODO multicont
         var _inv = this._tables[c].open();
         this._tables[c].sync(_inv);
         this._tables[c].near(this._direction);
         
         _search = this._searchFunction(name, quality);
         _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
         if (_total >= quantity) break;
      }
   }
   var _best = 0; var _bestid = 0;
   for (var i = 0; i < this._tables.length; i++) {
      if (_search[i] > _best) {
         _best = _search[i];
         _bestid = i;
         if (_best >= quantity) break;
      }
   }
   return this._tables[_bestid];
}

TableCluster.prototype.utilNeedItems = function(inventory, name, quality, amount) {
   var _currentItems = inventory.getItems(name);
   var _have = 0;
   for (var i = 0; i < _currentItems.length; i++) {
      if (_currentItems[i].quality() >= quality) _have++;
   }
   while (_have != amount) {
      var _need = amount - _have;
      var _container = this.find(name, 1, quality);
      _container.come(this._direction);
      // TODO multicont
      var _inv = _container.open();
      var _citems = _inv.getItems(name);
      for (var i = 0; i < _citems.length; i++) {
         if (_citems[i].quality() >= quality) {
            _citems[i].transfer();
            apiWaitUnActual(_citems[i]);
            _have++;
            if (_have == amount) break;
         }
      }
      _container.sync(_inv);
      _container.near(this._direction);
   }
   return true;
}
// =================================================================
// ============================   BARREL   ============================
// =================================================================
function Barrel(gob) {
   this._gob = gob;
   this._position = gob.position();
   this._quantity = -1;
   this._quality = -1;
   this._liquid = "";
}

Barrel.prototype.sync = function(wnd) {
   var str = wnd.getLabelText(1);
   if (str == "This barrel is empty.") {
      this._quantity = 0;
      this._quality = 0;
      this._liquid = "";
      return;
   }
   var regex = /This barrel contains ([\d\.]+) liters of quality (\d+) (\w+)\./;
   var result = regex.exec(str);
   if (result.length == 4) {
      this._quantity = parseFloat(result[1]);
      this._quality = parseInt(result[2]);
      this._liquid = result[3];
   }
}

Barrel.prototype.come = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMove(offset);
}

Barrel.prototype.near = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMoveStraight(offset);
}

Barrel.prototype.open = function() {
   var _window = null;
   while (true) {
      this._gob.doClick(3, 0);
      jDropLastWindow();
      _window = jWaitNewWindow("Barrel", actionTimeout);
      if (_window != null) break;
      jSleep(50);
   }
   return _window;
}

Barrel.prototype.interact = function() {
   this._gob.interactClick(0);
}

function BarrelCluster(direction) {
   this._barrels = [];
   this._direction = direction;
}

BarrelCluster.prototype.update = function(radius) {
   var _objs = jGetObjects(radius, jCoord(0, 0), "gfx/terobjs/barrel");
   this._barrels = [];
   for (var i = 0; i < _objs.length; i++) {
      this._barrels[i] = new Barrel(_objs[i]);
   }
}

BarrelCluster.prototype.find = function(name, quantity, quality) {
   for (var i = 0; i < this._barrels.length; i++) {
      if (this._barrels[i]._liquid == name
         && this._barrels[i]._quantity >= quantity
         && this._barrels[i]._quality >= quality) {
         return this._barrels[i];
      }
   }
   // Nothing was found, go check cluster
   for (var i = 0; i < this._barrels.length; i++) {
      this._barrels[i].come(this._direction);
      var _window = this._barrels[i].open();
      this._barrels[i].sync(_window);
      this._barrels[i].near(this._direction);
      
      if (this._barrels[i]._liquid == name
         && this._barrels[i]._quantity >= quantity
         && this._barrels[i]._quality >= quality) {
         return this._barrels[i];
      }
   }
}

BarrelCluster.prototype.utilFillBucket = function(inventory, barrel) {
   var _buckets = inventory.getItems("gfx/invobjs/buckete");
   if (_buckets.length == 0) {
      _buckets = inventory.getItems("gfx/invobjs/bucket-");
      if (_buckets.length > 0) {
         _buckets[0].iact();
         if (jWaitPopup(actionTimeout)) {
            jSelectContextMenu("Empty");
            apiWaitResName(_buckets[0], "gfx/invobjs/buckete", 100500);
         }
      }
      _buckets = inventory.getItems("gfx/invobjs/buckete");
   }
   if (_buckets.length == 0) {
      jPrint("No buckets!");
      return false;
   }
   barrel.come(this._direction);
   for (var i = 0; i < _buckets.length; i++) {
      if (barrel.quantity <= 0) break;
      var _coord = _buckets[i].coord();
      _buckets[i].take();
      if (jWaitDrag(actionTimeout)) {
         barrel.interact();
         var _drag = jGetDraggingItem();
         if (apiWaitResOtherName(_drag, "gfx/invobjs/buckete", actionTimeout)) {
            // Everything is ok
         }
         inventory.drop(_coord);
         jWaitDrop(actionTimeout);
      }
      var _window = barrel.open();
      barrel.sync(_window);
   }
   barrel.near(this._direction);
   return true;
}
// =================================================================
// =========================   CONTAINER   ========================
// =================================================================
function Container(gob) {
   this._gob = gob;
   this._position = gob.position();
   this._items = [];
   this._freeslots = -1;
}

Container.prototype.sync = function(inv) {
   this._freeslots = inv.freeSlots();
   var _itembuf = inv.getItems("/");
   this._items = [ ];
   for (var i = 0; i < _itembuf.length; i++) {
      this._items[i] = { };
      this._items[i].resName = _itembuf[i].resName();
      this._items[i].quality = _itembuf[i].quality();
   }
}

Container.prototype.come = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMove(offset);
}

Container.prototype.near = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMoveStraight(offset);
}

Container.prototype.open = function() {
   var _window = null;
   while (true) {
      this._gob.doClick(3, 0);
      var name = "Chest";
      if (this._gob.name().contains("cupboard")) name = "Cupboard";
      jDropLastWindow();
      _window = jWaitNewWindow(name, actionTimeout);
      if (_window != null) break;
      jSleep(50);
   }
   var _inv = null;
   while (true) {
      _inv = _window.getInventories();
      if (_inv.length == 1) break;
      jSleep(50);
   }
   return _inv[0];
}

function ContainerCluster(direction) {
   this._containers = [];
   this._direction = direction;
}

ContainerCluster.prototype.update = function(radius, name) {
   var _objs = jGetObjects(radius, jCoord(0, 0), name);
   this._containers = [];
   for (var i = 0; i < _objs.length; i++) {
      this._containers[i] = new Container(_objs[i]);
   }
}

ContainerCluster.prototype.updateFromObjs = function(objs) {
   this._containers = [];
   for (var i = 0; i < objs.length; i++) {
      this._containers[i] = new Container(objs[i]);
   }
}

ContainerCluster.prototype._searchFunction = function(name, quality) {
   var _search = [];
   for (var i = 0; i < this._containers.length; i++) {
      var _buf = this._containers[i];
      _search[i] = 0;
      for (var j = 0; j < _buf._items.length; j++) {
         if (_buf._items[j].resName.indexOf(name) >= 0) {
            _search[i]++;
         }
      }
   }
   return _search;
}

ContainerCluster.prototype.findFreeSpace = function(quantity) {
   var _notupdated = [ ];
   for (var i = 0; i < this._containers.length; i++) {
      if (this._containers[i]._freeslots >= quantity) return this._containers[i];
      if (this._containers[i]._freeslots == -1) _notupdated.push(this._containers[i]);
   }
   if (_notupdated.length == 0) {
      for (var i = 0; i < this._containers.length; i++) {
         _notupdated.push(this._containers[i]);
      }
   }
   // Nothing found, update cluster
   for (var i = 0; i < _notupdated.length; i++) {
   
      _notupdated[i].come(this._direction);
      var _inv = _notupdated[i].open("Chest");
      _notupdated[i].sync(_inv);
      _notupdated[i].near(this._direction);
      
      if (_notupdated[i]._freeslots >= quantity) return _notupdated[i];
   }
   return false;
}

ContainerCluster.prototype.find = function(name, quantity, quality) {
   var _search = this._searchFunction(name, quality);
   var _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
   
   if (_total < quantity) {
      // Update cluster
      for (var c = 0; c < this._containers.length; c++) {
         if (this._containers[c]._freeslots != -1) continue;
         this._containers[c].come(this._direction);
         // TODO multicont
         var _inv = this._containers[c].open("Chest");
         this._containers[c].sync(_inv);
         this._containers[c].near(this._direction);
         
         _search = this._searchFunction(name, quality);
         _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
         if (_total >= quantity) break;
      }
   }
   if (_total == 0) return false;
   
   var _best = 0; var _bestid = 0;
   for (var i = 0; i < this._containers.length; i++) {
      if (_search[i] > _best) {
         _best = _search[i];
         _bestid = i;
         if (_best >= quantity) break;
      }
   }
   return this._containers[_bestid];
}

ContainerCluster.prototype.utilNeedItems = function(inventory, name, quality, amount, cam) {
   if (cam == null || cam == undefined) cam = 100500;
   var _currentItems = inventory.getItems(name);
   var _have = 0;
   for (var i = 0; i < _currentItems.length; i++) {
      if (_currentItems[i].quality() >= quality && _currentItems[i].currentAmount() < cam) _have++;
   }
   while (_have != amount) {
      var _need = amount - _have;
      var _container = this.find(name, 1, quality);
      if (_container === false) return _have;
      _container.come(this._direction);
      // TODO multicont
      var _inv = _container.open();
      var _citems = _inv.getItems(name);
      for (var i = 0; i < _citems.length; i++) {
         if (_citems[i].quality() >= quality && _citems[i].currentAmount() < cam) {
            _citems[i].transfer();
            apiWaitUnActual(_citems[i]);
            _have++;
            if (_have == amount) break;
         }
      }
      _container.sync(_inv);
      _container.near(this._direction);
   }
   return true;
}

ContainerCluster.prototype.putItems = function(fn_itemfilter) {
   var _items = fn_itemfilter();
   while (_items.length > 0) {
      var _nexttable = this.findFreeSpace(1);
      _nexttable.come(this._direction);
      var _inv = _nexttable.open("Chest");
      for (var i = 0; i < _items.length; i++) {
         try {
            if (_inv.freeSlots() == 0) break;
         } catch (ex) {
            // Dat java :(
            break;
         }
         _items[i].transfer();
         apiWaitUnActual(_items[i]);
      }
      _nexttable.sync(_inv);
      _nexttable.near(this._direction);
      _items = fn_itemfilter();
   }
}
// =================================================================
// =========================   CAULDRON   ========================
// =================================================================
function Cauldron(gob) {
   this._gob = gob;
   this._position = gob.position();
   this._water = -1;
   this._fire = -1;
}

Cauldron.prototype.liquid = function() {
   return this._water;
}

Cauldron.prototype.fuel = function() {
   return this._fire;
}

Cauldron.prototype.sync = function(wnd) {
   this._water = wnd.getMeterValue(1);
   this._fire = wnd.getMeterValue(2);
}

Cauldron.prototype.interact = function() {
   this._gob.interactClick(0);
}

Cauldron.prototype.come = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMove(offset);
}

Cauldron.prototype.near = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMoveStraight(offset);
}

Cauldron.prototype.open = function() {
   var _window = null;
   while (true) {
      this._gob.doClick(3, 0);
      jDropLastWindow();
      _window = jWaitNewWindow("Cauldron", actionTimeout);
      if (_window != null) break;
      jSleep(50);
   }
   return _window;
}

function findCauldrons(radius) {
   var _objs = jGetObjects(radius, jCoord(0, 0), "gfx/terobjs/cauldron");
   var _objarr = [];
   for (var i = 0; i < _objs.length; i++) {
      _objarr[i] = new Cauldron(_objs[i]);
   }
   return _objarr;
}

function Cauldron(gob) {
   this._gob = gob;
   this._position = gob.position();
   this._water = -1;
   this._fire = -1;
}

Cauldron.prototype.liquid = function() {
   return this._water;
}

Cauldron.prototype.fuel = function() {
   return this._fire;
}

Cauldron.prototype.sync = function(wnd) {
   this._water = wnd.getMeterValue(1);
   this._fire = wnd.getMeterValue(2);
}

Cauldron.prototype.interact = function() {
   this._gob.interactClick(0);
}

Cauldron.prototype.come = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMove(offset);
}

Cauldron.prototype.near = function(direction) {
   var offset = this._position.add(direction);
   apiAbsMoveStraight(offset);
}

// =================================================================
// ============================   KILN   ============================
// =================================================================
function Kiln(gob) {
   this._gob = gob;
   this._position = gob.position();
   this._items = [];
   this._freeslots = -1;
   this._fuel = -1;
}

Kiln.prototype.sync = function(inv) {
   try {
      this._freeslots = inv.freeSlots();
   } catch (ex) {
      jSleep(100);
      this._freeslots = inv.freeSlots();
   }
   var _itembuf = inv.getItems("/");
   this._items = [ ];
   for (var i = 0; i < _itembuf.length; i++) {
      this._items[i] = { };
      this._items[i].resName = _itembuf[i].resName();
      this._items[i].quality = _itembuf[i].quality();
   }
}

Kiln.prototype.count = function(name) {
   var count = 0;
   for (var i = 0; i < this._items.length; i++) {
      if (this._items[i].resName.contains(name)) {
         count++;
      }
   }
   return count;
}

Kiln.prototype.come = function(direction) {
   var offset = this._position.add(direction.mul(2, 2));
   apiAbsMove(offset);
}

Kiln.prototype.near = function(direction) {
   var offset = this._position.add(direction.mul(2, 2));
   apiAbsMoveStraight(offset);
}

Kiln.prototype.open = function() {
   var _window = null;
   while (true) {
      this._gob.doClick(3, 0);
      jDropLastWindow();
      _window = jWaitNewWindow("Kiln", actionTimeout);
      this._fuel = _window.getMeterValue(1);
      if (_window != null) break;
      jSleep(50);
   }
   var _inv = null;
   while (true) {
      _inv = _window.getInventories();
      if (_inv.length == 1) break;
      jSleep(50);
   }
   return _inv[0];
}

function KilnCluster(direction) {
   this._containers = [];
   this._direction = direction;
}

KilnCluster.prototype.update = function(radius, name) {
   var _objs = jGetObjects(radius, jCoord(0, 0), name);
   this._containers = [];
   for (var i = 0; i < _objs.length; i++) {
      this._containers[i] = new Kiln(_objs[i]);
   }
}

KilnCluster.prototype.updateFromObjs = function(objs) {
   this._containers = [];
   for (var i = 0; i < objs.length; i++) {
      this._containers[i] = new Kiln(objs[i]);
   }
}

KilnCluster.prototype.updateState = function() {
   for (var i = 0; i < this._containers.length; i++) {
      if (this._containers[i]._freeslots == -1) {
         this._containers[i].come(this._direction);
         var _inv = this._containers[i].open();
         this._containers[i].sync(_inv);
         this._containers[i].near(this._direction);
      }
   }
}

KilnCluster.prototype._searchFunction = function(name, quality) {
   var _search = [];
   for (var i = 0; i < this._containers.length; i++) {
      var _buf = this._containers[i];
      _search[i] = 0;
      for (var j = 0; j < _buf._items.length; j++) {
         if (_buf._items[j].resName.indexOf(name) >= 0) {
            _search[i]++;
         }
      }
   }
   return _search;
}

KilnCluster.prototype.findFreeSpace = function(quantity) {
   var _notupdated = [ ];
   for (var i = 0; i < this._containers.length; i++) {
      if (this._containers[i]._freeslots >= quantity) return this._containers[i];
      if (this._containers[i]._freeslots == -1) _notupdated.push(this._containers[i]);
   }
   if (_notupdated.length == 0) {
      for (var i = 0; i < this._containers.length; i++) {
         _notupdated.push(this._containers[i]);
      }
   }
   // Nothing found, update cluster
   for (var i = 0; i < _notupdated.length; i++) {
   
      _notupdated[i].come(this._direction);
      var _inv = _notupdated[i].open("Kiln");
      _notupdated[i].sync(_inv);
      _notupdated[i].near(this._direction);
      
      if (_notupdated[i]._freeslots >= quantity) return _notupdated[i];
   }
   return false;
}

KilnCluster.prototype.find = function(name, quantity, quality) {
   var _search = this._searchFunction(name, quality);
   var _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
   
   if (_total < quantity) {
      // Update cluster
      for (var c = 0; c < this._containers.length; c++) {
         if (this._containers[c]._freeslots != -1) continue;
         this._containers[c].come(this._direction);
         // TODO multicont
         var _inv = this._containers[c].open("Kiln");
         this._containers[c].sync(_inv);
         this._containers[c].near(this._direction);
         
         _search = this._searchFunction(name, quality);
         _total = 0; for (var i = 0; i < _search.length; i++) _total += _search[i];
         if (_total >= quantity) break;
      }
   }
   if (_total == 0) return false;
   
   var _best = 0; var _bestid = 0;
   for (var i = 0; i < this._containers.length; i++) {
      if (_search[i] > _best) {
         _best = _search[i];
         _bestid = i;
         if (_best >= quantity) break;
      }
   }
   return this._containers[_bestid];
}

KilnCluster.prototype.utilNeedItems = function(inventory, name, quality, amount, cam) {
   if (cam == null || cam == undefined) cam = 100500;
   var _currentItems = inventory.getItems(name);
   var _have = 0;
   for (var i = 0; i < _currentItems.length; i++) {
      if (_currentItems[i].quality() >= quality && _currentItems[i].currentAmount() < cam) _have++;
   }
   while (_have != amount) {
      var _need = amount - _have;
      var _container = this.find(name, 1, quality);
      if (_container === false) return _have;
      _container.come(this._direction);
      // TODO multicont
      var _inv = _container.open();
      var _citems = _inv.getItems(name);
      for (var i = 0; i < _citems.length; i++) {
         if (_citems[i].quality() >= quality && _citems[i].currentAmount() < cam) {
            _citems[i].transfer();
            apiWaitUnActual(_citems[i]);
            _have++;
            if (_have == amount) break;
         }
      }
      _container.sync(_inv);
      _container.near(this._direction);
   }
   return true;
}

KilnCluster.prototype.putItems = function(fn_itemfilter) {
   var _items = fn_itemfilter();
   while (_items.length > 0) {
      var _nexttable = this.findFreeSpace(1);
      if (_nexttable === false) return false;
      _nexttable.come(this._direction);
      var _inv = _nexttable.open("Kiln");
      for (var i = 0; i < _items.length; i++) {
         try {
            if (_inv.freeSlots() == 0) break;
         } catch (ex) {
            // Dat java :(
            break;
         }
         _items[i].transfer();
         apiWaitUnActual(_items[i]);
      }
      _nexttable.sync(_inv);
      _nexttable.near(this._direction);
      _items = fn_itemfilter();
   }
   return true;
}

KilnCluster.prototype.count = function(name) {
   var count = 0;
   for (var i = 0; i < this._containers.length; i++) {
      count += this._containers[i].count(name);
   }
   return count;
}

KilnCluster.prototype.full = function(name) {
   var ret = [ ];
   for (var i = 0; i < this._containers.length; i++) {
      if (this._containers[i].count(name) == 25) {
         ret.push(this._containers[i]);
      }
   }
   return ret;
}

KilnCluster.prototype.notfull = function() {
   var ret = [ ];
   for (var i = 0; i < this._containers.length; i++) {
      if (this._containers[i].count("/") != 25) {
         ret.push(this._containers[i]);
      }
   }
   return ret;
}
User avatar
talon00302
 
Posts: 516
Joined: Sun Apr 15, 2012 8:30 pm

Re: Union Client Scripts

Postby talon00302 » Mon Apr 21, 2014 5:09 am

link to all of these plus far more.

https://www.dropbox.com/s/fjhk2kob3b2u2i4/Bots.7z
User avatar
talon00302
 
Posts: 516
Joined: Sun Apr 15, 2012 8:30 pm

Re: Union Client Scripts

Postby windmaker » Mon Apr 21, 2014 10:05 pm

someone seems mad (Because die) and liberate all this beatufil but public like year ago scripts.
also if someone want more scritps can check it in russian forum of hnh [ http://havenandhearth.ru/viewtopic.php?f=17&t=1524 ] .

o7
Image #swag
User avatar
windmaker
 
Posts: 1855
Joined: Thu Mar 29, 2012 7:08 am
Location: in the forum where some mods are fags.

Re: Union Client Scripts

Postby julian12it » Mon Apr 21, 2014 10:22 pm

You just posted all of the Union old scripts, everyone and their mother has it.
User avatar
julian12it
 
Posts: 787
Joined: Sat Sep 11, 2010 8:01 pm
Location: Topaz

Re: Union Client Scripts

Postby windmaker » Mon Apr 21, 2014 10:23 pm

julian12it wrote:You just posted all of the Union old scripts, everyone and their mother has it.

yep.
Image #swag
User avatar
windmaker
 
Posts: 1855
Joined: Thu Mar 29, 2012 7:08 am
Location: in the forum where some mods are fags.

Re: Union Client Scripts

Postby talon00302 » Tue Apr 22, 2014 7:14 am

Actually I keep getting asked by villagers for scripts so I figured I'd just post here lol :lol:
User avatar
talon00302
 
Posts: 516
Joined: Sun Apr 15, 2012 8:30 pm

PreviousNext

Return to The Wizards' Tower

Who is online

Users browsing this forum: Claude [Bot] and 0 guests