Union Client Scripts

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

Moderator: Phades

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

Re: Union Client Scripts

Post by slipper »

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
Lordtimo
Posts: 437
Joined: Wed Jun 01, 2011 12:00 pm

Re: Union Client Scripts

Post by Lordtimo »

This bot reminds me of W5 lol.
User avatar
NOOBY93
Posts: 6528
Joined: Tue Aug 09, 2011 1:12 pm

Re: Union Client Scripts

Post by NOOBY93 »

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
talon00302
Posts: 516
Joined: Sun Apr 15, 2012 8:30 pm

Re: Union Client Scripts

Post by talon00302 »

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

Post by talon00302 »

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

Post by talon00302 »

link to all of these plus far more.

https://www.dropbox.com/s/fjhk2kob3b2u2i4/Bots.7z
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

Post by windmaker »

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
julian12it
Posts: 787
Joined: Sat Sep 11, 2010 8:01 pm
Location: Topaz

Re: Union Client Scripts

Post by julian12it »

You just posted all of the Union old scripts, everyone and their mother has it.
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

Post by windmaker »

julian12it wrote:You just posted all of the Union old scripts, everyone and their mother has it.
yep.
Image #swag
User avatar
talon00302
Posts: 516
Joined: Sun Apr 15, 2012 8:30 pm

Re: Union Client Scripts

Post by talon00302 »

Actually I keep getting asked by villagers for scripts so I figured I'd just post here lol :lol:

Return to “The Wizards' Tower”