Union Client Scripts

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

Moderator: Phades

Re: Union Client Scripts

Postby Arcanist » Sat Mar 07, 2015 4:18 am

jSelectPopupMenu() must be a function in the API

The correct method is jSelectContextMenu(name)

nothing to do with waitpopup, although adding some error checking wouldn't be a bad idea.
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby Wallbound » Sun Mar 08, 2015 9:27 pm

Having a problem with the farmer script. I had to wipe my PC. Everything worked fine before the wipe now I can't use the farmer script. I get these Errors:


C:\Users\Wallbound\Desktop\builder2\build2>.\update\HnH_updater.exe
The system cannot find the path specified.

C:\Users\Wallbound\Desktop\builder2\build2>"C:\Program Files (x86)\Java\jre1.8.0
_40\bin\java.exe" -Xms256m -Xmx512m -jar haven.jar moltke.seatribe.se
Mar 08, 2015 4:21:17 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0
x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Script: farmer.jbot Thread: 40 Started.
java.lang.ArrayIndexOutOfBoundsException: 19567
at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader
.accept(ClassReader.java:342)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader
.accept(ClassReader.java:300)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.ClassDescr
iptor.<init>(ClassDescriptor.java:67)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.ClassDescr
iptor.getInstance(ClassDescriptor.java:82)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.MethodDesc
riptor.getInstance(MethodDescriptor.java:120)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.java.lang.refle
ct._Method.isVarArgs(_Method.java:96)
at org.mozilla.javascript.jdk15.VMBridge_jdk15.isVarArgs(VMBridge_jdk15.
java:64)
at org.mozilla.javascript.MemberBox.init(MemberBox.java:79)
at org.mozilla.javascript.MemberBox.<init>(MemberBox.java:67)
at org.mozilla.javascript.JavaMembers.reflect(JavaMembers.java:492)
at org.mozilla.javascript.JavaMembers.<init>(JavaMembers.java:76)
at org.mozilla.javascript.JavaMembers.lookupClass(JavaMembers.java:847)
at org.mozilla.javascript.NativeJavaObject.initMembers(NativeJavaObject.
java:90)
at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:
80)
at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:
70)
at org.mozilla.javascript.WrapFactory.wrapAsJavaObject(WrapFactory.java:
148)
at org.mozilla.javascript.WrapFactory.wrap(WrapFactory.java:105)
at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:25
8)
at org.mozilla.javascript.optimizer.OptRuntime.callProp0(OptRuntime.java
:119)
at org.mozilla.javascript.gen.farmer_jbot_1._c_main_46(farmer.jbot:811)
at org.mozilla.javascript.gen.farmer_jbot_1.call(farmer.jbot)
at org.mozilla.javascript.optimizer.OptRuntime.callName0(OptRuntime.java
:108)
at org.mozilla.javascript.gen.farmer_jbot_1._c_script_0(farmer.jbot:857)

at org.mozilla.javascript.gen.farmer_jbot_1.call(farmer.jbot)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:4
26)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:317
8)
at org.mozilla.javascript.gen.farmer_jbot_1.call(farmer.jbot)
at org.mozilla.javascript.gen.farmer_jbot_1.exec(farmer.jbot)
at org.mozilla.javascript.Context.evaluateString(Context.java:1111)
at union.JSThread.run(JSThread.java:58)
Script: farmer.jbot Thread: 40 Finished.


Can someone tell me what's wrong?
Wallbound
 
Posts: 20
Joined: Thu Jul 11, 2013 7:39 pm

Re: Union Client Scripts

Postby Arcanist » Sun Mar 08, 2015 9:44 pm

Use java 1.70
not 1.8
the latest 1.75 seems to throw errors too, so make sure you get 1.70
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby BangPow » Sat Mar 21, 2015 8:41 pm

What Farming script on here works? and how do you make it work... I can't get the one I thought worked to work... I have a buck and flask run farmer bot, click on the type (Flax), then it says script finished.... and it won't exit the crop type tab. Or maybe this bot doesn't harvest, just plants?
Before enlightenment - chop wood, carry water. After enlightenment - chop wood, carry water. ~Zen Buddhist Proverb
User avatar
BangPow
 
Posts: 427
Joined: Tue May 31, 2011 4:15 am
Location: Now.......... Awakened

Re: Union Client Scripts

Postby lcharle8 » Tue Mar 24, 2015 5:07 pm

Does anyone have a working Grape & Tea harvester?

My tea harvester doesnt drop tea leaves or store in container.
lcharle8
 
Posts: 38
Joined: Sat Feb 22, 2014 4:45 am

Re: Union Client Scripts

Postby julian12it » Tue Mar 24, 2015 7:56 pm

lcharle8 wrote:Does anyone have a working Grape & Tea harvester?

My tea harvester doesnt drop tea leaves or store in container.

Just get a Container, that's the best way to store them. Have another account to just withdraw the leaves if the field is large.
User avatar
julian12it
 
Posts: 787
Joined: Sat Sep 11, 2010 8:01 pm
Location: Topaz

Re: Union Client Scripts

Postby Arcanist » Wed Mar 25, 2015 4:19 am

Code: Select all
//#! name = Farmer
//#! uniq = farmer_apxproductions
//#! icon = gfx/invobjs/seed-hops
// Globals
var inventory = checkInventory();
var harvester;
include("pathfinder");
include("jBotAPIArcanist");
// Settings
var actionTimeout = 1000 * 60 * 2;   // Lag timeout
var cannotPlantTimeout = 1000 * 10;   // Non-plowed tile timeout
var cropRadius = 3;               // Ðàäèóñ â êîòîðì èäåò ïîèñê (âåðõ, ïðàâî, íèç, ëåâî)

// Flags
var stopFlag = false;

/* =========================================================================== */
/* ==============================   ÌÎÐÊÎÂÊÀ   ============================== */
/* =========================================================================== */
function CarrotHarvester() {
    this.cropName = "plants/carrot";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/carrot";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 4;                  // Ñòàäèÿ îáðàáîòêè
}
CarrotHarvester.prototype.processHarvestedGoods = function() {
    inventory = checkInventory();
   
   var seeds = inventory.getItems(this.cropSeedName);
   var free = inventory.freeSlots();
   var i = 0;
   if (free < 3) {
      inventory.sortItems(seeds, "quality", false);
      for (i = 0; i < 3 - free; i++) {
         // Åñòü ìîðêîâü åñëè ãîëîäåí
         if (jGetHungry() < 50) {
            if (seeds[i].isActual()) {
               seeds[i].iact();
               jWaitPopup(actionTimeout);
            jSleep(1000);
               jSelectContextMenu("Eat");
               waitUnActual(seeds[i]);
            }
         }
         // Âûáðîñèòü ëèøêó
         if (seeds[i].isActual()) {
            seeds[i].drop();
         }
      }
   }
};


/* =========================================================================== */
/* ==============================   ÑÂÅÊËÀ      ============================== */
/* =========================================================================== */
function BeetHarvester() {
    this.cropName = "plants/beetroot";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/beetroot";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
BeetHarvester.prototype.processHarvestedGoods = function() {
    inventory = checkInventory();
   
   var seeds = inventory.getItems(this.cropSeedName);
   var free = inventory.freeSlots();
   var i = 0;
   //dropsleaves
   var leaves = inventory.getItems("beetrootleaves");
   if(leaves.length > 0)
      if(leaves[0].isActual()){
     if (jIsDragging()) dropFromCursor();
         leaves[0].dropSuchAll();}
   while(leaves.length > 0)
   {
      leaves = inventory.getItems("beetrootleaves");
      jSleep(500);
   }
   if (free < 6) {
      inventory.sortItems(seeds, "quality", false);
      for (i = 0; i < 4 - free; i++) {
         if (jGetHungry() < 1) {
            if (seeds[i].isActual()) {
               seeds[i].iact();
               jWaitPopup(actionTimeout);
               jSelectContextMenu("Eat");
               waitUnActual(seeds[i]);
            }
         }
         if (seeds[i].isActual()) {
            seeds[i].drop();
         }
      }
   }
};

/* =========================================================================== */
/* ==============================   ÂÈÍÎÃÐÀÄ   ============================== */
/* =========================================================================== */
function WineHarvester() {
    this.cropName = "plants/wine";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-grape";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.packName = "invobjs/grapes";
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
   this.barrelID = 0; //id of barrel
   this.pressID = 0; //id of winepress
   this.containerID = 0;
   this.startCoord = jCoord(0, 0);
   this.fieldSize = jCoord(0, 0);
   this.offsMove = jCoord(0, 2);
}

WineHarvester.prototype.selectObjects = function() {
   var bar = jSelectObject("Select barrel...");
   if(bar.name().indexOf("barrel") == -1)
   {
      jToConsole("ERROR: This is not a barrel!");
      return false;
   }
   else this.barrelID = bar.getID();
   var pr = jSelectObject("Select winepress...");
   if(pr.name().indexOf("winepress") == -1)
   {
      jToConsole("ERROR: This is not a press!");
      return false;
   }
   else this.pressID = pr.getID();
   var cnt = jSelectObject("Select container (chest/lchest)...");
   if(cnt.name().indexOf("cclosed") == -1 && cnt.name().indexOf("lchest") == -1)
   {
      jToConsole("ERROR: This is not a container!");
      return false;
   }
   else this.containerID = cnt.getID();
   return true;
}

WineHarvester.prototype.selectOffsetSide = function() {
   var res = false;
   var blist = ["West", "East", "North", "South", "Exit"];
   var selectWindow = jGUIWindow(jCoord(450, 250), jCoord(105, blist.length * 25 + 15), "Offset");
   var label = jGUILabel(selectWindow, jCoord(0, 5), "Select offset from objects.");
   for(var i = 0; i < blist.length; i++)
      jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
   selectWindow.toggleCloseButton();
   var btext = selectWindow.waitButtonClick();
   if(btext == blist[0]) {this.offsMove = jCoord(-2, 0); res = true;}
   if(btext == blist[1]) {this.offsMove = jCoord(2, 0); res = true;}
   if(btext == blist[2]) {this.offsMove = jCoord(0, -2); res = true;}
   if(btext == blist[3]) {this.offsMove = jCoord(0, 2); res = true;}
   if(btext == blist[4]) res = false;
   selectWindow.destroy();
   return res;
}

WineHarvester.prototype.selectRect = function() {
   var offs = jCoord(0, 0);
   var size = jCoord(1, 1);
   var confirm = false;
   jDrawGroundRect(offs, size);
   var blist = ["West", "East", "North", "South", "Inc width", "Inc height", "Dec width", "Dec height", "Confirm", "Exit"];
   var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(105, blist.length * 25 + 15), "Area");
   var label = jGUILabel(selectWindow, jCoord(5, 5), "Select grapes area.");
   for(var i = 0; i < blist.length; i++)
      jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
   selectWindow.toggleCloseButton();
   var btext = "";
   while(btext != "Exit"){
      btext = selectWindow.waitButtonClick();
      if(btext == blist[0]) offs.x--;
      if(btext == blist[1]) offs.x++;
      if(btext == blist[2]) offs.y--;
      if(btext == blist[3]) offs.y++;
      if(btext == blist[4]) size.x++;
      if(btext == blist[5]) size.y++;
      if(btext == blist[6]) if(size.x > 1) size.x--;
      if(btext == blist[7]) if(size.y > 1) size.y--;
      if(btext == blist[8]) {confirm = true; break;}
      jDrawGroundRect(offs, size);
   }
   selectWindow.destroy();
   jDrawGroundRect(offs, jCoord(0, 0));
   this.startCoord = jMyCoords().add(offs.mul(11));
   this.fieldSize = size;
   return confirm;
}

WineHarvester.prototype.processHarvesting = function() {
   var result = false;
   var grapes = jGetObjectsInRect(this.startCoord, this.fieldSize.sub(1, 1), this.cropStage, [this.cropName]);
   inventory = checkInventory();
   var cuts = Math.floor((inventory.freeSlots() - 1)/3); //õóéïèçäà
   if(cuts > 8) cuts = 8;
   var currentgrape = 0;
   while(1)
   {
      
      if(currentgrape >= grapes.length) {
         result = true;
         this.plantGrapes();
         jToConsole("FARMER: End of selected area.");
         break;
      }
      goNearPosition(grapes[currentgrape].position(), 0);
      
      //cursor
      if(!jIsCursor("harvest")) {
         jSendAction("harvest");
         jWaitCursor("harvest", actionTimeout);
      }
      //harvesting grapes
      for(var i = 0; i < cuts; i++)
      {
         if(jGetStamina() < 50) drinkWater();
         if(currentgrape >= grapes.length) break;
         jDoClick(grapes[currentgrape].getID(), 1, 0);
         jWaitProgress(actionTimeout);
         currentgrape++;
      }
      //got pack of grapes
      resetCursor();
      //goes to press
      goNearPosition(jGob(this.pressID).position(), 1);
      //jAbsClick(jGob(this.pressID).position().add(this.offsMove.mul(11)), 1, 0);
      //jWaitMove(actionTimeout);
      jDoClick(this.pressID, 3, 0);
      jWaitWindow("Winepress", actionTimeout);
      //no window in lag/etc
      jSleep(100);
      if(!jHaveWindow("Winepress")) {result = false; break;}
      //transfers all grapes to winepress
      inventory.getItems(this.packName)[0].transferSuchAll();
      //waits transfering
      while(inventory.getItems(this.packName).length > 0)
         jSleep(300);
      //making juice
      jGetWindow("Winepress").pushButton(1);
      while(jGetWindow("Winepress").getInventories()[0].getItems(this.packName).length > 0)
         jSleep(500);
      //lifts press
      var pc = jGob(this.pressID).position();// memorizing press coords
      jSendAction("carry");
      jWaitCursor("chi", actionTimeout);
      //lag
      if(!jIsCursor("chi")) {result = false; break;}
      jDoClick(this.pressID, 1, 0);
      jSleep(1500);
      //juice to barrel
      goNearPosition(jGob(this.barrelID).position(), 1);
      jDoClick(this.barrelID, 3, 0);
      jWaitMove(actionTimeout);
      jSleep(2000);
      //placing press back
      goNearPosition(pc, 1);
      jAbsClick(pc, 3, 0);
      jWaitMove(actionTimeout);
      //getting seeds from press
      jDoClick(this.pressID, 3, 0);
      jWaitWindow("Winepress", actionTimeout);
      //no window in lag/etc
      jSleep(100);
      if(!jHaveWindow("Winepress")) {result = false; break;}
      //transfer to pack seeds
      jGetWindow("Winepress").getInventories()[0].getItems("")[0].transferSuchAll();
      while(jGetWindow("Winepress").getInventories()[0].getItems("").length > 0)
         jSleep(200);
      //offset move
      jMoveStep(this.offsMove);
      jWaitMove(actionTimeout);
      //going to lchect
      var lc = jGob(this.containerID).position().add(this.offsMove.mul(11));
      goNearPosition(jGob(this.containerID).position(), 1);
      //jWaitMove(actionTimeout);
      jDoClick(this.containerID, 3, 0);
      jWaitWindow("Chest", actionTimeout);
      //no window in lag/etc
      jSleep(100);
      if(!jHaveWindow("Chest")) {result = false; break;}
      var bags = jGetWindow("Chest").getInventories()[0].getItems("invobjs/bag-seed");
      var cbag = 0; //current bag
      inventory = checkInventory();
      //transferring seeds, btw i hate loftar
      while(inventory.getItems(this.cropSeedName).length >= 1)
      {
         if(cbag >= bags.length) {result = true; break;}
         var cnt = inventory.getItems(this.cropSeedName).length; //inventory count
         bags[cbag].iact();
         //opens seedbag
         while(!jHaveWindow("Seedbag"))
            jSleep(200);
         //check for free slots
         if(jGetWindow("Seedbag").getInventories()[0].freeSlots() == 0)
         {
            jGetWindow("Seedbag").close();
            while(jHaveWindow("Seedbag"))
               jSleep(200);
            cbag++;
            continue;
         }
         jSleep(100);
         var free = jGetWindow("Seedbag").getInventories()[0].freeSlots(); //free slots in seedbag
         inventory.getItems(this.cropSeedName)[0].transferSuchAll();
         while(inventory.getItems(this.cropSeedName).length > Math.abs(cnt - free))
            jSleep(200);
         jGetWindow("Seedbag").close();
         while(jHaveWindow("Seedbag"))
            jSleep(200);
         cbag++;
      }
      //èäèòå íà õóé, ìíå ëåíü ÷òîòî äåëàòü ñ ýòèìè ñåìåíàìè
      if(result == true) {
         inventory.getItems(this.cropSeedName)[0].dropSuchAll();
         jSleep(1000);
         //planting grapes seeds
         this.plantGrapes();
         result = false;
      }
      //checks barrel
      var bc = jGob(this.barrelID).position().add(this.offsMove.mul(11));
      goNearPosition(jGob(this.barrelID).position(), 1);
      //jWaitMove(actionTimeout);
      jDoClick(this.barrelID, 3, 0);
      while(!jHaveWindow("Barrel"))
         jSleep(500);
      //barrel label
      var blbl = jGetWindow("Barrel").getLabelText(1);
      if(blbl.indexOf("100.0") != -1) {
         result = false;
         jToConsole("FARMER: Barrel is full of juice.");
         this.plantGrapes();
         break;
      } //breaks if barrel is full
   }//1
   return result;
}

WineHarvester.prototype.plantGrapes = function() {
   equipShovel();
   jMoveStep(this.offsMove);
   jWaitMove(actionTimeout);
   //going to lchect
   var lc = jGob(this.containerID).position().add(this.offsMove.mul(11));
   jAbsClick(lc, 1, 0);
   jWaitMove(actionTimeout);
   jDoClick(this.containerID, 3, 0);
   jWaitWindow("Chest", actionTimeout);
   //no window in lag/etc
   jSleep(100);
   if(!jHaveWindow("Chest")) return false;
   openAllSeedbagsInv(jGetWindow("Chest").getInventories()[0]);
   bagsSeedsSorter(this, jGetWindow("Chest").getInventories()[0]);
   organizeBags(jGetWindow("Chest").getInventories()[0], this.cropSeedName);
   jDoClick(this.containerID, 3, 0);
   jSleep(1000);
   jWaitWindow("Chest", actionTimeout);
   //no window in lag/etc
   jSleep(100);
   if(!jHaveWindow("Chest")) return false;
   jGetWindow("Chest").getInventories()[0].getItems("invobjs/bag-seed-f")[0].transferSuchAll();
   jSleep(1000);
   inventory = checkInventory();
   var fullbags = inventory.getItems("invobjs/bag-seed-f");
   for(var i = 0; i < fullbags.length; i++)
      fullbags[i].iact();
   while(jGetWindows("Seedbag").length < fullbags.length)
      jSleep(200);
   var swnds = jGetWindows("Seedbag");
   var allseeds = [];
   for(var i = 0; i < swnds.length; i++)
   {
      var sinvs = swnds[i].getInventories()[0].getItems(this.cropSeedName);
      for(var j = 0; j < sinvs.length; j++)
         allseeds.push(sinvs[j]);
   }
   var cseed = 0;
   var overflow = false;
   var st = jTilify(this.startCoord);
   jAbsClick(st, 1, 0);
   jWaitMove(actionTimeout);
   for(var i = 0; i < this.fieldSize.x; i++) {
      if(overflow == true) break;
      for(var j = 0; j < this.fieldSize.y; j++) {
         if(cseed >= allseeds.length) {overflow = true; break;}
         if(jGetStamina() < 50) drinkWater();
         var tile_coord = st.add(i*11, j*11);
         if (jFindMapObjectNearAbs(tile_coord, 1, this.cropName) == null) {
            jAbsClick(tile_coord, 1, 0);
            jWaitMove(actionTimeout);
            plantNewCrop(this, false);
            cseed++;
         }
      }
      jSleep(100);
   }
   //bagsSeedsSorter(this, inventory);
   jAbsClick(lc, 1, 0);
   jWaitMove(actionTimeout);
   jDoClick(this.containerID, 3, 0);
   jWaitWindow("Chest", actionTimeout);
   //no window in lag/etc
   jSleep(100);
   if(!jHaveWindow("Chest")) return false;
   var allbags = inventory.getItems("invobjs/bag-seed");
   for(var i = 0; i < allbags.length; i++) {
      allbags[i].transfer();
      jSleep(100);
   }
   while(inventory.getItems("invobjs/bag-seed").length > 0)
      jSleep(200);
   jAbsClick(lc, 1, 0);
   jWaitMove(actionTimeout);
   equipScythe();
}
/* =========================================================================== */
/* ==============================   ÊÎÍÎÏËß      ============================== */
/* =========================================================================== */
function HempHarvester() {
    this.cropName = "plants/hemp";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-hemp";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 4;                  // Ñòàäèÿ îáðàáîòêè
   bagsSeedsSorter(this);
}
HempHarvester.prototype.processHarvestedGoods = function() {
    bagsSeedsSorter(this);
};

/* =========================================================================== */
/* ==============================   ÊÎÍÎÏËß      ============================== */
/* =========================================================================== */
function PepperHarvester() {
    this.cropName = "plants/pepper";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-pepper";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
   bagsSeedsSorter(this);
}
PepperHarvester.prototype.processHarvestedGoods = function() {
    bagsSeedsSorter(this);
};

/* =========================================================================== */
/* ==============================   ËÅÍ         ============================== */
/* =========================================================================== */
function FlaxHarvester() {
    this.cropName = "plants/flax";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/flaxseed";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
FlaxHarvester.prototype.processHarvestedGoods = function() {
    bagsSeedsSorter(this);
};

/* =========================================================================== */
/* ==============================   ÏÅÐÅÖ      ============================== */
/* =========================================================================== */
function PepperHarvester() {
    this.cropName = "plants/pepper";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-pepper";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
PepperHarvester.prototype.processHarvestedGoods = function() {
    bagsSeedsSorter(this);
};

/* =========================================================================== */
/* ==============================   ×ÀÉ       ============================== */
/* =========================================================================== */
//function TeaHarvester() {
//    this.cropName = "plants/tea";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
//    this.cropSeedName = "invobjs/seed-tea";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
//  this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
 //  this.leaveName = "invobjs/tea-fresh";
 //  this.containerID = 0;
//}
//TeaHarvester.prototype.processHarvestedGoods = function() {
 //   bagsSeedsSorter(this);
//};

//TeaHarvester.prototype.selectObjects = function() {
 //  var cnt = jSelectObject("Select container (chest/lchest)...");
 //  if(cnt.name().indexOf("cclosed") == -1 && cnt.name().indexOf("lchest") == -1)
 //  {
 //     jToConsole("ERROR: This is not a container!");
 //     return false;
 //  }
 //  else this.containerID = cnt;
 //  return true;
//}
//

function TeaHarvester() {
    this.cropName = "plants/tea";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-tea";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
TeaHarvester.prototype.processHarvestedGoods = function() {
   bagsSeedsSorter(this);
    inventory = checkInventory();
   
   //dropsleaves
   var leaves = inventory.getItems("tea-fresh");
   if(leaves.length > 0)
      if(leaves[0].isActual())
         leaves[0].dropSuchAll();
   while(leaves.length > 0)
   {
      leaves = inventory.getItems("tealeaves");
      jSleep(500);
   }
 
};
/* =========================================================================== */
/* ==============================      ÌÀÊ      ============================== */
/* =========================================================================== */
function PoppyHarvester() {
    this.cropName = "plants/poppy";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-poppy";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 4;                  // Ñòàäèÿ îáðàáîòêè
}
PoppyHarvester.prototype.processHarvestedGoods = function() {
   bagsSeedsSorter(this);
};

/* =========================================================================== */
/* ==============================   ÏØÅÍÈ×ÊÀ   ============================== */
/* =========================================================================== */
function WheatHarvester() {
    this.cropName = "plants/wheat";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "wheat";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
WheatHarvester.prototype.processHarvestedGoods = function() {
    bagsSeedsSorter(this);
};

/* =========================================================================== */
/* ==============================   ÌÎÐÊÎÂÊÀ   ============================== */
/* =========================================================================== */
function HopsHarvester() {
    this.cropName = "plants/hops";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-hops";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
HopsHarvester.prototype.processHarvestedGoods = function() {
    inventory = checkInventory();
   
   var seeds = inventory.getItems(this.cropSeedName);
   var free = inventory.freeSlots();
   var i = 0;
     if (free < 3) {
      inventory.sortItems(seeds, "quality", false);
      for (i = 0; i < 3 - free; i++) {
         // Åñòü ìîðêîâü åñëè ãîëîäåí
         if (jGetHungry() < 1) {
            if (seeds[i].isActual()) {
               seeds[i].iact();
               jWaitPopup(actionTimeout);
               jSelectContextMenu("Eat");
               waitUnActual(seeds[i]);
            }
         }
         // Âûáðîñèòü ëèøêó
         if (seeds[i].isActual()) {
            seeds[i].drop();
         }
      }
   }
};

/* =========================================================================== */
/* ==============================   ÌÎÐÊÎÂÊÀ   ============================== */
/* =========================================================================== */
function PeasHarvester() {
    this.cropName = "plants/peas";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/peapod";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 4;                  // Ñòàäèÿ îáðàáîòêè
}
PeasHarvester.prototype.processHarvestedGoods = function() {
    inventory = checkInventory();
   
   var seeds = inventory.getItems(this.cropSeedName);
   var free = inventory.freeSlots();
   var i = 0;
     if (free < 3) {
      inventory.sortItems(seeds, "quality", false);
      for (i = 0; i < 3 - free; i++) {
         // Åñòü ìîðêîâü åñëè ãîëîäåí
         if (jGetHungry() < 1) {
            if (seeds[i].isActual()) {
               seeds[i].iact();
               jWaitPopup(actionTimeout);
               jSelectContextMenu("Eat");
               waitUnActual(seeds[i]);
            }
         }
         // Âûáðîñèòü ëèøêó
         if (seeds[i].isActual()) {
            seeds[i].drop();
         }
      }
   }
};

/* =========================================================================== */
/* ==============================   ÌÎÐÊÎÂÊÀ   ============================== */
/* =========================================================================== */
function OnionsHarvester() {
    this.cropName = "plants/onion";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/onion";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
OnionsHarvester.prototype.processHarvestedGoods = function() {
    inventory = checkInventory();
   
   var seeds = inventory.getItems(this.cropSeedName);
   var free = inventory.freeSlots();
   var i = 0;
     if (free < 3) {
      inventory.sortItems(seeds, "quality", false);
      for (i = 0; i < 3 - free; i++) {
         // Åñòü ìîðêîâü åñëè ãîëîäåí
         if (jGetHungry() < 1) {
            if (seeds[i].isActual()) {
               seeds[i].iact();
               jWaitPopup(actionTimeout);
               jSelectContextMenu("Eat");
               waitUnActual(seeds[i]);
            }
         }
         // Âûáðîñèòü ëèøêó
         if (seeds[i].isActual()) {
            seeds[i].drop();
         }
      }
   }
};

/* =========================================================================== */
/* ==============================   ÌÎÐÊÎÂÊÀ   ============================== */
/* =========================================================================== */
function TobaccoHarvester() {
    this.cropName = "plants/tobacco";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-tobacco";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
}
TobaccoHarvester.prototype.processHarvestedGoods = function() {
   bagsSeedsSorter(this);
    inventory = checkInventory();
   
   //dropsleaves
   var leaves = inventory.getItems("tobacco-fresh");
   if(leaves.length > 0)
      if(leaves[0].isActual())
         leaves[0].dropSuchAll();
   while(leaves.length > 0)
   {
      leaves = inventory.getItems("tobacco-fresh");
      jSleep(500);
   }
 
};

/* =========================================================================== */
/* ==============================   ÑÂÅÊËÀ      ============================== */
/* =========================================================================== */
function PumpkinHarvester() {
    this.cropName = "plants/pumpkin";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-pumpkin";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 6;                  // Ñòàäèÿ îáðàáîòêè
}
PumpkinHarvester.prototype.processHarvestedGoods = function() {
    inventory = checkInventory();
   
   var seeds = inventory.getItems(this.cropSeedName);
   var free = inventory.freeSlots();
   var i = 0;
   //dropsleaves
   var leaves = inventory.getItems("pumpkin");
   while (leaves.length < 1) {jSleep(500); var leaves = inventory.getItems("pumpkin"); }
   if(leaves.length > 0){
      resetCursor();
      jGetWindow("Inventory").getInventories()[0].getItems("pumpkin")[0].iact();
      jWaitPopup();
      jSelectContextMenu("Slice"); }
   jSleep(500);
   var flesh = inventory.getItems("pumpkinflesh");
   var seed = inventory.getItems("seed-pumpkin");
   while (flesh.length < 1) {jSleep(500); var flesh = inventory.getItems("pumpkinflesh"); var seed = inventory.getItems("seed-pumpkin");}
      if(flesh[0].isActual()) {
         flesh[0].dropSuchAll();}
     if(seed[0].isActual()) {
         seed[0].dropSuchAll();}
   while(leaves.length > 0)
   {
      leaves = inventory.getItems("pumpkin");
      jSleep(500);
   }

};

/* =========================================================================== */
/* ==============================   ÊÎÍÎÏËß      ============================== */
/* =========================================================================== */
function CarrotSeedHarvester() {
    this.cropName = "plants/carrot";      // Èìÿ êðîïà êîòîðûé íóæíî õàðâåñòèòü
    this.cropSeedName = "invobjs/seed-carrot";   // Èìÿ ñåìå÷êè êîòîðóþ íóæíî ñàæàòü
   this.cropStage = 3;                  // Ñòàäèÿ îáðàáîòêè
   bagsSeedsSorter(this);
}
CarrotSeedHarvester.prototype.processHarvestedGoods = function() {
    bagsSeedsSorter(this);
};

/*==============================Êðîï÷èêè============================================*/

function bagsSeedsSorter(harv) {
   inventory = checkInventory();
   var bags = inventory.getItems("invobjs/bag-seed");
   var free = inventory.freeSlots();
   var fslots = 0;
   
   if (bags.length > 0) {
      var windows = jGetWindows("Seedbag");
      if (windows.length > 0) {
         var seeds = [];
         var maxseedscount = bags.length * 9;
         //getting seeds from all seedbags into array
         for (var i = 0; i < windows.length; i++) {
            var inv = waitInventory(windows[i], 0);
            fslots += inv.freeSlots();
            var bufseeds = inv.getItems(harv.cropSeedName);
            for (var j = 0; j < bufseeds.length; j++) {
               seeds.push(bufseeds[j]);
            }
         }
         //from inventory to same array
         var invseeds = inventory.getItems(harv.cropSeedName);
         for (var j = 0; j < invseeds.length; j++) {
            seeds.push(invseeds[j]);
         }
         //calculation quality of all seeds
         var allq = 0;
         for (var j = 0; j < seeds.length; j++) {
            allq += seeds[j].quality();
         }
         //medium quality
         var mediumrange = (allq / seeds.length) - 1;
         //correcting medium q
         //too many seeds
         if(fslots < 9)
            mediumrange += 1;
         
         if (seeds.length > maxseedscount * 0.75) {
            for (var j = 0; j < seeds.length; j++) {
               if (seeds[j].quality() <= mediumrange) seeds[j].drop();
            }
            organizeBags(inventory, harv.cropSeedName);
         }
      }//bags windows
   }
   if (inventory.freeSlots() < 4 && bags.length < 1) {
      inventory.sortItems(inventory.getItems(harv.cropSeedName), "quality", false);
      for (i = 0; i < 3 - free; i++) {
         if (seeds[i].isActual()) {
            seeds[i].drop();
         }
      }
   }
}

function organizeBags(inv, name) {
   var bagw = jGetWindows("Seedbag");
   if(bagw.length < 1) return;
   var fullb, nextb;
   fullb = 0;
   nextb = bagw.length - 1;
   while(1)
   {
      if(fullb == nextb) break; //breaks if filling bag == last bag
      if(bagw[fullb].getInventories()[0].freeSlots() == 0) {
         fullb++;
         continue;
      }
      if(bagw[nextb].getInventories()[0].freeSlots() == 9) {
         nextb--;
         continue;
      }
      var freeSlot = bagw[fullb].getInventories()[0].freeSlotsCoords()[0]; //getting 1st empty slot at current filling bag
      var seed = bagw[nextb].getInventories()[0].getItems(name)[0];    //getting 1st seed at current emptying bag
      seed.take();
      jWaitDrag();
      bagw[fullb].getInventories()[0].drop(freeSlot); //drops to filling bag
      jWaitDrop();
   }
}

function openAllSeedbags() {
   inv = checkInventory();
   var bags = inv.getItems("invobjs/bag-seed");
   if(bags.length < 1)
      return;
   for(var i = 0; i < bags.length; i++)
      if(bags[i].isActual())
         bags[i].iact();
   while(jGetWindows("Seedbag").length != bags.length)
      jSleep(300);
}

function openAllSeedbagsInv(inv) {
   var bags = inv.getItems("invobjs/bag-seed");
   if(bags.length < 1)
      return;
   for(var i = 0; i < bags.length; i++)
      if(bags[i].isActual())
         bags[i].iact();
   while(jGetWindows("Seedbag").length != bags.length)
      jSleep(300);
}

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

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

function dropFromCursor(where) { //  1 = inventory
if (jIsDragging()) {
   if (where = null) where = 1
   if (where = 1) {
      if (checkInventory().freeSlots() > 0) checkInventory().drop(checkInventory().freeSlotsCoords()[0]);
         jSleep(500);
         if (!jIsDragging())   return;
   }
   while (jIsDragging()) {
      jDropObject(0);
      jSleep(300);     
      }
}
}

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 waitUnActual(item) {
   while (item.isActual()) {
      jSleep(100);
   }
}

function drinkWater() {
   if (jGetStamina() > 50) return;
   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");
         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");
   if (flasks.length > 0) {
      var flask = flasks[0];
      if (flask.isActual()) {
         flask.iact();
         if (jWaitPopup(actionTimeout)) {
            jSelectContextMenu("Drink");
            jWaitProgress();
         } else {
            // No water
            stopFlag = true;
         }
      }
   }
}

function TileInfo(crd) {
   this.coord = crd;
}

function findCrop(harv) {
   var objid = 0;
   for (var i = 0; i < cropRadius; i++) {
      objid = (jFindObjectWithOffset(harv.cropName, 1, jCoord(0, i))); // down
      if (objid && objid.blob(0) == harv.cropStage) return objid;
   }
   for (var i = 0; i < cropRadius; i++) {
      objid = jFindObjectWithOffset(harv.cropName, 1, jCoord(0, -i)); // up
      if (objid && objid.blob(0) == harv.cropStage) return objid;
   }
   for (var i = 0; i < cropRadius; i++) {
      objid = jFindObjectWithOffset(harv.cropName, 1, jCoord(i, 0)); // right
      if (objid && objid.blob(0) == harv.cropStage) return objid;
   }
   for (var i = 0; i < cropRadius; i++) {
      objid = jFindObjectWithOffset(harv.cropName, 1, jCoord(-i, 0));// left
      if (objid && objid.blob(0) == harv.cropStage) return objid;
   }
   objid = jFindObjectByName(harv.cropName, cropRadius);
   if (objid.blob(0) != harv.cropStage) objid = -1;
   return objid;
}

function dropItem(coord) {
   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 waitDragName(name) {
   while (true) {
      var item = jGetDraggingItem();
      if (item != null) {
     jSleep(500)
         if (item.resName() != null) {
         if (item.resName().indexOf(name) >= 0) {
            break;
         } else {
            jSleep(100);
         }
         } else jSleep(100);
      } else {
         break;
      }
   }
}

function equipScythe() {
   var equip = checkEquipment();
   var scythe = inventory.getItems("scythe")[0];
   if (!scythe) return;
   if (equip.resName(6).indexOf("shovel") >= 0) {
      equip.takeAt(6);
      jWaitDrag(actionTimeout);
      inventory.drop(scythe.coord());
      jSleep(1000);
      waitDragName("scythe");
     jSleep(1000);
      equip.dropTo(6);
      jWaitDrop(actionTimeout);
   }
}

function equipShovel() { // From scythe
   var equip = checkEquipment();
   var shovel = inventory.getItems("shovel")[0];
   if (!shovel) return;
   if (equip.resName(6).indexOf("scythe") >= 0) {
      dropItem(shovel.coord().add(0, 2));
      equip.takeAt(6);
      jWaitDrag(actionTimeout);
      inventory.drop(shovel.coord());
      jSleep(1000);
      waitDragName("shovel");
      equip.dropTo(6);
      jWaitDrop(actionTimeout);
   }
}

function plowTile() {
   drinkWater();
   equipShovel();
   jSendAction("plow");
   jWaitCursor("dig", actionTimeout);
   jOffsetClick(jCoord(0, 0), 1, 0);
   jWaitProgress();
   jOffsetClick(jCoord(0, 0), 3, 0);
   jWaitCursor("arw", actionTimeout);
}

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 sortFunction2(a, b) {
   if (!a.isActual() || !b.isActual()) return 0;
   else return a.quality() - b.quality();
}

function sortFunction(a, b) {
   if (!a.isActual() || !b.isActual()) return 0;
   if (a.quality() < b.quality()) return 1;
   if (a.quality() > b.quality()) return -1;
   return 0;
}

function waitInventory(wnd, index) {
   while (wnd.getInventories().length <= 0) {
      jSleep(100);
   }
   return wnd.getInventories()[index];
}

function plantNewCrop(harv, notrecursive) {
   jSleep(300);
   inventory = checkInventory();
   var plantedSeed = null;
   var windows = jGetWindows("Seedbag");
   var seedbags = inventory.getItems("invobjs/bag-seed-f");
   if (seedbags.length > 0) {
      var seeds = [];
      for (var i = 0; i < windows.length; i++) {
         var inv = waitInventory(windows[i], 0);
         if (inv) {
            var bufseeds = inv.getItems(harv.cropSeedName);
            for (var j = 0; j < bufseeds.length; j++) {
               seeds.push(bufseeds[j]);
            }
         }
      }
      var invseeds = inventory.getItems(harv.cropSeedName);
      for (var j = 0; j < invseeds.length; j++) {
         seeds.push(invseeds[j]);
      }
      var sorted_seeds = seeds.sort(sortFunction);
      plantedSeed = sorted_seeds[0];
   } else {
      var invseeds = inventory.getItems(harv.cropSeedName);
      if (invseeds.length > 0) {
         inventory.sortItems(invseeds, "quality", true);
         plantedSeed = invseeds[0];
      }
   }
   
   if (plantedSeed) {
      // Plow tile if needed
      if (jGetTileType(jCoord(0, 0)) != 9) {
         plowTile();
      }
      if (plantedSeed.isActual()) {
         plantedSeed.take();
         jWaitDrag();
         jInteractClick(jCoord(0, 0), 0);
         if (!jWaitDrop(cannotPlantTimeout)) {
            jWaitDrop();
            if (notrecursive) return;
            plowTile();
            plantNewCrop(harv, true);
         }
      } else {
         if (!notrecursive) plantNewCrop(harv, true);
         else jPrint("Double fail on non-actual seed");
      }
   }
}

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

function main() {
   jDropLastWindow();
   openAllSeedbags();
   var blist = ["Carrot", "Poppy", "Wheat", "Hemp", "Beetroot", "Grapes", "Tea", "Flax", "Pepper","Hops", "Carrot Seed","Peas","Onions","Tobacco","Pepper","Pumpkin", "Exit"];
   var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(110, blist.length * 25 + 15), "Farming");
   var label = jGUILabel(selectWindow, jCoord(5, 5), "Select crop type:");
   for(var i = 0; i < blist.length; i++)
      jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
   selectWindow.toggleCloseButton();
   var btext = selectWindow.waitButtonClick();
   if(btext == blist[0]) harvester = new CarrotHarvester();
   if(btext == blist[1]) harvester = new PoppyHarvester();
   if(btext == blist[2]) harvester = new WheatHarvester();
   if(btext == blist[3]) harvester = new HempHarvester();
   if(btext == blist[4]) harvester = new BeetHarvester();
   if(btext == blist[5]) {
      selectWindow.destroy();
      harvester = new WineHarvester();
      if(!harvester.selectObjects()) return;
      if(!harvester.selectRect()) return;
      if(!harvester.processHarvesting()) return;
      harvester.plantGrapes();
      return;
   }
   if(btext == blist[6]) {
      harvester = new TeaHarvester();
      //if(!harvester.selectObjects()) return;
   }
   if(btext == blist[7]) harvester = new FlaxHarvester();
   if(btext == blist[8]) harvester = new PepperHarvester();
   if(btext == blist[9]) harvester = new HopsHarvester();
   if(btext == blist[10]) harvester = new CarrotSeedHarvester();
   if(btext == blist[11]) harvester = new PeasHarvester();
   if(btext == blist[12]) harvester = new OnionsHarvester();
   if(btext == blist[13]) harvester = new TobaccoHarvester();
   if(btext == blist[14]) harvester = new PepperHarvester();
   if(btext == blist[15]) harvester = new PumpkinHarvester();
   if(btext == blist[blist.length - 1]) {selectWindow.destroy(); return;}
   selectWindow.destroy();
   while (!stopFlag) {
      var crop = findCrop(harvester);
      if (crop == -1) break; // No crops found
     dropFromCursor(1);
      drinkWater();
      equipScythe();
      if (!jIsPathFree(crop.position())) {
         resetCursor();
         jPFMove(crop.position());
         jWaitStartMove();
         waitPFEndMove();
         while (jIsMoving() || jMyCoords().dist(crop.position()) > 1) {
            jSleep(100);
         }
      }
      jSendAction("harvest");
      jWaitCursor("harvest", actionTimeout);
      jDoClick(crop.getID(), 1, 0);
      jWaitProgress();
      harvester.processHarvestedGoods();
      plantNewCrop(harvester, false);
   }
}

main();
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby windmaker » Wed Mar 25, 2015 5:03 am

just equip two seedbags in your inventory, and get 1 space free in your inventory
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 IndezG » Wed Mar 25, 2015 7:57 pm

I have a small problem, when i press run scripts ,do not show to me the scripts that I have in the folder scripts
IndezG
 
Posts: 8
Joined: Wed Feb 06, 2013 7:42 am

Re: Union Client Scripts

Postby Arcanist » Thu Mar 26, 2015 9:20 am

Ensure they have the extention jbot not .jbot.txt
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

PreviousNext

Return to The Wizards' Tower

Who is online

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