Перейти к содержанию

Скрипт для добычи руды пешком (Mining script)

Материал из Wiki Legnes

Скрипт для Legnes/Orion Assist. Вариант для тех у кого ещё нет своего дома. Бегает в пещеру и относит в банк пешком, возвращается на то же место и продолжает рыть.

Автор скрипта: Hotride

// Пещера для копания:
// 0 - Newbie mine
// 1 - Trinsic secret cave
// 2 - Trinsic cave
var CaveType = 0;

// Использовать фильтр руды, 0 - не использовать, 1 - использовать
var UseOreNameFilter = 0;

// Названия руды для игнорирования жилы (не продолжать копать)
var IgnoreOreNames = 'Iron ore|Железная руда';

// Использовать хайд, 0 - не использовать, 1 - использовать
var UseHidding = 0;

// Выгружать руду с переплавкой, 0 - не плавить, 1 - плавить
var UnloadWithSmelt = 1;

// Звук при появлении элементаля
var SoundForGuard = 'C:/a.wav';

// Количество повтора звука
var SoundRepeatCount = 5;

// Точки банков для CaveType
// Первая точка - координаты, куда нужно вставть
// Вторая - запаска, если на первую не встали (тайл заблокирован)
var BankSpots =
[
	// CaveType == 0
	[ [2564, 480], [2564, 479] ],
	// CaveType == 1
	[ [1821, 2821], [1821, 2822] ],
	// CaveType == 2
	[ [1821, 2821], [1821, 2822] ]
];

// CaveType == 0
var SpotsNewbieMine =
[
	[ 2564, 472 ],
	[ 2569, 472 ],
	[ 2571, 470 ],
	[ 2574, 472 ],
	[ 2579, 477 ],
	[ 2574, 477 ],
	[ 2569, 477 ],
	[ 2569, 482 ],
	[ 2574, 482 ],
	[ 2579, 482 ],
	[ 2577, 486 ],
	[ 2572, 486 ],
	[ 2569, 489 ],
	[ 2567, 486 ],
	[ 2564, 490 ],
	[ 2563, 494 ],
	[ 2560, 497 ],
	[ 2556, 497 ],
	[ 2559, 492 ],
	[ 2561, 487 ],
	[ 2564, 484 ],
	[ 2564, 480 ],
	[ 2565, 476 ]
];

// CaveType == 1
var SpotsTrinsicSecretCave =
[
	[ 1662, 2935 ],
	[ 1659, 2932 ],
	[ 1655, 2932 ],
	[ 1655, 2927 ],
	[ 1653, 2922 ],
	[ 1652, 2917 ],
	[ 1650, 2913 ],
	[ 1648, 2908 ],
	[ 1647, 2903 ],
	[ 1647, 2898 ],
	[ 1648, 2894 ],
];

// CaveType == 2
var SpotsTrinsicCave =
[
	[ 1490, 2852 ],
	[ 1493, 2851 ],
	[ 1492, 2847 ],
	[ 1495, 2846 ],
	[ 1496, 2843 ],
	[ 1495, 2839 ],
	[ 1495, 2834 ],
	[ 1491, 2834 ],
	[ 1487, 2837 ],
	[ 1482, 2839 ],
	[ 1478, 2842 ],
	[ 1488, 2834 ],
	[ 1493, 2830 ],
	[ 1488, 2825 ],
	[ 1489, 2821 ],
	[ 1491, 2823 ],
	[ 1495, 2829 ],
	[ 1497, 2830 ],
];

// Не трогать!!!
var BankX = BankSpots[CaveType][0][0];
var BankY = BankSpots[CaveType][0][1];
var Bank2X = BankSpots[CaveType][1][0];
var Bank2Y = BankSpots[CaveType][1][1];
var SayBank = (CaveType != 0);
var CycledMining = (CaveType == 0);

var Spots = [];
if (CaveType== 1)
	Spots = SpotsTrinsicSecretCave;
else if (CaveType== 2)
	Spots = SpotsTrinsicCave;
else
	Spots = SpotsNewbieMine;

function UsePickaxe(_private)
{
	if (!Orion.UseType('0x0E85', 'any', self, false))
	{
		if (!Orion.UseType('0x0E85'))
		{
			Orion.Print('0x0021', 'Your tool is gone!');
			Orion.Terminate('all');
		}
	}
}

function WalkHangChecker(_private)
{
	var x = Player.X();
	var y = Player.Y();
	var count = 0;

	while (true)
	{
		if (x == Player.X() && y == Player.Y())
			count++;
		else
			count = 0;

		if (count >= 15)
		{
			Orion.StopWalking();
			count = 0;
		}

		x = Player.X();
		y = Player.Y();

		Orion.Wait(1000);
	}
}

function WalkToWrapper(x, y, distance, run)
{
	Orion.Exec('WalkHangChecker');
	// Потому что на пути следования могут быть динамические препятствия
	for (var i = 0; i < 3; i++)
	{
		if (Orion.WalkTo(x, y, distance, 0, 255, run))
		{
			Orion.Terminate('WalkHangChecker');
			return true;
			}
	}

	Orion.Terminate('WalkHangChecker');
	return false;
}

function CheckOverweight(useWalkingBack, forced)
{
	if (forced || Player.Weight('%') >= 95)
	{
		var oldX = Player.X();
		var oldY = Player.Y();

		if (!forced)
			Orion.Print('0x0021', 'Weight limit reached!!!');

		if (!WalkToWrapper(BankX, BankY, 0, true))
		{
			if (!WalkToWrapper(Bank2X, Bank2Y, 1, true))
				Orion.PauseScript();
		}

		if (UnloadWithSmelt)
		{
			while (Orion.UseType('0x19B7|0x19BA|0x19B8|0x19B9'))
				Orion.Wait(100);
		}

		if (SayBank)
			Orion.Say('bank');
		else
			Orion.UseObject('0x401D02AA'); // Bankomat

		Orion.Wait(200);
		UnloadIngots();
		UnloadOres();

		if (Orion.UseType('0x09B7|0x09F2|0x097B', '0', lastcontainer))
			Orion.Wait(100);

		while (Orion.Count('0x0E85') < 4)
		{
			if (!Orion.MoveItemType('0x0E85', 'any', lastcontainer))
				break;

			Orion.Wait(400);
		}

		if (useWalkingBack)
			WalkToWrapper(oldX, oldY, 0, true);
	}
}

function PlayGuardAlarm(_private)
{
	for (var i = 0; i < SoundRepeatCount; i++)
	{
		Orion.PlayWav(SoundForGuard);
		Orion.Wait(1000);
	}
}

function MiningDig()
{
	var text = 'в свой рюкзак|in your pack|Вы расшатываете несколько камней, но не можете найти|You loosen some rocks but fail to find|Это слишком далеко|That is too far away|Цель находится вне прямой видимости|Target is not in line of sight|Здесь нет руды, которую можно было бы добывать|There is no ore here to mine';

	for (var x = -2; x <= 2; x++)
	{
		for (var y = -2; y <= 2; y++)
		{
			var tryingCount = 0;

			while (true)
			{
				if (CaveType != 0 && Orion.FindType('0x000E', 'any', ground, 'mobile|near', 10).length > 0)
				{
					var oldX = Player.X();
					var oldY = Player.Y();
					Orion.Exec('PlayGuardAlarm');

					if (!Player.Hidden())
						CheckOverweight(false, true);

					Orion.PauseScript();
					WalkToWrapper(oldX, oldY, 0,  (UseHidding == 0 || !Player.Hidden()));
				}

				while (UseHidding && !Player.Hidden())
				{
					Orion.WarMode(false);
					Orion.Wait(100);
					Orion.UseSkill('21');
					Orion.WaitJournal('Вы хорошо спрятались|You have hidden yourself well|Кажется, ты не можешь здесь спрятаться|t seem to hide here', Orion.Now(), Orion.Now() + 3000);
				}

				CheckOverweight(true, false);

				if (!Orion.ValidateTargetTileRelative('mine', x, y, 0))
					break;

				var now = Orion.Now();
				Orion.WaitTargetTileRelative('mine', x, y, 0);
				UsePickaxe(0);
				var msg = Orion.WaitJournal(text, now, now + 5000, 'my|sys');
				
				if (msg != null)
				{
					if (msg.FindTextID() > 3)
						break;

					tryingCount++;

					if (tryingCount >= 10)
						break;

					if (UseOreNameFilter && Orion.Contains(msg.Text(), IgnoreOreNames))
						break;
				}
		
				Orion.Wait(50);
			}
		}
	}
}

function Mining()
{
	var spawnTimeMinutes = 90; // 60 min + error 30 min
	var spawnTime = spawnTimeMinutes * 60 * 1000;
	var maxWaitSpawnTime = 5 * 60 * 1000;

	while (true)
	{
		var now = Orion.Now();

		for (var c = 0; c < 2; c++) // Потому что на первом проходе, почему-то, бывают пропуски тайлов и недокопы
		{
			for (var i = 0; i < Spots.length; i++)
			{
				WalkToWrapper(Spots[i][0], Spots[i][1], 0,  (UseHidding == 0 || !Player.Hidden()));
				MiningDig();
			}
		}

		CheckOverweight(false, true);

		if (!CycledMining)
			return;

		var delta = now + spawnTime - Orion.Now();

		if (delta > 0 && delta > maxWaitSpawnTime)
			delta = maxWaitSpawnTime;

		if (delta > 0)
		{
			var secs = delta / 1000;
			var mins = Math.floor(secs / 60);
			Orion.Print('Wait to respawn: ' + mins + ' min ' + Math.floor(secs - (mins * 60)) + ' sec');
			Orion.Wait(delta);
		}
	}
}

function UnloadIngots()
{
	var list = Orion.FindTypeEx('0x1BEF|0x1BF2|0x1BE3|0x1BE9|0x1BF5|0x0F02');

	for (var i = 0; i < list.length; i++)
	{
		var found = Orion.FindType(list[i].Graphic(), list[i].Color(), lastcontainer);

		if (found.length != 0)
			Orion.MoveItem(list[i].Serial(), 0, found[0]);
		else
			Orion.MoveItem(list[i].Serial(), 0, lastcontainer);

		Orion.Wait(400);
	}
}

function UnloadOres()
{
	var list = Orion.FindTypeEx('0x19B7|0x19BA|0x19B8|0x19B9');

	for (var i = 0; i < list.length; i++)
	{
		var found = Orion.FindType(list[i].Graphic(), list[i].Color(), lastcontainer);

		if (found.length != 0)
			Orion.MoveItem(list[i].Serial(), 0, found[0]);
		else
			Orion.MoveItem(list[i].Serial(), 0, lastcontainer);

		Orion.Wait(400);
	}
}

function SmeltIronOres()
{
	while (true)
	{
		var list = Orion.FindTypeEx('0x19B7|0x19BA|0x19B8|0x19B9', '0');

		for (var i = 0; i < list.length; i++)
		{
			if (list[i].Count() == 1)
			{
				Orion.UseObject(list[i].Serial());
				Orion.Wait(100);
			}
			else
			{
				Orion.MoveItem(list[i].Serial(), 1, backpack, 50, 50);
				Orion.Wait(400);
			}
		}

		if (list.length == 0)
			return;
	}
}