//Авто-запуск скриптов при заходе в игру. Пример: Orion.Exec('AutoLootBezRezki');
//Autostart scripts after login into the game. Example: Orion.Exec('AutoLootBezRezki');

function Autostart()
{
  Orion.Print('Welcome to UORPG Orion scripts');
}

//--#Выбор таргета, атака последнего таргета, фаст рекол, бинт.
//--#Auto last target, attack last, fast recall, bandage self.

function AutoTarget_attacknext()
{
	Orion.Say('.attacknext');
}

function Attacklast_attacklast()
{
	Orion.Say('.attacklast');
}

function FastRecall()
{
if (Orion.GetSerial('runebook') == '0x00000000')
{
Orion.AddObject('runebook');
    Orion.Print('0x0123', 'Выберите рунбуку/руну для фаст рекола.');
        Orion.Print('0x0123', 'Choose your runebook/rune for fast recall.');
        while (Orion.HaveTarget())
        Orion.Wait(1000);
            Orion.Print('0x0123', 'Вещь зарегистрирована в Lists->Objects.');
        Orion.Print('0x0123', 'Bind is added to Lists->Objects.');
}
	Orion.Cast('Recall');
	Orion.WaitTargetObject('runebook');
}

function Bandageself()
{
	Orion.Say('.bandageself');
}

function BattleHide()
{
    var hideTime = 3000; //Время задержки до хайда в мс.

    if (!Player.Hidden())
    {
        var oldAlwaysRun = Orion.OptionAlwaysRun();
        Orion.OptionAlwaysRun(true);

        Orion.ClearJournal();
        Orion.UseSkill('Hiding');

        var msg = Orion.WaitJournal('You can`t seem|You have', Orion.Now(), Orion.Now() + hideTime, 'sys|my');

        if (msg == null)
        {
            Orion.OptionAlwaysRun(false);

            while (Player.Hidden())
                Orion.Wait(100);
        }

        Orion.OptionAlwaysRun(oldAlwaysRun);
    }

    Orion.Attack('lastattack');

}

//--#Боевая магия
//--#Damage spells

function Fireball()
{
	Orion.Say('.castenemy Fireball');
}

function FlameStrike()
{
	Orion.Say('.castenemy Flame Strike');
}

function EnergyBolt()
{
	Orion.Say('.castenemy Energy Bolt');
}

function Explosion()
{
	Orion.Say('.castenemy Explosion');
}

function Lightning()
{
	Orion.Say('.castenemy Lightning');
}

function Harm()
{
	Orion.Say('.castenemy Harm');
}

function MindBlast()
{
	Orion.Say('.castenemy Mind Blast');
}

//--#Магия контроля и проклятья.
//--#Curse's, control and stuns.

function Paralyze()
{
	Orion.Say('.castenemy Paralyze');
}

function fParalyze_fizzleparalyze()
{
	Orion.Say('.castenemy fParalyze');
}

function Poison()
{
	Orion.Say('.castenemy Poison');
}

function Clumsy()
{
	Orion.Say('.castenemy Clumsy');
}

function Weaken()
{
	Orion.Say('.castenemy Weaken');
}

function Curse()
{
	Orion.Say('.castenemy Curse');
}

function ManaDrain()
{
	Orion.Say('.castenemy Mana Drain');
}

function ManaVampire()
{
	Orion.Say('.castenemy Mana Vampire');
}

//--#Сбивает зеркало, не затронув вашего.
//--#Take off the Magic Reflection and keep yours up.

function Dispel_lasttarget()
{
	Orion.Say('.castenemy Dispel');
}

//--#Сбивает зеркало, вам и сопернику.
//--#Take off the Magic Reflection from both - the enemy and yours.

function MagicArrow_lasttarget()
{
	Orion.Say('.castenemy Magic Arrow');
}

//--#Телепортирует вас к последней цели/противнику.
//--#Teleport you to the target.

function Teleport_lasttarget()
{
	Orion.Say('.castenemy Teleport');
}

//--#Массивная магия, на определённую ширину местности.
//--#Massive magic

function Reveal()
{
	Orion.Cast('Reveal');
}

function MassDispel()
{
	Orion.Cast('Mass Dispel');
}

function Earthquake()
{
	Orion.Cast('Earthquake');
}

function MeteorSwarm()
{
	Orion.Cast('Meteor Swarm');
}

function BladeSpirits()
{
	Orion.Cast('Blade Spirits');
}

function ChainLightning()
{
	Orion.Say('.castenemy Chain Lightning');
}

//--#Уберает магию любого вида стен. (1 клетка)
//--#Dispel the magic of any field. (1 tile)

function DispelField()
{
	Orion.Cast('Dispel Field');
}

//--#Стены *филды*
//--#Fields

function WallOfStone()
{
	Orion.Cast('Wall of Stone');
}

function FireField()
{
	Orion.Cast('Fire Field');
}

function ParalyzeField()
{
	Orion.Cast('Paralyze Field');
}

function PoisonField()
{
	Orion.Cast('Poison Field');
}

function EnergyField()
{
	Orion.Cast('Energy Field');
}

//--#Зеркало, магия света, баффы.
//--#Magic reflect, holy magery, buffs.

function MagicReflect()
{
	Orion.Say('.castself Magic Reflect');
}

function Heal()
{
	Orion.Say('.castself Heal');
}

function Heal2()
{
	Orion.Say('.castself Heal');
	Orion.Wait(1250);
}

function GreaterHeal()
{
	Orion.Say('.castself Greater Heal');
}

function ReactiveArmor()
{
	Orion.Say('.castself Reactive Armor');
}

function Cure()
{
     
	Orion.Say('.castself Cure');
}

function Bless()
{
	Orion.Say('.castself Bless');
}

function Protection()
{
	Orion.Say('.castself Protection');
}

function Agility()
{
	Orion.Say('.castself Agility');
}

function Cunning()
{
	Orion.Say('.castself Cunning');
}

function Strength()
{
	Orion.Say('.castself Strength');
}

//--#Персонаж становится в инвиз.
//--#Character becomes invisible.

function Invisibility()
{
	Orion.Say('.castself Invisibility');
}

//--#Моментально выводит из парализа отнимая треть от текущей жизни.
//--#Instantly removed paralyze effects from your character by losing 1/3 of your current hp.

function Antiparalyze()
{
   if (Orion.BuffExists('Paralyze'))
	Orion.Say('.antiparalyze');
}

//--#Пускает на себя огненую стрелу, чтобы выйти из парализа. (магическая задержка)
//--#Magic Arrow to get youself out from paralyze. (magic delay)

function MagicArrow_antiparalyze()
{
       Orion.Say('.castself Magic Arrow');
}

//--#Останавливает любое действие, аналогично переключению режима War/Peace.
//--#Disrupt

function OffCast_disrupt()
{
	Orion.Say('.stop');
}

//--#Использует добавленого Add_Mount
//--#Mounts the pet remembered with Add_Mount

function Mount()
{
	Orion.Say('.m_pet');
	Orion.Say('.upd');
}

//--#Добавляет вашего пета для Mount
//--#Remembers your pet for Mount

function Add_Mount()
{
	Orion.Say('.m_pet_add');
}

//--#Банки
//--#Potions

function CurePot()
{
      if (Orion.BuffExists('Poison'))
	Orion.Say('.m_orion_useitem_30');
}

function ManaPot()
{
if (Orion.FindType('0x0E26', '0x0006').length)
{
    Orion.UseType('0x0E26', '0x0006');
    }
 else	
	Orion.Say('.m_orion_useitem_31');
}

function HealPot()
{
if (Player.Hits() < 150)
{
	Orion.Say('.m_orion_useitem_39');
	}

if (Orion.BuffExists('Poison'))
{
	Orion.Say('.m_orion_useitem_30');
	}
if (Orion.FindType('0x0E26', '0x0000').length)
{
    Orion.UseType('0x0E26', '0x0000');
    }
 else
 Orion.Say('.m_orion_useitem_32');
}

function RefreshPot()
{
if (Orion.FindType('0x0E26', '0x01B1').length)
{
    Orion.UseType('0x0E26', '0x01B1');
    }
else
	Orion.Say('.m_orion_useitem_33');
}

function InvisPot()
{
	Orion.Say('.m_orion_useitem_34');
	Orion.Wait(10000);
      Orion.Print('Invisibility potion ready in 5 sec.');
}

function InvisPot2()
{
	Orion.Say('.m_orion_useitem_34');
	Orion.WarMode('off');
      Orion.Exec('tele');
	Orion.Wait(10000);
      Orion.Print('Invisibility potion ready in 5 sec.');

}

function Explospot_lasttarget()
{
	Orion.Say('.explosiononenemy');
}

function BloodPot()
{
	Orion.Say('.m_orion_useitem_35');
}

//--#Шруды, робы для переодевания.
//--#Shrouds, robes to wear.

function FlameShroud()
{
	Orion.Say('.m_orion_useitem_36');
}

function PriestShroud()
{
	Orion.Say('.m_orion_useitem_37');
}

function IceShroud()
{
	Orion.Say('.m_orion_useitem_38');
}

function DesintoxicationShroud()
{
	Orion.Say('.m_orion_useitem_39');
}

function ParalyzeShroud()
{
	Orion.Say('.m_orion_useitem_40');
}

//--#Добавляет вещи для одевания (Оружие, щит, предметы турниров для использования)
//--#Add your items for wearing (Weapons, shield, items from tourneys)

function SetArm1()
{
	Orion.Say('.m_orion_useitem_41');
}

function SetArm2()
{
	Orion.Say('.m_orion_useitem_42');
}

function SetArm3()
{
	Orion.Say('.m_orion_useitem_43');
}

function SetArm4()
{
	Orion.Say('.m_orion_useitem_44');
}

function SetArm5()
{
	Orion.Say('.m_orion_useitem_45');
}

//--#Бинды для артефактов Мёрзлой реки
//--#Frozen river binds for artefacts

function ForceJumpArtefact()
{
if (Orion.FindType('0x1711', '1152'))
{
    Orion.UseType('0x1711', '1152');
    }
}

function PullingArtefact()
{
if (Orion.FindType('0x2F57', '1152'))
{
    Orion.UseType('0x2F57', '1152');
    }
}

function PushingArtefact()
{
if (Orion.FindType('0x1F13', '1152'))
{
    Orion.UseType('0x1F13', '1152');
    }
}

//--#Авто-хил
//--#Auto healing

function autohealing()
{
    while (true)
    {
        if (Player.Hits() < Player.MaxHits())
        {
            Orion.Say('.bandageself');
 
            var msg = Orion.WaitJournal('Healing,|HP +', Orion.Now(), Orion.Now() + 2200, 'my|sys');
 
            while (msg != null)
            {
                if (msg.FindTextID() == 1)
                    break;
 
                msg = Orion.WaitJournal('Healing,|HP +', Orion.Now(), Orion.Now() + 2200, 'my|sys');
 
                Orion.Wait(100);
            }
        }
 
        Orion.Wait(100);
    }
}

//--#Настройка ПвП биндов для Hotkeys
//--#Potions, shrouds and weapons/shields configuration

function PvPBinds()
{

Orion.CancelWaitTarget();
Orion.Print('0x0123', 'РУС: Настройка банок, шруд и оружия/щитов, которые далее будем использовать на кнопку в Hotkeys. Если у вас нету определённой вещи или вы не хотите забиндить что-либо, прожимаем ESC, чтобы продолжить.');
Orion.Wait(2000);
Orion.Print('0x0111', '3');
Orion.Wait(1000);
Orion.Print('0x0111', '2');
Orion.Wait(1000);
Orion.Print('0x0111', '1');
Orion.Wait(1000);
Orion.Print('0x0111', '-------------------------------------');
Orion.Wait(1000);

    
var textArray = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', 'Cure potion', 'Mana potion', 'Heal potion', 'Refresh potion', 'Invisibility potion', 'Blood potion', 'Flame Shroud', 'Priest Shroud', 'Ice Shroud', 'Desintoxication Shroud', 'Paralyze Shroud', 'SetArm1', 'SetArm2', 'SetArm3', 'SetArm4', 'SetArm5'];

for (var i = 30; i < textArray.length; i++)
	{
    Orion.Print('0x0123', 'Выберите ' + textArray[i]);
    Orion.Wait(300);
    Orion.CancelWaitTarget();
    Orion.Say('.m_orion_useitem_add ' + i);
    Orion.Wait(100);
   
        while (Orion.HaveTarget())
        Orion.Wait(200);
        Orion.WaitJournal('use it, enter|его вы можете, набрав команду', Orion.Now() , Orion.Now() + 1000);
        Orion.Print('0x0111', '-------------------------------------');
	}
}

//--#Настройка ПвМ биндов
//--#PvM scripts

function PvMAttack()
{
    Orion.Ignore(Player.Serial());
    var mobs = Orion.FindType('!0x0190|!0x0191', '-1', ground, 'near|mobile', '25', 'red|gray|criminal');
    if (mobs.length)
    {
        Orion.Attack(mobs[0]);
    }
}
 
 function PvPattackred()
{
Orion.Ignore(Player.Serial());
var players = Orion.FindType('0x0190|0x0191', '-1', ground, 'near|mobile', '25', 'blue');
if (players.length)
{
   Orion.Attack(players[0]);
   }
}
function PvPattack()
{
var players = Orion.FindType('0x0190|0x0191', '-1', ground, 'near|mobile', '25', 'red|gray|criminal');
if (players.length)
   Orion.Attack(players[0]);
   }
   
function FastLootRPG()
{
	//Если 1 то лутит все, если 0 то лутит только приоритетные вещи.
	var all = 1;

	//Если 1 то игнорирует вещи из списка, если 0 то не игнорирует.
	var clear = 1;

	//Если 1 то режет труп.
	var useSkining = 1;

	FastLoot('Loot', all, clear, useSkining);
}
function FastLootPVP()
{
	//Если 1 то лутит все, если 0 то лутит только приоритетные вещи.
	var all = 0;

	//Если 1 то игнорирует вещи из списка, если 0 то не игнорирует.
	var clear = 1;

	//Если 1 то режет труп.
	var useSkining = 0;

	FastLoot('Loot2', all, clear, useSkining);
}

function FastLoot(listName, all, clear, useSkining)
{
	var corpse = FindCorpse();

	if (corpse == null)
	{
		Orion.Print('CORPS NOT FOUND!');
		Orion.Print('CORPS NOT FOUND!');
		Orion.Print('CORPS NOT FOUND!');
		Orion.Ignore('corpse', false);
	}
	else
	{
		Orion.AddObject('corpse', corpse.Serial());
		LootLag();
		Loot(listName, all, clear, useSkining);
	}

	Orion.Say('.upd');
}

function FindCorpse()
{
	var list = Orion.FindType('0x2006|0x0ECA|0x0E40|0x0E41', '-1', ground, 'fast', '2');

	if (list.length)
	{
		Orion.UseObject(list[0]);
		return Orion.FindObject(list[0]);
	}

	return null;
}

function LootLag()
{
	var timer = Orion.Now() + 300;

	while (!Orion.FindType('-1', '-1', 'corpse').length && timer > Orion.Now())
		Orion.Wait(50);
}

function Loot(listName, all, clear, useSkining)
{
	//Тип сумки в которую складываем лут.
	var bag = '0x4054843E';

	var lootBagList = Orion.FindType(bag);

	if (lootBagList.length)
		Orion.AddObject('lootpack', lootBagList[0]);
	else
		Orion.AddObject('lootpack', Orion.GetSerial(backpack));

	LootByFindList(listName);

	if (all == 1)
	{
		if (clear == 1)
			Orion.UseIgnoreList('ignoreLoot');
		else
			Orion.ResetIgnoreList();

		LootAll();

		Orion.ResetIgnoreList();
		Orion.Ignore('corpse');
	}

	if (useSkining == 1)
		Skining();
}

function Skining()
{
	Orion.WaitTargetObject('corpse');
	Orion.UseType('0x0EC4');
	Orion.Wait(500);

	LootAll();
}

function LootItems(list)
{
	if (!list.length)
		return false;

	for (var i = 0; i < list.length; i++)
	{
		if (Orion.GetDistance('corpse') > 2)
			return false;

		Orion.MoveItem(list[i], 0, 'lootpack');
		Orion.Wait(700);
	}

	return true;
}

function LootByFindList(listName)
{
	while (LootItems(Orion.FindList(listName, 'corpse')))
		Orion.Wait(50);
}

function LootAll()
{
	while (LootItems(Orion.FindType('-1', '-1', 'corpse')))
		Orion.Wait(50);
}

function tele()
{
    var value = 7;
    var empty = 0;
 
    var offset =
    [
        [empty, -value],        //direction = 0
        [value, -value],        //direction = 1
        [value, empty],     //direction = 2
        [value, value],     //direction = 3
        [empty, value],     //direction = 4
        [-value, value],        //direction = 5
        [-value, empty],        //direction = 6
        [-value, -value]        //direction = 7
    ];
   
    var xy = offset[Player.Direction() & 7];
    Orion.WaitTargetTileRelative('0', xy[0], xy[1], Player.Z());
    Orion.Cast('Teleport');
}

function AutoLootIgnore()
    {
        //Объект LootBag должен быть в списке объектов (закладка Lists/Objects)
        //Тип knife должен быть в списке типов (закладка Lists/Types)
        //Поисковый список Loot долен быть в списке поиска (закладка Lists/Find)
        //Список игнора IgnoreLoot долен быть в списке игнора (закладка Lists/Ignore)

        //Сканируем только если живы
        while (true)
        {
            //Сканируем только если живы
            if (Player.Dead())
            {
                Orion.Wait(200);
                continue;
            }

            //Поиск трупа на земле по usedistance
            var corpses = Orion.FindType('0x2006', '-1', ground, '', 'usedistance');

            //Проход по всем найденным трупам
            for (var c = 0; c < corpses.length; c++)
            {
                var serial = corpses[c]
               
                //Тыкаем таргетом от ножа на ласткорпс (режем)
                Orion.WaitTargetObject(serial);
                Orion.UseType('knife');
                Orion.Wait(200);

                //Открываем труп
                Orion.UseObject(serial);
                Orion.Wait(200);

                Orion.UseIgnoreList('IgnoreLoot');
                var list = Orion.FindList('Loot', serial);
                Orion.ResetIgnoreList();
       
                for (var i = 0; i < list.length; i++)
                {
                    Orion.MoveItem(list[i], 0, 'LootBag');
                    Orion.Wait('700');
                }

                //Добавляем труп в игнор и ждем 500 мс
                Orion.Ignore(serial);
                Orion.Wait(200);
            }

            Orion.Wait(200);
        }
    }

