What this script does?:
1) Waits until boss room teleport spawns and uses it.
2) Attacks 1st and 2nd boss with the strongest skill and kills them.
3) Moves to experience beads and kills them.
4) Moves to Quest Box and loots it.
5) Uses teleport to leave the instance. (Optional)
6) Uses healing skill when Hp is lower than 65%
7) Gets A Rank 100% of times

What this script cant do?:
(To improve later / suggestions are appreciated)
* For now it has no support for quest deliver and 7 key-chest looting. So, if you want to loot the chest you need to do it manually, that's why the teleport is "Optional", you can commentate or delete that section of the script if needed.
* It cant get Rank S for now. A new version will be released for that.
There is a timer to loot the quest box after 19 minutes, so its really important to run the script right after you enter the instance for best results. (Hopefully I will remove it soon).
NA Version:
Code: Select all
--NA Entities and skills:
BossTeleport= "War Factory Rift"
Watcher= "Siege Factory Watcher"
Summons= "Siege Factory Protector"
Boss1= "Mechaturerk Machine Monster"
Boss2= "Mechaturerk"
ExpBeads= "Mechaturerk’s Core Fragment"
QuestBox="Mechaturerk’s Footlocker"
ExitTeleport="Corridor to Atreia"
Skill1= "Soul Scream"
Skill2= "Wave of Darkness"
Skill3= "Terror's Restraint"
Skill4= "Hellish Fissure"
Skill5= "Cloak of Darkness"
--[[EU Entities and skills:
BossTeleport= "Dimension Gate to the Weapons Factory"
Watcher= "Siege Factory Watcher"
Summons= "Factory Keeper"
Boss1= "Mechaturerk Machine Monster"
Boss2= "Mechaturerk"
ExpBeads= "Mechanerk's Core"
QuestBox= "Mechanerk's Chest"
ExitTeleport= "Atreia Corridor"
Skill1= "Darkness Cry"
Skill2= "Darkness Wave"
Skill3= "Horror Shackles"
Skill4= "Infernal Rift"
Skill5= "Mantle of Darkness"
--]]
function OnLoad()
SoulScream = Time(); --0.5Sec
WaveOfDarkness = Time(); --4 Sec
TerrorsRestraint= Time(); --8 Sec
HellishFissure = Time(); --30 Sec + 1.5 Casting
CloakOfDarkness = Time(); --80 Sec
Coordinate = Time(); --Coordinate Allocation
LeaveInstance = Time(); --Timer after looting Quest Box
Looting = Time();
Write( "Script will start after minute 48:00, please, be patient.")
end
function OnFrame()
--Boss Teleport Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == BossTeleport then
PlayerInput:Console("/Select "..BossTeleport)
PlayerInput:Console("/Attack")
Write( "Teleport Spawned!")
return true;
end
end
--Watcher Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Watcher then
PlayerInput:Console("/Select "..Watcher)
Player:SetMove(191.99, 258.84, 191.87);
if WaveOfDarkness <Time() then
PlayerInput:Console("/skill "..Skill2);
WaveOfDarkness = Time() + 5000;
return false;
elseif SoulScream <Time() then
PlayerInput:Console("/skill "..Skill1);
SoulScream = Time() + 2000;
return false;
end
Write( "Siege Watcher Detected!")
return true;
end
end
--Watcher Summon Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Summons then
PlayerInput:Console("/Select "..Summons)
Player:SetMove(191.99, 258.84, 191.87);
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif WaveOfDarkness <Time() then
PlayerInput:Console("/skill "..Skill2);
WaveOfDarkness = Time() + 5000;
return false;
elseif SoulScream <Time() then
PlayerInput:Console("/skill "..Skill1);
SoulScream = Time() + 2000;
return false;
end
Write( "Siege Watcher Summons Detected!")
return true;
end
end
--First Boss Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Boss1 then
PlayerInput:Console("/Select "..Boss1)
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif HellishFissure <Time() then
PlayerInput:Console("/skill "..Skill4);
HellishFissure = Time() + 17000;
return false;
end
Write( "First Boss Detected!")
return true;
end
end
--Second Boss Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Boss2 then
PlayerInput:Console("/Select "..Boss2)
Player:SetMove(172.71, 258.92, 191.87);
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif HellishFissure <Time() then
PlayerInput:Console("/skill "..Skill4);
HellishFissure = Time() + 17000;
return false;
end
Write( "Second Boss Detected!")
return true;
end
end
--Instance finished, exp beads were spawned.
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == ExpBeads then
PlayerInput:Console("/Select "..ExpBeads)
Player:SetMove(161.39, 261.83, 192.08);
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif WaveOfDarkness <Time() then
PlayerInput:Console("/skill "..Skill2);
WaveOfDarkness = Time() + 5000;
return false;
elseif SoulScream <Time() then
PlayerInput:Console("/skill "..Skill1);
SoulScream = Time() + 20000;
return false;
end
Write( "Experience Beads Spawned!")
return true;
end
end
--Looting Quest Box
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == QuestBox then
PlayerInput:Console("/Select "..QuestBox)
PlayerInput:Console("/Skill Loot")
PlayerInput:Console("/Attack")
Write( "Quest Item should have been looted, please verify.")
return true;
end
end
--Leaving the Instance. (Still Optional)
if Time() > (LeaveInstance + 1260000) then
PlayerInput:Console("/Select "..ExitTeleport)
PlayerInput:Console("/Attack")
Write( "Script Completed: Leaving the instance.")
end
end
function OnRun()
--Healing Routine when Hp lower than 65%
if Player:GetHealth() < 65 and CheckAvailable( Skill5 ) then
CheckExecute( Skill5 );
Write( "Healing up!")
return true;
end
--Forced Looting Routine.
if Time() > ( Looting + 10000 ) then
PlayerInput:Console("/Skill Loot")
Looting = Time();
end
end
--Helper Functions:
function CheckAvailable( Name, SkipActivation )
-- Retrieve the ability with the provided name.
local Ability = AbilityList:GetAbility( Name );
-- Check if the ability is valid and is not in cooldown.
if Ability ~= nil and Ability:GetCooldown() == 0 and ( SkipActivation ~= nil or Ability:GetActivated()) then
return true;
end
-- Either we do not have the ability or it is in cooldown.
return false;
end
function CheckExecute( Name, Entity )
-- Retrieve the ability with the provided name.
local Ability = AbilityList:GetAbility( Name );
-- Check if the provided ability is available and return when it is not.
if Ability == nil or Ability:GetCooldown() ~= 0 then
return false;
end
-- Check if I am currently resting and stop resting when I am!
if Player:IsResting() then
PlayerInput:Ability( "Toggle Rest" );
return false;
end
-- Check if this is a friendly ability with my own character as the target.
if Entity ~= nil and Player:GetID() == Entity:GetID() then
-- Retrieve the skill based on the ability identifier.
local Skill = SkillList:GetSkill( Ability:GetID());
-- It is not possible to perform a hostile skill on my own character.
if Skill == nil or Skill:IsAttack() then
return false;
end
-- When no target has been selected we can execute the ability.
if Player:GetTargetID() == 0 then
return PlayerInput:Ability( Name );
end
-- Otherwise retrieve the entity we currently have selected.
local EntityTarget = EntityList:GetEntity( Player:GetTargetID());
-- When the target is valid and is not friendly we can use our ability.
if EntityTarget ~= nil and not EntityTarget:IsFriendly() or not EntityTarget:IsObject() then
return PlayerInput:Ability( Name );
end
end
-- Check if the target entity has been selected and select it when it is needed.
if Entity ~= nil and Player:GetTargetID() ~= Entity:GetID() then
Player:SetTarget( Entity );
return false;
end
-- Everything seems to be valid
return PlayerInput:Ability( Name );
end
Code: Select all
--[[--NA Entities and skills:
BossTeleport= "War Factory Rift"
Watcher= "Siege Factory Watcher"
Summons= "Siege Factory Protector"
Boss1= "Mechaturerk Machine Monster"
Boss2= "Mechaturerk"
ExpBeads= "Mechaturerk’s Core Fragment"
QuestBox="Mechaturerk’s Footlocker"
ExitTeleport="Corridor to Atreia"
Skill1= "Soul Scream"
Skill2= "Wave of Darkness"
Skill3= "Terror's Restraint"
Skill4= "Hellish Fissure"
Skill5= "Cloak of Darkness"--]]
--EU Entities and skills:
BossTeleport= "Dimension Gate to the Weapons Factory"
Watcher= "Factory Guardian"
Summons= "Factory Keeper"
Boss1= "Mechanerk's Creature"
Boss2= "Mechanerk"
ExpBeads= "Mechanerk's Core"
QuestBox= "Mechanerk's Chest"
ExitTeleport= "Atreia Corridor"
Skill1= "Darkness Cry"
Skill2= "Darkness Wave"
Skill3= "Horror Shackles"
Skill4= "Infernal Rift"
Skill5= "Mantle of Darkness"
function OnLoad()
SoulScream = Time(); --0.5Sec
WaveOfDarkness = Time(); --4 Sec
TerrorsRestraint= Time(); --8 Sec
HellishFissure = Time(); --30 Sec + 1.5 Casting
CloakOfDarkness = Time(); --80 Sec
Coordinate = Time(); --Coordinate Allocation
LeaveInstance = Time(); --Timer after looting Quest Box
Looting = Time();
Write( "Script will start after minute 48:00, please, be patient.")
end
function OnFrame()
--Boss Teleport Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == BossTeleport then
PlayerInput:Console("/Select "..BossTeleport)
PlayerInput:Console("/Attack")
Write( "Teleport Spawned!")
return true;
end
end
--Watcher Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Watcher then
PlayerInput:Console("/Select "..Watcher)
Player:SetMove(191.99, 258.84, 191.87);
if WaveOfDarkness <Time() then
PlayerInput:Console("/skill "..Skill2);
WaveOfDarkness = Time() + 5000;
return false;
elseif SoulScream <Time() then
PlayerInput:Console("/skill "..Skill1);
SoulScream = Time() + 2000;
return false;
end
Write( "Siege Watcher Detected!")
return true;
end
end
--Watcher Summon Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Summons then
PlayerInput:Console("/Select "..Summons)
Player:SetMove(191.99, 258.84, 191.87);
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif WaveOfDarkness <Time() then
PlayerInput:Console("/skill "..Skill2);
WaveOfDarkness = Time() + 5000;
return false;
elseif SoulScream <Time() then
PlayerInput:Console("/skill "..Skill1);
SoulScream = Time() + 2000;
return false;
end
Write( "Siege Watcher Summons Detected!")
return true;
end
end
--First Boss Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Boss1 then
PlayerInput:Console("/Select "..Boss1)
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif HellishFissure <Time() then
PlayerInput:Console("/skill "..Skill4);
HellishFissure = Time() + 17000;
return false;
end
Write( "First Boss Detected!")
return true;
end
end
--Second Boss Verification
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == Boss2 then
PlayerInput:Console("/Select "..Boss2)
Player:SetMove(172.71, 258.92, 191.87);
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif HellishFissure <Time() then
PlayerInput:Console("/skill "..Skill4);
HellishFissure = Time() + 17000;
return false;
end
Write( "Second Boss Detected!")
return true;
end
end
--Instance finished, exp beads were spawned.
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == ExpBeads then
PlayerInput:Console("/Select "..ExpBeads)
Player:SetMove(161.39, 261.83, 192.08);
if TerrorsRestraint <Time() then
PlayerInput:Console("/skill "..Skill3);
TerrorsRestraint = Time() + 9000;
return false;
elseif WaveOfDarkness <Time() then
PlayerInput:Console("/skill "..Skill2);
WaveOfDarkness = Time() + 5000;
return false;
elseif SoulScream <Time() then
PlayerInput:Console("/skill "..Skill1);
SoulScream = Time() + 20000;
return false;
end
Write( "Experience Beads Spawned!")
return true;
end
end
--Looting Quest Box
for ID, Entity in DictionaryIterator(EntityList:GetList()) do
if Entity:GetName() == QuestBox then
PlayerInput:Console("/Select "..QuestBox)
PlayerInput:Console("/Skill Loot")
PlayerInput:Console("/Attack")
Write( "Quest Item should have been looted, please verify.")
return true;
end
end
--Leaving the Instance. (Still Optional)
if Time() > (LeaveInstance + 1260000) then
PlayerInput:Console("/Select "..ExitTeleport)
PlayerInput:Console("/Attack")
Write( "Script Completed: Leaving the instance.")
end
end
function OnRun()
--Healing Routine when Hp lower than 65%
if Player:GetHealth() < 65 and CheckAvailable( Skill5 ) then
CheckExecute( Skill5 );
Write( "Healing up!")
return true;
end
--Forced Looting Routine.
if Time() > ( Looting + 10000 ) then
PlayerInput:Console("/Skill Loot")
Looting = Time();
end
end
--Helper Functions:
function CheckAvailable( Name, SkipActivation )
-- Retrieve the ability with the provided name.
local Ability = AbilityList:GetAbility( Name );
-- Check if the ability is valid and is not in cooldown.
if Ability ~= nil and Ability:GetCooldown() == 0 and ( SkipActivation ~= nil or Ability:GetActivated()) then
return true;
end
-- Either we do not have the ability or it is in cooldown.
return false;
end
function CheckExecute( Name, Entity )
-- Retrieve the ability with the provided name.
local Ability = AbilityList:GetAbility( Name );
-- Check if the provided ability is available and return when it is not.
if Ability == nil or Ability:GetCooldown() ~= 0 then
return false;
end
-- Check if I am currently resting and stop resting when I am!
if Player:IsResting() then
PlayerInput:Ability( "Toggle Rest" );
return false;
end
-- Check if this is a friendly ability with my own character as the target.
if Entity ~= nil and Player:GetID() == Entity:GetID() then
-- Retrieve the skill based on the ability identifier.
local Skill = SkillList:GetSkill( Ability:GetID());
-- It is not possible to perform a hostile skill on my own character.
if Skill == nil or Skill:IsAttack() then
return false;
end
-- When no target has been selected we can execute the ability.
if Player:GetTargetID() == 0 then
return PlayerInput:Ability( Name );
end
-- Otherwise retrieve the entity we currently have selected.
local EntityTarget = EntityList:GetEntity( Player:GetTargetID());
-- When the target is valid and is not friendly we can use our ability.
if EntityTarget ~= nil and not EntityTarget:IsFriendly() or not EntityTarget:IsObject() then
return PlayerInput:Ability( Name );
end
end
-- Check if the target entity has been selected and select it when it is needed.
if Entity ~= nil and Player:GetTargetID() ~= Entity:GetID() then
Player:SetTarget( Entity );
return false;
end
-- Everything seems to be valid
return PlayerInput:Ability( Name );
end
* Looting the quest box is taking more than it should, but being looted before leaving the instance.
* It gets Rank B sometimes, it depends on how slow the NPC clear the instance. I'm working to fix it.
Note: "Disable click to move" is highly recommended for this script.