Скрипт для добычи руды пешком (Mining script)
Внешний вид
Скрипт для 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;
}
}