// В ToolsBag должны лежать расходники:
// Реги на реколл и диспел, свитки диспела, бинты, стрелы для лука, кирки
// Руны в пещеры должны лежать в банке
// Использовать фильтр руды, 0 - не использовать, 1 - использовать
var UseOreNameFilter = 0;
// Названия руды для игнорирования жилы (не продолжать копать)
var IgnoreOreNames = 'Iron ore|Железная руда';
// Использовать хайд, 0 - не использовать, 1 - использовать
var UseHidding = 1;
// Выгружать руду с переплавкой, 0 - не плавить, 1 - плавить
var UnloadWithSmelt = 0;
// Звук при появлении элементаля
var SoundForGuard = 'C:/a.wav';
// Количество повтора звука
var SoundRepeatCount = 5;
// Серийник сундука, в котором находятся мешки (может быть пустым)
var TopChest = '0x403EF74F';
// Серийник мешка с инструментами, регами и едой
var ToolsBag = '0x402A1730';
// Серийник мешка для руды
var OresBag = '0x4047D248';
// Типы еды
var FoodType = '0x09B7|0x09F2|0x097B';
// Серийник оружия, который использовать при появлении гварда
var UseWeaponForGuard = '0x40521269';
// Серийник руны домой
var RuneHome = '0x408B4FD2';
// Серийники рун в пещеры
var RunesToCave =
[
// Trinsic secret cave
'0x408B4FD1',
];
// Точки обкопки в пещерах
var CaveSpots =
[
// Trinsic secret cave
[
[ 2427, 178 ],
[ 2427, 177 ],
[ 2427, 176 ],
[ 2426, 175 ],
[ 2426, 176 ],
[ 2426, 177 ],
[ 2426, 178 ],
[ 2426, 179 ],
[ 2425, 179 ],
[ 2425, 179 ],
[ 2425, 178 ],
[ 2425, 177 ],
[ 2425, 176 ],
[ 2425, 175 ],
[ 2425, 174 ],
[ 2425, 173 ],
[ 2425, 172 ],
[ 2425, 171 ],
[ 2425, 170 ],
[ 2425, 169 ],
[ 2425, 168 ],
[ 2424, 169 ],
[ 2424, 170 ],
[ 2424, 171 ],
[ 2424, 172 ],
[ 2424, 173 ],
[ 2424, 174 ],
[ 2424, 175 ],
[ 2424, 176 ],
[ 2424, 177 ],
[ 2424, 178 ],
[ 2424, 179 ],
[ 2424, 180 ],
[ 2423, 180 ],
[ 2423, 179 ],
[ 2423, 178 ],
[ 2423, 177 ],
[ 2423, 176 ],
[ 2423, 175 ],
[ 2423, 174 ],
[ 2423, 173 ],
[ 2423, 172 ],
[ 2423, 171 ],
[ 2423, 170 ],
[ 2423, 169 ],
[ 2423, 168 ],
[ 2427, 177 ],
[ 2427, 176 ],
[ 2426, 175 ],
[ 2426, 176 ],
[ 2426, 177 ],
[ 2426, 178 ],
[ 2426, 179 ],
[ 2425, 179 ],
[ 2425, 179 ],
[ 2425, 178 ],
[ 2425, 177 ],
[ 2425, 176 ],
[ 2425, 175 ],
[ 2425, 174 ],
[ 2425, 173 ],
[ 2425, 172 ],
[ 2425, 171 ],
[ 2425, 170 ],
[ 2425, 169 ],
[ 2425, 168 ],
[ 2424, 169 ],
[ 2424, 170 ],
[ 2424, 171 ],
[ 2424, 172 ],
[ 2424, 173 ],
[ 2424, 174 ],
[ 2424, 175 ],
[ 2424, 176 ],
[ 2424, 177 ],
[ 2424, 178 ],
[ 2424, 179 ],
[ 2424, 180 ],
[ 2423, 180 ],
[ 2423, 179 ],
[ 2423, 178 ],
[ 2423, 177 ],
[ 2423, 176 ],
[ 2423, 175 ],
[ 2423, 174 ],
[ 2423, 173 ],
[ 2423, 172 ],
[ 2423, 171 ],
[ 2423, 170 ],
[ 2423, 169 ],
[ 2422, 168 ],
[ 2422, 169 ],
[ 2422, 170 ],
[ 2422, 171 ],
[ 2422, 172 ],
[ 2422, 173 ],
[ 2422, 174 ],
[ 2422, 175 ],
[ 2422, 176 ],
[ 2422, 177 ],
[ 2422, 178 ],
[ 2422, 179 ],
[ 2422, 180 ],
[ 2418, 183 ],
[ 2418, 182 ],
[ 2418, 181 ],
[ 2418, 180 ],
[ 2418, 179 ],
[ 2418, 178 ],
[ 2418, 177 ],
[ 2418, 176 ],
[ 2418, 175 ],
[ 2418, 174 ],
[ 2418, 173 ],
[ 2418, 172 ],
[ 2418, 171 ],
[ 2418, 170 ],
[ 2418, 169 ],
[ 2418, 168 ],
[ 2418, 167 ],
[ 2417, 167 ],
[ 2417, 168 ],
[ 2417, 169 ],
[ 2417, 170 ],
[ 2417, 171 ],
[ 2417, 172 ],
[ 2417, 173 ],
[ 2417, 174 ],
[ 2417, 175 ],
[ 2417, 176 ],
[ 2417, 177 ],
[ 2417, 178 ],
[ 2417, 179 ],
[ 2417, 180 ],
[ 2417, 181 ],
[ 2417, 182 ],
[ 2417, 183 ],
[ 2416, 183 ],
[ 2416, 182 ],
[ 2416, 181 ],
[ 2416, 180 ],
[ 2416, 179 ],
[ 2416, 178 ],
[ 2416, 177 ],
[ 2416, 176 ],
[ 2416, 175 ],
[ 2416, 174 ],
[ 2416, 173 ],
[ 2416, 172 ],
[ 2416, 171 ],
[ 2416, 170 ],
[ 2416, 169 ],
[ 2416, 168 ],
[ 2416, 167 ],
[ 2415, 167 ],
[ 2415, 168 ],
[ 2415, 169 ],
[ 2415, 170 ],
[ 2415, 171 ],
[ 2415, 172 ],
[ 2415, 173 ],
[ 2415, 174 ],
[ 2415, 175 ],
[ 2415, 176 ],
[ 2415, 177 ],
[ 2415, 178 ],
[ 2415, 179 ],
[ 2415, 180 ],
[ 2415, 181 ],
[ 2415, 182 ],
[ 2415, 183 ],
[ 2415, 184 ],
[ 2415, 185 ],
[ 2415, 186 ],
[ 2414, 186 ],
[ 2414, 185 ],
[ 2414, 184 ],
[ 2414, 183 ],
[ 2414, 182 ],
[ 2414, 181 ],
[ 2414, 180 ],
[ 2414, 179 ],
[ 2414, 178 ],
[ 2414, 177 ],
[ 2414, 176 ],
[ 2414, 175 ],
[ 2414, 174 ],
[ 2414, 173 ],
[ 2414, 172 ],
[ 2414, 171 ],
[ 2414, 170 ],
[ 2414, 169 ],
[ 2414, 168 ],
[ 2414, 167 ],
[ 2413, 167 ],
[ 2413, 168 ],
[ 2413, 169 ],
[ 2413, 170 ],
[ 2413, 171 ],
[ 2413, 172 ],
[ 2413, 173 ],
[ 2413, 174 ],
[ 2413, 175 ],
[ 2413, 176 ],
[ 2413, 177 ],
[ 2413, 178 ],
[ 2413, 179 ],
[ 2413, 180 ],
[ 2413, 181 ],
[ 2413, 182 ],
[ 2413, 183 ],
[ 2413, 184 ],
[ 2413, 185 ],
[ 2413, 186 ],
[ 2412, 186 ],
[ 2412, 186 ],
[ 2412, 185 ],
[ 2412, 184 ],
[ 2412, 183 ],
[ 2412, 182 ],
[ 2412, 181 ],
[ 2412, 180 ],
[ 2412, 179 ],
[ 2412, 178 ],
[ 2412, 177 ],
[ 2412, 176 ],
[ 2412, 175 ],
[ 2412, 174 ],
[ 2412, 173 ],
[ 2412, 172 ],
[ 2412, 171 ],
[ 2412, 170 ],
[ 2412, 169 ],
[ 2412, 168 ],
[ 2412, 167 ],
[ 2411, 167 ],
[ 2411, 168 ],
[ 2411, 169 ],
[ 2411, 170 ],
[ 2411, 171 ],
[ 2411, 172 ],
[ 2411, 173 ],
[ 2411, 174 ],
[ 2411, 175 ],
[ 2411, 176 ],
[ 2411, 177 ],
[ 2411, 178 ],
[ 2411, 179 ],
[ 2411, 180 ],
[ 2411, 181 ],
[ 2411, 182 ],
[ 2411, 183 ],
[ 2411, 184 ],
[ 2411, 185 ],
[ 2411, 186 ],
[ 2408, 182 ],
[ 2408, 181 ],
[ 2408, 180 ],
[ 2408, 179 ],
[ 2406, 178 ],
[ 2406, 177 ],
[ 2406, 176 ],
[ 2406, 175 ],
[ 2404, 185 ],
[ 2404, 184 ],
[ 2404, 183 ],
[ 2404, 182 ],
[ 2404, 181 ],
[ 2404, 180 ],
],
// Не трогать!!!
var FakeId = 0;
function UsePickaxe(_private)
{
if (!Orion.UseType('0x0E85', 'any', self, false))
{
if (!Orion.UseType('0x0E85'))
{
Orion.Print('0x0021', 'Your tool is gone!');
return false;
}
}
return true;
}
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');
Orion.Wait(20);
// Потому что на пути следования могут быть динамические препятствия
for (var i = 0; i < 3; i++)
{
if (Orion.WalkTo(x, y, 0, distance, 255, run))
{
Orion.Terminate('WalkHangChecker');
Orion.Wait(20);
return true;
}
}
Orion.Terminate('WalkHangChecker');
Orion.Wait(20);
return false;
}
function RecallTo(rune)
{
var x = Player.X();
var y = Player.Y();
var successCount = 0;
while (x == Player.X() && y == Player.Y() && successCount < 5)
{
Orion.WarMode(0);
Orion.Wait(100);
Orion.ClearJournal();
var timeout = Orion.Now() + 10000;
var mr = Orion.Count('mr');
Orion.Cast('Recall', rune);
while (mr == Orion.Count('mr') && timeout > Orion.Now())
Orion.Wait(100);
if (Orion.InJournal('The spell fizzles', 'my|sys') == null)
successCount++;
var msgUses = Orion.InJournal('uses left', 'my|sys');
if (msgUses != null)
{
for (var i = 0; i < 10; i++)
{
if (Orion.Contains(msgUses.Text(), 'has ' + i + ' uses left'))
{
MarkRune(rune);
break;
}
}
break;
}
}
if (Player.Mana('%') < 99)
{
Orion.WarMode(false);
Orion.Exec('AutoMeditation', true);
}
}
function MarkRune(rune)
{
while (true)
{
if (Player.Mana('%') < 40)
{
while (Player.Mana('%') < 100)
{
Orion.UseSkill('46');
Orion.Wait(500);
}
}
Orion.WarMode(0);
Orion.Wait(100);
Orion.ClearJournal();
var timeout = Orion.Now() + 10000;
var mr = Orion.Count('mr');
Orion.Cast('Mark', rune);
while (mr == Orion.Count('mr') && timeout > Orion.Now())
Orion.Wait(100);
if (Orion.InJournal('The spell fizzles', 'my|sys') == null)
break;
}
}
function Restock(graphic, count)
{
var val = Orion.Count(graphic);
while (val < count)
{
if (!Orion.MoveItemType(graphic, 'any', ToolsBag, count - val))
break;
Orion.Wait(400);
val = Orion.Count(graphic);
}
}
function CheckOverweight(forced, runeCave)
{
if (forced || Player.Weight('%') >= 97)
{
var oldX = Player.X();
var oldY = Player.Y();
if (!forced)
Orion.Print('0x0021', 'Weight limit reached!!!');
RecallTo(RuneHome);
if (UnloadWithSmelt)
{
while (Orion.UseType('0x19B7|0x19BA|0x19B8|0x19B9'))
Orion.Wait(100);
}
if (TopChest != '')
Orion.UseObject(TopChest);
Orion.UseObject(ToolsBag);
Orion.UseObject(OresBag);
Orion.Wait(200);
UnloadIngots();
UnloadOres();
// Bloody bandages
if (Orion.MoveItemType('0x0E20', '0', backpack, 0, ToolsBag))
Orion.Wait(400);
if (Orion.Count(FoodType, '0') > 0 || Orion.MoveItemType(FoodType, '0', ToolsBag, 1))
{
Orion.UseType(FoodType, '0');
Orion.Wait(100);
}
Restock('0x0E85', 4); // Pickaxe
Restock('0x0F3F', 100); // Arrows
Restock('0x1F55', 20); // Dispel scrolls
//Restock('0x1F62', 10); // Mass dispel scrolls
Restock('bandage', 100);
Restock('mr', 50);
Restock('bp', 20);
Restock('bm', 20);
Restock('ga', 30);
Restock('sa', 30);
if (Orion.Count('0x0E85') == 0)
{
Orion.Print('0x0021', 'No pickaxes!!!');
Orion.PauseScript();
}
else if (Orion.Count('0x0F3F') < 30)
{
Orion.Print('0x0021', 'No arrows!!!');
Orion.PauseScript();
}
else if (Orion.Count('mr') < 5 || Orion.Count('bp') < 5 || Orion.Count('bm') < 5)
{
Orion.Print('0x0021', 'No reagents to recalls!!!');
Orion.PauseScript();
}
if (runeCave != '')
RecallTo(runeCave);
if (!forced)
WalkToWrapper(oldX, oldY, 0, (UseHidding == 0 || !Player.Hidden()));
}
}
function PlayGuardAlarm(_private)
{
for (var i = 0; i < SoundRepeatCount; i++)
{
Orion.PlayWav(SoundForGuard);
Orion.Wait(1000);
}
}
function DispelSummons(guard)
{
var summon = null;
if (guard != null && guard.Color() == '0x0000')
summon = guard;
else
{
var summons = Orion.FindTypeEx('0x000E|0x000F|0x0009|0x023E', '0', ground, 'mobile|near', 10);
if (summons.length > 0)
summon = summons[0];
}
if (summon != null)
{
while (summon.Exists() && Player.Hits('%') >= 50 && Player.Mana() >= 20)
{
var timeout = Orion.Now() + 6000;
var type = '0x1F55';
var count = Orion.Count(type);
if (count > 0)
{
Orion.WaitTargetObject(summon.Serial());
Orion.UseType(type);
}
else
{
type = 'mr';
count = Orion.Count(type);
if (count > 0 && Orion.Count('ga') > 0 && Orion.Count('sa') > 0)
Orion.Cast('Dispel', summon.Serial());
else
return false;
}
while (count == Orion.Count(type) && timeout > Orion.Now())
Orion.Wait(100);
Orion.Wait(100);
}
return !summon.Exists();
}
return true;
}
function GetDirectionToFlee(target, mirrored, inversedXY)
{
var targetX = target.X();
var targetY = target.Y();
var x = Player.X();
var y = Player.Y();
if (mirrored)
{
targetX = Player.X();
targetY = Player.Y();
x = target.X();
y = target.Y();
}
if (inversedXY)
{
var temp = targetX;
targetX = targetY;
targetY = temp;
temp = x;
x = y;
y = temp;
}
if (x == targetX)
{
if (y < targetY)
return 0;
else //if (y >= targetY)
return 4;
}
else if (y == targetY)
{
if (x < targetX)
return 6;
else //if (x > targetX)
return 2;
}
else
{
if (x > targetX)
{
if (y < targetY)
return 1;
else //if (y > targetY)
return 3;
}
else //if (x < targetX)
{
if (y > targetY)
return 5;
else //if (y < targetY)
return 7;
}
}
return 0;
}
function Flee(target, direction, distance)
{
switch (direction)
{
case 0:
return Orion.WalkTo(target.X(), target.Y() - distance, 0, 0, 255, true);
case 1:
return Orion.WalkTo(target.X() + distance, target.Y() - distance, 0, 0, 255, true);
case 2:
return Orion.WalkTo(target.X() + distance, target.Y(), 0, 0, 255, true);
case 3:
return Orion.WalkTo(target.X() + distance, target.Y() + distance, 0, 0, 255, true);
case 4:
return Orion.WalkTo(target.X(), target.Y() + distance, 0, 0, 255, true);
case 5:
return Orion.WalkTo(target.X() - distance, target.Y() + distance, 0, 0, 255, true);
case 6:
return Orion.WalkTo(target.X() - distance, target.Y(), 0, 0, 255, true);
case 7:
return Orion.WalkTo(target.X() - distance, target.Y() - distance, 0, 0, 255, true);
default:
break;
}
return false;
}
function CheckGuards(_private)
{
var guards = Orion.FindTypeEx('0x000E', 'any', ground, 'mobile|near', 10);
if (guards.length > 0)
{
var oldX = Player.X();
var oldY = Player.Y();
if (UseWeaponForGuard != '')
Orion.UseObject(UseWeaponForGuard);
var guard = guards[0];
if (Orion.Contains('0x07D1|0x0253|0x052D|0x0455|0x0486|0x0487', guard.Color()))
{
Orion.Exec('PlayGuardAlarm');
if (!Player.Hidden())
{
Orion.WarMode(false);
Orion.Wait(100);
Orion.UseSkill('21');
}
Orion.PauseScript();
}
Orion.WarMode(true);
Orion.Ignore(guard.Serial());
while (guard.Exists() && Player.Hits('%') >= 50)
{
if (guard.Distance() > 6)
{
Orion.WalkTo(guard.X(), guard.Y(), 0, 4, 255, true);
}
else
{
var distance = 4;
if (guard.Distance() < distance)
{
var direction = GetDirectionToFlee(guard, false, false);
if (!Flee(guard, direction, distance))
{
direction = GetDirectionToFlee(guard, false, true);
if (!Flee(guard, direction, distance))
{
direction = GetDirectionToFlee(guard, true, true);
if (!Flee(guard, direction, distance))
{
direction = GetDirectionToFlee(guard, true, false);
Flee(guard, direction, distance);
}
}
}
}
}
Orion.Attack(guard.Serial());
Orion.Wait(500);
if (!DispelSummons(guard))
break;
}
if (guard.Exists())
{
Orion.Exec('PlayGuardAlarm');
Orion.PauseScript();
}
else
{
DispelSummons(null);
// Blade spirits
while (Player.Hits('%') >= 50)
{
var summons = Orion.FindTypeEx('0x023E', 'any', ground, 'mobile|near', 10);
if (summons.length == 0)
break;
guard = summons[0];
Orion.Ignore(guard.Serial());
while (guard.Exists() && Player.Hits('%') >= 50)
{
Orion.Attack(guard.Serial());
Orion.Wait(500);
}
}
}
if (Player.Mana('%') < 99)
{
Orion.WarMode(false);
Orion.Exec('AutoMeditation', true);
}
var corpses = Orion.FindTypeEx('0x2006', 'any', ground, '', 10);
if (corpses.length > 0)
{
for (var c = 0; c < corpses.length; c++)
{
var corpse = corpses[c];
WalkToWrapper(corpse.X(), corpse.Y(), 1, true);
Orion.Wait(1000);
Orion.UseObject(corpse.Serial());
Orion.Ignore(corpse.Serial());
Orion.Wait(2500);
}
}
else
{
Orion.Print('0x0021', 'Corpse not found!');
Orion.Exec('PlayGuardAlarm');
Orion.PauseScript();
}
Orion.WarMode(false);
WalkToWrapper(oldX, oldY, 0, (UseHidding == 0 || !Player.Hidden()));
}
}
function AutoMeditation(_private)
{
while (Player.Hits('%') > 50 && Player.Mana('%') < 99)
{
Orion.UseSkill('46');
Orion.Wait(500);
}
}
function MiningDig(runeCave)
{
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 (Player.Hits('%') < 50)
{
Orion.Exec('PlayGuardAlarm');
Orion.PauseScript();
}
CheckGuards(0);
DispelSummons(null);
var hits = Player.Hits('%');
var needHeal = (hits > 50 && hits < 99 && Orion.Count('bandage') > 0);
if (needHeal)
{
Orion.PauseScript('AutoMeditation');
while (needHeal)
{
Orion.BandageSelf();
Orion.Wait(2000);
hits = Player.Hits('%');
needHeal = (hits > 50 && hits < 99 && Orion.Count('bandage') > 0);
}
Orion.ResumeScript('AutoMeditation');
}
while (Orion.ScriptRunning('AutoMeditation'))
Orion.Wait(500);
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(false, runeCave);
if (!Orion.ValidateTargetTileRelative('mine', x, y, 0))
break;
var now = Orion.Now();
Orion.WaitTargetTileRelative('mine', x, y, 0);
if (!UsePickaxe(0))
{
CheckOverweight(true, runeCave);
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.WarMode(false);
Orion.Wait(50);
}
}
}
}
function Mining()
{
for (var cave = 0; cave < CaveSpots.length; cave++)
{
RecallTo(RunesToCave[cave]);
var spot = CaveSpots[cave];
//for (var c = 0; c < 2; c++) // Потому что на первом проходе, почему-то, бывают пропуски тайлов и недокопы
{
for (var i = 0; i < spot.length; i++)
{
WalkToWrapper(spot[i][0], spot[i][1], 0, (UseHidding == 0 || !Player.Hidden()));
MiningDig(RunesToCave[cave]);
}
}
if (Player.Weight('%') >= 65)
CheckOverweight(true, '');
}
Orion.Print(0x0044, 'Caves cycle done, restarting in ' + SoundRepeatCount + ' seconds...');
PlayGuardAlarm(0);
Orion.Wait(5000);
// Exec а не while (true) чтобы перезагружались константы (если ломается лук или какие-то правки кода)
// Чтоб вручную не ловить конец цикла/стопать на полпути и не перезапускать заново
Orion.Exec('Mining');
Orion.Wait(500);
}
function UnloadIngots()
{
while (Orion.MoveItemType('0x1BEF|0x1BF2|0x1BE3|0x1BE9|0x1BF5|0x0F02', 'any', backpack, 0, OresBag))
Orion.Wait(400);
}
function UnloadOres()
{
while (Orion.MoveItemType('0x19B7|0x19BA|0x19B8|0x19B9|gp', 'any', backpack, 0, OresBag))
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;
}
}
function TestHarvestingZones(rune)
{
Orion.ClearFakeMapObjects();
if (rune < 0 || rune >= CaveSpots.length)
{
Orion.Print('0x0021', 'Invalid rune index: ' + rune);
return;
}
FakeId = 1;
var spots = CaveSpots[rune];
for (var spot = 0; spot < spots.length; spot++)
{
TestHarvestingZone(spots[spot][0], spots[spot][1], 2);
}
}
function TestHarvestingZone(centerX, centerY, distance)
{
for (var x = -distance; x <= distance; x++)
{
for (var y = -distance; y <= distance; y++)
{
Orion.AddFakeMapObject(FakeId++, '0x051A', '0x0044', centerX + x, centerY + y, Player.Z());
}
}
}